Configuration file runtime reload 75/101175/5
authorandre.schmid <andre.schmid@est.tech>
Wed, 29 Jan 2020 17:38:07 +0000 (17:38 +0000)
committerOfir Sonsino <ofir.sonsino@intl.att.com>
Tue, 18 Feb 2020 16:06:10 +0000 (16:06 +0000)
Reloads the backend configuration file when the file
listener catches a change.
Forces validations errors when the configuration file
could not be parsed.
Remove not used configurations.

Change-Id: Ic6fcb2b557d52ec53074c38ab8e0fcfa96e9be67
Issue-ID: SDC-2758
Signed-off-by: andre.schmid <andre.schmid@est.tech>
27 files changed:
asdctool/sdc-cassandra-init/chef-repo/cookbooks/cassandra-actions/templates/default/configuration.yaml.erb
asdctool/src/main/resources/config/configuration.yaml
catalog-be/sdc-backend/chef-repo/cookbooks/sdc-catalog-be/templates/default/BE-configuration.yaml.erb
catalog-be/src/main/java/org/openecomp/sdc/be/components/distribution/engine/DistributionEngine.java
catalog-be/src/main/resources/config/configuration.yaml
catalog-be/src/test/resources/config/catalog-be/auth/configuration.yaml
catalog-be/src/test/resources/config/catalog-be/configuration.yaml
catalog-fe/src/test/resources/config/catalog-fe/configuration.yaml
catalog-model/src/test/resources/config/catalog-model/configuration.yaml
catalog-model/src/test/resources/config/configuration.yaml
catalog-ui/src/app/services/configuration-ui-service.ts
common-app-api/src/main/java/org/openecomp/sdc/be/config/Configuration.java
common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java
common-app-api/src/main/java/org/openecomp/sdc/common/api/ConfigurationSource.java
common-app-api/src/main/java/org/openecomp/sdc/common/api/FileChangeCallback.java
common-app-api/src/main/java/org/openecomp/sdc/common/api/exception/LoadConfigurationException.java [new file with mode: 0644]
common-app-api/src/main/java/org/openecomp/sdc/common/impl/ConfigFileChangeListener.java
common-app-api/src/main/java/org/openecomp/sdc/common/impl/FSConfigurationSource.java
common-app-api/src/main/java/org/openecomp/sdc/common/util/YamlToObjectConverter.java
common-app-api/src/main/java/org/openecomp/sdc/exception/YamlConversionException.java [new file with mode: 0644]
common-app-api/src/test/java/org/openecomp/sdc/common/util/YamlToObjectConverterTest.java
common-app-api/src/test/java/org/openecomp/sdc/fe/config/WorkspaceConfigurationTest.java
common-app-api/src/test/resources/config/fe/workspace-configuration.yaml [moved from common-app-api/src/test/resources/config/common/workspace-configuration.yaml with 100% similarity]
docs/configuration.rst
openecomp-be/lib/openecomp-core-lib/openecomp-nosqldb-lib/openecomp-nosqldb-core/src/main/resources/configuration.yaml
openecomp-be/tools/zusammen-tools/src/test/resources/configuration.yaml
test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml

