From 615de28561aeb843e4fc18a1859b68a8164b17a4 Mon Sep 17 00:00:00 2001 From: "andre.schmid" Date: Fri, 17 Apr 2020 14:53:17 +0100 Subject: Validates artifact configuration Validates if all the SDC base artifacts are configured. The base artifacts are provided by the ArtifactTypeEnum. Change-Id: Iffa38d6ba276014940afad71f7472bc8d730fcf8 Issue-ID: SDC-2929 Signed-off-by: andre.schmid --- .../templates/default/BE-configuration.yaml.erb | 43 ++++++++ .../resources/config/catalog-be/configuration.yaml | 43 ++++++++ .../sdc/be/config/ConfigurationManager.java | 13 ++- .../MissingBaseArtifactConfigException.java | 28 +++++ .../config/validation/ArtifactConfigValidator.java | 82 +++++++++++++++ .../openecomp/sdc/common/api/ArtifactTypeEnum.java | 116 +++++++++++++++++++-- .../validation/ArtifactConfigValidatorTest.java | 76 ++++++++++++++ 7 files changed, 389 insertions(+), 12 deletions(-) create mode 100644 common-app-api/src/main/java/org/openecomp/sdc/be/config/exception/MissingBaseArtifactConfigException.java create mode 100644 common-app-api/src/main/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidator.java create mode 100644 common-app-api/src/test/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidatorTest.java diff --git a/catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb b/catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb index 8db48dc503..149adf214c 100644 --- a/catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb +++ b/catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb @@ -650,6 +650,49 @@ artifacts: acceptedTypes: - yaml - yml + - type: FLOW + categories: + - DEPLOYMENT + componentTypes: + - SERVICE + resourceTypes: *allResourceTypes + acceptedTypes: + - type: SHELL_SCRIPT + categories: + - DEPLOYMENT + componentTypes: + - SERVICE + - SERVICE_INSTANCE + - RESOURCE + - RESOURCE_INSTANCE + resourceTypes: *allResourceTypes + acceptedTypes: + - sh + - type: TOSCA_CSAR + categories: + - TOSCA + componentTypes: + resourceTypes: + acceptedTypes: + - csar + - type: TOSCA_TEMPLATE + categories: + - TOSCA + componentTypes: + resourceTypes: + acceptedTypes: + - yml + - yaml + - type: NETWORK_CALL_FLOW + categories: + componentTypes: + resourceTypes: + acceptedTypes: + - type: ICON + categories: + componentTypes: + resourceTypes: + acceptedTypes: deploymentResourceArtifacts: diff --git a/catalog-be/src/test/resources/config/catalog-be/configuration.yaml b/catalog-be/src/test/resources/config/catalog-be/configuration.yaml index ca7c636ff6..ac5d0acc72 100644 --- a/catalog-be/src/test/resources/config/catalog-be/configuration.yaml +++ b/catalog-be/src/test/resources/config/catalog-be/configuration.yaml @@ -1009,3 +1009,46 @@ artifacts: acceptedTypes: - yaml - yml + - type: FLOW + categories: + - DEPLOYMENT + componentTypes: + - SERVICE + resourceTypes: *allResourceTypes + acceptedTypes: + - type: SHELL_SCRIPT + categories: + - DEPLOYMENT + componentTypes: + - SERVICE + - SERVICE_INSTANCE + - RESOURCE + - RESOURCE_INSTANCE + resourceTypes: *allResourceTypes + acceptedTypes: + - sh + - type: TOSCA_CSAR + categories: + - TOSCA + componentTypes: + resourceTypes: + acceptedTypes: + - csar + - type: TOSCA_TEMPLATE + categories: + - TOSCA + componentTypes: + resourceTypes: + acceptedTypes: + - yml + - yaml + - type: NETWORK_CALL_FLOW + categories: + componentTypes: + resourceTypes: + acceptedTypes: + - type: ICON + categories: + componentTypes: + resourceTypes: + acceptedTypes: diff --git a/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java b/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java index 101b60e941..66494ed668 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java @@ -21,6 +21,8 @@ package org.openecomp.sdc.be.config; import com.google.common.annotations.VisibleForTesting; +import org.openecomp.sdc.be.config.validation.ArtifactConfigValidator; +import org.openecomp.sdc.common.api.ArtifactTypeEnum; import org.openecomp.sdc.common.api.BasicConfiguration; import org.openecomp.sdc.common.api.ConfigurationListener; import org.openecomp.sdc.common.api.ConfigurationSource; @@ -48,11 +50,11 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura super(); this.configurationSource = configurationSource; loadConfigurationFiles(); + validateConfiguration(); instance = this; } private void loadConfigurationFiles() { - loadConfigurationClass(Configuration.class); loadConfigurationClass(ErrorConfiguration.class); loadConfigurationClass(Neo4jErrorsConfiguration.class); @@ -60,6 +62,15 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura loadConfigurationClass(DistributionEngineConfiguration.class); } + private void validateConfiguration() { + final Object configurationObj = configurations.get(getKey(Configuration.class)); + if (configurationObj instanceof Configuration) { + final ArtifactConfigValidator artifactConfigValidator = + new ArtifactConfigValidator((Configuration) configurationObj, ArtifactTypeEnum.getBaseArtifacts()); + artifactConfigValidator.validate(); + } + } + private void loadConfigurationClass(Class clazz) { ConfigurationListener configurationListener = new ConfigurationListener(clazz, this); diff --git a/common-app-api/src/main/java/org/openecomp/sdc/be/config/exception/MissingBaseArtifactConfigException.java b/common-app-api/src/main/java/org/openecomp/sdc/be/config/exception/MissingBaseArtifactConfigException.java new file mode 100644 index 0000000000..87bf2cc5a8 --- /dev/null +++ b/common-app-api/src/main/java/org/openecomp/sdc/be/config/exception/MissingBaseArtifactConfigException.java @@ -0,0 +1,28 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.config.exception; + +public class MissingBaseArtifactConfigException extends RuntimeException { + + public MissingBaseArtifactConfigException(final String msg) { + super(msg); + } + +} diff --git a/common-app-api/src/main/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidator.java b/common-app-api/src/main/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidator.java new file mode 100644 index 0000000000..66152d6a20 --- /dev/null +++ b/common-app-api/src/main/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidator.java @@ -0,0 +1,82 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.config.validation; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; +import org.openecomp.sdc.be.config.ArtifactConfiguration; +import org.openecomp.sdc.be.config.Configuration; +import org.openecomp.sdc.be.config.exception.MissingBaseArtifactConfigException; +import org.openecomp.sdc.common.api.ArtifactTypeEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Responsible for the validation of the artifact configuration + */ +public class ArtifactConfigValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(ArtifactConfigValidator.class); + + private final Configuration configuration; + private final Set baseArtifactSet; + + public ArtifactConfigValidator(final Configuration configuration, + final Set baseArtifactSet) { + this.configuration = configuration; + this.baseArtifactSet = baseArtifactSet; + } + + /** + * Validates the artifacts configuration + */ + public void validate() { + if (CollectionUtils.isEmpty(baseArtifactSet)) { + return; + } + + final List artifacts = configuration.getArtifacts(); + if (CollectionUtils.isEmpty(artifacts)) { + LOGGER.warn("No configuration artifacts entry found. Ignoring artifacts validation."); + return; + } + + final Set notConfiguredArtifactTypeSet = baseArtifactSet.stream() + .filter(artifactTypeEnum -> + artifacts.stream() + .noneMatch(artifactConfiguration -> + artifactTypeEnum.getType().equals(artifactConfiguration.getType()))) + .collect(Collectors.toSet()); + if (!notConfiguredArtifactTypeSet.isEmpty()) { + final String msg = buildErrorMessage(notConfiguredArtifactTypeSet); + throw new MissingBaseArtifactConfigException(msg); + } + } + + private String buildErrorMessage(final Set missingConfigArtifactTypeSet) { + final String artifactTypeAsString = missingConfigArtifactTypeSet.stream() + .map(ArtifactTypeEnum::getType) + .collect(Collectors.joining(", ")); + return String.format("Missing configuration for Artifact Type(s): %s", artifactTypeAsString); + } + +} diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java b/common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java index affa2d32e0..94d9a8ed73 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java @@ -20,34 +20,64 @@ package org.openecomp.sdc.common.api; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import lombok.AllArgsConstructor; import lombok.Getter; /** - * Represents an artifact type that is used for hard-coded type representation. All artifacts must be configured in the - * SDC configuration file. + * Represents an artifact type that is used for hard-coded type representation. + * All artifacts must be configured in the SDC configuration file. */ @Getter @AllArgsConstructor public enum ArtifactTypeEnum { AAI_SERVICE_MODEL("AAI_SERVICE_MODEL"), + AAI_VF_INSTANCE_MODEL("AAI_VF_INSTANCE_MODEL"), + AAI_VF_MODEL("AAI_VF_MODEL"), + AAI_VF_MODULE_MODEL("AAI_VF_MODULE_MODEL"), ANSIBLE_PLAYBOOK("ANSIBLE_PLAYBOOK"), + APPC_CONFIG("APPC_CONFIG"), + BPEL("BPEL"), + CHEF("CHEF"), CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT("CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT"), + CONTROLLER_BLUEPRINT_ARCHIVE("CONTROLLER_BLUEPRINT_ARCHIVE"), + DCAE_DOC("DCAE_DOC"), + DCAE_EVENT("DCAE_EVENT"), + DCAE_INVENTORY_BLUEPRINT("DCAE_INVENTORY_BLUEPRINT"), + DCAE_INVENTORY_DOC("DCAE_INVENTORY_DOC"), + DCAE_INVENTORY_EVENT("DCAE_INVENTORY_EVENT"), DCAE_INVENTORY_JSON("DCAE_INVENTORY_JSON"), + DCAE_INVENTORY_POLICY("DCAE_INVENTORY_POLICY"), DCAE_INVENTORY_TOSCA("DCAE_INVENTORY_TOSCA"), + DCAE_JSON("DCAE_JSON"), + DCAE_POLICY("DCAE_POLICY"), + DCAE_TOSCA("DCAE_TOSCA"), + DG_XML("DG_XML"), GUIDE("GUIDE"), - HEAT("HEAT"), HEAT_ARTIFACT("HEAT_ARTIFACT"), HEAT_ENV("HEAT_ENV"), + HEAT("HEAT"), HEAT_NESTED("HEAT_NESTED"), HEAT_NET("HEAT_NET"), HEAT_VOL("HEAT_VOL"), + ICON("ICON"), LIFECYCLE_OPERATIONS("LIFECYCLE_OPERATIONS"), MODEL_INVENTORY_PROFILE("MODEL_INVENTORY_PROFILE"), MODEL_QUERY_SPEC("MODEL_QUERY_SPEC"), + MURANO_PKG("MURANO_PKG"), + NETWORK_CALL_FLOW("NETWORK_CALL_FLOW"), + ONBOARDED_PACKAGE("ONBOARDED_PACKAGE"), OTHER("OTHER"), + PERFORMANCE_COUNTER("PERFORMANCE_COUNTER"), + PLAN("PLAN"), PM_DICTIONARY("PM_DICTIONARY"), + PNF_SW_INFORMATION("PNF_SW_INFORMATION"), PUPPET("PUPPET"), + SHELL("SHELL"), + SHELL_SCRIPT("SHELL_SCRIPT"), SNMP_POLL("SNMP_POLL"), SNMP_TRAP("SNMP_TRAP"), TOSCA_CSAR("TOSCA_CSAR"), @@ -59,14 +89,9 @@ public enum ArtifactTypeEnum { VF_MODULES_METADATA("VF_MODULES_METADATA"), VNF_CATALOG("VNF_CATALOG"), WORKFLOW("WORKFLOW"), - YANG_XML("YANG_XML"), - CHEF("CHEF"), YANG("YANG"), SHELL_SCRIPT("SHELL_SCRIPT"), SHELL("SHELL"), ICON("ICON"), UNKNOWN("UNKNOWN"), DG_XML("DG_XML"), MURANO_PKG("MURANO_PKG"), - NETWORK_CALL_FLOW("NETWORK_CALL_FLOW"), BPEL("BPEL"), APPC_CONFIG("APPC_CONFIG"), PERFORMANCE_COUNTER("PERFORMANCE_COUNTER"), CONTROLLER_BLUEPRINT_ARCHIVE("CONTROLLER_BLUEPRINT_ARCHIVE"), - DCAE_TOSCA("DCAE_TOSCA"), DCAE_JSON("DCAE_JSON"), DCAE_POLICY("DCAE_POLICY"), DCAE_DOC("DCAE_DOC"), DCAE_EVENT("DCAE_EVENT"), - DCAE_INVENTORY_POLICY("DCAE_INVENTORY_POLICY"), DCAE_INVENTORY_DOC("DCAE_INVENTORY_DOC"), DCAE_INVENTORY_BLUEPRINT("DCAE_INVENTORY_BLUEPRINT"), DCAE_INVENTORY_EVENT("DCAE_INVENTORY_EVENT"), - AAI_VF_MODEL("AAI_VF_MODEL"), AAI_VF_MODULE_MODEL("AAI_VF_MODULE_MODEL"), AAI_VF_INSTANCE_MODEL("AAI_VF_INSTANCE_MODEL"), - PLAN("PLAN"), YANG_MODULE("YANG_MODULE"), ONBOARDED_PACKAGE("ONBOARDED_PACKAGE"), PNF_SW_INFORMATION("PNF_SW_INFORMATION"); - + YANG("YANG"), + YANG_MODULE("YANG_MODULE"), + YANG_XML("YANG_XML"); private final String type; @@ -85,4 +110,73 @@ public enum ArtifactTypeEnum { return null; } + /** + * Gets the list of mandatory/base SDC artifacts. Those artifacts must be configured. + * + * @return A set of base artifact types + */ + public static Set getBaseArtifacts() { + final List artifactTypeEnums = Arrays.asList( + AAI_SERVICE_MODEL, + AAI_VF_INSTANCE_MODEL, + AAI_VF_MODEL, + AAI_VF_MODULE_MODEL, + ANSIBLE_PLAYBOOK, + APPC_CONFIG, + BPEL, + CHEF, + CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT, + CONTROLLER_BLUEPRINT_ARCHIVE, + DCAE_DOC, + DCAE_EVENT, + DCAE_INVENTORY_BLUEPRINT, + DCAE_INVENTORY_DOC, + DCAE_INVENTORY_EVENT, + DCAE_INVENTORY_JSON, + DCAE_INVENTORY_POLICY, + DCAE_INVENTORY_TOSCA, + DCAE_JSON, + DCAE_POLICY, + DCAE_TOSCA, + DG_XML, + GUIDE, + HEAT, + HEAT_ARTIFACT, + HEAT_ENV, + HEAT_NESTED, + HEAT_NET, + HEAT_VOL, + ICON, + LIFECYCLE_OPERATIONS, + MODEL_INVENTORY_PROFILE, + MODEL_QUERY_SPEC, + MURANO_PKG, + NETWORK_CALL_FLOW, + ONBOARDED_PACKAGE, + OTHER, + PERFORMANCE_COUNTER, + PLAN, + PM_DICTIONARY, + PNF_SW_INFORMATION, + PUPPET, + SHELL, + SHELL_SCRIPT, + SNMP_POLL, + SNMP_TRAP, + TOSCA_CSAR, + TOSCA_TEMPLATE, + UCPE_LAYER_2_CONFIGURATION, + VENDOR_LICENSE, + VES_EVENTS, + VF_LICENSE, + VF_MODULES_METADATA, + VNF_CATALOG, + WORKFLOW, + YANG, + YANG_MODULE, + YANG_XML + ); + return new HashSet<>(artifactTypeEnums); + } + } diff --git a/common-app-api/src/test/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidatorTest.java b/common-app-api/src/test/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidatorTest.java new file mode 100644 index 0000000000..14e679276e --- /dev/null +++ b/common-app-api/src/test/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidatorTest.java @@ -0,0 +1,76 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.config.validation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.openecomp.sdc.be.config.ArtifactConfiguration; +import org.openecomp.sdc.be.config.Configuration; +import org.openecomp.sdc.be.config.exception.MissingBaseArtifactConfigException; +import org.openecomp.sdc.common.api.ArtifactTypeEnum; + +public class ArtifactConfigValidatorTest { + + @Rule + public ExpectedException exceptionRule = ExpectedException.none(); + + public ArtifactConfigValidator artifactConfigValidator; + + @Test + public void testValidate() { + final Configuration configuration = new Configuration(); + //not base artifacts, should validate + artifactConfigValidator = new ArtifactConfigValidator(configuration, Collections.emptySet()); + artifactConfigValidator.validate(); + final HashSet baseArtifactTypes = new HashSet<>( + Arrays.asList(ArtifactTypeEnum.AAI_SERVICE_MODEL, ArtifactTypeEnum.BPEL)); + //with base artifacts, but no artifact configured, should validate + artifactConfigValidator = new ArtifactConfigValidator(configuration, baseArtifactTypes); + artifactConfigValidator.validate(); + + final List artifactConfigurationList = new ArrayList<>(); + final ArtifactConfiguration artifactConfiguration1 = new ArtifactConfiguration(); + artifactConfiguration1.setType(ArtifactTypeEnum.AAI_SERVICE_MODEL.getType()); + artifactConfigurationList.add(artifactConfiguration1); + + final ArtifactConfiguration artifactConfiguration2 = new ArtifactConfiguration(); + artifactConfiguration2.setType(ArtifactTypeEnum.BPEL.getType()); + artifactConfigurationList.add(artifactConfiguration2); + + configuration.setArtifacts(artifactConfigurationList); + //with base artifacts and corresponding configuration, should validate + artifactConfigValidator = new ArtifactConfigValidator(configuration, baseArtifactTypes); + artifactConfigValidator.validate(); + + //with base artifacts and missing one configuration, should not validate + configuration.setArtifacts(Collections.singletonList(artifactConfiguration1)); + exceptionRule.expect(MissingBaseArtifactConfigException.class); + exceptionRule.expectMessage(String.format("Missing configuration for Artifact Type(s): %s", ArtifactTypeEnum.BPEL.getType())); + artifactConfigValidator = new ArtifactConfigValidator(configuration, baseArtifactTypes); + artifactConfigValidator.validate(); + } + +} \ No newline at end of file -- cgit 1.2.3-korg