Validates artifact configuration 07/106207/2
authorandre.schmid <andre.schmid@est.tech>
Fri, 17 Apr 2020 13:53:17 +0000 (14:53 +0100)
committerOfir Sonsino <ofir.sonsino@intl.att.com>
Sun, 19 Apr 2020 16:35:32 +0000 (16:35 +0000)
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 <andre.schmid@est.tech>
catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb
catalog-be/src/test/resources/config/catalog-be/configuration.yaml
common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java
common-app-api/src/main/java/org/openecomp/sdc/be/config/exception/MissingBaseArtifactConfigException.java [new file with mode: 0644]
common-app-api/src/main/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidator.java [new file with mode: 0644]
common-app-api/src/main/java/org/openecomp/sdc/common/api/ArtifactTypeEnum.java
common-app-api/src/test/java/org/openecomp/sdc/be/config/validation/ArtifactConfigValidatorTest.java [new file with mode: 0644]

index 8db48dc..149adf2 100644 (file)
@@ -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:
 
index ca7c636..ac5d0ac 100644 (file)
@@ -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:
index 101b60e..66494ed 100644 (file)
@@ -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 <T extends BasicConfiguration> void loadConfigurationClass(Class<T> 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 (file)
index 0000000..87bf2cc
--- /dev/null
@@ -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 (file)
index 0000000..66152d6
--- /dev/null
@@ -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<ArtifactTypeEnum> baseArtifactSet;
+
+    public ArtifactConfigValidator(final Configuration configuration,
+                                   final Set<ArtifactTypeEnum> baseArtifactSet) {
+        this.configuration = configuration;
+        this.baseArtifactSet = baseArtifactSet;
+    }
+
+    /**
+     * Validates the artifacts configuration
+     */
+    public void validate() {
+        if (CollectionUtils.isEmpty(baseArtifactSet)) {
+            return;
+        }
+
+        final List<ArtifactConfiguration> artifacts = configuration.getArtifacts();
+        if (CollectionUtils.isEmpty(artifacts)) {
+            LOGGER.warn("No configuration artifacts entry found. Ignoring artifacts validation.");
+            return;
+        }
+
+        final Set<ArtifactTypeEnum> 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<ArtifactTypeEnum> missingConfigArtifactTypeSet) {
+        final String artifactTypeAsString = missingConfigArtifactTypeSet.stream()
+            .map(ArtifactTypeEnum::getType)
+            .collect(Collectors.joining(", "));
+        return String.format("Missing configuration for Artifact Type(s): %s", artifactTypeAsString);
+    }
+
+}
index affa2d3..94d9a8e 100644 (file)
 
 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<ArtifactTypeEnum> getBaseArtifacts() {
+        final List<ArtifactTypeEnum> 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 (file)
index 0000000..14e6792
--- /dev/null
@@ -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<ArtifactTypeEnum> 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<ArtifactConfiguration> 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