index 93bb2de..69f82ac 100644 (file)
@@ -584,8 +584,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 3fd8579..f4eb081 100644 (file)
@@ -33,6 +33,7 @@ import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.resources.data.OperationalEnvironmentEntry;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.common.util.YamlToObjectConverter;
+import org.openecomp.sdc.exception.YamlConversionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -76,7 +77,7 @@ public class DistributionEngine implements IDistributionEngine {
      * The main method for testing only
      * @param args
      */
-    public static void main(String[] args) {
+    public static void main(String[] args) throws YamlConversionException {
 
         List<String> servers = new ArrayList<>();
         String server = "uebsb91kcdc.it.att.com:3904";
index 3dca458..972f625 100644 (file)
@@ -614,8 +614,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 6cbad54..0e68b32 100644 (file)
@@ -508,8 +508,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index b982c38..9bd8849 100644 (file)
@@ -516,8 +516,6 @@ resourceInformationalArtifacts:
         validForResourceTypes:
             - PNF
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 5cc22fd..0d9f101 100644 (file)
@@ -22,13 +22,6 @@ threadpoolSize: 50
 # request processing timeout (seconds)
 requestTimeout: 10
 
-# a4c hostname
-a4cHost: localhost
-
-# a4c http port
-a4cHttpPort: 8088
-
-
 identificationHeaderFields: 
    -
         - &HTTP_IV_USER HTTP_IV_USER
index a1aaa3a..052add6 100644 (file)
@@ -523,8 +523,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 767fc42..adf065c 100644 (file)
@@ -515,8 +515,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
@@ -655,5 +653,4 @@ dmaapConsumerConfiguration:
         password: hmXYcznAljMSisdy8zgcag==
         
 dmeConfiguration:
-    dme2Search: DME2SEARCH
-    dme2Resolve: DME2RESOLVE
+    lookupUriFormat: "http://DME2RESOLVE/service=%s/version=1.0.0/envContext=%s/routeOffer=DEFAULT"
index 766df7a..463a974 100644 (file)
@@ -18,7 +18,7 @@
  * ============LICENSE_END=========================================================
  */
 
-'use strict'
+'use strict';
 import {IAppConfigurtaion, IApi} from "../models/app-config";
 
 interface IConfigurationUiService {
index 5d5afe0..711268e 100644 (file)
@@ -95,7 +95,6 @@ public class Configuration extends BasicConfiguration {
     private Map<String, ArtifactTypeConfig> serviceDeploymentArtifacts;
     private Map<String, ArtifactTypeConfig> resourceInstanceDeploymentArtifacts;
     private Map<String, ArtifactTypeConfig> resourceInformationalArtifacts;
-    private Map<String, ArtifactTypeConfig> resourceInformationalDeployedArtifacts;
     private Map<String, Object> serviceApiArtifacts;
     private List<String> excludeServiceCategory;
 
@@ -144,29 +143,23 @@ public class Configuration extends BasicConfiguration {
     private CadiFilterParams cadiFilterParams;
 
     private Boolean aafAuthNeeded;
-
     private String autoHealingOwner;
     private boolean enableAutoHealing;
-
     private Map<String, List<String>> resourcesForUpgrade;
     private DmaapConsumerConfiguration dmaapConsumerConfiguration;
     private DmaapProducerConfiguration dmaapProducerConfiguration;
-
     private boolean skipUpgradeFailedVfs;
     private boolean skipUpgradeVSPs;
     private DmeConfiguration dmeConfiguration;
-
     private boolean supportAllottedResourcesAndProxy;
     private Integer deleteLockTimeoutInSeconds;
     private Integer maxDeleteComponents;
     private CookieConfig authCookie;
-
-
     private String aafNamespace;
     private String workloadContext;
-
     private EnvironmentContext environmentContext;
-
+    private List<GabConfig> gabConfig;
+    private EcompPortalConfig ecompPortal;
 
     public String getAutoHealingOwner() {
         return autoHealingOwner;
@@ -207,7 +200,6 @@ public class Configuration extends BasicConfiguration {
     public void setDmaapConsumerConfiguration(DmaapConsumerConfiguration dmaapConsumerConfiguration) {
         this.dmaapConsumerConfiguration = dmaapConsumerConfiguration;
     }
-
     public DmeConfiguration getDmeConfiguration() {
         return dmeConfiguration;
     }
@@ -215,6 +207,7 @@ public class Configuration extends BasicConfiguration {
     public void setDmeConfiguration(DmeConfiguration dmeConfiguration) {
         this.dmeConfiguration = dmeConfiguration;
     }
+
     public void setSkipUpgradeVSPs(boolean skipUpgradeVSPs) { this.skipUpgradeVSPs = skipUpgradeVSPs; }
 
     public boolean getSkipUpgradeVSPsFlag() { return skipUpgradeVSPs; }
@@ -251,8 +244,6 @@ public class Configuration extends BasicConfiguration {
         this.artifactGeneratorConfig = artifactGeneratorConfig;
     }
 
-    private List<GabConfig> gabConfig;
-
     public Map<String, String> getGenericAssetNodeTypes() {
         return genericAssetNodeTypes;
     }
@@ -285,8 +276,6 @@ public class Configuration extends BasicConfiguration {
         this.applicationL2Cache = applicationL2Cache;
     }
 
-    private EcompPortalConfig ecompPortal;
-
     public CassandrConfig getCassandraConfig() {
         return cassandraConfig;
     }
@@ -1212,6 +1201,8 @@ public class Configuration extends BasicConfiguration {
         private Integer port;
         private String healthCheckUri;
         private String defaultFunctionalMenu;
+        private Integer pollingInterval;
+        private Integer timeoutMs;
 
         public void setPollingInterval(Integer pollingInterval) {
             this.pollingInterval = pollingInterval;
@@ -1221,9 +1212,6 @@ public class Configuration extends BasicConfiguration {
             this.timeoutMs = timeoutMs;
         }
 
-        private Integer pollingInterval;
-        private Integer timeoutMs;
-
         public String getProtocol() {
             return protocol;
         }
@@ -1583,15 +1571,6 @@ public class Configuration extends BasicConfiguration {
         this.artifactsIndex = artifactsIndex;
     }
 
-    public Map<String, ArtifactTypeConfig> getResourceInformationalDeployedArtifacts() {
-        return resourceInformationalDeployedArtifacts;
-    }
-
-    public void setResourceInformationalDeployedArtifacts(
-            Map<String, ArtifactTypeConfig> resourceInformationalDeployedArtifacts) {
-        this.resourceInformationalDeployedArtifacts = resourceInformationalDeployedArtifacts;
-    }
-
     public List<String> getResourceTypes() {
         return resourceTypes;
     }
index 0e9fd24..101b60e 100644 (file)
@@ -36,6 +36,7 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura
 
        ConfigurationSource configurationSource = null;
        private static ConfigurationManager instance;
+       final Map<String, Object> configurations = new HashMap<>();
 
     @VisibleForTesting
     public ConfigurationManager() {
@@ -43,7 +44,6 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura
         instance = this;
     }
 
-    Map<String, Object> configurations = new HashMap<>();
        public ConfigurationManager(ConfigurationSource configurationSource) {
                super();
                this.configurationSource = configurationSource;
@@ -124,7 +124,11 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura
                return instance;
        }
 
-    public void reconfigure(BasicConfiguration obj) { }
+    public void reconfigure(final BasicConfiguration basicConfiguration) {
+               if (basicConfiguration instanceof Configuration) {
+                       configurations.put(getKey(Configuration.class), basicConfiguration);
+               }
+       }
 
        /**
         * FOR TEST ONLY
index 5901d1e..12982ca 100644 (file)
@@ -22,7 +22,7 @@ package org.openecomp.sdc.common.api;
 
 public interface ConfigurationSource {
 
-       public <T> T getAndWatchConfiguration(Class<T> className, ConfigurationListener configurationListener);
+       <T> T getAndWatchConfiguration(Class<T> className, ConfigurationListener configurationListener);
 
-       public <T> void addWatchConfiguration(Class<T> className, ConfigurationListener configurationListener);
+       <T> void addWatchConfiguration(Class<T> className, ConfigurationListener configurationListener);
 }
index 5c4d3d5..9684c98 100644 (file)
@@ -20,8 +20,9 @@
 
 package org.openecomp.sdc.common.api;
 
+@FunctionalInterface
 public interface FileChangeCallback {
 
-       public void reconfigure(BasicConfiguration obj);
+       void reconfigure(BasicConfiguration obj);
 
 }
diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/api/exception/LoadConfigurationException.java b/common-app-api/src/main/java/org/openecomp/sdc/common/api/exception/LoadConfigurationException.java
new file mode 100644 (file)
index 0000000..dff83c6
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * ============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.common.api.exception;
+
+public class LoadConfigurationException extends RuntimeException {
+
+    public LoadConfigurationException(final String s, final Throwable throwable) {
+        super(s, throwable);
+    }
+}
index e243bac..c94db9a 100644 (file)
 
 package org.openecomp.sdc.common.impl;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.jci.listeners.FileChangeListener;
 import org.openecomp.sdc.common.api.BasicConfiguration;
 import org.openecomp.sdc.common.api.ConfigurationListener;
 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.common.util.YamlToObjectConverter;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.openecomp.sdc.exception.YamlConversionException;
 
 public class ConfigFileChangeListener extends FileChangeListener {
 
-       private static Logger log = Logger.getLogger(ConfigFileChangeListener.class.getName());
+       private static final Logger LOGGER = Logger.getLogger(ConfigFileChangeListener.class.getName());
 
        private Map<String, List<ConfigurationListener>> fileChangeToCallBack = new HashMap<>();
 
@@ -45,45 +46,46 @@ public class ConfigFileChangeListener extends FileChangeListener {
 
        @Override
        public void onFileChange(File pFile) {
-
                super.onFileChange(pFile);
 
-               if (pFile != null) {
-
-                       if (fileChangeToCallBack != null) {
-
-                               String id = findIdFromFileName(pFile.getName());
-
-                               if (id != null) {
-
-                                       List<ConfigurationListener> listeners = fileChangeToCallBack.get(id);
-                                       if (listeners != null) {
-                                               for (ConfigurationListener configurationListener : listeners) {
-
-                                                       Class<? extends BasicConfiguration> configClass = configurationListener.getType();
-
-                                                       BasicConfiguration basicConfiguration = yamlToObjectConverter.convert(pFile.getAbsolutePath(), configClass);
-
-                                                       if (basicConfiguration == null) {
-                                                               log.warn(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Cannot update the listeners for file Change since the file content is invalid");
-                                                               continue;
-                                                       }
-                                                       log.debug("Loaded configuration after converting is {}", basicConfiguration);
-
+               if (pFile == null) {
+                       LOGGER.debug("Invalid file '{}'.", pFile);
+                       return;
+               }
 
-                                                       configurationListener.getCallBack().reconfigure(basicConfiguration);
+               if (fileChangeToCallBack == null) {
+                       LOGGER.debug("File '{}' callback is null.", pFile);
+                       return;
+               }
 
-                                               }
-                                       }
-                               } else {
+               final String id = findIdFromFileName(pFile.getName());
+               if (id == null) {
+                       LOGGER.warn(EcompLoggerErrorCode.UNKNOWN_ERROR,"","",
+                               "Cannot calculate id from file {}", pFile.getName());
+                       return;
+               }
 
-                                       log.warn(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Cannot calculate id from file {}", pFile.getName());
-                               }
+               final List<ConfigurationListener> listeners = fileChangeToCallBack.get(id);
+               if (CollectionUtils.isEmpty(listeners)) {
+                       LOGGER.debug("No file listeners for file '{}', id '{}'.", pFile, id);
+                       return;
+               }
+               for (final ConfigurationListener configurationListener : listeners) {
+                       final Class<? extends BasicConfiguration> configClass = configurationListener.getType();
+                       final BasicConfiguration basicConfiguration;
+                       try {
+                               basicConfiguration = yamlToObjectConverter.convert(pFile.getAbsolutePath(), configClass);
+                       } catch (final YamlConversionException e) {
+                               LOGGER.warn(EcompLoggerErrorCode.SCHEMA_ERROR,
+                                       "Configuration", "Configuration",
+                                       "Cannot update the listeners for file Change since the file content is invalid: {}",
+                                       e.getLocalizedMessage());
+                               continue;
                        }
-
+                       LOGGER.debug("Loaded configuration after converting is {}", basicConfiguration);
+                       configurationListener.getCallBack().reconfigure(basicConfiguration);
                }
-
-               log.debug("File {} was changed.", pFile);
+               LOGGER.debug("File {} was changed.", pFile);
        }
 
        private String findIdFromFileName(String name) {
@@ -95,10 +97,6 @@ public class ConfigFileChangeListener extends FileChangeListener {
                        if (name.contains(File.separator)) {
                                startIndex = name.lastIndexOf(File.separator);
                        }
-                       // String subNameString = name.substring(startIndex, endIndex);
-                       // if (subNameString.contains(".")) {
-                       // endIndex = subNameString.indexOf(".");
-                       // }
 
                        result = name.substring(startIndex, endIndex);
 
@@ -126,20 +124,4 @@ public class ConfigFileChangeListener extends FileChangeListener {
 
        }
 
-       // public void notify(String id, BasicConfiguration object) {
-       //
-       // if (fileChangeToCallBack != null) {
-       // List<ConfigurationListener> listeners = fileChangeToCallBack
-       // .get(id);
-       // if (listeners != null) {
-       // for (ConfigurationListener configurationListener : listeners) {
-       //
-       // configurationListener.getCallBack().reconfigure(object);
-       //
-       // }
-       // }
-       // }
-       //
-       // }
-
 }
index 8cab431..3820f2c 100644 (file)
@@ -27,7 +27,9 @@ import java.util.stream.Collectors;
 import org.openecomp.sdc.common.api.ConfigurationListener;
 import org.openecomp.sdc.common.api.ConfigurationSource;
 import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.api.exception.LoadConfigurationException;
 import org.openecomp.sdc.common.util.YamlToObjectConverter;
+import org.openecomp.sdc.exception.YamlConversionException;
 
 /**
  * Read configuration from file system
@@ -55,16 +57,21 @@ public class FSConfigurationSource implements ConfigurationSource {
         * 
         * @see org.openecomp.sdc.common.api.ConfigurationSource#getAndWatchConfiguration (java.lang.Class, org.openecomp.sdc.common.api.ConfigurationListener)
         */
-       public <T> T getAndWatchConfiguration(Class<T> className, ConfigurationListener configurationListener) {
+       public <T> T getAndWatchConfiguration(final Class<T> className, final ConfigurationListener configurationListener) {
 
-               String configFileName = calculateFileName(className);
+               final String configFileName = calculateFileName(className);
 
-               T object = yamlToObjectConverter.convert(this.appConfigDir, className, configFileName);
+               T object;
+               try {
+                       object = yamlToObjectConverter.convert(this.appConfigDir, className, configFileName);
+               } catch (final YamlConversionException e) {
+                       final String errorMsg =
+                               String.format("Could not load '%s' in '%s' for class '%s'", configFileName, appConfigDir, className);
+                       throw new LoadConfigurationException(errorMsg, e);
+               }
 
                if (configurationListener != null && changeListener != null) {
-                       if (object != null) {
-                               changeListener.register(configFileName, configurationListener);
-                       }
+                       changeListener.register(configFileName, configurationListener);
                }
 
                return object;
index b2435de..756670c 100644 (file)
 
 package org.openecomp.sdc.common.util;
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.commons.codec.binary.Base64;
-import org.openecomp.sdc.be.config.Configuration.*;
+import org.openecomp.sdc.be.config.Configuration.ApplicationL1CacheConfig;
+import org.openecomp.sdc.be.config.Configuration.ApplicationL2CacheConfig;
+import org.openecomp.sdc.be.config.Configuration.ArtifactTypeConfig;
+import org.openecomp.sdc.be.config.Configuration.BeMonitoringConfig;
+import org.openecomp.sdc.be.config.Configuration.EcompPortalConfig;
+import org.openecomp.sdc.be.config.Configuration.OnboardingConfig;
+import org.openecomp.sdc.be.config.Configuration.SwitchoverDetectorConfig;
+import org.openecomp.sdc.be.config.Configuration.ToscaValidatorsConfig;
 import org.openecomp.sdc.be.config.DistributionEngineConfiguration;
 import org.openecomp.sdc.be.config.DistributionEngineConfiguration.ComponentArtifactTypesConfig;
 import org.openecomp.sdc.be.config.DistributionEngineConfiguration.CreateTopicConfig;
@@ -30,21 +45,11 @@ import org.openecomp.sdc.be.config.DistributionEngineConfiguration.DistributionS
 import org.openecomp.sdc.be.config.validation.DeploymentArtifactHeatConfiguration;
 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
 import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.YamlConversionException;
 import org.openecomp.sdc.fe.config.Configuration.FeMonitoringConfig;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.introspector.PropertyUtils;
-import org.yaml.snakeyaml.nodes.Node;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
 
 public class YamlToObjectConverter {
 
@@ -132,115 +137,51 @@ public class YamlToObjectConverter {
                return yaml;
        }
 
-       public <T> T convert(String dirPath, Class<T> className, String configFileName) {
-
-               T config = null;
-
-               try {
-
-                       String fullFileName = dirPath + File.separator + configFileName;
-
-                       config = convert(fullFileName, className);
-
-               } catch (Exception e) {
-                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Failed to convert yaml file {} to object.", configFileName,e);
+       public <T> T convert(final String dirPath, final Class<T> className,
+                                                final String configFileName) throws YamlConversionException {
+               if (className == null) {
+                       throw new IllegalArgumentException("className cannot be null");
                }
-
-               return config;
+               final String fullFileName = dirPath + File.separator + configFileName;
+               return convert(fullFileName, className);
        }
 
-       public class MyYamlConstructor extends org.yaml.snakeyaml.constructor.Constructor {
-               private HashMap<String, Class<?>> classMap = new HashMap<>();
-
-               public MyYamlConstructor(Class<? extends Object> theRoot) {
-                       super(theRoot);
-                       classMap.put(DistributionEngineConfiguration.class.getName(), DistributionEngineConfiguration.class);
-                       classMap.put(DistributionStatusTopicConfig.class.getName(), DistributionStatusTopicConfig.class);
+       public <T> T convert(String fullFileName, Class<T> className) throws YamlConversionException {
+               if (!new File(fullFileName).exists()) {
+                       log.warn(EcompLoggerErrorCode.UNKNOWN_ERROR,"","",
+                               "The file {} cannot be found. Ignore reading configuration.", fullFileName);
+                       return null;
                }
 
-               /*
-                * This is a modified version of the Constructor. Rather than using a
-                * class loader to get external classes, they are already predefined
-                * above. This approach works similar to the typeTags structure in the
-                * original constructor, except that class information is pre-populated
-                * during initialization rather than runtime.
-                *
-                * @see
-                * org.yaml.snakeyaml.constructor.Constructor#getClassForNode(org.yaml.
-                * snakeyaml.nodes.Node)
-                */
-               protected Class<?> getClassForNode(Node node) {
-                       String name = node.getTag().getClassName();
-                       Class<?> cl = classMap.get(name);
-                       if (cl == null)
-                               throw new YAMLException("Class not found: " + name);
-                       else
-                               return cl;
-               }
-       }
-
-       public <T> T convert(String fullFileName, Class<T> className) {
-
-               T config = null;
-
-               Yaml yaml = getYamlByClassName(className);
-
-               InputStream in = null;
-               try {
+               final Yaml yaml = getYamlByClassName(className);
 
-                       File f = new File(fullFileName);
-                       if (!f.exists()) {
-                               log.warn(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","The file {} cannot be found. Ignore reading configuration.",fullFileName);
-                               return null;
-                       }
-                       in = Files.newInputStream(Paths.get(fullFileName));
-
-                       config = yaml.loadAs(in, className);
-
-                       // System.out.println(config.toString());
+               try (final InputStream in = Files.newInputStream(Paths.get(fullFileName))) {
+                       return yaml.loadAs(in, className);
+               } catch (final IOException e) {
+                       log.debug("Failed to open/close input stream", e);
                } catch (Exception e) {
-                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Failed to convert yaml file {} to object.", fullFileName, e);
-               } finally {
-                       if (in != null) {
-                               try {
-                                       in.close();
-                               } catch (IOException e) {
-                                       log.debug("Failed to close input stream", e);
-                                       e.printStackTrace();
-                               }
-                       }
+                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","",
+                               "Failed to convert yaml file {} to object.", fullFileName, e);
+                       final String errorMsg = String.format("Could not parse '%s' to class '%s'", fullFileName, className);
+                       throw new YamlConversionException(errorMsg, e);
                }
 
-               return config;
+               return null;
        }
 
        public <T> T convert(byte[] fileContents, Class<T> className) {
-
-               T config = null;
-
-               Yaml yaml = getYamlByClassName(className);
-
-               InputStream in = null;
-               try {
-
-                       in = new ByteArrayInputStream(fileContents);
-
-                       config = yaml.loadAs(in, className);
-
-               } catch (Exception e) {
-                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Failed to convert yaml file to object", e);
-               } finally {
-                       if (in != null) {
-                               try {
-                                       in.close();
-                               } catch (IOException e) {
-                                       log.debug("Failed to close input stream", e);
-                                       e.printStackTrace();
-                               }
-                       }
+               final Yaml yaml = getYamlByClassName(className);
+
+               try (final InputStream in = new ByteArrayInputStream(fileContents)){
+                       return yaml.loadAs(in, className);
+               } catch (final IOException e) {
+                       log.debug("Failed to open or close input stream", e);
+               } catch (final Exception e) {
+                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,
+                               "","","Failed to convert yaml file to object", e);
                }
 
-               return config;
+               return null;
        }
 
        public boolean isValidYamlEncoded64(byte[] fileContents) {
@@ -261,7 +202,8 @@ public class YamlToObjectConverter {
                         }
                        
                } catch (Exception e) {
-                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","","Failed to convert yaml file to object - yaml is invalid", e);
+                       log.error(EcompLoggerErrorCode.UNKNOWN_ERROR,"","",
+                               "Failed to convert yaml file to object - yaml is invalid", e);
                        return false;
                }
                return true;
diff --git a/common-app-api/src/main/java/org/openecomp/sdc/exception/YamlConversionException.java b/common-app-api/src/main/java/org/openecomp/sdc/exception/YamlConversionException.java
new file mode 100644 (file)
index 0000000..4d8791f
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * ============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.exception;
+
+public class YamlConversionException extends Exception {
+
+    public YamlConversionException(final String s, final Throwable throwable) {
+        super(s, throwable);
+    }
+}
index 49fc553..35af78b 100644 (file)
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import org.openecomp.sdc.exception.YamlConversionException;
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertFalse;
@@ -81,14 +82,14 @@ public class YamlToObjectConverterTest {
     }
 
     @Test
-    public void validateConvertWithFullFilePathReturnsValidObjectCreatedFromYaml() {
+    public void validateConvertWithFullFilePathReturnsValidObjectCreatedFromYaml() throws YamlConversionException {
         Configuration result = yamlToObjectConverter.convert(filePath+fileName, Configuration.class);
 
         assertThatCreatedObjectIsValid(result);
     }
 
     @Test
-    public void validateConvertWithFullFilePathReturnsNullIfFileDoesNotExist() {
+    public void validateConvertWithFullFilePathReturnsNullIfFileDoesNotExist() throws YamlConversionException {
         final String wrongFileName = "wrong-configuration.yaml";
 
         Configuration result = yamlToObjectConverter.convert(wrongFileName, Configuration.class);
@@ -96,28 +97,23 @@ public class YamlToObjectConverterTest {
         assertNull(result);
     }
 
-    @Test
-    public void validateConvertWithFullFilePathReturnsNullIfClassDoesNotMathYaml() {
-
-        HttpClient result = yamlToObjectConverter.convert(filePath+fileName, HttpClient.class);
-
-        assertNull(result);
+    @Test(expected = YamlConversionException.class)
+    public void validateConvertWithFullFilePathThrowsExceptionIfClassDoesNotMathYaml() throws YamlConversionException {
+        yamlToObjectConverter.convert(filePath + fileName, HttpClient.class);
     }
 
     @Test
-    public void validateConvertWithFilePathAndFileNameReturnsValidObjectCreatedFromYaml() {
+    public void validateConvertWithFilePathAndFileNameReturnsValidObjectCreatedFromYaml()
+        throws YamlConversionException {
 
         Configuration result = yamlToObjectConverter.convert(filePath, Configuration.class, fileName);
 
         assertThatCreatedObjectIsValid(result);
     }
 
-    @Test
-    public void validateConvertWithFilePathAndFileNameReturnsNullIfClassIsNull() {
-
-        HttpClient result = yamlToObjectConverter.convert(filePath, null, fileName);
-
-        assertNull(result);
+    @Test(expected = IllegalArgumentException.class)
+    public void validateConvertWithFilePathAndFileNameThrowsExceptionIfClassIsNull() throws YamlConversionException {
+        yamlToObjectConverter.convert(filePath, null, fileName);
     }
 
     @Test
index dd1fe8b..08e9b34 100644 (file)
@@ -41,7 +41,7 @@ public class WorkspaceConfigurationTest {
 
     @Before
     public void setUp() {
-        String appConfigDir = "src/test/resources/config/common";
+        String appConfigDir = "src/test/resources/config/fe";
         ConfigurationSource configurationSource =
                 new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
         configurationManager = new ConfigurationManager(configurationSource);
index 3ce4a5f..1fe2665 100644 (file)
@@ -790,9 +790,6 @@ BE-configuration.yaml
                 - VFC
                 - CVFC
 
-    # Resource informational deployment artifact placeholder
-    resourceInformationalDeployedArtifacts:
-
     # Requirements needed to be fulfilled before certification
     requirementsToFulfillBeforeCert:
 
index c5a82d5..81a548d 100644 (file)
@@ -220,12 +220,6 @@ resourceDeploymentArtifacts:
             - yaml
             - yml
 
-resourceInformationalDeployedArtifacts:
-    YANG_XML:
-        acceptedTypes:
-            - xml
-
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 4dd21e3..44b2759 100644 (file)
@@ -221,12 +221,6 @@ resourceDeploymentArtifacts:
             - yaml
             - yml
 
-resourceInformationalDeployedArtifacts:
-    YANG_XML:
-        acceptedTypes:
-            - xml
-
-
 unLoggedUrls:
    - /sdc2/rest/healthCheck
 
index 897a80b..de9f213 100644 (file)
@@ -536,8 +536,6 @@ resourceInformationalArtifacts:
             - VFC
             - CVFC
 
-resourceInformationalDeployedArtifacts:
-
 requirementsToFulfillBeforeCert:
 
 capabilitiesToConsumeBeforeCert:
@@ -680,5 +678,4 @@ dmaapConsumerConfiguration:
         password: Pass
         
 dmeConfiguration:
-    dme2Search: DME2SEARCH
-    dme2Resolve: DME2RESOLVE
+    lookupUriFormat: "http://DME2RESOLVE/service=%s/version=1.0.0/envContext=%s/routeOffer=DEFAULT"