Merge "Update cadi to 2.1.10 and updated keystore"
authorSébastien Determe <sebastien.determe@intl.att.com>
Mon, 8 Apr 2019 16:34:27 +0000 (16:34 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 8 Apr 2019 16:34:27 +0000 (16:34 +0000)
45 files changed:
extra/sql/bulkload/create-tables.sql
pom.xml
src/main/java/org/onap/clamp/clds/config/spring/CldsConfiguration.java
src/main/java/org/onap/clamp/clds/dao/CldsDao.java
src/main/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParser.java
src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
src/main/java/org/onap/clamp/loop/CsarInstallerImpl.java
src/main/java/org/onap/clamp/loop/Loop.java
src/main/java/org/onap/clamp/loop/LoopController.java
src/main/java/org/onap/clamp/loop/LoopOperation.java
src/main/java/org/onap/clamp/loop/LoopService.java
src/main/java/org/onap/clamp/loop/log/LoopLog.java
src/main/java/org/onap/clamp/loop/log/LoopLogService.java [new file with mode: 0644]
src/main/java/org/onap/clamp/policy/Policy.java
src/main/java/org/onap/clamp/policy/PolicyOperation.java [deleted file]
src/main/java/org/onap/clamp/policy/PolicyService.java
src/main/java/org/onap/clamp/policy/microservice/MicroServicePolicy.java
src/main/java/org/onap/clamp/policy/microservice/MicroservicePolicyService.java
src/main/java/org/onap/clamp/policy/operational/OperationalPolicy.java
src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html
src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js
src/main/resources/META-INF/resources/designer/scripts/propertyController.js
src/main/resources/application-noaaf.properties
src/main/resources/application.properties
src/main/resources/clds/camel/rest/clamp-api-v2.xml
src/main/resources/clds/camel/routes/flexible-flow.xml
src/test/java/org/onap/clamp/clds/sdc/controller/installer/BlueprintParserTest.java
src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java
src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java
src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java
src/test/java/org/onap/clamp/loop/LoopToJsonTest.java
src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java [new file with mode: 0644]
src/test/resources/example/sdc/blueprint-dcae/tca.yaml
src/test/resources/example/sdc/blueprint-dcae/tca_2.yaml
src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
src/test/resources/example/sdc/expected-result/policy-data.yaml [new file with mode: 0644]
src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar [new file with mode: 0755]
src/test/resources/tosca/guard1-policy-payload.json [new file with mode: 0644]
src/test/resources/tosca/guard2-policy-payload.json [new file with mode: 0644]
src/test/resources/tosca/micro-service-policy-payload.json [new file with mode: 0644]
src/test/resources/tosca/micro-service-policy-properties.json [new file with mode: 0644]
src/test/resources/tosca/operational-policy-payload.yaml [new file with mode: 0644]
src/test/resources/tosca/operational-policy-properties.json [new file with mode: 0644]

index 29e0fac..3c261eb 100644 (file)
@@ -35,7 +35,6 @@
 
     create table micro_service_policies (
        name varchar(255) not null,
-        blueprint_name varchar(255) not null,
         json_representation json not null,
         model_type varchar(255) not null,
         policy_tosca MEDIUMTEXT not null,
diff --git a/pom.xml b/pom.xml
index 71c9f29..911ffc6 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -64,8 +64,8 @@
                                <java.version>1.8</java.version>
 
                                <eelf.core.version>1.0.0</eelf.core.version>
-                               <camel.version>2.22.1</camel.version>
-                               <springboot.version>2.0.6.RELEASE</springboot.version>
+                               <camel.version>2.23.1</camel.version>
+                               <springboot.version>2.1.4.RELEASE</springboot.version>
 
                                <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
                                <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
                                                <version>${tomcat.version}</version>
                                </dependency>
                                <!-- For CAMEL -->
+                               <dependency>
+                                       <groupId>org.apache.camel</groupId>
+                                       <artifactId>camel-http4</artifactId>
+                               </dependency>
                                <dependency>
                                                <groupId>org.apache.camel</groupId>
                                                <artifactId>camel-spring-boot-starter</artifactId>
                                <dependency>
                                                <groupId>com.googlecode.json-simple</groupId>
                                                <artifactId>json-simple</artifactId>
+                                               <version>1.1.1</version>
                                </dependency>
                                <dependency>
                                                <groupId>org.apache.commons</groupId>
index 8372e3f..8e1c75b 100644 (file)
@@ -5,20 +5,20 @@
  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
  *                             reserved.
  * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
+ * 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 
+ *
+ * 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.
  * ============LICENSE_END============================================
  * ===================================================================
- * 
+ *
  */
 
 package org.onap.clamp.clds.config.spring;
@@ -28,10 +28,8 @@ import javax.xml.transform.TransformerConfigurationException;
 
 import org.onap.clamp.clds.config.ClampProperties;
 import org.onap.clamp.clds.config.EncodedPasswordBasicDataSource;
-import org.onap.clamp.clds.dao.CldsDao;
 import org.onap.clamp.clds.transform.XslTransformer;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.config.PropertiesFactoryBean;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.ApplicationContext;
@@ -50,7 +48,7 @@ public class CldsConfiguration {
 
     /**
      * Clds Identity database DataSource configuration
-     * 
+     *
      * @return
      */
     @Bean(name = "cldsDataSource")
@@ -66,13 +64,6 @@ public class CldsConfiguration {
         return bean;
     }
 
-    @Bean(name = "cldsDao")
-    public CldsDao getCldsDao(@Qualifier("cldsDataSource") DataSource dataSource) {
-        CldsDao cldsDao = new CldsDao();
-        cldsDao.setDataSource(dataSource);
-        return cldsDao;
-    }
-
     @Bean(name = "cldsBpmnTransformer")
     public XslTransformer getCldsBpmnXslTransformer() throws TransformerConfigurationException {
         XslTransformer xslTransformer = new XslTransformer();
index 5da26b1..0cf68ea 100644 (file)
@@ -26,7 +26,6 @@ package org.onap.clamp.clds.dao;
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 
-import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -35,7 +34,6 @@ import java.util.Map;
 
 import javax.sql.DataSource;
 
-import org.onap.clamp.clds.model.CldsDbServiceCache;
 import org.onap.clamp.clds.model.CldsDictionary;
 import org.onap.clamp.clds.model.CldsDictionaryItem;
 import org.onap.clamp.clds.model.CldsEvent;
@@ -43,11 +41,11 @@ import org.onap.clamp.clds.model.CldsModel;
 import org.onap.clamp.clds.model.CldsModelInstance;
 import org.onap.clamp.clds.model.CldsModelProp;
 import org.onap.clamp.clds.model.CldsMonitoringDetails;
-import org.onap.clamp.clds.model.CldsServiceData;
 import org.onap.clamp.clds.model.CldsTemplate;
 import org.onap.clamp.clds.model.CldsToscaModel;
 import org.onap.clamp.clds.model.ValueItem;
-import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.jdbc.core.namedparam.SqlParameterSource;
@@ -86,14 +84,17 @@ public class CldsDao {
     /**
      * Log message when instantiating.
      */
-    public CldsDao() {
+    @Autowired
+    public CldsDao(@Qualifier("cldsDataSource") DataSource dataSource) {
         logger.info("CldsDao instantiating...");
+        setDataSource(dataSource);
     }
 
     /**
      * When dataSource is provided, instantiate spring jdbc objects.
      *
-     * @param dataSource the data source
+     * @param dataSource
+     *        the data source
      */
     public void setDataSource(DataSource dataSource) {
         this.jdbcTemplateObject = new JdbcTemplate(dataSource);
@@ -117,7 +118,8 @@ public class CldsDao {
     /**
      * Get a model from the database given the model name.
      *
-     * @param modelName the model name
+     * @param modelName
+     *        the model name
      * @return the model
      */
     public CldsModel getModel(String modelName) {
@@ -138,16 +140,19 @@ public class CldsDao {
     /**
      * Get a model from the database given the controlNameUuid.
      *
-     * @param controlNameUuid the control name uuid
+     * @param controlNameUuid
+     *        the control name uuid
      * @return the model by uuid
      */
     public CldsModel getModelByUuid(String controlNameUuid) {
         return getModel(null, controlNameUuid);
     }
+
     /**
      * Get a model and template information from the database given the model name.
      *
-     * @param modelName the model name
+     * @param modelName
+     *        the model name
      * @return model model template
      */
 
@@ -179,8 +184,10 @@ public class CldsDao {
      * Update model in the database using parameter values and return updated model
      * object.
      *
-     * @param model  the model
-     * @param userid the userid
+     * @param model
+     *        the model
+     * @param userid
+     *        the userid
      * @return model
      */
     public CldsModel setModel(CldsModel model, String userid) {
@@ -208,8 +215,10 @@ public class CldsDao {
      * Inserts new modelInstance in the database using parameter values and return
      * updated model object.
      *
-     * @param model              the model
-     * @param modelInstancesList the model instances list
+     * @param model
+     *        the model
+     * @param modelInstancesList
+     *        the model instances list
      */
     public void insModelInstance(CldsModel model, List<CldsModelInstance> modelInstancesList) {
         // Delete all existing model instances for given controlNameUUID
@@ -241,10 +250,14 @@ public class CldsDao {
      * Insert an event in the database - require either modelName or
      * controlNamePrefix/controlNameUuid.
      *
-     * @param modelName         the model name
-     * @param controlNamePrefix the control name prefix
-     * @param controlNameUuid   the control name uuid
-     * @param cldsEvent         the clds event
+     * @param modelName
+     *        the model name
+     * @param controlNamePrefix
+     *        the control name prefix
+     * @param controlNameUuid
+     *        the control name uuid
+     * @param cldsEvent
+     *        the clds event
      * @return clds event
      */
     public CldsEvent insEvent(String modelName, String controlNamePrefix, String controlNameUuid, CldsEvent cldsEvent) {
@@ -268,8 +281,10 @@ public class CldsDao {
     /**
      * Update event with process instance id.
      *
-     * @param eventId           the event id
-     * @param processInstanceId the process instance id
+     * @param eventId
+     *        the event id
+     * @param processInstanceId
+     *        the process instance id
      */
     public void updEvent(String eventId, String processInstanceId) {
         SqlParameterSource in = new MapSqlParameterSource().addValue("v_event_id", eventId)
@@ -291,8 +306,10 @@ public class CldsDao {
      * Update template in the database using parameter values and return updated
      * template object.
      *
-     * @param template the template
-     * @param userid   the userid
+     * @param template
+     *        the template
+     * @param userid
+     *        the userid
      */
     public void setTemplate(CldsTemplate template, String userid) {
         SqlParameterSource in = new MapSqlParameterSource().addValue("v_template_name", template.getName())
@@ -322,7 +339,8 @@ public class CldsDao {
     /**
      * Get a template from the database given the model name.
      *
-     * @param templateName the template name
+     * @param templateName
+     *        the template name
      * @return model template
      */
     public CldsTemplate getTemplate(String templateName) {
@@ -367,7 +385,7 @@ public class CldsDao {
     public List<CldsModelProp> getDeployedModelProperties() {
         List<CldsModelProp> cldsModelPropList = new ArrayList<>();
         String modelsSql = "select m.model_id, m.model_name, mp.model_prop_id, mp.model_prop_text FROM model m, "
-                + "model_properties mp, event e "
+            + "model_properties mp, event e "
             + "WHERE m.model_prop_id = mp.model_prop_id and m.event_id = e.event_id and e.action_cd = 'DEPLOY'";
         List<Map<String, Object>> rows = jdbcTemplateObject.queryForList(modelsSql);
         CldsModelProp cldsModelProp = null;
@@ -421,7 +439,8 @@ public class CldsDao {
     /**
      * Method to delete model from database.
      *
-     * @param modelName the model name
+     * @param modelName
+     *        the model name
      */
     public void deleteModel(String modelName) {
         SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName);
@@ -461,7 +480,8 @@ public class CldsDao {
     /**
      * Method to retrieve a tosca models by Policy Type from database.
      *
-     * @param policyType the policy type
+     * @param policyType
+     *        the policy type
      * @return List of CldsToscaModel
      */
     public List<CldsToscaModel> getToscaModelByPolicyType(String policyType) {
@@ -471,7 +491,8 @@ public class CldsDao {
     /**
      * Method to retrieve a tosca models by toscaModelName, version from database.
      *
-     * @param toscaModelName the tosca model name
+     * @param toscaModelName
+     *        the tosca model name
      * @return List of CldsToscaModel
      */
     public List<CldsToscaModel> getToscaModelByName(String toscaModelName) {
@@ -486,8 +507,7 @@ public class CldsDao {
 
         String toscaModelSql = "SELECT tm.tosca_model_name, tm.tosca_model_id, tm.policy_type, "
             + "tmr.tosca_model_revision_id, tmr.tosca_model_json, tmr.version, tmr.user_id, tmr.createdTimestamp, "
-            + "tmr.lastUpdatedTimestamp "
-            + ((toscaModelName != null) ? (", tmr.tosca_model_yaml ") : " ")
+            + "tmr.lastUpdatedTimestamp " + ((toscaModelName != null) ? (", tmr.tosca_model_yaml ") : " ")
             + "FROM tosca_model tm, tosca_model_revision tmr WHERE tm.tosca_model_id = tmr.tosca_model_id "
             + ((toscaModelName != null) ? (" AND tm.tosca_model_name = '" + toscaModelName + "'") : " ")
             + ((policyType != null) ? (" AND tm.policy_type = '" + policyType + "'") : " ")
@@ -520,8 +540,10 @@ public class CldsDao {
     /**
      * Method to upload a new version of Tosca Model Yaml in Database.
      *
-     * @param cldsToscaModel the clds tosca model
-     * @param userId         the user id
+     * @param cldsToscaModel
+     *        the clds tosca model
+     * @param userId
+     *        the user id
      * @return CldsToscaModel clds tosca model
      */
     public CldsToscaModel updateToscaModelWithNewVersion(CldsToscaModel cldsToscaModel, String userId) {
@@ -537,8 +559,10 @@ public class CldsDao {
     /**
      * Method to upload a new Tosca model Yaml in DB. Default version is 1.0
      *
-     * @param cldsToscaModel the clds tosca model
-     * @param userId         the user id
+     * @param cldsToscaModel
+     *        the clds tosca model
+     * @param userId
+     *        the user id
      * @return CldsToscaModel clds tosca model
      */
     public CldsToscaModel insToscaModel(CldsToscaModel cldsToscaModel, String userId) {
@@ -558,7 +582,8 @@ public class CldsDao {
     /**
      * Method to insert a new Dictionary in Database.
      *
-     * @param cldsDictionary the clds dictionary
+     * @param cldsDictionary
+     *        the clds dictionary
      */
     public void insDictionary(CldsDictionary cldsDictionary) {
         SqlParameterSource in = new MapSqlParameterSource()
@@ -571,9 +596,12 @@ public class CldsDao {
     /**
      * Method to update Dictionary with new info in Database.
      *
-     * @param dictionaryId   the dictionary id
-     * @param cldsDictionary the clds dictionary
-     * @param userId         the user id
+     * @param dictionaryId
+     *        the dictionary id
+     * @param cldsDictionary
+     *        the clds dictionary
+     * @param userId
+     *        the user id
      */
     public void updateDictionary(String dictionaryId, CldsDictionary cldsDictionary, String userId) {
 
@@ -586,8 +614,10 @@ public class CldsDao {
     /**
      * Method to get list of Dictionaries from the Database.
      *
-     * @param dictionaryId   the dictionary id
-     * @param dictionaryName the dictionary name
+     * @param dictionaryId
+     *        the dictionary id
+     * @param dictionaryName
+     *        the dictionary name
      * @return dictionary
      */
     public List<CldsDictionary> getDictionary(String dictionaryId, String dictionaryName) {
@@ -620,8 +650,10 @@ public class CldsDao {
     /**
      * Method to insert a new Dictionary Element for given dictionary in Database.
      *
-     * @param cldsDictionaryItem the clds dictionary item
-     * @param userId             the user id
+     * @param cldsDictionaryItem
+     *        the clds dictionary item
+     * @param userId
+     *        the user id
      */
     public void insDictionarElements(CldsDictionaryItem cldsDictionaryItem, String userId) {
         SqlParameterSource in = new MapSqlParameterSource()
@@ -638,9 +670,12 @@ public class CldsDao {
      * Method to update Dictionary Elements with new info for a given dictionary in
      * Database.
      *
-     * @param dictionaryElementId the dictionary element id
-     * @param cldsDictionaryItem  the clds dictionary item
-     * @param userId              the user id
+     * @param dictionaryElementId
+     *        the dictionary element id
+     * @param cldsDictionaryItem
+     *        the clds dictionary item
+     * @param userId
+     *        the user id
      */
     public void updateDictionaryElements(String dictionaryElementId, CldsDictionaryItem cldsDictionaryItem,
         String userId) {
@@ -659,9 +694,12 @@ public class CldsDao {
      * Method to get list of all dictionary elements for a given dictionary in the
      * Database.
      *
-     * @param dictionaryName       the dictionary name
-     * @param dictionaryId         the dictionary id
-     * @param dictElementShortName the dict element short name
+     * @param dictionaryName
+     *        the dictionary name
+     * @param dictionaryId
+     *        the dictionary id
+     * @param dictElementShortName
+     *        the dict element short name
      * @return dictionary elements
      */
     public List<CldsDictionaryItem> getDictionaryElements(String dictionaryName, String dictionaryId,
@@ -701,7 +739,8 @@ public class CldsDao {
      * Method to get Map of all dictionary elements with key as dictionary short
      * name and value as the full name.
      *
-     * @param dictionaryElementType the dictionary element type
+     * @param dictionaryElementType
+     *        the dictionary element type
      * @return Map of dictionary elements as key value pair
      */
     public Map<String, String> getDictionaryElementsByType(String dictionaryElementType) {
index 7447fba..93374fe 100644 (file)
@@ -27,7 +27,6 @@ import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -88,7 +87,8 @@ public class BlueprintParser {
             }
         }
         String msName = theBiggestMicroServiceKey.toLowerCase().contains(HOLMES_PREFIX) ? HOLMES : TCA;
-        return Collections.singletonList(new MicroService(msName, "", "", "", ""));
+        return Collections
+            .singletonList(new MicroService(msName, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "", ""));
     }
 
     String getName(Entry<String, JsonElement> entry) {
@@ -124,7 +124,7 @@ public class BlueprintParser {
             if (properties.has(POLICYID)) {
                 JsonObject policyIdObj = properties.get(POLICYID).getAsJsonObject();
                 if (policyIdObj.has(POLICY_TYPEID)) {
-                   return policyIdObj.get(POLICY_TYPEID).getAsString();
+                    return policyIdObj.get(POLICY_TYPEID).getAsString();
                 }
             }
         }
index b65a994..65d5592 100644 (file)
@@ -42,6 +42,7 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 import org.apache.commons.io.IOUtils;
+import org.codehaus.plexus.util.StringUtils;
 import org.onap.clamp.clds.exception.sdc.controller.CsarHandlerException;
 import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
 import org.onap.sdc.api.notification.IArtifactInfo;
@@ -71,6 +72,8 @@ public class CsarHandler {
     public static final String RESOURCE_INSTANCE_NAME_PREFIX = "/Artifacts/Resources/";
     public static final String RESOURCE_INSTANCE_NAME_SUFFIX = "/Deployment/";
     public static final String POLICY_DEFINITION_NAME_SUFFIX = "Definitions/policies.yml";
+    public static final String DATA_DEFINITION_NAME_SUFFIX = "Definitions/data.yml";
+    public static final String DATA_DEFINITION_KEY = "data_types:";
 
     public CsarHandler(INotificationData iNotif, String controller, String clampCsarPath) throws CsarHandlerException {
         this.sdcNotification = iNotif;
@@ -159,6 +162,10 @@ public class CsarHandler {
         return csarFilePath;
     }
 
+    public String setFilePath(String newPath) {
+        return csarFilePath = newPath;
+    }
+
     public synchronized ISdcCsarHelper getSdcCsarHelper() {
         return sdcCsarHelper;
     }
@@ -171,12 +178,26 @@ public class CsarHandler {
         return mapOfBlueprints;
     }
 
+    /**
+     * Get the whole policy model Yaml. It combines the content of policies.yaml and data.yaml.
+     * @return The whole policy model yaml
+     * @throws IOException The IO Exception
+     */
     public Optional<String> getPolicyModelYaml() throws IOException {
         String result = null;
         try (ZipFile zipFile = new ZipFile(csarFilePath)) {
             ZipEntry entry = zipFile.getEntry(POLICY_DEFINITION_NAME_SUFFIX);
             if (entry != null) {
-                result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+                ZipEntry data = zipFile.getEntry(DATA_DEFINITION_NAME_SUFFIX);
+                if (data != null) {
+                    String dataStr = IOUtils.toString(zipFile.getInputStream(data), StandardCharsets.UTF_8);
+                    String dataStrWithoutHeader = dataStr.substring(dataStr.indexOf(DATA_DEFINITION_KEY));
+                    String policyStr = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+                    StringUtils.chomp(policyStr);
+                    result = policyStr.concat(dataStrWithoutHeader);
+                } else {
+                    result = IOUtils.toString(zipFile.getInputStream(entry), StandardCharsets.UTF_8);
+                }
             } else {
                 logger.info("Policy model not found inside the CSAR file: " + csarFilePath);
             }
index 05d5c48..9bb9e01 100644 (file)
@@ -163,8 +163,9 @@ public class CsarInstallerImpl implements CsarInstaller {
                 Policy.generatePolicyName(microService.getName(), csar.getSdcNotification().getServiceName(),
                     csar.getSdcNotification().getServiceVersion(),
                     blueprintArtifact.getResourceAttached().getResourceInstanceName(),
-                    blueprintArtifact.getBlueprintArtifactName()), microService.getModelType(),
-                csar.getPolicyModelYaml().orElse(""), false, new HashSet<>(Arrays.asList(newLoop)), microService.getBlueprintName());
+                    blueprintArtifact.getBlueprintArtifactName()),
+                microService.getModelType(), csar.getPolicyModelYaml().orElse(""), false,
+                new HashSet<>(Arrays.asList(newLoop)));
 
             newSet.add(microServicePolicy);
             microService.setMappedNameJpa(microServicePolicy.getName());
index e62874a..a24d344 100644 (file)
@@ -134,7 +134,7 @@ public class Loop implements Serializable {
         this.name = name;
     }
 
-    String getDcaeDeploymentId() {
+    public String getDcaeDeploymentId() {
         return dcaeDeploymentId;
     }
 
@@ -142,7 +142,7 @@ public class Loop implements Serializable {
         this.dcaeDeploymentId = dcaeDeploymentId;
     }
 
-    String getDcaeDeploymentStatusUrl() {
+    public String getDcaeDeploymentStatusUrl() {
         return dcaeDeploymentStatusUrl;
     }
 
@@ -150,7 +150,7 @@ public class Loop implements Serializable {
         this.dcaeDeploymentStatusUrl = dcaeDeploymentStatusUrl;
     }
 
-    String getSvgRepresentation() {
+    public String getSvgRepresentation() {
         return svgRepresentation;
     }
 
@@ -158,7 +158,7 @@ public class Loop implements Serializable {
         this.svgRepresentation = svgRepresentation;
     }
 
-    String getBlueprint() {
+    public String getBlueprint() {
         return blueprint;
     }
 
@@ -166,7 +166,7 @@ public class Loop implements Serializable {
         this.blueprint = blueprint;
     }
 
-    LoopState getLastComputedState() {
+    public LoopState getLastComputedState() {
         return lastComputedState;
     }
 
@@ -174,7 +174,7 @@ public class Loop implements Serializable {
         this.lastComputedState = lastComputedState;
     }
 
-    Set<OperationalPolicy> getOperationalPolicies() {
+    public Set<OperationalPolicy> getOperationalPolicies() {
         return operationalPolicies;
     }
 
@@ -182,7 +182,7 @@ public class Loop implements Serializable {
         this.operationalPolicies = operationalPolicies;
     }
 
-    Set<MicroServicePolicy> getMicroServicePolicies() {
+    public Set<MicroServicePolicy> getMicroServicePolicies() {
         return microServicePolicies;
     }
 
@@ -190,7 +190,7 @@ public class Loop implements Serializable {
         this.microServicePolicies = microServicePolicies;
     }
 
-    JsonObject getGlobalPropertiesJson() {
+    public JsonObject getGlobalPropertiesJson() {
         return globalPropertiesJson;
     }
 
@@ -198,7 +198,7 @@ public class Loop implements Serializable {
         this.globalPropertiesJson = globalPropertiesJson;
     }
 
-    Set<LoopLog> getLoopLogs() {
+    public Set<LoopLog> getLoopLogs() {
         return loopLogs;
     }
 
@@ -221,7 +221,7 @@ public class Loop implements Serializable {
         log.setLoop(this);
     }
 
-    String getDcaeBlueprintId() {
+    public String getDcaeBlueprintId() {
         return dcaeBlueprintId;
     }
 
@@ -229,7 +229,7 @@ public class Loop implements Serializable {
         this.dcaeBlueprintId = dcaeBlueprintId;
     }
 
-    JsonObject getModelPropertiesJson() {
+    public JsonObject getModelPropertiesJson() {
         return modelPropertiesJson;
     }
 
index a02fa93..b862780 100644 (file)
@@ -24,7 +24,6 @@
 package org.onap.clamp.loop;
 
 import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 
@@ -42,9 +41,9 @@ public class LoopController {
 
     private final LoopService loopService;
     private static final Type OPERATIONAL_POLICY_TYPE = new TypeToken<List<OperationalPolicy>>() {
-       }.getType();
+    }.getType();
     private static final Type MICROSERVICE_POLICY_TYPE = new TypeToken<List<MicroServicePolicy>>() {
-       }.getType();
+    }.getType();
 
     @Autowired
     public LoopController(LoopService loopService) {
@@ -61,32 +60,41 @@ public class LoopController {
 
     /**
      * Update the Operational Policy properties.
-     * @param loopName The loop name
-     * @param operationalPoliciesJson The new Operational Policy properties
+     *
+     * @param loopName
+     *        The loop name
+     * @param operationalPoliciesJson
+     *        The new Operational Policy properties
      * @return The updated loop
      */
     public Loop updateOperationalPolicies(String loopName, JsonArray operationalPoliciesJson) {
-        List<OperationalPolicy> operationalPolicies = JsonUtils.GSON
-            .fromJson(operationalPoliciesJson, OPERATIONAL_POLICY_TYPE);
+        List<OperationalPolicy> operationalPolicies = JsonUtils.GSON.fromJson(operationalPoliciesJson,
+            OPERATIONAL_POLICY_TYPE);
         return loopService.updateAndSaveOperationalPolicies(loopName, operationalPolicies);
     }
 
     /**
      * Update the whole array of MicroService policies properties
-     * @param loopName The loop name
-     * @param microServicePoliciesJson The array of all MicroService policies properties
+     *
+     * @param loopName
+     *        The loop name
+     * @param microServicePoliciesJson
+     *        The array of all MicroService policies properties
      * @return The updated loop
      */
     public Loop updateMicroservicePolicies(String loopName, JsonArray microServicePoliciesJson) {
-        List<MicroServicePolicy> microservicePolicies = JsonUtils.GSON
-            .fromJson(microServicePoliciesJson, MICROSERVICE_POLICY_TYPE);
+        List<MicroServicePolicy> microservicePolicies = JsonUtils.GSON.fromJson(microServicePoliciesJson,
+            MICROSERVICE_POLICY_TYPE);
         return loopService.updateAndSaveMicroservicePolicies(loopName, microservicePolicies);
     }
 
     /**
      * Update the global properties
-     * @param loopName The loop name
-     * @param globalProperties The updated global properties
+     *
+     * @param loopName
+     *        The loop name
+     * @param globalProperties
+     *        The updated global properties
      * @return The updated loop
      */
     public Loop updateGlobalPropertiesJson(String loopName, JsonObject globalProperties) {
@@ -95,8 +103,11 @@ public class LoopController {
 
     /**
      * Update one MicroService policy properties
-     * @param loopName The loop name
-     * @param newMicroservicePolicy The new MicroService policy properties
+     *
+     * @param loopName
+     *        The loop name
+     * @param newMicroservicePolicy
+     *        The new MicroService policy properties
      * @return The updated MicroService policy
      */
     public MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) {
@@ -105,11 +116,12 @@ public class LoopController {
 
     /**
      * Get the SVG representation of the loop
-     * @param loopName The loop name
+     * 
+     * @param loopName
+     *        The loop name
      * @return The SVG representation
      */
     public String getSVGRepresentation(String loopName) {
-        return loopService.getClosedLoopModelSVG(loopName);
-
+        return loopService.getLoop(loopName).getSvgRepresentation();
     }
 }
index 7def783..5b55ab0 100644 (file)
@@ -45,7 +45,6 @@ import org.onap.clamp.clds.config.ClampProperties;
 import org.onap.clamp.clds.util.LoggingUtils;
 import org.onap.clamp.clds.util.ONAPLogConstants;
 import org.onap.clamp.exception.OperationException;
-import org.onap.clamp.policy.PolicyOperation;
 import org.onap.clamp.util.HttpConnectionManager;
 import org.slf4j.event.Level;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,30 +58,30 @@ import org.yaml.snakeyaml.Yaml;
 @Component
 public class LoopOperation {
 
-    protected static final EELFLogger logger          = EELFManager.getInstance().getLogger(LoopOperation.class);
-    protected static final EELFLogger auditLogger     = EELFManager.getInstance().getMetricsLogger();
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class);
+    protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
     private final DcaeDispatcherServices dcaeDispatcherServices;
     private final LoopService loopService;
     private LoggingUtils util = new LoggingUtils(logger);
-    private PolicyOperation policyOp;
 
     @Autowired
     private HttpServletRequest request;
 
     @Autowired
-    public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices, 
-            ClampProperties refProp, HttpConnectionManager httpConnectionManager, PolicyOperation policyOp) {
+    public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices,
+        ClampProperties refProp, HttpConnectionManager httpConnectionManager) {
         this.loopService = loopService;
         this.dcaeDispatcherServices = dcaeDispatcherServices;
-        this.policyOp =  policyOp;
     }
 
     /**
      * Deploy the closed loop.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
-     * @throws Exceptions during the operation
+     * @throws Exceptions
+     *         during the operation
      */
     public Loop deployLoop(Exchange camelExchange, String loopName) throws OperationException {
         util.entering(request, "CldsService: Deploy model");
@@ -98,10 +97,9 @@ public class LoopOperation {
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.SUBMITTED) {
-            String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be deployed only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
@@ -118,25 +116,27 @@ public class LoopOperation {
         Map<String, Object> yamlMap = yaml.load(loop.getBlueprint());
         JsonObject bluePrint = wrapSnakeObject(yamlMap).getAsJsonObject();
 
-        loop.setDcaeDeploymentStatusUrl(dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint));
+        loop.setDcaeDeploymentStatusUrl(
+            dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint));
         loop.setLastComputedState(LoopState.DEPLOYED);
         // save the updated loop
-        loopService.saveOrUpdateLoop (loop);
+        loopService.saveOrUpdateLoop(loop);
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("Deploy model completed");
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return  loop;
+        return loop;
     }
 
     /**
      * Un deploy closed loop.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
      */
-    public Loop unDeployLoop(String loopName)  throws OperationException {
+    public Loop unDeployLoop(String loopName) throws OperationException {
         util.entering(request, "LoopOperation: Undeploy the closed loop");
         Date startTime = new Date();
         Loop loop = loopService.getLoop(loopName);
@@ -146,14 +146,13 @@ public class LoopOperation {
             util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO,
                 ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
-        } 
+        }
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.DEPLOYED) {
-            String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be undeployed only when it is in DEPLOYED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
@@ -165,7 +164,7 @@ public class LoopOperation {
         loop.setLastComputedState(LoopState.SUBMITTED);
 
         // save the updated loop
-        loopService.saveOrUpdateLoop (loop);
+        loopService.saveOrUpdateLoop(loop);
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
@@ -175,14 +174,14 @@ public class LoopOperation {
     }
 
     private JsonElement wrapSnakeObject(Object o) {
-        //NULL => JsonNull
+        // NULL => JsonNull
         if (o == null)
             return JsonNull.INSTANCE;
 
         // Collection => JsonArray
         if (o instanceof Collection) {
             JsonArray array = new JsonArray();
-            for (Object childObj : (Collection<?>)o)
+            for (Object childObj : (Collection<?>) o)
                 array.add(wrapSnakeObject(childObj));
             return array;
         }
@@ -192,14 +191,14 @@ public class LoopOperation {
             JsonArray array = new JsonArray();
 
             int length = Array.getLength(array);
-            for (int i=0; i<length; i++)
+            for (int i = 0; i < length; i++)
                 array.add(wrapSnakeObject(Array.get(array, i)));
             return array;
         }
 
         // Map => JsonObject
         if (o instanceof Map) {
-            Map<?, ?> map = (Map<?, ?>)o;
+            Map<?, ?> map = (Map<?, ?>) o;
 
             JsonObject jsonObject = new JsonObject();
             for (final Map.Entry<?, ?> entry : map.entrySet()) {
@@ -217,12 +216,15 @@ public class LoopOperation {
     /**
      * Submit the Ms policies.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
-     * @throws IOException IO exception
-     * @throws Exceptions during the operation
+     * @throws IOException
+     *         IO exception
+     * @throws Exceptions
+     *         during the operation
      */
-    public Loop submitMsPolicies (String loopName) throws OperationException, IOException {
+    public Loop submitMsPolicies(String loopName) throws OperationException, IOException {
         util.entering(request, "LoopOperation: delete microservice policies");
         Date startTime = new Date();
         Loop loop = loopService.getLoop(loopName);
@@ -236,33 +238,34 @@ public class LoopOperation {
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.SUBMITTED && loop.getLastComputedState() != LoopState.DESIGN) {
-            String msg = "Submit MS policies exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Submit MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be deleted only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
         // Establish the api call to Policy to create the ms services
-        policyOp.createMsPolicy(loop.getMicroServicePolicies());
+        // policyOp.createMsPolicy(loop.getMicroServicePolicies());
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("Deletion of MS policies completed");
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return  loop;
+        return loop;
     }
 
-    
     /**
      * Delete the Ms policies.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
-     * @throws IOException IO exception
-     * @throws Exceptions during the operation
+     * @throws IOException
+     *         IO exception
+     * @throws Exceptions
+     *         during the operation
      */
-    public Loop deleteMsPolicies (Exchange camelExchange, String loopName) throws OperationException, IOException {
+    public Loop deleteMsPolicies(Exchange camelExchange, String loopName) throws OperationException, IOException {
         util.entering(request, "LoopOperation: delete microservice policies");
         Date startTime = new Date();
         Loop loop = loopService.getLoop(loopName);
@@ -276,31 +279,32 @@ public class LoopOperation {
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.SUBMITTED) {
-            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be deleted only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
         // Establish the api call to Policy to create the ms services
-        policyOp.deleteMsPolicy(loop.getMicroServicePolicies());
+        // policyOp.deleteMsPolicy(loop.getMicroServicePolicies());
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("Deletion of MS policies completed");
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return  loop;
+        return loop;
     }
 
     /**
      * Delete the operational policy.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
-     * @throws Exceptions during the operation
+     * @throws Exceptions
+     *         during the operation
      */
-    public Loop deleteOpPolicy (Exchange camelExchange, String loopName) throws OperationException {
+    public Loop deleteOpPolicy(Exchange camelExchange, String loopName) throws OperationException {
         util.entering(request, "LoopOperation: delete guard policy");
         Date startTime = new Date();
         Loop loop = loopService.getLoop(loopName);
@@ -314,31 +318,32 @@ public class LoopOperation {
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.SUBMITTED) {
-            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be deleted only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
         // Establish the api call to Policy to delete operational policy
-        //client.deleteOpPolicy();
+        // client.deleteOpPolicy();
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("Deletion of Guard policy completed");
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return  loop;
+        return loop;
     }
 
     /**
      * Delete the Guard policy.
      *
-     * @param loopName the loop name
+     * @param loopName
+     *        the loop name
      * @return the updated loop
-     * @throws Exceptions during the operation
+     * @throws Exceptions
+     *         during the operation
      */
-    public Loop deleteGuardPolicy (Exchange camelExchange, String loopName) throws OperationException {
+    public Loop deleteGuardPolicy(Exchange camelExchange, String loopName) throws OperationException {
         util.entering(request, "LoopOperation: delete operational policy");
         Date startTime = new Date();
         Loop loop = loopService.getLoop(loopName);
@@ -352,20 +357,19 @@ public class LoopOperation {
 
         // verify the current closed loop state
         if (loop.getLastComputedState() != LoopState.SUBMITTED) {
-            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() 
+            String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState()
                 + ". It could be deleted only when it is in SUBMITTED state.";
-            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO,
-                ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
             throw new OperationException(msg);
         }
 
         // Establish the api call to Policy to delete Guard policy
-        //client.deleteOpPolicy();
+        // client.deleteOpPolicy();
 
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("Deletion of operational policy completed");
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
-        return  loop;
+        return loop;
     }
 }
index 34e1b4b..8d61b87 100644 (file)
 
 package org.onap.clamp.loop;
 
+import com.google.gson.JsonObject;
+
 import java.util.List;
 import java.util.Set;
 
-import com.google.gson.JsonObject;
-
 import javax.persistence.EntityNotFoundException;
 
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.clamp.policy.microservice.MicroservicePolicyService;
 import org.onap.clamp.policy.operational.OperationalPolicy;
 import org.onap.clamp.policy.operational.OperationalPolicyService;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 @Service
+@Component
 public class LoopService {
 
     private final LoopsRepository loopsRepository;
@@ -46,15 +48,14 @@ public class LoopService {
     /**
      * Constructor.
      */
-    public LoopService(LoopsRepository loopsRepository,
-        MicroservicePolicyService microservicePolicyService,
+    public LoopService(LoopsRepository loopsRepository, MicroservicePolicyService microservicePolicyService,
         OperationalPolicyService operationalPolicyService) {
         this.loopsRepository = loopsRepository;
         this.microservicePolicyService = microservicePolicyService;
         this.operationalPolicyService = operationalPolicyService;
     }
 
-    public Loop saveOrUpdateLoop(Loop loop) {
+    Loop saveOrUpdateLoop(Loop loop) {
         return loopsRepository.save(loop);
     }
 
@@ -63,61 +64,36 @@ public class LoopService {
     }
 
     public Loop getLoop(String loopName) {
-        return loopsRepository
-            .findById(loopName)
-            .orElse(null);
-    }
-
-    String getClosedLoopModelSVG(String loopName) {
-        Loop closedLoopByName = findClosedLoopByName(loopName);
-        return closedLoopByName.getSvgRepresentation();
+        return loopsRepository.findById(loopName).orElse(null);
     }
 
     Loop updateAndSaveOperationalPolicies(String loopName, List<OperationalPolicy> newOperationalPolicies) {
         Loop loop = findClosedLoopByName(loopName);
-        updateOperationalPolicies(loop, newOperationalPolicies);
+        Set<OperationalPolicy> newPolicies = operationalPolicyService.updatePolicies(loop, newOperationalPolicies);
+        loop.setOperationalPolicies(newPolicies);
         return loopsRepository.save(loop);
     }
 
     Loop updateAndSaveMicroservicePolicies(String loopName, List<MicroServicePolicy> newMicroservicePolicies) {
         Loop loop = findClosedLoopByName(loopName);
-        updateMicroservicePolicies(loop, newMicroservicePolicies);
+        Set<MicroServicePolicy> newPolicies = microservicePolicyService.updatePolicies(loop, newMicroservicePolicies);
+        loop.setMicroServicePolicies(newPolicies);
         return loopsRepository.save(loop);
     }
 
     Loop updateAndSaveGlobalPropertiesJson(String loopName, JsonObject newGlobalPropertiesJson) {
         Loop loop = findClosedLoopByName(loopName);
-        updateGlobalPropertiesJson(loop, newGlobalPropertiesJson);
+        loop.setGlobalPropertiesJson(newGlobalPropertiesJson);
         return loopsRepository.save(loop);
     }
 
     MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) {
         Loop loop = findClosedLoopByName(loopName);
-        MicroServicePolicy newPolicies = microservicePolicyService
-                .getAndUpdateMicroServicePolicy(loop, newMicroservicePolicy);
+        MicroServicePolicy newPolicies = microservicePolicyService.getAndUpdateMicroServicePolicy(loop,
+            newMicroservicePolicy);
         return newPolicies;
     }
 
-    private Loop updateOperationalPolicies(Loop loop, List<OperationalPolicy> newOperationalPolicies) {
-        Set<OperationalPolicy> newPolicies = operationalPolicyService
-                .updatePolicies(loop, newOperationalPolicies);
-
-        loop.setOperationalPolicies(newPolicies);
-        return loop;
-    }
-
-    private Loop updateMicroservicePolicies(Loop loop, List<MicroServicePolicy> newMicroservicePolicies) {
-        Set<MicroServicePolicy> newPolicies = microservicePolicyService
-                .updatePolicies(loop, newMicroservicePolicies);
-        loop.setMicroServicePolicies(newPolicies);
-        return loop;
-    }
-
-    private Loop updateGlobalPropertiesJson(Loop loop, JsonObject newGlobalPropertiesJson) {
-        loop.setGlobalPropertiesJson(newGlobalPropertiesJson);
-        return loop;
-    }
-
     private Loop findClosedLoopByName(String loopName) {
         return loopsRepository.findById(loopName)
             .orElseThrow(() -> new EntityNotFoundException("Couldn't find closed loop named: " + loopName));
index 0c51c0c..3edb2ee 100644 (file)
@@ -40,6 +40,7 @@ import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
+
 import org.onap.clamp.loop.Loop;
 
 /**
@@ -79,6 +80,15 @@ public class LoopLog implements Serializable {
     @Column(name = "log_instant", nullable = false)
     private Instant logInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS);
 
+    public LoopLog() {
+    }
+
+    public LoopLog(String message, LogType logType, Loop loop) {
+        this.message = message;
+        this.logType = logType;
+        this.loop = loop;
+    }
+
     public Long getId() {
         return id;
     }
diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
new file mode 100644 (file)
index 0000000..b593b41
--- /dev/null
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.loop.log;
+
+import org.onap.clamp.loop.Loop;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoopLogService {
+
+    private final LoopLogRepository repository;
+
+    @Autowired
+    public LoopLogService(LoopLogRepository repository) {
+        this.repository = repository;
+    }
+
+    public void addLog(String message, String logType, Loop loop) {
+        repository.save(new LoopLog(message, LogType.valueOf(logType), loop));
+    }
+}
index 683881b..f4efab0 100644 (file)
@@ -31,13 +31,21 @@ public interface Policy {
 
     JsonObject getJsonRepresentation();
 
+    String createPolicyPayload();
+
     /**
      * Generate the policy name.
-     * @param policyType The policy type
-     * @param serviceName The service name
-     * @param serviceVersion The service version
-     * @param resourceName The resource name
-     * @param blueprintFilename The blueprint file name
+     *
+     * @param policyType
+     *        The policy type
+     * @param serviceName
+     *        The service name
+     * @param serviceVersion
+     *        The service version
+     * @param resourceName
+     *        The resource name
+     * @param blueprintFilename
+     *        The blueprint file name
      * @return The generated policy name
      */
     static String generatePolicyName(String policyType, String serviceName, String serviceVersion, String resourceName,
diff --git a/src/main/java/org/onap/clamp/policy/PolicyOperation.java b/src/main/java/org/onap/clamp/policy/PolicyOperation.java
deleted file mode 100644 (file)
index edce8ff..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights
- *                             reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.policy;
-
-import java.io.IOException;
-import java.util.Set;
-
-import org.onap.clamp.clds.config.ClampProperties;
-import org.onap.clamp.policy.microservice.MicroServicePolicy;
-import org.onap.clamp.util.HttpConnectionManager;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-
-@Component
-public class PolicyOperation {
-    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyOperation.class);
-    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
-    public static final String POLICY_MSTYPE_PROPERTY_NAME = "policy.ms.type";
-    public static final String POLICY_ONAPNAME_PROPERTY_NAME = "policy.onap.name";
-    public static final String POLICY_BASENAME_PREFIX_PROPERTY_NAME = "policy.base.policyNamePrefix";
-    public static final String POLICY_OP_NAME_PREFIX_PROPERTY_NAME = "policy.op.policyNamePrefix";
-    public static final String POLICY_MS_NAME_PREFIX_PROPERTY_NAME = "policy.ms.policyNamePrefix";
-    public static final String POLICY_OP_TYPE_PROPERTY_NAME = "policy.op.type";
-    public static final String POLICY_GUARD_SUFFIX = "_Guard";
-    public static final String POLICY_URL_PROPERTY_NAME = "clamp.config.policy.url";
-    public static final String POLICY_URL_SUFFIX = "/versions/1.0.0/policies";
-    public static final String POLICY_USER_NAME = "clamp.config.policy.userName";
-    public static final String POLICY_PASSWORD = "clamp.config.policy.password";
-
-    public static final String TOSCA_DEF_VERSION = "tosca_definitions_version";
-    public static final String TOSCA_DEF_VERSION_VALUE = "tosca_simple_yaml_1_0_0";
-    public static final String TEMPLATE = "topology_template";
-    public static final String POLICIES = "policies";
-    public static final String MS_TYPE = "type";
-    public static final String MS_VERSION = "version";
-    public static final String MS_VERSION_VALUE = "1.0.0";
-    public static final String MS_METADATA = "metadata";
-    public static final String MS_POLICY_ID = "policy_id";
-    public static final String MS_PROPERTIES = "properties";
-    public static final String MS_policy = "tca_policy";
-
-    private final ClampProperties refProp;
-    private final HttpConnectionManager httpConnectionManager;
-
-    @Autowired
-    public PolicyOperation(ClampProperties refProp, HttpConnectionManager httpConnectionManager) {
-        this.refProp = refProp;
-        this.httpConnectionManager = httpConnectionManager;
-    }
-
-    public void createMsPolicy(Set<MicroServicePolicy> policyList) throws IOException {
-        // Get policy first? if exist delete???
-        // push pdp group
-        for (MicroServicePolicy msPolicy:policyList) {
-            JsonObject payload = createMsPolicyPayload(msPolicy);
-            String policyType = msPolicy.getModelType();
-            String url = refProp.getStringValue(POLICY_URL_PROPERTY_NAME) + policyType + POLICY_URL_SUFFIX;
-            String userName = refProp.getStringValue(POLICY_USER_NAME);
-            String encodedPass = refProp.getStringValue(POLICY_PASSWORD);
-            httpConnectionManager.doHttpRequest(url, "POST", payload.toString(), "application/json", "POLICY", userName, encodedPass);
-        }
-    }
-
-    public void deleteMsPolicy(Set<MicroServicePolicy> policyList) throws IOException {
-        for (MicroServicePolicy msPolicy:policyList) {
-            String policyType = msPolicy.getModelType();
-            String url = refProp.getStringValue(POLICY_URL_PROPERTY_NAME) + policyType + POLICY_URL_SUFFIX + "/" + msPolicy.getName();
-            String userName = refProp.getStringValue(POLICY_USER_NAME);
-            String encodedPass = refProp.getStringValue(POLICY_PASSWORD);
-            httpConnectionManager.doHttpRequest(url, "POST", null, null, "POLICY", userName, encodedPass);
-        }
-    }
-
-    private JsonObject createMsPolicyPayload(MicroServicePolicy microService) {
-        JsonObject policyConfig = new JsonObject();
-        policyConfig.add(MS_policy, microService.getProperties());
-
-        JsonObject properties = new JsonObject();
-        properties.add(MS_policy, policyConfig);
-
-        JsonObject msPolicy = new JsonObject();
-        msPolicy.addProperty(MS_TYPE, microService.getModelType());
-        msPolicy.addProperty(MS_VERSION, MS_VERSION_VALUE);
-        JsonObject metaData = new JsonObject();
-        metaData.addProperty(MS_POLICY_ID, microService.getName());
-        msPolicy.add(MS_METADATA, metaData);
-        msPolicy.add(MS_PROPERTIES, properties);
-
-        JsonObject msPolicyWithName = new JsonObject();
-        msPolicyWithName.add(microService.getName(), msPolicy);
-
-        JsonArray policyArray = new JsonArray();
-        policyArray.add(msPolicyWithName);
-
-        JsonObject template =  new JsonObject();
-        template.add(POLICIES, policyArray);
-
-        JsonObject configPolicy = new JsonObject();
-        configPolicy.addProperty(TOSCA_DEF_VERSION, TOSCA_DEF_VERSION_VALUE);
-        configPolicy.add(TEMPLATE, template);
-
-        return configPolicy;
-    }
-
-}
index 05785c0..ae15f86 100644 (file)
@@ -25,12 +25,12 @@ package org.onap.clamp.policy;
 
 import java.util.List;
 import java.util.Set;
+
 import org.onap.clamp.loop.Loop;
 
 public interface PolicyService<T extends Policy> {
 
-    Set<T> updatePolicies(Loop loop,
-        List<T> newMicroservicePolicies);
+    Set<T> updatePolicies(Loop loop, List<T> newPolicies);
 
     boolean isExisting(String policyName);
 }
index c2c60c9..332b20a 100644 (file)
 
 package org.onap.clamp.policy.microservice;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.Expose;
 
 import java.io.Serializable;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.ManyToMany;
 import javax.persistence.Table;
@@ -39,11 +44,13 @@ import javax.persistence.Table;
 import org.hibernate.annotations.Type;
 import org.hibernate.annotations.TypeDef;
 import org.hibernate.annotations.TypeDefs;
+import org.json.JSONObject;
 import org.onap.clamp.clds.tosca.ToscaYamlToJsonConvertor;
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
 import org.onap.clamp.loop.Loop;
 import org.onap.clamp.policy.Policy;
+import org.yaml.snakeyaml.Yaml;
 
 @Entity
 @Table(name = "micro_service_policies")
@@ -63,10 +70,6 @@ public class MicroServicePolicy implements Serializable, Policy {
     @Column(nullable = false, name = "model_type")
     private String modelType;
 
-    @Expose
-    @Column(nullable = false, name = "blueprint_name")
-    private String blueprintName;
-
     @Expose
     @Type(type = "json")
     @Column(columnDefinition = "json", name = "properties")
@@ -84,7 +87,7 @@ public class MicroServicePolicy implements Serializable, Policy {
     @Column(columnDefinition = "json", name = "json_representation", nullable = false)
     private JsonObject jsonRepresentation;
 
-    @ManyToMany(mappedBy = "microServicePolicies")
+    @ManyToMany(mappedBy = "microServicePolicies", fetch = FetchType.EAGER)
     private Set<Loop> usedByLoops = new HashSet<>();
 
     public MicroServicePolicy() {
@@ -92,15 +95,22 @@ public class MicroServicePolicy implements Serializable, Policy {
     }
 
     /**
-     * The constructor.
-     * @param name The name of the MicroService
-     * @param type The model type of the MicroService
-     * @param blueprintName The name in the blueprint
-     * @param policyTosca The policy Tosca of the MicroService
-     * @param shared The flag indicate whether the MicroService is shared
-     * @param usedByLoops The list of loops that uses this MicroService
+     * The constructor that create the json representation from the policyTosca
+     * using the ToscaYamlToJsonConvertor.
+     *
+     * @param name
+     *        The name of the MicroService
+     * @param type
+     *        The model type of the MicroService
+     * @param policyTosca
+     *        The policy Tosca of the MicroService
+     * @param shared
+     *        The flag indicate whether the MicroService is shared
+     * @param usedByLoops
+     *        The list of loops that uses this MicroService
      */
-    public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared, Set<Loop> usedByLoops, String blueprintName) {
+    public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared,
+        Set<Loop> usedByLoops) {
         this.name = name;
         this.modelType = modelType;
         this.policyTosca = policyTosca;
@@ -108,28 +118,39 @@ public class MicroServicePolicy implements Serializable, Policy {
         this.jsonRepresentation = JsonUtils.GSON_JPA_MODEL
             .fromJson(new ToscaYamlToJsonConvertor(null).parseToscaYaml(policyTosca), JsonObject.class);
         this.usedByLoops = usedByLoops;
-        this.blueprintName = blueprintName;
+    }
+
+    private JsonObject createJsonFromPolicyTosca() {
+        Map<String, Object> map = new Yaml().load(this.getPolicyTosca());
+        JSONObject jsonObject = new JSONObject(map);
+        return new Gson().fromJson(jsonObject.toString(), JsonObject.class);
     }
 
     /**
-     * The constructor.
-     * @param name The name of the MicroService
-     * @param type The model type of the MicroService
-     * @param blueprintName The name in the blueprint
-     * @param policyTosca The policy Tosca of the MicroService
-     * @param shared The flag indicate whether the MicroService is shared
-     * @param jsonRepresentation The UI representation in json format
-     * @param usedByLoops The list of loops that uses this MicroService
+     * The constructor that does not make use of ToscaYamlToJsonConvertor but take
+     * the jsonRepresentation instead.
+     *
+     * @param name
+     *        The name of the MicroService
+     * @param type
+     *        The model type of the MicroService
+     * @param policyTosca
+     *        The policy Tosca of the MicroService
+     * @param shared
+     *        The flag indicate whether the MicroService is shared
+     * @param jsonRepresentation
+     *        The UI representation in json format
+     * @param usedByLoops
+     *        The list of loops that uses this MicroService
      */
-    public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared, JsonObject jsonRepresentation,
-        Set<Loop> usedByLoops, String blueprintName) {
+    public MicroServicePolicy(String name, String modelType, String policyTosca, Boolean shared,
+        JsonObject jsonRepresentation, Set<Loop> usedByLoops) {
         this.name = name;
         this.modelType = modelType;
         this.policyTosca = policyTosca;
         this.shared = shared;
         this.usedByLoops = usedByLoops;
         this.jsonRepresentation = jsonRepresentation;
-        this.blueprintName = blueprintName;
     }
 
     @Override
@@ -141,8 +162,8 @@ public class MicroServicePolicy implements Serializable, Policy {
         return modelType;
     }
 
-    public String getBlueprintName() {
-        return blueprintName;
+    void setModelType(String modelType) {
+        this.modelType = modelType;
     }
 
     public JsonObject getProperties() {
@@ -157,7 +178,7 @@ public class MicroServicePolicy implements Serializable, Policy {
         return shared;
     }
 
-    public void setShared(Boolean shared) {
+    void setShared(Boolean shared) {
         this.shared = shared;
     }
 
@@ -165,7 +186,7 @@ public class MicroServicePolicy implements Serializable, Policy {
         return policyTosca;
     }
 
-    public void setPolicyTosca(String policyTosca) {
+    void setPolicyTosca(String policyTosca) {
         this.policyTosca = policyTosca;
     }
 
@@ -174,7 +195,7 @@ public class MicroServicePolicy implements Serializable, Policy {
         return jsonRepresentation;
     }
 
-    public void setJsonRepresentation(JsonObject jsonRepresentation) {
+    void setJsonRepresentation(JsonObject jsonRepresentation) {
         this.jsonRepresentation = jsonRepresentation;
     }
 
@@ -182,7 +203,7 @@ public class MicroServicePolicy implements Serializable, Policy {
         return usedByLoops;
     }
 
-    public void setUsedByLoops(Set<Loop> usedBy) {
+    void setUsedByLoops(Set<Loop> usedBy) {
         this.usedByLoops = usedBy;
     }
 
@@ -216,4 +237,41 @@ public class MicroServicePolicy implements Serializable, Policy {
         return true;
     }
 
+    private String getMicroServicePropertyNameFromTosca(JsonObject object) {
+        return object.getAsJsonObject("policy_types").getAsJsonObject(this.modelType).getAsJsonObject("properties")
+            .keySet().toArray(new String[1])[0];
+    }
+
+    @Override
+    public String createPolicyPayload() {
+        JsonObject toscaJson = createJsonFromPolicyTosca();
+
+        JsonObject policyPayloadResult = new JsonObject();
+
+        policyPayloadResult.add("tosca_definitions_version", toscaJson.get("tosca_definitions_version"));
+
+        JsonObject topologyTemplateNode = new JsonObject();
+        policyPayloadResult.add("topology_template", topologyTemplateNode);
+
+        JsonArray policiesArray = new JsonArray();
+        topologyTemplateNode.add("policies", policiesArray);
+
+        JsonObject thisPolicy = new JsonObject();
+        policiesArray.add(thisPolicy);
+
+        JsonObject policyDetails = new JsonObject();
+        thisPolicy.add(this.getName(), policyDetails);
+        policyDetails.addProperty("type", this.getModelType());
+        policyDetails.addProperty("version", "1.0.0");
+
+        JsonObject policyMetadata = new JsonObject();
+        policyDetails.add("metadata", policyMetadata);
+        policyMetadata.addProperty("policy-id", this.getName());
+
+        JsonObject policyProperties = new JsonObject();
+        policyDetails.add("properties", policyProperties);
+        policyProperties.add(this.getMicroServicePropertyNameFromTosca(toscaJson), this.getProperties());
+        return new GsonBuilder().setPrettyPrinting().create().toJson(policyPayloadResult);
+    }
+
 }
index f95ad3b..59ddaa0 100644 (file)
@@ -33,7 +33,6 @@ import org.onap.clamp.loop.Loop;
 import org.onap.clamp.policy.PolicyService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class MicroservicePolicyService implements PolicyService<MicroServicePolicy> {
@@ -46,7 +45,6 @@ public class MicroservicePolicyService implements PolicyService<MicroServicePoli
     }
 
     @Override
-    @Transactional
     public Set<MicroServicePolicy> updatePolicies(Loop loop, List<MicroServicePolicy> newMicroservicePolicies) {
         return newMicroservicePolicies.stream().map(policy -> getAndUpdateMicroServicePolicy(loop, policy))
             .collect(Collectors.toSet());
@@ -59,21 +57,24 @@ public class MicroservicePolicyService implements PolicyService<MicroServicePoli
 
     /**
      * Get and update the MicroService policy properties.
-     * @param loop The loop
-     * @param policy The new MicroService policy
+     *
+     * @param loop
+     *        The loop
+     * @param policy
+     *        The new MicroService policy
      * @return The updated MicroService policy
      */
-    @Transactional
     public MicroServicePolicy getAndUpdateMicroServicePolicy(Loop loop, MicroServicePolicy policy) {
-        return repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
-            .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(), policy.getShared(),
-                policy.getJsonRepresentation(), Sets.newHashSet(loop), policy.getBlueprintName()));
+        return repository
+            .save(repository.findById(policy.getName()).map(p -> updateMicroservicePolicyProperties(p, policy, loop))
+                .orElse(new MicroServicePolicy(policy.getName(), policy.getModelType(), policy.getPolicyTosca(),
+                    policy.getShared(), policy.getJsonRepresentation(), Sets.newHashSet(loop))));
     }
 
     private MicroServicePolicy updateMicroservicePolicyProperties(MicroServicePolicy oldPolicy,
         MicroServicePolicy newPolicy, Loop loop) {
         oldPolicy.setProperties(newPolicy.getProperties());
-        if (oldPolicy.getUsedByLoops().contains(loop)) {
+        if (!oldPolicy.getUsedByLoops().contains(loop)) {
             oldPolicy.getUsedByLoops().add(loop);
         }
         return oldPolicy;
index c1e075d..b6b591d 100644 (file)
 
 package org.onap.clamp.policy.operational;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.Expose;
+
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import javax.persistence.Column;
-import javax.persistence.Convert;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
+
 import org.hibernate.annotations.Type;
 import org.hibernate.annotations.TypeDef;
 import org.hibernate.annotations.TypeDefs;
 import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
 import org.onap.clamp.loop.Loop;
 import org.onap.clamp.policy.Policy;
+import org.yaml.snakeyaml.Yaml;
 
 @Entity
 @Table(name = "operational_policies")
@@ -66,14 +76,18 @@ public class OperationalPolicy implements Serializable, Policy {
     private Loop loop;
 
     public OperationalPolicy() {
-        //Serialization
+        // Serialization
     }
 
     /**
      * The constructor.
-     * @param name The name of the operational policy
-     * @param loop The loop that uses this operational policy
-     * @param configurationsJson The operational policy property in the format of json
+     *
+     * @param name
+     *        The name of the operational policy
+     * @param loop
+     *        The loop that uses this operational policy
+     * @param configurationsJson
+     *        The operational policy property in the format of json
      */
     public OperationalPolicy(String name, Loop loop, JsonObject configurationsJson) {
         this.name = name;
@@ -81,6 +95,7 @@ public class OperationalPolicy implements Serializable, Policy {
         this.configurationsJson = configurationsJson;
     }
 
+    @Override
     public String getName() {
         return name;
     }
@@ -136,4 +151,48 @@ public class OperationalPolicy implements Serializable, Policy {
         return true;
     }
 
+    @Override
+    public String createPolicyPayload() {
+        JsonObject policyPayloadResult = new JsonObject();
+
+        policyPayloadResult.addProperty("tosca_definitions_version", "tosca_simple_yaml_1_0_0");
+
+        JsonObject topologyTemplateNode = new JsonObject();
+        policyPayloadResult.add("topology_template", topologyTemplateNode);
+
+        JsonArray policiesArray = new JsonArray();
+        topologyTemplateNode.add("policies", policiesArray);
+
+        JsonObject operationalPolicy = new JsonObject();
+        policiesArray.add(operationalPolicy);
+
+        JsonObject operationalPolicyDetails = new JsonObject();
+        operationalPolicy.add(this.name, operationalPolicyDetails);
+        operationalPolicyDetails.addProperty("type", "onap.policies.controlloop.Operational");
+        operationalPolicyDetails.addProperty("version", "1.0.0");
+
+        JsonObject metadata = new JsonObject();
+        operationalPolicyDetails.add("metadata", metadata);
+        metadata.addProperty("policy-id", this.name);
+
+        operationalPolicyDetails.add("properties", this.configurationsJson.get("operational_policy"));
+
+        Gson gson = new GsonBuilder().create();
+        Map<?, ?> jsonMap = gson.fromJson(gson.toJson(policyPayloadResult), Map.class);
+        return (new Yaml()).dump(jsonMap);
+    }
+
+    public List<String> createGuardPolicyPayloads() {
+        List<String> result = new ArrayList<>();
+
+        JsonObject guard = new JsonObject();
+        JsonElement guardsList = this.getConfigurationsJson().get("guard_policies");
+        for (Entry<String, JsonElement> guardElem : guardsList.getAsJsonObject().entrySet()) {
+            guard.addProperty("policy-id", guardElem.getKey());
+            guard.add("contents", guardElem.getValue());
+            result.add(new GsonBuilder().create().toJson(guard));
+        }
+        return result;
+    }
+
 }
index cf9382b..a53ad73 100644 (file)
@@ -110,7 +110,9 @@ label {
                                                                <select type="text" id="trigger_policy" name="trigger_policy"
                                                                        class="form-control" ng-model="null_dump"
                                                                        ng-init="initPolicySelect()"
-                                                                       ng-options="policy for policy in policy_ids track by policy"></select>
+                                                                       ng-options="policy for policy in policy_ids track by policy">
+                                                                       <option value="">-- choose an option --</option>
+                                                                       </select>
                                                        </div>
 
                                                        <label for="timeout" class="col-sm-3"
@@ -127,6 +129,13 @@ label {
                                                                        checked="true" class="form-control">
                                                        </div>
                                                </div>
+                                               <div class="form-group clearfix row">
+                                                   <label class="col-sm-4 control-label" for="clname">ControlLoopName</label>
+                                                   <div class="col-sm-8">
+                                                           <input type="text" class="form-control" name="controlLoopName"
+                                                                   readonly="readonly" id="clname" ng-model="clname"/>
+                                                   </div>
+                                               </div>
                                        </div>
                                </form>
                                <div class="panel-heading" style="background-color: white;">
@@ -158,7 +167,8 @@ label {
                                                <label class="col-sm-4 control-label" for="recipe">Recipe</label>
                                                <div class="col-sm-8">
                                                        <select class="form-control" name="recipe" id="recipe"
-                                                               enableFilter="true" ng-click="updateGuardRecipe($event)">
+                                                               enableFilter="true"  ng-model="recipe" ng-click="updateGuardRecipe($event)">
+                                                               <option value="">-- choose an option --</option>
                                                                <option value="Restart">Restart</option>
                                                                <option value="Rebuild">Rebuild</option>
                                                                <option value="Migrate">Migrate</option>
@@ -191,7 +201,8 @@ label {
                                        <div class="form-group clearfix">
                                                <label for="actor" class="col-sm-4 control-label"> Actor</label>
                                                <div class="col-sm-8">
-                                                       <select class="form-control" id="actor" name="actor">
+                                                       <select class="form-control" id="actor" name="actor" ng-click="updateGuardActor($event)" ng-model="actor">
+                                                           <option value="">-- choose an option --</option>
                                                                <option value="APPC">APPC</option>
                                                                <option value="SO">SO</option>
                                                                <option value="VFC">VFC</option>
@@ -212,7 +223,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="success" name="success"
                                                                ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -221,7 +234,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="failure" name="failure"
                                                                ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -230,7 +245,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="failure_timeout"
                                                                name="failure_timeout" ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -239,7 +256,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="failure_retries"
                                                                name="failure_retries" ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -248,7 +267,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="failure_exception"
                                                                name="failure_exception" ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -257,7 +278,9 @@ label {
                                                <div class="col-sm-8">
                                                        <select class="form-control" id="failure_guard"
                                                                name="failure_guard" ng-model="null_dump"
-                                                               ng-options="policy for policy in policy_ids track by policy"></select>
+                                                               ng-options="policy for policy in policy_ids track by policy">
+                                                               <option value="">-- choose an option --</option>
+                                                               </select>
                                                </div>
                                        </div>
                                </form>
@@ -267,7 +290,8 @@ label {
                                                <label for="type" class="col-sm-4 control-label"> Target
                                                        Type</label>
                                                <div class="col-sm-8">
-                                                       <select class="form-control" name="type" id="type">
+                                                       <select class="form-control" name="type" id="type"
+                                                               ng-click="initTargetResourceId()" ng-model="type">
                                                                <option value="VFC">VFC</option>
                                                                <option value="VM">VM</option>
                                                                <option value="VNF">VNF</option>
@@ -279,10 +303,55 @@ label {
                                                        Target ResourceId</label>
                                                <div class="col-sm-8">
                                                        <select class="form-control" name="resourceId" id="resourceId"
-                                                               enableFilter="true">
+                                                               enableFilter="true" ng-click="changeTargetResourceId()"
+                                                               ng-model="resourceId">
+                                                               <option value=""></option>
+                                                               <option value="Other:">Other:</option>
                                                        </select>
                                                </div>
                                        </div>
+                                       <div id="metadata">
+                                               <div class="form-group clearfix">
+                                                       <label for="modelInvariantId" class="col-sm-4 control-label">
+                                                               Model Invariant Id</label>
+                                                       <div class="col-sm-8">
+                                                               <input class="form-control" name="modelInvariantId"
+                                                                       id="modelInvariantId" readonly />
+                                                       </div>
+                                               </div>
+                                               <div class="form-group clearfix">
+                                                       <label for="modelVersionId" class="col-sm-4 control-label">
+                                                               Model Version Id</label>
+                                                       <div class="col-sm-8">
+                                                               <input class="form-control" name="modelVersionId"
+                                                                       id="modelVersionId" readonly />
+                                                       </div>
+                                               </div>
+                                               <div class="form-group clearfix">
+                                                       <label for="modelName" class="col-sm-4 control-label">
+                                                               Model Name</label>
+                                                       <div class="col-sm-8">
+                                                               <input class="form-control" name="modelName" id="modelName"
+                                                                       readonly />
+                                                       </div>
+                                               </div>
+                                               <div class="form-group clearfix">
+                                                       <label for="modelVersion" class="col-sm-4 control-label">
+                                                               Model Version</label>
+                                                       <div class="col-sm-8">
+                                                               <input class="form-control" name="modelVersion"
+                                                                       id="modelVersion" readonly />
+                                                       </div>
+                                               </div>
+                                               <div class="form-group clearfix">
+                                                       <label for="modelCustomizationId" class="col-sm-4 control-label">
+                                                               Model Customization Id</label>
+                                                       <div class="col-sm-8">
+                                                               <input class="form-control" name="modelCustomizationId"
+                                                                       id="modelCustomizationId" readonly />
+                                                       </div>
+                                               </div>
+                                       </div>
                                </form>
                                <div class="form-group clearfix">
                                        <label for="enableGuardPolicy" class="col-sm-4 control-label">
@@ -306,7 +375,7 @@ label {
                                        title="Guard policy associated" style="border: 2px dotted gray;">
 
                                        <div class="form-group clearfix">
-                                               <label class="col-sm-4 control-label" for="id">ID</label>
+                                               <label class="col-sm-4 control-label" for="id">Guard Policy ID</label>
                                                <div class="col-sm-8">
                                                        <input type="text" class="form-control" name="id" id="id" />
                                                </div>
@@ -315,7 +384,7 @@ label {
                                                <label class="col-sm-4 control-label" for="recipe">Recipe</label>
                                                <div class="col-sm-8">
                                                        <input type="text" class="form-control" name="recipe"
-                                                               readonly="readonly" id="recipe" />
+                                                               readonly="readonly" id="recipe"/>
                                                </div>
                                        </div>
                                        <div class="form-group clearfix">
@@ -325,8 +394,13 @@ label {
                                                                readonly="readonly" id="clname" ng-model="clname"/>
                                                </div>
                                        </div>
-                                       
-                                       
+                                       <div class="form-group clearfix">
+                                           <label for="actor" class="col-sm-4 control-label">Actor</label>
+                                               <div class="col-sm-8">
+                                                   <input type="text" class="form-control" name="actor"
+                                                               readonly="readonly" id="actor" />
+                                               </div>
+                                       </div>
                                        <div class="form-group clearfix">
 
                                                <label for="guardTargets" class="col-sm-4 control-label">Guard
index 5a1ac53..4e8855e 100644 (file)
@@ -37,7 +37,8 @@ app
            var allPolicies = {};
            $scope.guardType = "GUARD_MIN_MAX";
            $scope.number = 0;
-           $scope.clname="";
+           $scope.clname = "";
+           $scope.guard_ids = [];
            function getAllFormId() {
 
                    return Array.from(document.getElementsByClassName("formId"));
@@ -54,17 +55,7 @@ app
                    }
                    console.log("No active formId found !");
            }
-           function initTargetResourceId() {
 
-                   if (vf_Services !== null && vf_Services !== undefined) {
-                           // Set all the Resource Invariant UUID in the target resource ID
-                           // list (+Empty and other)
-                           Object.keys(vf_Services["shared"]["byVf"]).forEach(function(key) {
-
-                                   $("#targetResourceId").append($('<option></option>').val(key).html(key));
-                           });
-                   }
-           }
            function add_one_more() {
 
                    console.log("add one more");
@@ -102,6 +93,7 @@ app
                    $(".formId").not($("#formId" + count)).css("display", "none");
                    addCustListen(count);
                    $("#formId" + count + " #id").val("new");
+                   $("#formId" + count + " #clname").val($scope.clname);
                    return count;
            }
            function addCustListen(count) {
@@ -150,10 +142,11 @@ app
            }
            function savePolicyLocally() {
 
-                   var polForm = {}
-                   polForm = serializeElement($("#operationalPolicyHeaderForm"));
+                   var polForm = {};
+                   var clPolForm = {};
+                   clPolForm = serializeElement($("#operationalPolicyHeaderForm"));
+                   allPolicies['guard_policies'] = {};
                    var policiesArray = []
-                   allPolicies['guard_policies'] = [];
                    $.each($(".formId"), function() {
 
                            var policyProperties = serializeElement($("#" + this.id + " .policyProperties"));
@@ -161,9 +154,15 @@ app
                            policiesArray.push(policyProperties);
                            // Now get the Guard
                            if ($("#" + this.id + " #enableGuardPolicy").is(':checked')) {
-                                   allPolicies['guard_policies'].push(serializeElement($("#" + this.id + " .guardProperties")));
+                               var guardPolicyBody = serializeElement($("#" + this.id + " .guardProperties"));
+                               var guardPolicyId = guardPolicyBody['id'];
+                               delete guardPolicyBody['id'];
+
+                                   allPolicies['guard_policies'][guardPolicyId] = guardPolicyBody;
+                                   $scope.guard_ids.push(guardPolicyId);
                            }
                    });
+                   polForm['controlLoop'] = clPolForm;
                    polForm['policies'] = policiesArray;
                    allPolicies['operational_policy'] = polForm;
            }
@@ -183,7 +182,7 @@ app
                    // Set the header
                    $.each($('#operationalPolicyHeaderForm').find('.form-control'), function() {
 
-                           $(this).val(allPolicies['operational_policy'][this.id]);
+                           $(this).val(allPolicies['operational_policy']['controlLoop'][this.id]);
                    });
                    // Set the sub-policies
                    $.each(allPolicies['operational_policy']['policies'], function(opPolicyElemIndex, opPolicyElemValue) {
@@ -198,13 +197,14 @@ app
                            $("#go_properties_tab" + formNum).text(
                            allPolicies['operational_policy']['policies'][opPolicyElemIndex]['id']);
                            // Check if there is a guard set for it
-                           $.each(allPolicies['guard_policies'], function(guardElemIndex, guardElemValue) {
+                           $.each(allPolicies['guard_policies'], function(guardElemId, guardElemValue) {
 
                                    if (guardElemValue.recipe === $($("#formId" + formNum + " #recipe")[0]).val()) {
                                            // Found one, set all guard prop
                                            $.each($('.guardProperties').find('.form-control'), function(guardPropElemIndex,guardPropElemValue) {
+                                               guardElemValue['id'] = guardElemId;
                                                $("#formId"+formNum+" .guardProperties").find("#"+guardPropElemValue.id).val(
-                                                   allPolicies['guard_policies'][guardElemIndex][guardPropElemValue.id]);
+                                                   guardElemValue[guardPropElemValue.id]);
                                            });
                                            // And finally enable the flag
                                            $("#formId" + formNum + " #enableGuardPolicy").prop("checked", true);
@@ -212,6 +212,107 @@ app
                            });
                    });
            }
+           
+           $scope.initTargetResourceId = function() {
+
+                       var recipe = $(event.target).val();
+
+                       var type = $(event.target).val();
+                       
+                       $("#modelName").val("");
+                       $("#modelInvariantId").val("");
+                       $("#modelVersionId").val("");
+                       $("#modelVersion").val("");
+                       $("#modelCustomizationId").val("");
+                       $('#resourceId').empty();
+                       $("#resourceId")
+                                       .append(
+                                                       $('<option></option>').val("")
+                                                                       .html(""));
+                       $("#resourceId").append(
+                                       $('<option></option>').val("Other:")
+                                                       .html("Other:"));
+                       if (type == "VM" || type == "" || type == "VNF" ) {
+                               $("#metadata *").prop('disabled',true);
+                       }
+                       
+                       var resourceVnf = getResourceDetailsProperty();
+                       if (type == "VNF"
+                                       && (null !== resourceVnf || undefined !== resourceVnf)) {
+                               for ( var prop in resourceVnf) {
+                                       var name = resourceVnf[prop]["name"];
+                                       $("#resourceId").append(
+                                                       $('<option></option>')
+                                                                       .val(name).html(name));
+                               }
+
+                       }
+                       var resourceVfc = getResourceDetailsVfcProperty();
+                       if (type == "VFC"
+                                       && (null !== resourceVfc || undefined !== resourceVfc)) {
+                               if (recipe == 'VF Module Create'
+                                               || recipe == 'VF Module Delete') {
+                                       for ( var prop in resourceVfc) {
+                                               if (resourceVfc[prop]["isBase"] == false) {
+                                                       var name = resourceVfc[prop]["name"];
+                                                       $("#resourceId").append(
+                                                                       $('<option></option>')
+                                                                                       .val(name)
+                                                                                       .html(name));
+                                               }
+                                       }
+                               } 
+                       else
+                       {
+                         for ( var prop in resourceVfc) {
+                                    var name = resourceVfc[prop]["name"];
+                             $("#resourceId").append(
+                                    $('<option></option>')
+                                           .val(name).html(name));
+                                       }
+                                       }
+                               }
+           }   
+
+               $scope.changeTargetResourceId = function() {
+                       $("#modelName").val("");
+                       $("#modelInvariantId").val("");
+                       $("#modelVersionId").val("");
+                       $("#modelVersion").val("");
+                       $("#modelCustomizationId").val("");
+                       var resourceVfc = getResourceDetailsVfcProperty();
+                       var type = $("#type").val();
+                       var recipe = $("#recipe").val();
+                       vfBaseName = $(event.target).val();
+                       if (type == "VFC"
+                                       && (null !== resourceVfc || undefined !== resourceVfc)
+                                       && (recipe == 'VF Module Create' || recipe == 'VF Module Delete')) {
+                               for ( var prop in resourceVfc) {
+                                       var name = resourceVfc[prop]["name"];
+                                       if (name == vfBaseName) {
+                                               var vfModuleModelName = resourceVfc[prop]["name"];
+                                               $("#modelName").val(
+                                                               vfModuleModelName);
+                                               var vfModuleModelInvariantUUID = resourceVfc[prop]["invariantUUID"];
+                                               $("#modelInvariantId").val(
+                                                               vfModuleModelInvariantUUID);
+                                               var vfModuleModelUUID = resourceVfc[prop]["UUID"];
+                                               $("#modelVersionId").val(
+                                                               vfModuleModelUUID);
+                                               var vfModuleModelVersion = resourceVfc[prop]["version"];
+                                               $("#modelVersion").val(
+                                                               vfModuleModelVersion);
+                                               var vfModuleModelCustomizationUUID = resourceVfc[prop]["customizationUUID"];
+                                               $("#modelCustomizationId")
+                                                               .val(
+                                                                               vfModuleModelCustomizationUUID);
+                                       }
+                               }
+                       }
+                       else {
+                               $("#metadata *").prop('disabled',true);
+                       }
+               }
 
            $scope.changeGuardPolicyType = function() {
 
@@ -258,13 +359,20 @@ app
                                    add_new_policy();
                            }
                            $("#savePropsBtn").click(function(event) {
-
                                    console.log("save properties triggered");
                                    savePolicyLocally();
+                               for(var i = 0; i <= $scope.guard_ids.length; i++) {
+                                   for(var j = i; j <= $scope.guard_ids.length; j++) {
+                                       if(i != j && $scope.guard_ids[i] == $scope.guard_ids[j]) {
+                                           // duplacated guard policy id exist
+                                               alert("The guard policy ID should be unique.");
+                                               return;
+                                       }
+                                   }
+                               }
                                    angular.element(document.getElementById('formSpan')).scope().submitForm(allPolicies);
                                    $("#close_button").click();
                            });
-                           initTargetResourceId();
                    });
            }
            $scope.init();
@@ -274,6 +382,12 @@ app
                    // Get the second recipe (guard one) and update it
                    $($("#formId" + formNum + " #recipe")[1]).val($(event.target).val());
            }
+           $scope.updateGuardActor = function(event) {
+
+                   var formNum = $(event.target).closest('.formId').attr('id').substring(6);
+                   // Get the second actor (guard one) and update it
+                   $($("#formId" + formNum + " #actor")[1]).val($(event.target).val());
+           }
            // When we change the name of a policy
            $scope.updateTabLabel = function(event) {
 
@@ -302,4 +416,4 @@ app
 
                    });
            };
-    } ]);
\ No newline at end of file
+    } ]);
index 2b32f4d..75c64f3 100644 (file)
@@ -72,7 +72,9 @@ function getMsProperty(type) {
     var msProperties = cl_props["microServicePolicies"];
     for (p in msProperties) {
         if (msProperties[p]["name"] == type) {
-           return JSON.parse(JSON.stringify(msProperties[p]["properties"]));
+               if (msProperties[p]["properties"] !== null && msProperties[p]["properties"] !== undefined) {
+                       return JSON.parse(JSON.stringify(msProperties[p]["properties"]));
+               }
         }
     }
     return null;
@@ -82,7 +84,7 @@ function getMsUI(type) {
     var msProperties = cl_props["microServicePolicies"];
     for (p in msProperties) {
         if (msProperties[p]["name"] == type) {
-           return JSON.parse(JSON.stringify(msProperties[p]["jsonRepresentation"]));
+               return JSON.parse(JSON.stringify(msProperties[p]["jsonRepresentation"]));
         }
     }
     return null;
@@ -111,4 +113,13 @@ function getDeploymentStatusURL() {
 function setDeploymentStatusURL(deploymentStatusURL) {
     cl_props["dcaeDeploymentStatusUrl"] = deploymentStatusURL;
 }
-module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getLastUpdatedStatus,getDeploymentID,getDeploymentStatusURL };
\ No newline at end of file
+
+function getResourceDetailsProperty() {
+       return cl_props["modelPropertiesJson"]["resourceDetails"]["VF"];
+}
+
+function getResourceDetailsVfcProperty() {
+       return cl_props["modelPropertiesJson"]["resourceDetails"]["VFC"];
+}
+
+module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getLastUpdatedStatus,getDeploymentID,getDeploymentStatusURL,getResourceDetailsProperty,getResourceDetailsVfcProperty };
\ No newline at end of file
index 82b2a28..84e97ea 100644 (file)
@@ -135,7 +135,7 @@ clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-
 #
 #
 # Configuration Settings for Policy Engine Components
-clamp.config.policy.url=http://localhost:8085/
+clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/policy/api/v1
 clamp.config.policy.userName=test
 clamp.config.policy.password=test
 clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
index 02acf18..b1077d3 100644 (file)
@@ -150,7 +150,7 @@ clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-
 #
 #
 # Configuration Settings for Policy Engine Components
-clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/pdp/
+clamp.config.policy.url=http://policy.api.simpledemo.onap.org:8081/policy/api/v1
 clamp.config.policy.userName=test
 clamp.config.policy.password=test
 clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
index f339d5d..c17595e 100644 (file)
-<rests xmlns="http://camel.apache.org/schema/spring" >
-    <rest >
-        <get uri="/v2/loop/getAllNames"
-            outType="java.lang.String[]"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=getLoopNames()" />
-            </route>
-        </get>
-        <get uri="/v2/loop/{loopName}"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" />
-            </route>
-        </get>
-        <get uri="/v2/loop/svgRepresentation/{loopName}"
-            outType="java.lang.String"
-            produces="application/xml">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=getSVGRepresentation(${header.loopName})" />
-            </route>
-        </get>
+<rests xmlns="http://camel.apache.org/schema/spring">
+       <rest>
+               <get
+                       uri="/v2/loop/getAllNames"
+                       outType="java.lang.String[]"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=getLoopNames()" />
+                       </route>
+               </get>
+               <get
+                       uri="/v2/loop/{loopName}"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" />
+                       </route>
+               </get>
+               <get
+                       uri="/v2/loop/svgRepresentation/{loopName}"
+                       outType="java.lang.String"
+                       produces="application/xml">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','read')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=getSVGRepresentation(${header.loopName})" />
+                       </route>
+               </get>
 
-        <post uri="/v2/loop/updateGlobalProperties/{loopName}"
-            type="com.google.gson.JsonObject"
-            consumes="application/json"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=updateGlobalPropertiesJson(${header.loopName},${body})" />
-            </route>
-        </post>
-        <post uri="/v2/loop/updateOperationalPolicies/{loopName}"
-            type="com.google.gson.JsonArray"
-            consumes="application/json"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=updateOperationalPolicies(${header.loopName},${body})" />
-            </route>
-        </post>
-        <post uri="/v2/loop/updateMicroservicePolicy/{loopName}"
-            type="org.onap.clamp.policy.microservice.MicroServicePolicy"
-            consumes="application/json"
-            outType="org.onap.clamp.policy.microservice.MicroServicePolicy"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.loop.LoopController?method=updateMicroservicePolicy(${header.loopName},${body})" />
-            </route>
-        </post>
-        <put uri="/v2/loop/deployLoop/{loopName}"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deployLoop(*,${header.loopName})" />
-            </route>
-        </put>
-        <put uri="/v2/loop/undeployLoop/{loopName}"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=unDeployLoop(${header.loopName})" />
-            </route>
-        </put>
-        <put uri="/v2/loop/submit/{loopName}">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitMsPolicies(${header.loopName})" />
-                <!-- <to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitOpPolicy(${header.loopName})" />-->
-                <!--<to uri="bean:org.onap.clamp.operation.LoopOperation?method=submitGuardPolicy(${header.loopName})" /> -->
-            </route>
-        </put>
-        <put uri="/v2/loop/delete/{loopName}"
-            outType="org.onap.clamp.loop.Loop"
-            produces="application/json">
-            <route>
-                <to uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteMsPolicies(${header.loopName})" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteOpPolicy(${header.loopName})" />
-                <to uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteGuardPolicy(${header.loopName})" />
-            </route>
-        </put>
-    </rest>
+               <post
+                       uri="/v2/loop/updateGlobalProperties/{loopName}"
+                       type="com.google.gson.JsonObject"
+                       consumes="application/json"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=updateGlobalPropertiesJson(${header.loopName},${body})" />
+                       </route>
+               </post>
+               <post
+                       uri="/v2/loop/updateOperationalPolicies/{loopName}"
+                       type="com.google.gson.JsonArray"
+                       consumes="application/json"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=updateOperationalPolicies(${header.loopName},${body})" />
+                       </route>
+               </post>
+               <post
+                       uri="/v2/loop/updateMicroservicePolicy/{loopName}"
+                       type="org.onap.clamp.policy.microservice.MicroServicePolicy"
+                       consumes="application/json"
+                       outType="org.onap.clamp.policy.microservice.MicroServicePolicy"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.loop.LoopController?method=updateMicroservicePolicy(${header.loopName},${body})" />
+                       </route>
+               </post>
+               <put
+                       uri="/v2/loop/deployLoop/{loopName}"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.operation.LoopOperation?method=deployLoop(*,${header.loopName})" />
+                       </route>
+               </put>
+               <put
+                       uri="/v2/loop/undeployLoop/{loopName}"
+                       outType="org.onap.clamp.loop.Loop"
+                       produces="application/json">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.operation.LoopOperation?method=unDeployLoop(${header.loopName})" />
+                       </route>
+               </put>
+               <put uri="/v2/loop/submit/{loopName}">
+                       <route>
+                               <setBody>
+                                       <simple>${header.loopName}</simple>
+                               </setBody>
+                               <log
+                                       loggingLevel="INFO"
+                                       message="Loop name received: ${body}"></log>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <setHeader headerName="LoopObject">
+                                       <method
+                                               ref="org.onap.clamp.loop.LoopService"
+                                               method="getLoop" />
+                               </setHeader>
+                               <split streaming="true">
+                                       <simple>${header.LoopObject.getMicroServicePolicies()}
+                                       </simple>
+                                       <setHeader headerName="HttpQueryException">
+                                               <simple resultType="java.lang.Boolean">false</simple>
+                                       </setHeader>
+                                       <to uri="direct:delete-micro-service"/>
+                                       
+                                       <setHeader headerName="HttpQueryException">
+                                               <simple resultType="java.lang.Boolean">true</simple>
+                                       </setHeader>
+                                       <setBody>
+                                               <simple>${body.createPolicyPayload()}</simple>
+                                       </setBody>
+                                       <to uri="direct:create-micro-service"/>
+
+                               </split>
+                       </route>
+               </put>
+               <put
+                       uri="/v2/loop/delete/{loopName}">
+                       <route>
+                               <to
+                                       uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
+                               <to
+                                       uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteMsPolicies(${header.loopName})" />
+                               <to
+                                       uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteOpPolicy(${header.loopName})" />
+                               <to
+                                       uri="bean:org.onap.clamp.operation.LoopOperation?method=deleteGuardPolicy(${header.loopName})" />
+                       </route>
+               </put>
+       </rest>
 </rests>
 
index 2103b4a..b824499 100644 (file)
 <routes xmlns="http://camel.apache.org/schema/spring">
-               <route id="submit">
-                               <from uri="direct:processSubmit" />
-                               <choice>
-                                               <when>
-                                                               <simple> ${exchangeProperty.actionCd} == 'SUBMIT' || ${exchangeProperty.actionCd} == 'RESUBMIT'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
-                                                               <delay>
-                                                                               <constant>30000</constant>
-                                                               </delay>
-                                                               <to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
-                                               </when>
-                                               <when>
-                                                               <simple> ${exchangeProperty.actionCd} == 'DELETE'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate" />
-                                                               <delay>
-                                                                               <constant>30000</constant>
-                                                               </delay>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.ModelDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
-                                               </when>
-                                               <when>
-                                                               <simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
-                                                               <delay>
-                                                                               <constant>30000</constant>
-                                                               </delay>
-                                                               <to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
-                                               </when>
-                                               <when>
-                                                               <simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
-                                               </when>
-                                               <when>
-                                                               <simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
-                                                               <to uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
-                                               </when>
-                               </choice>
-               </route>
+       <route id="submit">
+               <from uri="direct:processSubmit" />
+               <choice>
+                       <when>
+                               <simple> ${exchangeProperty.actionCd} == 'SUBMIT' ||
+                                       ${exchangeProperty.actionCd} == 'RESUBMIT'
+                               </simple>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+                               <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+                               <delay>
+                                       <constant>30000</constant>
+                               </delay>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+                       </when>
+                       <when>
+                               <simple> ${exchangeProperty.actionCd} == 'DELETE'</simple>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDeleteDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.HolmesPolicyDeleteDelegate" />
+                               <delay>
+                                       <constant>30000</constant>
+                               </delay>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
+                               <to uri="bean:org.onap.clamp.clds.client.ModelDeleteDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+                       </when>
+                       <when>
+                               <simple> ${exchangeProperty.actionCd} == 'UPDATE'</simple>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+                               <to uri="bean:org.onap.clamp.clds.client.TcaPolicyDelegate" />
+                               <to uri="bean:org.onap.clamp.clds.client.HolmesPolicyDelegate" />
+                               <delay>
+                                       <constant>30000</constant>
+                               </delay>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+                       </when>
+                       <when>
+                               <simple> ${exchangeProperty.actionCd} == 'STOP'</simple>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.OperationalPolicyDeleteDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.GuardPolicyDeleteDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+                       </when>
+                       <when>
+                               <simple> ${exchangeProperty.actionCd} == 'RESTART'</simple>
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'INITIATED')" />
+                               <to uri="bean:org.onap.clamp.clds.client.GuardPolicyDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.OperationalPolicyDelegate" />
+                               <to
+                                       uri="bean:org.onap.clamp.clds.client.CldsEventDelegate?method=addEvent(*,'COMPLETED')" />
+                       </when>
+               </choice>
+       </route>
+       <route id="delete-micro-service">
+               <from uri="direct:delete-micro-service" />
+
+               <setHeader headerName="CamelHttpMethod">
+                       <constant>DELETE</constant>
+               </setHeader>
+               <setHeader headerName="CamelHttpUri">
+                       <simple>{{clamp.config.policy.url}}/policyTypes/${body.getModelType()}/versions/1.0.0/policies/${body.getName()}
+                       </simple>
+               </setHeader>
+               <setBody>
+                       <constant>null</constant>
+               </setBody>
+               <!--<convertBodyTo type="org.onap.clamp.policy.microservice.MicroServicePolicy"/> -->
+               <log
+                       loggingLevel="INFO"
+                       message="Policy Endpoint for microservice: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+               <toD
+                       uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryException}" />
+
+       </route>
+       <route id="create-micro-service">
+               <from uri="direct:create-micro-service" />
+
+               <setHeader headerName="CamelHttpMethod">
+                       <constant>POST</constant>
+               </setHeader>
+               <setHeader headerName="CamelHttpUri">
+                       <simple>{{clamp.config.policy.url}}/policyTypes/${body.getModelType()}/versions/1.0.0/policies
+                       </simple>
+               </setHeader>
+               <!--<convertBodyTo type="org.onap.clamp.policy.microservice.MicroServicePolicy"/> -->
+               <log
+                       loggingLevel="INFO"
+                       message="Policy Endpoint for microservice: ${header.CamelHttpMethod} ${header.CamelHttpUri}"></log>
+               <toD
+                       uri="http4://policyhost:8085?throwExceptionOnFailure=${header.HttpQueryException}" />
+       </route>
 
 </routes>
\ No newline at end of file
index fbe6e63..93d7166 100644 (file)
@@ -163,7 +163,8 @@ public class BlueprintParserTest {
 
     @Test
     public void fallBackToOneMicroServiceTCATest() {
-        MicroService tcaMS = new MicroService(BlueprintParser.TCA, "", "", "", "");
+        MicroService tcaMS = new MicroService(BlueprintParser.TCA, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "", "",
+            "");
 
         List<MicroService> expected = Collections.singletonList(tcaMS);
         List<MicroService> actual = new BlueprintParser().fallbackToOneMicroService(microServiceBlueprintOldStyleTCA);
@@ -173,7 +174,8 @@ public class BlueprintParserTest {
 
     @Test
     public void fallBackToOneMicroServiceHolmesTest() {
-        MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "", "", "", "");
+        MicroService holmesMS = new MicroService(BlueprintParser.HOLMES, "onap.policy.monitoring.cdap.tca.hi.lo.ap", "",
+            "", "");
 
         List<MicroService> expected = Collections.singletonList(holmesMS);
         List<MicroService> actual = new BlueprintParser()
index 1fe3ff3..17e27d5 100644 (file)
  *
  */
 
-
 package org.onap.clamp.clds.sdc.controller.installer;
 
 import com.google.gson.JsonObject;
+
 import java.io.IOException;
 import java.io.InputStream;
+
 import org.apache.commons.io.IOUtils;
 import org.assertj.core.api.Assertions;
 import org.junit.Before;
@@ -38,7 +39,6 @@ import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.onap.clamp.clds.client.DcaeInventoryServices;
 import org.onap.clamp.clds.config.sdc.BlueprintParserFilesConfiguration;
-import org.onap.clamp.clds.dao.CldsDao;
 import org.onap.clamp.clds.exception.sdc.controller.SdcArtifactInstallerException;
 import org.onap.clamp.clds.service.CldsService;
 import org.onap.clamp.clds.service.CldsTemplateService;
@@ -83,64 +83,54 @@ public class CsarInstallerImplTest {
     private BlueprintArtifact artifact;
 
     /**
-     * Set up method.
-     * throws: Exception
+     * Set up method. throws: Exception
      */
     @Before
     public void setUp() throws Exception {
         String dceaBlueprint = ResourceFileUtil.getResourceAsString("tosca/dcea_blueprint.yml");
         artifact = prepareBlueprintArtifact(dceaBlueprint);
-        csarInstaller = new CsarInstallerImpl(applicationContext, new CldsDao(), new CldsTemplateService(),
-                cldsService, dcaeInventoryServices, new XslTransformer());
+        csarInstaller = new CsarInstallerImpl(applicationContext, null, new CldsTemplateService(), cldsService,
+            dcaeInventoryServices, new XslTransformer());
     }
 
     @Test
     public void shouldReturnInputParametersFromBlueprint() {
-        //given
+        // given
         String expectedBlueprintInputsText = "{\"aaiEnrichmentHost\":\"aai.onap.svc.cluster.local\""
-                + ",\"aaiEnrichmentPort\":\"8443\""
-                + ",\"enableAAIEnrichment\":true"
-                + ",\"dmaap_host\":\"message-router\""
-                + ",\"dmaap_port\":\"3904\""
-                + ",\"enableRedisCaching\":false"
-                + ",\"redisHosts\":\"dcae-redis:6379\""
-                + ",\"tag_version\":"
-                + "\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0\""
-                + ",\"consul_host\":\"consul-server\""
-                + ",\"consul_port\":\"8500\",\"cbs_host\":\"{\\\"test\\\":"
-                + "{\\\"test\\\":\\\"test\\\"}}\",\"cbs_port\":\"10000\""
-                + ",\"external_port\":\"32010\",\"policy_id\":\"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"}";
+            + ",\"aaiEnrichmentPort\":\"8443\"" + ",\"enableAAIEnrichment\":true" + ",\"dmaap_host\":\"message-router\""
+            + ",\"dmaap_port\":\"3904\"" + ",\"enableRedisCaching\":false" + ",\"redisHosts\":\"dcae-redis:6379\""
+            + ",\"tag_version\":"
+            + "\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0\""
+            + ",\"consul_host\":\"consul-server\"" + ",\"consul_port\":\"8500\",\"cbs_host\":\"{\\\"test\\\":"
+            + "{\\\"test\\\":\\\"test\\\"}}\",\"cbs_port\":\"10000\""
+            + ",\"external_port\":\"32010\",\"policy_id\":\"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"}";
 
         JsonObject expectedBlueprintInputs = JsonUtils.GSON.fromJson(expectedBlueprintInputsText, JsonObject.class);
-        //when
+        // when
         String parametersInJson = csarInstaller.getAllBlueprintParametersInJson(artifact);
-        //then
+        // then
         Assertions.assertThat(JsonUtils.GSON.fromJson(parametersInJson, JsonObject.class))
-                .isEqualTo(expectedBlueprintInputs);
+            .isEqualTo(expectedBlueprintInputs);
     }
 
     @Test
     public void shouldReturnBuildModelName() throws SdcArtifactInstallerException {
-        //given
-        String expectedModelName = "CLAMP_test_name_"
-                + "vtest_service_version_"
-                + "test_resource_instance_name_"
-                + "test_artifact_name";
-        prepareMockCsarHandler("name", "test_name",
-                "test_service_version");
+        // given
+        String expectedModelName = "CLAMP_test_name_" + "vtest_service_version_" + "test_resource_instance_name_"
+            + "test_artifact_name";
+        prepareMockCsarHandler("name", "test_name", "test_service_version");
         Mockito.when(resourceInstance.getResourceInstanceName()).thenReturn("test_resource_instance_name");
-        //when
+        // when
         String actualModelName = CsarInstallerImpl.buildModelName(csarHandler, artifact);
-        //then
+        // then
         Assertions.assertThat(actualModelName).isEqualTo(expectedModelName);
     }
 
     @Test
     public void shouldReturnRightMapping() throws SdcArtifactInstallerException, IOException {
-        //given
-        String input = "[{\"blueprintKey\":\"tca_k8s\","
-                + "\"dcaeDeployable\":false,"
-                + "\"files\":{\"svgXmlFilePath\":\"samplePath\",\"bpmnXmlFilePath\":\"samplePath\"}}]";
+        // given
+        String input = "[{\"blueprintKey\":\"tca_k8s\"," + "\"dcaeDeployable\":false,"
+            + "\"files\":{\"svgXmlFilePath\":\"samplePath\",\"bpmnXmlFilePath\":\"samplePath\"}}]";
         BlueprintParserFilesConfiguration filesConfiguration = new BlueprintParserFilesConfiguration();
         filesConfiguration.setBpmnXmlFilePath("samplePath");
         filesConfiguration.setSvgXmlFilePath("samplePath");
@@ -149,10 +139,10 @@ public class CsarInstallerImplTest {
         Mockito.when(applicationContext.getResource(Mockito.any(String.class))).thenReturn(resource);
         Mockito.when(resource.getInputStream()).thenReturn(inputStream);
         csarInstaller.loadConfiguration();
-        //when
+        // when
         BlueprintParserFilesConfiguration configuration = csarInstaller.searchForRightMapping(artifact);
 
-        //then
+        // then
         Assertions.assertThat(configuration.getBpmnXmlFilePath()).isEqualTo("samplePath");
         Assertions.assertThat(configuration.getSvgXmlFilePath()).isEqualTo("samplePath");
     }
@@ -167,7 +157,7 @@ public class CsarInstallerImplTest {
     }
 
     private void prepareMockCsarHandler(String metadataNameMockInput, String metadataNameMockOutput,
-                                        String serviceVersion) {
+        String serviceVersion) {
         Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcCsarHelper);
         Mockito.when(sdcCsarHelper.getServiceMetadata()).thenReturn(metadata);
         Mockito.when(metadata.getValue(metadataNameMockInput)).thenReturn(metadataNameMockOutput);
index 2578f68..0cadef9 100644 (file)
@@ -36,6 +36,7 @@ import javax.transaction.Transactional;
 
 import org.apache.commons.lang3.RandomStringUtils;
 import org.json.JSONException;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
@@ -47,6 +48,7 @@ import org.onap.clamp.clds.sdc.controller.installer.BlueprintArtifact;
 import org.onap.clamp.clds.sdc.controller.installer.CsarHandler;
 import org.onap.clamp.clds.sdc.controller.installer.CsarInstaller;
 import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.onap.sdc.api.notification.IArtifactInfo;
 import org.onap.sdc.api.notification.INotificationData;
 import org.onap.sdc.api.notification.IResourceInstance;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
@@ -55,6 +57,7 @@ import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
@@ -63,7 +66,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 @ActiveProfiles(profiles = "clamp-default,clamp-default-user,clamp-sdc-controller-new")
 public class CsarInstallerItCase {
 
-    private static final String CSAR_ARTIFACT_NAME = "example/sdc/service-Simsfoimap0112.csar";
+    private static final String CSAR_ARTIFACT_NAME = "example/sdc/service-Vloadbalancerms-csar.csar";
     private static final String INVARIANT_SERVICE_UUID = "4cc5b45a-1f63-4194-8100-cd8e14248c92";
     private static final String INVARIANT_RESOURCE1_UUID = "07e266fc-49ab-4cd7-8378-ca4676f1b9ec";
     private static final String INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad";
@@ -129,8 +132,9 @@ public class CsarInstallerItCase {
         // Create helper based on real csar to test policy yaml and global properties
         // set
         SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();
+        String path = Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME).getFile();
         ISdcCsarHelper sdcHelper = factory
-            .getSdcCsarHelper(Thread.currentThread().getContextClassLoader().getResource(CSAR_ARTIFACT_NAME).getFile());
+            .getSdcCsarHelper(path);
         Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(sdcHelper);
 
         // Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper);
@@ -139,6 +143,24 @@ public class CsarInstallerItCase {
         return csarHandler;
     }
 
+    @Test
+    @Transactional
+    public void testGetPolicyModelYaml() throws IOException, SdcToscaParserException, CsarHandlerException {
+        INotificationData notificationData = Mockito.mock(INotificationData.class);
+        IArtifactInfo serviceArtifacts = Mockito.mock(IArtifactInfo.class);
+        Mockito.when(serviceArtifacts.getArtifactType()).thenReturn("TOSCA_CSAR");
+        List<IArtifactInfo> serviceArtifactsList = new ArrayList<>();
+        serviceArtifactsList.add(serviceArtifacts);
+        Mockito.when(notificationData.getServiceArtifacts()).thenReturn(serviceArtifactsList);
+
+        CsarHandler csarHandler = new CsarHandler(notificationData, "", "");
+        csarHandler.setFilePath(Thread.currentThread().getContextClassLoader()
+                .getResource(CSAR_ARTIFACT_NAME).getFile());
+        Optional<String> testyaml = csarHandler.getPolicyModelYaml();
+        Assert.assertEquals(testyaml, Optional.ofNullable(ResourceFileUtil
+                .getResourceAsString("example/sdc/expected-result/policy-data.yaml")));
+    }
+
     @Test
     @Transactional
     public void testIsCsarAlreadyDeployedTca() throws SdcArtifactInstallerException, SdcToscaParserException,
index 9d07415..a935808 100644 (file)
@@ -30,8 +30,8 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 
 import java.time.Instant;
-
 import java.util.HashSet;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.onap.clamp.clds.Application;
@@ -83,19 +83,16 @@ public class LoopRepositoriesItCase {
         return loop;
     }
 
-    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, String policyTosca,
-        String jsonProperties, boolean shared) {
+    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+        String policyTosca, String jsonProperties, boolean shared) {
         MicroServicePolicy µService = new MicroServicePolicy(name, modelType, policyTosca, shared,
-            gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>(), "");
+            gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>());
         µService.setProperties(new Gson().fromJson(jsonProperties, JsonObject.class));
         return µService;
     }
 
-    private LoopLog getLoopLog(LogType type, String message) {
-        LoopLog log = new LoopLog();
-        log.setLogType(type);
-        log.setMessage(message);
-        return log;
+    private LoopLog getLoopLog(LogType type, String message, Loop loop) {
+        return new LoopLog(message, type, loop);
     }
 
     @Test
@@ -105,10 +102,11 @@ public class LoopRepositoriesItCase {
             "123456789", "https://dcaetest.org", "UUID-blueprint");
         OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
         loopTest.addOperationalPolicy(opPolicy);
-        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", "{\"configtype\":\"json\"}",
-            "YamlContent", "{\"param1\":\"value1\"}", true);
+        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+            "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+            "{\"param1\":\"value1\"}", true);
         loopTest.addMicroServicePolicy(microServicePolicy);
-        LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+        LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest);
         loopTest.addLog(loopLog);
 
         // Attemp to save into the database the entire loop
index 9a44d41..2372338 100644 (file)
  *
  */
 
-
 package org.onap.clamp.loop;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 import com.google.gson.JsonObject;
+
 import java.util.Set;
 import java.util.stream.Collectors;
+
+import javax.transaction.Transactional;
+
 import org.assertj.core.util.Lists;
 import org.junit.After;
 import org.junit.Test;
@@ -39,10 +42,9 @@ import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.clamp.policy.operational.OperationalPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.transaction.annotation.Transactional;
+import org.springframework.test.context.junit4.SpringRunner;
 
-@RunWith(SpringJUnit4ClassRunner.class)
+@RunWith(SpringRunner.class)
 @SpringBootTest(classes = Application.class)
 public class LoopServiceTestItCase {
 
@@ -61,18 +63,19 @@ public class LoopServiceTestItCase {
     }
 
     @Test
+    @Transactional
     public void shouldCreateEmptyLoop() {
-        //given
+        // given
         String loopBlueprint = "blueprint";
         String loopSvg = "representation";
         Loop testLoop = createTestLoop(EXAMPLE_LOOP_NAME, loopBlueprint, loopSvg);
         testLoop.setGlobalPropertiesJson(JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
         testLoop.setLastComputedState(LoopState.DESIGN);
 
-        //when
+        // when
         Loop actualLoop = loopService.saveOrUpdateLoop(testLoop);
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop).isEqualTo(loopsRepository.findById(actualLoop.getName()).get());
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
@@ -83,81 +86,77 @@ public class LoopServiceTestItCase {
     }
 
     @Test
+    @Transactional
     public void shouldAddOperationalPolicyToLoop() {
-        //given
+        // given
         saveTestLoopToDb();
-        JsonObject confJson = JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class);
-        String policyName = "policyName";
-        OperationalPolicy operationalPolicy = new OperationalPolicy(policyName, null, confJson);
+        OperationalPolicy operationalPolicy = new OperationalPolicy("policyName", null,
+            JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
 
-        //when
-        Loop actualLoop = loopService
-            .updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(operationalPolicy));
+        // when
+        Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
+            Lists.newArrayList(operationalPolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
         assertThat(savedPolicies).hasSize(1);
-        assertThat(savedPolicies)
-            .usingElementComparatorIgnoringFields("loop")
-            .contains(operationalPolicy);
+        assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop").contains(operationalPolicy);
         OperationalPolicy savedPolicy = savedPolicies.iterator().next();
         assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME);
 
     }
 
     @Test
+    @Transactional
     public void shouldAddMicroservicePolicyToLoop() {
-        //given
+        // given
         saveTestLoopToDb();
-        JsonObject confJson = JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class);
-        String policyName = "policyName";
-        String policyTosca = "policyTosca";
-        MicroServicePolicy microServicePolicy = new MicroServicePolicy(policyName, "", policyTosca, false, confJson, null, "");
+        MicroServicePolicy microServicePolicy = new MicroServicePolicy("policyName", "",
+            "tosca_definitions_version: tosca_simple_yaml_1_0_0", false,
+            JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
 
-        //when
-        Loop actualLoop = loopService
-            .updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(microServicePolicy));
+        // when
+        Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
+            Lists.newArrayList(microServicePolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
         assertThat(savedPolicies).hasSize(1);
         assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops")
             .containsExactly(microServicePolicy);
-        assertThat(savedPolicies).extracting("usedByLoops")
-            .hasSize(1);
+        assertThat(savedPolicies).extracting("usedByLoops").hasSize(1);
 
     }
 
     @Test
     @Transactional
     public void shouldCreateNewMicroservicePolicyAndUpdateJsonRepresentationOfOldOne() {
-        //given
+        // given
         saveTestLoopToDb();
-        String firstPolicyName = "firstPolicyName";
-        JsonObject newJsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
-        String secondPolicyName = "secondPolicyName";
-        String secondPolicyTosca = "secondPolicyTosca";
-        MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy(firstPolicyName, "", "policyTosca",
-            false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, "");
-        loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
 
-        MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy(secondPolicyName, "", secondPolicyTosca, true,
-            newJsonRepresentation, null, "");
+        MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", "", "", false,
+            JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
+        loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
+        MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("secondPolicyName", "",
+            "tosca_definitions_version: tosca_simple_yaml_1_0_0", true, JsonUtils.GSON.fromJson("{}", JsonObject.class),
+            null);
 
-        //when
+        // when
         firstMicroServicePolicy.setProperties(JsonUtils.GSON.fromJson("{\"name1\":\"value1\"}", JsonObject.class));
         Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
             Lists.newArrayList(firstMicroServicePolicy, secondMicroServicePolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
         assertThat(savedPolicies).hasSize(2);
+        assertThat(savedPolicies).contains(firstMicroServicePolicy);
+        assertThat(savedPolicies).contains(secondMicroServicePolicy);
         assertThat(savedPolicies).usingElementComparatorIgnoringFields("usedByLoops")
             .containsExactlyInAnyOrder(firstMicroServicePolicy, secondMicroServicePolicy);
 
@@ -170,26 +169,24 @@ public class LoopServiceTestItCase {
     }
 
     @Test
+    @Transactional
     public void shouldRemoveOldMicroservicePolicyIfNotInUpdatedList() {
-        //given
+        // given
         saveTestLoopToDb();
 
-        JsonObject jsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
-        String firstPolicyName = "firstPolicyName";
-        String secondPolicyName = "policyName";
-        String secondPolicyTosca = "secondPolicyTosca";
-        MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy(firstPolicyName, "", "policyTosca",
-            false, JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null, "");
+        MicroServicePolicy firstMicroServicePolicy = new MicroServicePolicy("firstPolicyName", "",
+            "\"tosca_definitions_version: tosca_simple_yaml_1_0_0\"", false,
+            JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class), null);
         loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstMicroServicePolicy));
 
-        MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy(secondPolicyName, "", secondPolicyTosca, true,
-            jsonRepresentation, null, "");
+        MicroServicePolicy secondMicroServicePolicy = new MicroServicePolicy("policyName", "", "secondPolicyTosca",
+            true, JsonUtils.GSON.fromJson("{}", JsonObject.class), null);
 
-        //when
-        Loop actualLoop = loopService
-            .updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(secondMicroServicePolicy));
+        // when
+        Loop actualLoop = loopService.updateAndSaveMicroservicePolicies(EXAMPLE_LOOP_NAME,
+            Lists.newArrayList(secondMicroServicePolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<MicroServicePolicy> savedPolicies = actualLoop.getMicroServicePolicies();
@@ -202,82 +199,77 @@ public class LoopServiceTestItCase {
     @Test
     @Transactional
     public void shouldCreateNewOperationalPolicyAndUpdateJsonRepresentationOfOldOne() {
-        //given
+        // given
         saveTestLoopToDb();
 
-        String firstPolicyName = "firstPolicyName";
         JsonObject newJsonConfiguration = JsonUtils.GSON.fromJson("{}", JsonObject.class);
-        String secondPolicyName = "secondPolicyName";
-        OperationalPolicy firstOperationalPolicy = new OperationalPolicy(firstPolicyName, null,
+
+        OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null,
             JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
         loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy));
 
-        OperationalPolicy secondOperationalPolicy = new OperationalPolicy(secondPolicyName, null, newJsonConfiguration);
+        OperationalPolicy secondOperationalPolicy = new OperationalPolicy("secondPolicyName", null,
+            newJsonConfiguration);
 
-        //when
+        // when
         firstOperationalPolicy.setConfigurationsJson(newJsonConfiguration);
         Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
             Lists.newArrayList(firstOperationalPolicy, secondOperationalPolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
         assertThat(savedPolicies).hasSize(2);
         assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop")
             .containsExactlyInAnyOrder(firstOperationalPolicy, secondOperationalPolicy);
-        Set<String> policiesLoops = Lists.newArrayList(savedPolicies).stream()
-            .map(OperationalPolicy::getLoop)
-            .map(Loop::getName)
-            .collect(Collectors.toSet());
-        assertThat(policiesLoops)
-            .containsExactly(EXAMPLE_LOOP_NAME);
+        Set<String> policiesLoops = Lists.newArrayList(savedPolicies).stream().map(OperationalPolicy::getLoop)
+            .map(Loop::getName).collect(Collectors.toSet());
+        assertThat(policiesLoops).containsExactly(EXAMPLE_LOOP_NAME);
     }
 
     @Test
+    @Transactional
     public void shouldRemoveOldOperationalPolicyIfNotInUpdatedList() {
-        //given
+        // given
         saveTestLoopToDb();
 
-        JsonObject jsonRepresentation = JsonUtils.GSON.fromJson("{}", JsonObject.class);
-        String firstPolicyName = "firstPolicyName";
-        String secondPolicyName = "policyName";
-        OperationalPolicy firstOperationalPolicy = new OperationalPolicy(firstPolicyName, null,
+        OperationalPolicy firstOperationalPolicy = new OperationalPolicy("firstPolicyName", null,
             JsonUtils.GSON.fromJson(EXAMPLE_JSON, JsonObject.class));
         loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(firstOperationalPolicy));
 
-        OperationalPolicy secondOperationalPolicy = new OperationalPolicy(secondPolicyName, null, jsonRepresentation);
+        OperationalPolicy secondOperationalPolicy = new OperationalPolicy("policyName", null,
+            JsonUtils.GSON.fromJson("{}", JsonObject.class));
 
-        //when
-        Loop actualLoop = loopService
-            .updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME, Lists.newArrayList(secondOperationalPolicy));
+        // when
+        Loop actualLoop = loopService.updateAndSaveOperationalPolicies(EXAMPLE_LOOP_NAME,
+            Lists.newArrayList(secondOperationalPolicy));
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         Set<OperationalPolicy> savedPolicies = actualLoop.getOperationalPolicies();
         assertThat(savedPolicies).hasSize(1);
-        assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop")
-            .containsExactly(secondOperationalPolicy);
+        assertThat(savedPolicies).usingElementComparatorIgnoringFields("loop").containsExactly(secondOperationalPolicy);
         OperationalPolicy savedPolicy = savedPolicies.iterator().next();
         assertThat(savedPolicy.getLoop().getName()).isEqualTo(EXAMPLE_LOOP_NAME);
 
     }
 
     @Test
+    @Transactional
     public void shouldCreateModelPropertiesAndUpdateJsonRepresentationOfOldOne() {
-        //given
+        // given
         saveTestLoopToDb();
         String expectedJson = "{\"test\":\"test\"}";
         JsonObject baseGlobalProperites = JsonUtils.GSON.fromJson("{}", JsonObject.class);
         JsonObject updatedGlobalProperites = JsonUtils.GSON.fromJson(expectedJson, JsonObject.class);
         loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, baseGlobalProperites);
 
-        //when
-        Loop actualLoop = loopService
-                .updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites);
+        // when
+        Loop actualLoop = loopService.updateAndSaveGlobalPropertiesJson(EXAMPLE_LOOP_NAME, updatedGlobalProperites);
 
-        //then
+        // then
         assertThat(actualLoop).isNotNull();
         assertThat(actualLoop.getName()).isEqualTo(EXAMPLE_LOOP_NAME);
         JsonObject returnedGlobalProperties = actualLoop.getGlobalPropertiesJson();
index 1c21897..0e03e1b 100644 (file)
@@ -33,11 +33,11 @@ import java.util.HashSet;
 import java.util.Random;
 
 import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.loop.log.LogType;
 import org.onap.clamp.loop.log.LoopLog;
 import org.onap.clamp.policy.microservice.MicroServicePolicy;
 import org.onap.clamp.policy.operational.OperationalPolicy;
-import org.onap.clamp.clds.util.JsonUtils;
 
 public class LoopToJsonTest {
 
@@ -58,19 +58,17 @@ public class LoopToJsonTest {
         return loop;
     }
 
-    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation, String policyTosca,
-        String jsonProperties, boolean shared) {
+    private MicroServicePolicy getMicroServicePolicy(String name, String modelType, String jsonRepresentation,
+        String policyTosca, String jsonProperties, boolean shared) {
         MicroServicePolicy µService = new MicroServicePolicy(name, modelType, policyTosca, shared,
-            gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>(), "");
+            gson.fromJson(jsonRepresentation, JsonObject.class), new HashSet<>());
         µService.setProperties(new Gson().fromJson(jsonProperties, JsonObject.class));
 
         return µService;
     }
 
-    private LoopLog getLoopLog(LogType type, String message) {
-        LoopLog log = new LoopLog();
-        log.setLogType(type);
-        log.setMessage(message);
+    private LoopLog getLoopLog(LogType type, String message, Loop loop) {
+        LoopLog log = new LoopLog(message, type, loop);
         log.setId(Long.valueOf(new Random().nextInt()));
         return log;
     }
@@ -81,10 +79,11 @@ public class LoopToJsonTest {
             "123456789", "https://dcaetest.org", "UUID-blueprint");
         OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
         loopTest.addOperationalPolicy(opPolicy);
-        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "", "{\"configtype\":\"json\"}",
-            "YamlContent", "{\"param1\":\"value1\"}", true);
+        MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "",
+            "{\"configtype\":\"json\"}", "tosca_definitions_version: tosca_simple_yaml_1_0_0",
+            "{\"param1\":\"value1\"}", true);
         loopTest.addMicroServicePolicy(microServicePolicy);
-        LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+        LoopLog loopLog = getLoopLog(LogType.INFO, "test message", loopTest);
         loopTest.addLog(loopLog);
 
         String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest);
@@ -94,7 +93,7 @@ public class LoopToJsonTest {
         assertNotNull(loopTestDeserialized);
         assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint");
 
-        //svg and blueprint not exposed so wont be deserialized
+        // svg and blueprint not exposed so wont be deserialized
         assertThat(loopTestDeserialized.getBlueprint()).isEqualTo(null);
         assertThat(loopTestDeserialized.getSvgRepresentation()).isEqualTo(null);
 
diff --git a/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java b/src/test/java/org/onap/clamp/policy/microservice/MicroServicePayloadTest.java
new file mode 100644 (file)
index 0000000..c511f34
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.policy.microservice;
+
+import com.google.gson.JsonObject;
+
+import java.io.IOException;
+import java.util.HashSet;
+
+import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class MicroServicePayloadTest {
+
+    @Test
+    public void testPayloadConstruction() throws IOException {
+        MicroServicePolicy policy = new MicroServicePolicy("testPolicy", "onap.policy.monitoring.cdap.tca.hi.lo.app",
+            ResourceFileUtil.getResourceAsString("tosca/tosca_example.yaml"), false, new HashSet<>());
+        policy.setProperties(JsonUtils.GSON.fromJson(
+            ResourceFileUtil.getResourceAsString("tosca/micro-service-policy-properties.json"), JsonObject.class));
+        JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/micro-service-policy-payload.json"),
+            policy.createPolicyPayload(), false);
+    }
+}
diff --git a/src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java b/src/test/java/org/onap/clamp/policy/microservice/OperationalPolicyPayloadTest.java
new file mode 100644 (file)
index 0000000..1f57422
--- /dev/null
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.policy.microservice;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.onap.clamp.policy.operational.OperationalPolicy;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class OperationalPolicyPayloadTest {
+
+    @Test
+    public void testOperationalPolicyPayloadConstruction() throws IOException {
+        JsonObject jsonConfig = new GsonBuilder().create().fromJson(
+            ResourceFileUtil.getResourceAsString("tosca/operational-policy-properties.json"), JsonObject.class);
+        OperationalPolicy policy = new OperationalPolicy("testPolicy", null, jsonConfig);
+        assertThat(policy.createPolicyPayload())
+            .isEqualTo(ResourceFileUtil.getResourceAsString("tosca/operational-policy-payload.yaml"));
+    }
+
+    @Test
+    public void testGuardPolicyPayloadConstruction() throws IOException {
+        JsonObject jsonConfig = new GsonBuilder().create().fromJson(
+            ResourceFileUtil.getResourceAsString("tosca/operational-policy-properties.json"), JsonObject.class);
+        OperationalPolicy policy = new OperationalPolicy("testPolicy", null, jsonConfig);
+
+        List<String> guardsList = policy.createGuardPolicyPayloads();
+
+        JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard1-policy-payload.json"),
+            guardsList.get(0), false);
+
+        JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/guard2-policy-payload.json"),
+            guardsList.get(1), false);
+    }
+}
index 0ab8317..b165907 100644 (file)
@@ -17,6 +17,7 @@ node_templates:
     properties:
       policy_id: 
         get_input: policy_id
+        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
   cdap_host_host:
     type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
     properties:
index f73119f..5590136 100644 (file)
@@ -166,4 +166,5 @@ node_templates:
     properties:
       policy_id:
            get_input: policy_id
+           policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
 
index 0ab8317..b165907 100644 (file)
@@ -17,6 +17,7 @@ node_templates:
     properties:
       policy_id: 
         get_input: policy_id
+        policy_type_id: onap.policy.monitoring.cdap.tca.hi.lo.ap
   cdap_host_host:
     type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
     properties:
diff --git a/src/test/resources/example/sdc/expected-result/policy-data.yaml b/src/test/resources/example/sdc/expected-result/policy-data.yaml
new file mode 100644 (file)
index 0000000..7f2c484
--- /dev/null
@@ -0,0 +1,2008 @@
+#
+# 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.
+#
+tosca_definitions_version: tosca_simple_yaml_1_1
+imports:
+- data.yml
+policy_types:
+  tosca.policies.Root:
+    description: The TOSCA Policy Type all other TOSCA Policy Types derive from
+  tosca.policies.Placement:
+    derived_from: tosca.policies.Root
+    description: The TOSCA Policy Type definition that is used to govern placement of TOSCA nodes or groups of nodes.
+  tosca.policies.Scaling:
+    derived_from: tosca.policies.Root
+    description: The TOSCA Policy Type definition that is used to govern scaling of TOSCA nodes or groups of nodes.
+  tosca.policies.Update:
+    derived_from: tosca.policies.Root
+    description: The TOSCA Policy Type definition that is used to govern update of TOSCA nodes or groups of nodes.
+  tosca.policies.Performance:
+    derived_from: tosca.policies.Root
+    description: The TOSCA Policy Type definition that is used to declare performance requirements for TOSCA nodes or groups of nodes.
+  org.openecomp.policies.placement.Antilocate:
+    derived_from: tosca.policies.Placement
+    description: My placement policy for separation based upon container type value
+    properties:
+      name:
+        type: string
+        description: The name of the policy
+        required: false
+        status: SUPPORTED
+      container_type:
+        type: string
+        description: container type
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - host
+          - region
+          - compute
+  org.openecomp.policies.placement.Colocate:
+    derived_from: tosca.policies.Placement
+    description: Keep associated nodes (groups of nodes) based upon affinity value
+    properties:
+      name:
+        type: string
+        description: The name of the policy
+        required: false
+        status: SUPPORTED
+      affinity:
+        type: string
+        description: affinity
+        required: true
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - host
+          - region
+          - compute
+  org.openecomp.policies.placement.valet.Diversity:
+    derived_from: tosca.policies.Placement
+    description: Valet Diversity
+    properties:
+      level:
+        type: string
+        description: diversity
+        required: false
+        default: host
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - host
+          - rack
+  org.openecomp.policies.placement.valet.Exclusivity:
+    derived_from: tosca.policies.Placement
+    description: Valet Exclusivity
+    properties:
+      level:
+        type: string
+        description: exclusivity
+        required: false
+        default: host
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - host
+          - rack
+  org.openecomp.policies.placement.valet.Affinity:
+    derived_from: tosca.policies.Placement
+    description: Valet Affinity
+    properties:
+      level:
+        type: string
+        description: affinity
+        required: false
+        default: host
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - host
+          - rack
+  org.openecomp.policies.scaling.Fixed:
+    derived_from: tosca.policies.Scaling
+    properties:
+      quantity:
+        description: the exact number of instances to keep up
+        type: integer
+        required: true
+  org.openecomp.policies.External:
+    derived_from: tosca.policies.Root
+    description: externally managed policy (for example, type="network assignment", source="Policy Manager", name="route target")
+    properties:
+      source:
+        type: string
+        description: The name of the server that exposes the policy with predefined type and name.
+        required: false
+      type:
+        type: string
+        description: The type (category) of the policy same as it is defined in the source.
+        required: false
+      name:
+        type: string
+        description: The name of the policy, that related to specific type, same as it is defined in the source.
+        required: false
+  tosca.policies.Monitoring:
+    derived_from: tosca.policies.Root
+    description: A base policy type for all policies that governs monitoring provisioning
+  onap.policy.monitoring.cdap.tca.hi.lo.app:
+    derived_from: tosca.policies.Monitoring
+    version: 1.0.0
+    properties:
+      tca_policy:
+        type: map
+        description: TCA Policy JSON
+        entry_schema:
+          type: onap.datatypes.monitoring.tca_policy
+data_types:
+  tosca.datatypes.Root:
+    description: The TOSCA root Data Type all other TOSCA base Data Types derive from
+  integer:
+    derived_from: tosca.datatypes.Root
+  string:
+    derived_from: tosca.datatypes.Root
+  boolean:
+    derived_from: tosca.datatypes.Root
+  float:
+    derived_from: tosca.datatypes.Root
+  list:
+    derived_from: tosca.datatypes.Root
+  map:
+    derived_from: tosca.datatypes.Root
+  json:
+    derived_from: tosca.datatypes.Root
+  scalar-unit:
+    derived_from: tosca.datatypes.Root
+  scalar-unit.size:
+    derived_from: scalar-unit
+  scalar-unit.time:
+    derived_from: scalar-unit
+  scalar-unit.frequency:
+    derived_from: scalar-unit
+  tosca.datatypes.Credential:
+    derived_from: tosca.datatypes.Root
+    properties:
+      protocol:
+        type: string
+        required: false
+      token_type:
+        type: string
+        default: password
+      token:
+        type: string
+      keys:
+        type: map
+        required: false
+        entry_schema:
+          type: string
+      user:
+        type: string
+        required: false
+  org.openecomp.datatypes.PortMirroringConnectionPointDescription:
+    derived_from: tosca.datatypes.Root
+    properties:
+      nf_naming_code:
+        type: string
+      nfc_naming_code:
+        type: string
+      network_role:
+        type: string
+      pps_capacity:
+        type: string
+      nf_type:
+        type: string
+        description: deprecated
+      nfc_type:
+        type: string
+        description: deprecated
+  tosca.datatypes.TimeInterval:
+    derived_from: tosca.datatypes.Root
+    properties:
+      start_time:
+        type: timestamp
+        required: true
+      end_time:
+        type: timestamp
+        required: true
+  tosca.datatypes.network.NetworkInfo:
+    derived_from: tosca.datatypes.Root
+    properties:
+      network_name:
+        type: string
+      network_id:
+        type: string
+      addresses:
+        type: list
+        entry_schema:
+          type: string
+  tosca.datatypes.network.PortInfo:
+    derived_from: tosca.datatypes.Root
+    properties:
+      port_name:
+        type: string
+      port_id:
+        type: string
+      network_id:
+        type: string
+      mac_address:
+        type: string
+      addresses:
+        type: list
+        entry_schema:
+          type: string
+  tosca.datatypes.network.PortDef:
+    derived_from: integer
+    constraints:
+    - in_range:
+      - 1
+      - 65535
+  tosca.datatypes.network.PortSpec:
+    derived_from: tosca.datatypes.Root
+    properties:
+      protocol:
+        type: string
+        required: true
+        default: tcp
+        constraints:
+        - valid_values:
+          - udp
+          - tcp
+          - igmp
+      target:
+        type: tosca.datatypes.network.PortDef
+      target_range:
+        type: range
+        constraints:
+        - in_range:
+          - 1
+          - 65535
+      source:
+        type: tosca.datatypes.network.PortDef
+      source_range:
+        type: range
+        constraints:
+        - in_range:
+          - 1
+          - 65535
+  org.openecomp.datatypes.heat.network.AddressPair:
+    derived_from: tosca.datatypes.Root
+    description: MAC/IP address pairs
+    properties:
+      mac_address:
+        type: string
+        description: MAC address
+        required: false
+        status: SUPPORTED
+      ip_address:
+        type: string
+        description: IP address
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.subnet.HostRoute:
+    derived_from: tosca.datatypes.Root
+    description: Host route info for the subnet
+    properties:
+      destination:
+        type: string
+        description: The destination for static route
+        required: false
+        status: SUPPORTED
+      nexthop:
+        type: string
+        description: The next hop for the destination
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.AllocationPool:
+    derived_from: tosca.datatypes.Root
+    description: The start and end addresses for the allocation pool
+    properties:
+      start:
+        type: string
+        description: Start address for the allocation pool
+        required: false
+        status: SUPPORTED
+      end:
+        type: string
+        description: End address for the allocation pool
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.neutron.Subnet:
+    derived_from: tosca.datatypes.Root
+    description: A subnet represents an IP address block that can be used for assigning IP addresses to virtual instances
+    properties:
+      tenant_id:
+        type: string
+        description: The ID of the tenant who owns the network
+        required: false
+        status: SUPPORTED
+      enable_dhcp:
+        type: boolean
+        description: Set to true if DHCP is enabled and false if DHCP is disabled
+        required: false
+        default: true
+        status: SUPPORTED
+      ipv6_address_mode:
+        type: string
+        description: IPv6 address mode
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - dhcpv6-stateful
+          - dhcpv6-stateless
+          - slaac
+      ipv6_ra_mode:
+        type: string
+        description: IPv6 RA (Router Advertisement) mode
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - dhcpv6-stateful
+          - dhcpv6-stateless
+          - slaac
+      value_specs:
+        type: map
+        description: Extra parameters to include in the request
+        required: false
+        default: {}
+        status: SUPPORTED
+        entry_schema:
+          type: string
+      allocation_pools:
+        type: list
+        description: The start and end addresses for the allocation pools
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.AllocationPool
+      subnetpool:
+        type: string
+        description: The name or ID of the subnet pool
+        required: false
+        status: SUPPORTED
+      dns_nameservers:
+        type: list
+        description: A specified set of DNS name servers to be used
+        required: false
+        default: []
+        status: SUPPORTED
+        entry_schema:
+          type: string
+      host_routes:
+        type: list
+        description: The gateway IP address
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.subnet.HostRoute
+      ip_version:
+        type: integer
+        description: The gateway IP address
+        required: false
+        default: 4
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - '4'
+          - '6'
+      name:
+        type: string
+        description: The name of the subnet
+        required: false
+        status: SUPPORTED
+      prefixlen:
+        type: integer
+        description: Prefix length for subnet allocation from subnet pool
+        required: false
+        status: SUPPORTED
+        constraints:
+        - greater_or_equal: 0
+      cidr:
+        type: string
+        description: The CIDR
+        required: false
+        status: SUPPORTED
+      gateway_ip:
+        type: string
+        description: The gateway IP address
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.novaServer.network.PortExtraProperties:
+    derived_from: tosca.datatypes.Root
+    description: Nova server network expand properties for port
+    properties:
+      port_security_enabled:
+        type: boolean
+        description: Flag to enable/disable port security on the port
+        required: false
+        status: SUPPORTED
+      mac_address:
+        type: string
+        description: MAC address to give to this port
+        required: false
+        status: SUPPORTED
+      admin_state_up:
+        type: boolean
+        description: The administrative state of this port
+        required: false
+        default: true
+        status: SUPPORTED
+      qos_policy:
+        type: string
+        description: The name or ID of QoS policy to attach to this port
+        required: false
+        status: SUPPORTED
+      allowed_address_pairs:
+        type: list
+        description: Additional MAC/IP address pairs allowed to pass through the port
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.AddressPair
+      binding:vnic_type:
+        type: string
+        description: The vnic type to be bound on the neutron port
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - macvtap
+          - direct
+          - normal
+      value_specs:
+        type: map
+        description: Extra parameters to include in the request
+        required: false
+        default: {}
+        status: SUPPORTED
+        entry_schema:
+          type: string
+  org.openecomp.datatypes.heat.novaServer.network.AddressInfo:
+    derived_from: tosca.datatypes.network.NetworkInfo
+    description: Network addresses with corresponding port id
+    properties:
+      port_id:
+        type: string
+        description: Port id
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.neutron.port.FixedIps:
+    derived_from: tosca.datatypes.Root
+    description: subnet/ip_address
+    properties:
+      subnet:
+        type: string
+        description: Subnet in which to allocate the IP address for this port
+        required: false
+        status: SUPPORTED
+      ip_address:
+        type: string
+        description: IP address desired in the subnet for this port
+        required: false
+        status: SUPPORTED
+      subnet_id:
+        type: string
+        description: Subnet in which to allocate the IP address for this port
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.FileInfo:
+    derived_from: tosca.datatypes.Root
+    description: Heat File Info
+    properties:
+      file:
+        type: string
+        description: The required URI string (relative or absolute) which can be used to locate the file
+        required: true
+        status: SUPPORTED
+      file_type:
+        type: string
+        description: The type of the file
+        required: true
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - base
+          - env
+          - volume
+          - network
+  org.openecomp.datatypes.heat.contrail.network.rule.PortPairs:
+    derived_from: tosca.datatypes.Root
+    description: source and destination port pairs
+    properties:
+      start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrail.network.rule.Rule:
+    derived_from: tosca.datatypes.Root
+    description: policy rule
+    properties:
+      src_ports:
+        type: list
+        description: Source ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+      protocol:
+        type: string
+        description: Protocol
+        required: false
+        status: SUPPORTED
+      dst_addresses:
+        type: list
+        description: Destination addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+      apply_service:
+        type: string
+        description: Service to apply
+        required: false
+        status: SUPPORTED
+      dst_ports:
+        type: list
+        description: Destination ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs
+      src_addresses:
+        type: list
+        description: Source addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork
+      direction:
+        type: string
+        description: Direction
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrail.network.rule.RuleList:
+    derived_from: tosca.datatypes.Root
+    description: list of policy rules
+    properties:
+      policy_rule:
+        type: list
+        description: Contrail network rule
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrail.network.rule.Rule
+  org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: source and destination addresses
+    properties:
+      virtual_network:
+        type: string
+        description: Virtual network
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.neutron.SecurityRules.Rule:
+    derived_from: tosca.datatypes.Root
+    description: Rules Pairs
+    properties:
+      remote_group_id:
+        type: string
+        description: The remote group ID to be associated with this security group rule
+        required: false
+        status: SUPPORTED
+      protocol:
+        type: string
+        description: The protocol that is matched by the security group rule
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - tcp
+          - udp
+          - icmp
+      ethertype:
+        type: string
+        description: Ethertype of the traffic
+        required: false
+        default: IPv4
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - IPv4
+          - IPv6
+      port_range_max:
+        type: integer
+        description: 'The maximum port number in the range that is matched by the
+          security group rule. '
+        required: false
+        status: SUPPORTED
+        constraints:
+        - in_range:
+          - 0
+          - 65535
+      remote_ip_prefix:
+        type: string
+        description: The remote IP prefix (CIDR) to be associated with this security group rule
+        required: false
+        status: SUPPORTED
+      remote_mode:
+        type: string
+        description: Whether to specify a remote group or a remote IP prefix
+        required: false
+        default: remote_ip_prefix
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - remote_ip_prefix
+          - remote_group_id
+      direction:
+        type: string
+        description: The direction in which the security group rule is applied
+        required: false
+        default: ingress
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - egress
+          - ingress
+      port_range_min:
+        type: integer
+        description: The minimum port number in the range that is matched by the security group rule.
+        required: false
+        status: SUPPORTED
+        constraints:
+        - in_range:
+          - 0
+          - 65535
+  org.openecomp.datatypes.heat.substitution.SubstitutionFiltering:
+    derived_from: tosca.datatypes.Root
+    description: Substitution Filter
+    properties:
+      substitute_service_template:
+        type: string
+        description: Substitute Service Template
+        required: true
+        status: SUPPORTED
+      index_value:
+        type: integer
+        description: Index value of the substitution service template runtime instance
+        required: false
+        default: 0
+        status: SUPPORTED
+        constraints:
+        - greater_or_equal: 0
+      count:
+        type: string
+        description: Count
+        required: false
+        default: 1
+        status: SUPPORTED
+      scaling_enabled:
+        type: boolean
+        description: Indicates whether service scaling is enabled
+        required: false
+        default: true
+        status: SUPPORTED
+      mandatory:
+        type: boolean
+        description: Mandatory
+        required: false
+        default: true
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence:
+    derived_from: tosca.datatypes.Root
+    description: network policy refs data sequence
+    properties:
+      network_policy_refs_data_sequence_major:
+        type: integer
+        description: Network Policy ref data sequence Major
+        required: false
+        status: SUPPORTED
+      network_policy_refs_data_sequence_minor:
+        type: integer
+        description: Network Policy ref data sequence Minor
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefData:
+    derived_from: tosca.datatypes.Root
+    description: network policy refs data
+    properties:
+      network_policy_refs_data_sequence:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence
+        description: Network Policy ref data sequence
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data Subnet
+    properties:
+      network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len:
+        type: string
+        description: Network ipam refs data ipam subnets ip prefix len
+        required: false
+        status: SUPPORTED
+      network_ipam_refs_data_ipam_subnets_subnet_ip_prefix:
+        type: string
+        description: Network ipam refs data ipam subnets ip prefix
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data Subnet List
+    properties:
+      network_ipam_refs_data_ipam_subnets_subnet:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet
+        description: Network ipam refs data ipam subnets
+        required: false
+        status: SUPPORTED
+      network_ipam_refs_data_ipam_subnets_addr_from_start:
+        type: string
+        description: Network ipam refs data ipam subnets addr from start
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.IpamRefData:
+    derived_from: tosca.datatypes.Root
+    description: Network Ipam Ref Data
+    properties:
+      network_ipam_refs_data_ipam_subnets:
+        type: list
+        description: Network ipam refs data ipam subnets
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList
+  org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: source addresses
+    properties:
+      network_policy_entries_policy_rule_src_addresses_virtual_network:
+        type: string
+        description: Source addresses Virtual network
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork:
+    derived_from: tosca.datatypes.Root
+    description: destination addresses
+    properties:
+      network_policy_entries_policy_rule_dst_addresses_virtual_network:
+        type: string
+        description: Destination addresses Virtual network
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs:
+    derived_from: tosca.datatypes.Root
+    description: destination port pairs
+    properties:
+      network_policy_entries_policy_rule_dst_ports_start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_dst_ports_end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs:
+    derived_from: tosca.datatypes.Root
+    description: source port pairs
+    properties:
+      network_policy_entries_policy_rule_src_ports_start_port:
+        type: string
+        description: Start port
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_ports_end_port:
+        type: string
+        description: End port
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList:
+    derived_from: tosca.datatypes.Root
+    description: Action List
+    properties:
+      network_policy_entries_policy_rule_action_list_simple_action:
+        type: string
+        description: Simple Action
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_action_list_apply_service:
+        type: list
+        description: Apply Service
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: string
+  org.openecomp.datatypes.heat.contrailV2.network.rule.Rule:
+    derived_from: tosca.datatypes.Root
+    description: policy rule
+    properties:
+      network_policy_entries_policy_rule_dst_addresses:
+        type: list
+        description: Destination addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork
+      network_policy_entries_policy_rule_dst_ports:
+        type: list
+        description: Destination ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs
+      network_policy_entries_policy_rule_protocol:
+        type: string
+        description: Protocol
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_addresses:
+        type: list
+        description: Source addresses
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork
+      network_policy_entries_policy_rule_direction:
+        type: string
+        description: Direction
+        required: false
+        status: SUPPORTED
+      network_policy_entries_policy_rule_src_ports:
+        type: list
+        description: Source ports
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs
+      network_policy_entries_policy_rule_action_list:
+        type: org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList
+        description: Action list
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.network.rule.RuleList:
+    derived_from: tosca.datatypes.Root
+    description: list of policy rules
+    properties:
+      network_policy_entries_policy_rule:
+        type: list
+        description: Contrail network rule
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.network.rule.Rule
+  org.openecomp.datatypes.heat.network.contrail.port.StaticRoute:
+    derived_from: tosca.datatypes.Root
+    description: static route
+    properties:
+      prefix:
+        type: string
+        description: Route prefix
+        required: false
+        status: SUPPORTED
+      next_hop:
+        type: string
+        description: Next hop
+        required: false
+        status: SUPPORTED
+      next_hop_type:
+        type: string
+        description: Next hop type
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.contrail.AddressPair:
+    derived_from: tosca.datatypes.Root
+    description: Address Pair
+    properties:
+      address_mode:
+        type: string
+        description: Address mode active-active or active-standy
+        required: false
+        status: SUPPORTED
+        constraints:
+        - valid_values:
+          - active-active
+          - active-standby
+      prefix:
+        type: string
+        description: IP address prefix
+        required: false
+        status: SUPPORTED
+      mac_address:
+        type: string
+        description: Mac address
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.network.contrail.InterfaceData:
+    derived_from: tosca.datatypes.Root
+    description: Interface Data
+    properties:
+      static_routes:
+        type: list
+        description: An ordered list of static routes to be added to this interface
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.contrail.port.StaticRoute
+      virtual_network:
+        type: string
+        description: Virtual Network for this interface
+        required: true
+        status: SUPPORTED
+      allowed_address_pairs:
+        type: list
+        description: List of allowed address pair for this interface
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.network.contrail.AddressPair
+      ip_address:
+        type: string
+        description: IP for this interface
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.interface.Properties:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Interface Properties.
+    properties:
+      virtual_machine_interface_properties_service_interface_type:
+        type: string
+        description: Service Interface Type.
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.Root:
+    derived_from: tosca.datatypes.Root
+    description: |
+      The ECOMP root Data Type all other Data Types derive from
+    properties:
+      supplemental_data:
+        type: map
+        entry_schema:
+          description: |
+            A placeholder for missing properties that would be included in future ecomp model versions. fromat <key>:<value>
+          type: string
+  org.openecomp.datatypes.AssignmentRequirements:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      is_required:
+        description: |
+          "true" indicates that assignment is required
+        type: boolean
+        default: false
+        required: true
+      count:
+        description: number of assignments required
+        type: integer
+        required: false
+  org.openecomp.datatypes.network.SubnetAssignments:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ip_network_address_plan:
+        type: string
+        required: false
+        description: Reference to EIPAM, VLAN or other address plan ID used to assign subnets to this network
+      dhcp_enabled:
+        type: boolean
+        required: false
+        description: \"true\" indicates the network has 1 or more policies
+      ip_version:
+        type: integer
+        constraints:
+        - valid_values:
+          - 4
+          - 6
+        required: true
+        description: The IP version of the subnet
+      cidr_mask:
+        type: integer
+        required: true
+        description: The default subnet CIDR mask
+      min_subnets_count:
+        type: integer
+        default: 1
+        required: true
+        description: Quantity of subnets that must be initially assigned
+  org.openecomp.datatypes.network.IPv4SubnetAssignments:
+    derived_from: org.openecomp.datatypes.network.SubnetAssignments
+    properties:
+      use_ipv4:
+        type: boolean
+        required: true
+        description: Indicates IPv4 subnet assignments
+  org.openecomp.datatypes.network.IPv6SubnetAssignments:
+    derived_from: org.openecomp.datatypes.network.SubnetAssignments
+    properties:
+      use_ipv6:
+        type: boolean
+        required: true
+        description: Indicates IPv6 subnet assignments
+  org.openecomp.datatypes.network.NetworkAssignments:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ecomp_generated_network_assignment:
+        type: boolean
+        required: true
+        default: false
+        description: |
+          \"true\" indicates that the network assignments will be auto-generated by ECOMP \"false\" indicates operator-supplied Network assignments file upload is required (e.g. VID will present prompt to operator to upload operator-supplied Network assignments file).
+      is_shared_network:
+        type: boolean
+        required: true
+        description: \"true\" means this network is shared by multiple Openstack tenants
+      is_external_network:
+        type: boolean
+        required: true
+        default: false
+        description: |
+          \"true\" means this Contrail external network
+      ipv4_subnet_default_assignment:
+        type: org.openecomp.datatypes.network.IPv4SubnetAssignments
+        required: true
+        description: IPv4 defualt subnet assignments
+      ipv6_subnet_default_assignment:
+        type: org.openecomp.datatypes.network.IPv6SubnetAssignments
+        required: true
+        description: IPv6 defualt subnet assignments
+      related_networks:
+        type: list
+        required: false
+        description: Related Networks List.
+        entry_schema:
+          type: org.openecomp.datatypes.network.RelatedNetworksAssignments
+      is_trunked:
+        type: boolean
+        required: true
+        description: \"true\" indicates that network is trunked
+        default: false
+  org.openecomp.datatypes.network.ProviderNetwork:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      is_provider_network:
+        type: boolean
+        required: true
+        description: \"true\" indicates that this a Neutron provider type of network
+      physical_network_name:
+        type: string
+        required: false
+        constraints:
+        - valid_values:
+          - Physnet41
+          - Physnet42
+          - Physnet43
+          - Physnet44
+          - Physnet21
+          - Physnet22
+          - sriovnet1
+          - sriovnet2
+          - oam
+        description: |
+          Identifies the NUMA processor cluster to which this physical network interface belongs. NUMA instance correlates to the first digit of the Physical Network Name suffix (e.g. \"01\" = NUMA 0, \"11\" = NUMA 1)
+      numa:
+        type: string
+        required: false
+        constraints:
+        - valid_values:
+          - NUMA 0
+          - NUMA 1
+        description: |
+          PNIC instance within the NUMA processor cluster PNIC Instance correlates to the second digit of the Physical Network Name suffix (e.g. "01" = PNIC 1, "02" = "PNIC 2)
+      pnic_instance:
+        type: integer
+        required: false
+        description: PNIC instance within the NUMA processor cluster
+  org.openecomp.datatypes.network.NetworkFlows:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      is_network_policy:
+        type: boolean
+        required: false
+        default: false
+        description: \"true\" indicates the network has 1 or more policies
+      network_policy:
+        type: string
+        required: false
+        description: 'Identifies the specific Cloud network policy that must be applied
+          to this network (source: from Policy Manager).'
+      is_bound_to_vpn:
+        type: boolean
+        required: false
+        default: false
+        description: \"true\" indicates the network has 1 or more vpn bindings
+      vpn_binding:
+        type: string
+        required: false
+        description: 'Identifies the specific VPN Binding entry in A&AI that must
+          be applied when creating this network (source: A&AI)'
+  org.openecomp.datatypes.network.VlanRequirements:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      vlan_range_plan:
+        type: string
+        required: true
+        description: reference to a vlan range plan
+      vlan_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - c-tag
+          - s-tag
+        description: identifies the vlan type (e.g., c-tag)
+      vlan_count:
+        type: integer
+        required: true
+        description: identifies the number of vlan tags to assign to the CP from the plan
+  org.openecomp.datatypes.network.IpRequirements:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ip_version:
+        type: integer
+        required: true
+        constraints:
+        - valid_values:
+          - 4
+          - 6
+      ip_count:
+        description: identifies the number of ip address to assign to the CP from the plan
+        type: integer
+        required: false
+      floating_ip_count:
+        type: integer
+        required: false
+      subnet_role:
+        type: string
+        required: false
+      assingment_method:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - fixed
+          - dhcp
+      dhcp_enabled:
+        type: boolean
+        required: false
+      ip_count_required:
+        description: identifies the number of ip address to assign to the CP from the plan
+        type: org.openecomp.datatypes.AssignmentRequirements
+        required: false
+      floating_ip_count_required:
+        type: org.openecomp.datatypes.AssignmentRequirements
+        required: false
+      ip_address_plan_name:
+        type: string
+        required: false
+      vrf_name:
+        type: string
+        required: false
+  org.openecomp.datatypes.network.MacAssignments:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      mac_range_plan:
+        type: string
+        required: true
+        description: reference to a MAC address range plan
+      mac_count:
+        type: integer
+        required: true
+        description: identifies the number of MAC addresses to assign to the CP from the plan
+  org.openecomp.datatypes.EcompHoming:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ecomp_selected_instance_node_target:
+        type: boolean
+        required: true
+        default: false
+        description: |
+          \"true\" indicates that the target deployment node for this instance will be auto-selected by ECOMP \"false\" indicates operator-supplied instance target deployment node required (e.g. VID will present a prompt to operator and collect the operator-selected target node for the deployment of this Network instance).
+      homing_policy:
+        type: string
+        required: false
+        description: Referenc to a service level homing policy that ECOMP will use for instance deployment target node
+      instance_node_target:
+        type: string
+        required: false
+        description: Instance target deployment node
+  org.openecomp.datatypes.EcompNaming:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ecomp_generated_naming:
+        type: boolean
+        required: true
+        default: true
+        description: |
+          \"true\" indicates that the name for the instance will be auto-generated by ECOMP. \"false\" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+      naming_policy:
+        type: string
+        required: false
+        description: Referenc to naming policy that ECOMP will use when the name is auto-generated
+  org.openecomp.datatypes.network.MacRequirements:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      mac_range_plan:
+        description: reference to a MAC address range plan
+        type: string
+        required: false
+      mac_count:
+        description: identifies the number of MAC addresses to assign to the CP from the plan
+        type: integer
+        required: false
+      mac_count_required:
+        description: identifies the number of MAC addresses to assign to the CP from the plan
+        type: org.openecomp.datatypes.AssignmentRequirements
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Sub Interface Address Pair IP.
+    properties:
+      ip_prefix:
+        type: string
+        description: IP Prefix.
+        required: false
+        status: SUPPORTED
+      ip_prefix_len:
+        type: integer
+        description: IP Prefix Len.
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.MacAddress:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Sub Interface Mac Address.
+    properties:
+      mac_address:
+        type: list
+        description: Mac Addresses List.
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: string
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.Properties:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Sub Interface VLAN Properties.
+    properties:
+      sub_interface_vlan_tag:
+        type: string
+        description: Sub Interface VLAN Tag.
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Sub Interface Address Pair.
+    properties:
+      address_mode:
+        type: string
+        description: Address Mode.
+        required: false
+        status: SUPPORTED
+      ip:
+        type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp
+        description: IP.
+        required: false
+        status: SUPPORTED
+      mac:
+        type: string
+        description: Mac.
+        required: false
+        status: SUPPORTED
+  org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairs:
+    derived_from: tosca.datatypes.Root
+    description: Virtual Machine Sub Interface Address Pairs.
+    properties:
+      allowed_address_pair:
+        type: list
+        description: Addresses pair List.
+        required: false
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair
+  org.openecomp.datatypes.Naming:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      ecomp_generated_naming:
+        description: |
+          "true" indicates that the name for the instance will be auto-generated by ECOMP. "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+        type: boolean
+        default: true
+        required: true
+      naming_policy:
+        description: Reference to naming policy that ECOMP will use when the name is auto-generated
+        type: string
+        required: false
+      instance_name:
+        description: indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name).
+        type: string
+        required: false
+  org.openecomp.datatypes.flavors.ComputeFlavor:
+    derived_from: tosca.datatypes.Root
+    properties:
+      num_cpus:
+        type: integer
+      disk_size:
+        type: scalar-unit.size
+      mem_size:
+        type: scalar-unit.size
+  org.openecomp.datatypes.flavors.LicenseFlavor:
+    derived_from: tosca.datatypes.Root
+    properties:
+      feature_group_uuid:
+        type: string
+  org.openecomp.datatypes.flavors.VendorInfo:
+    derived_from: tosca.datatypes.Root
+    properties:
+      manufacturer_reference_number:
+        type: string
+      vendor_model:
+        type: string
+  org.openecomp.datatypes.flavors.DeploymentFlavor:
+    derived_from: tosca.datatypes.Root
+    properties:
+      sp_part_number:
+        type: string
+      vendor_info:
+        type: org.openecomp.datatypes.flavors.VendorInfo
+      compute_flavor:
+        type: org.openecomp.datatypes.flavors.ComputeFlavor
+      license_flavor:
+        type: org.openecomp.datatypes.flavors.LicenseFlavor
+        required: false
+  org.openecomp.datatypes.ImageInfo:
+    derived_from: tosca.datatypes.Root
+    properties:
+      software_version:
+        type: string
+      file_name:
+        type: string
+      file_hash:
+        type: string
+        description: checksum/signature
+      file_hash_type:
+        type: string
+        required: false
+        default: md5
+  org.openecomp.datatypes.network.RelatedNetworksAssignments:
+    derived_from: org.openecomp.datatypes.Root
+    properties:
+      related_network_role:
+        type: string
+        description: The network role of the related network, sharing provider network.
+        required: false
+  tosca.datatypes.nfv.VnfcConfigurableProperties:
+    derived_from: tosca.datatypes.Root
+    properties:
+      additional_vnfc_configurable_properties:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+  tosca.datatypes.nfv.RequestedAdditionalCapability:
+    derived_from: tosca.datatypes.Root
+    properties:
+      support_mandatory:
+        type: boolean
+        required: true
+      min_requested_additional_capability_version:
+        type: string
+        required: false
+      preferred_requested_additional_capability_version:
+        type: string
+        required: false
+      requested_additional_capability_name:
+        type: string
+        required: true
+      target_performance_parameters:
+        type: map
+        entry_schema:
+          type: string
+        required: true
+  tosca.datatypes.nfv.VirtualMemory:
+    derived_from: tosca.datatypes.Root
+    properties:
+      virtual_mem_size:
+        type: scalar-unit.size
+        required: true
+      virtual_mem_oversubscription_policy:
+        type: string
+        required: false
+      vdu_memory_requirements:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+      numa_enabled:
+        type: boolean
+        required: false
+  tosca.datatypes.nfv.VirtualCpuPinning:
+    derived_from: tosca.datatypes.Root
+    properties:
+      cpu_pinning_policy:
+        type: string
+        constraints:
+        - valid_values:
+          - static
+          - dynamic
+        required: false
+      cpu_pinning_map:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+  tosca.datatypes.nfv.VirtualCpu:
+    derived_from: tosca.datatypes.Root
+    properties:
+      cpu_architecture:
+        type: string
+        required: false
+      num_virtual_cpu:
+        type: integer
+        required: true
+      virtual_cpu_clock:
+        type: scalar-unit.frequency
+        required: false
+      virtual_cpu_oversubscription_policy:
+        type: string
+        required: false
+      vdu_cpu_requirements:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+      virtual_cpu_pinning:
+        type: tosca.datatypes.nfv.VirtualCpuPinning
+        required: false
+  tosca.datatypes.nfv.LogicalNodeData:
+    derived_from: tosca.datatypes.Root
+    properties:
+      logical_node_requirements:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+  tosca.datatypes.nfv.VirtualNetworkInterfaceRequirements:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: false
+      description:
+        type: string
+        required: false
+      support_mandatory:
+        type: boolean
+        required: true
+      requirement:
+        type: string
+        required: false
+      network_interface_requirements:
+        type: map
+        entry_schema:
+          type: string
+        required: true
+      nic_io_requirements:
+        type: tosca.datatypes.nfv.LogicalNodeData
+        required: false
+  tosca.datatypes.nfv.injectFile:
+    derived_from: tosca.datatypes.Root
+    properties:
+      source_path:
+        type: string
+        required: true
+      dest_path:
+        type: string
+        required: true
+  tosca.datatypes.nfv.L2AddressData:
+    derived_from: tosca.datatypes.Root
+    properties:
+      mac_address_assignment:
+        type: boolean
+        required: true
+      address:
+        type: string
+        required: false
+  tosca.datatypes.nfv.L3AddressData:
+    derived_from: tosca.datatypes.Root
+    properties:
+      ip_address_assignment:
+        type: boolean
+        required: true
+      floating_ip_activated:
+        type: boolean
+        required: true
+      ip_address_type:
+        type: string
+        required: false
+        constraints:
+        - valid_values:
+          - ipv4
+          - ipv6
+      number_of_ip_address:
+        type: integer
+        required: false
+      fixed_ip_address:
+        type: list
+        entry_schema:
+          type: string
+        required: false
+  tosca.datatypes.nfv.AddressData:
+    properties:
+      address_type:
+        constraints:
+        - valid_values:
+          - mac_address
+          - ip_address
+        type: string
+        required: true
+      l2_address_data:
+        required: false
+        type: tosca.datatypes.nfv.L2AddressData
+      l3_address_data:
+        required: false
+        type: tosca.datatypes.nfv.L3AddressData
+  tosca.datatypes.nfv.ConnectivityType:
+    derived_from: tosca.datatypes.Root
+    properties:
+      layer_protocol:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - ethernet
+          - mpls
+          - odu2
+          - ipv4
+          - ipv6
+          - pseudo_wire
+      flow_pattern:
+        type: string
+        required: false
+        constraints:
+        - valid_values:
+          - Line
+          - Tree
+          - Mesh
+  tosca.datatypes.nfv.VlFlavour:
+    derived_from: tosca.datatypes.Root
+    properties:
+      flavourId:
+        type: string
+  tosca.datatypes.nfv.ext.AddressPairs:
+    properties:
+      ip:
+        type: string
+        required: false
+      mac:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.FloatingIP:
+    properties:
+      external_network:
+        type: string
+        required: false
+      ip_address:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.LocationInfo:
+    properties:
+      availability_zone:
+        type: string
+        required: false
+      vimid:
+        type: integer
+        required: false
+      tenant:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.HostRouteInfo:
+    properties:
+      destination:
+        type: string
+        required: false
+      nexthop:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.InjectData:
+    properties:
+      file_name:
+        type: string
+        required: false
+      file_data:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.zte.WatchDog:
+    properties:
+      enable_delay:
+        type: integer
+        required: false
+      action:
+        type: string
+        required: false
+  tosca.datatypes.nfv.ext.LocalAffinityOrAntiAffinityRule:
+    properties:
+      scope:
+        type: string
+        required: false
+      affinity_antiaffinity:
+        type: string
+        required: false
+  tosca.datatypes.nfv.VduProfile:
+    derived_from: tosca.datatypes.Root
+    properties:
+      min_number_of_instances:
+        type: integer
+        required: true
+      max_number_of_instances:
+        type: integer
+        required: true
+      watchdog:
+        type: string
+        required: true
+      vmBootUpTimeOut:
+        type: integer
+        required: false
+  tosca.datatypes.nfv.LinkBitRateRequirements:
+    derived_from: tosca.datatypes.Root
+    properties:
+      root:
+        type: integer
+        required: true
+      leaf:
+        type: integer
+        required: true
+  tosca.datatypes.nfv.Qos:
+    derived_from: tosca.datatypes.Root
+    properties:
+      latency:
+        type: integer
+        required: true
+      packet_delay_variation:
+        type: integer
+        required: true
+      packet_loss_ratio:
+        type: float
+        constraints:
+        - in_range:
+          - 0.0
+          - 1.0
+        required: false
+  tosca.datatypes.nfv.VlProfile:
+    derived_from: tosca.datatypes.Root
+    properties:
+      max_bit_rate_requirements:
+        type: tosca.datatypes.nfv.LinkBitRateRequirements
+        required: true
+      min_bit_rate_requirements:
+        type: tosca.datatypes.nfv.LinkBitRateRequirements
+        required: true
+      qos:
+        type: tosca.datatypes.nfv.Qos
+        required: false
+      initiationParameters:
+        type: map
+        entry_schema:
+          type: string
+        required: false
+      cidr:
+        type: string
+        required: false
+      networkName:
+        type: string
+        required: false
+      startIp:
+        type: string
+        required: false
+      endIp:
+        type: string
+        required: false
+      gatewayIp:
+        type: string
+        required: false
+      segmentationId:
+        type: integer
+        required: false
+      physicalNetwork:
+        type: string
+        required: false
+      networkType:
+        type: string
+        required: false
+        constraints:
+        - valid_values:
+          - VLAN
+          - VXLAN
+      dhcpEnabled:
+        type: boolean
+        required: false
+      vlanTransparent:
+        type: boolean
+        required: false
+  tosca.datatypes.nfv.VduLevel:
+    derived_from: tosca.datatypes.Root
+    properties:
+      number_of_instances:
+        type: integer
+        required: true
+  tosca.datatypes.nfv.ScaleInfo:
+    derived_from: tosca.datatypes.Root
+    properties:
+      scaleLevel:
+        type: integer
+        required: true
+  tosca.datatypes.nfv.ScaleAspect:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      description:
+        type: string
+        required: true
+      associated_group:
+        type: string
+        required: false
+      max_scale_level:
+        type: integer
+        required: true
+  tosca.datatypes.nfv.InstantiationLevel:
+    derived_from: tosca.datatypes.Root
+    properties:
+      description:
+        type: string
+        required: true
+      vdu_levels:
+        type: map
+        required: true
+        entry_schema:
+          type: tosca.datatypes.nfv.VduLevel
+      scale_info:
+        type: map
+        required: false
+        entry_schema:
+          type: tosca.datatypes.nfv.ScaleInfo
+  tosca.datatypes.nfv.VnfScaleOperationConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      scaling_by_more_than_one_step_supported:
+        type: boolean
+  tosca.datatypes.nfv.VnfScaleToLevelOperationConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      arbitrary_target_levels_supported:
+        type: boolean
+  tosca.datatypes.nfv.VnfHealOperationConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      causes:
+        type: list
+        entry_schema:
+          type: string
+  tosca.datatypes.nfv.VnfTerminateOperationConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      min_graceful_termination_timeout:
+        type: integer
+      max_recommended_graceful_termination_timeout:
+        type: integer
+  tosca.datatypes.nfv.VnfOperateOperationConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      min_graceful_termination_timeout:
+        type: integer
+      max_recommended_graceful_termination_timeout:
+        type: integer
+  tosca.datatypes.nfv.VnfLcmOperationsConfiguration:
+    derived_from: tosca.datatypes.Root
+    properties:
+      scale:
+        type: tosca.datatypes.nfv.VnfScaleOperationConfiguration
+      scale_to_level:
+        type: tosca.datatypes.nfv.VnfScaleToLevelOperationConfiguration
+      heal:
+        type: tosca.datatypes.nfv.VnfHealOperationConfiguration
+      terminate:
+        type: tosca.datatypes.nfv.VnfTerminateOperationConfiguration
+      operate:
+        type: tosca.datatypes.nfv.VnfOperateOperationConfiguration
+  tosca.datatypes.nfv.CpProtocolData:
+    derived_from: tosca.datatypes.Root
+    properties:
+      asscociated_layer_protocol:
+        type: string
+        constraints:
+        - valid_values:
+          - ethernet
+          - mpls
+          - odu2
+          - ipv4
+          - ipv6
+          - pseudo-wire
+        required: true
+      address_data:
+        type: tosca.datatypes.nfv.AddressData
+        required: false
+  tosca.datatypes.nfv.VnfConfigurableProperties:
+    derived_from: tosca.datatypes.Root
+    properties:
+      is_autoscale_enabled:
+        type: boolean
+        required: false
+      is_autoheal_enabled:
+        type: boolean
+        required: false
+  tosca.datatypes.nfv.VnfInfoModifiableAttributesExtensions:
+    derived_from: tosca.datatypes.Root
+    properties:
+      description:
+        type: string
+        required: false
+  tosca.datatypes.nfv.VnfInfoModifiableAttributesMetadata:
+    derived_from: tosca.datatypes.Root
+    properties:
+      description:
+        type: string
+        required: false
+  tosca.datatypes.nfv.VnfInfoModifiableAttributes:
+    derived_from: tosca.datatypes.Root
+    properties:
+      extensions:
+        type: tosca.datatypes.nfv.VnfInfoModifiableAttributesExtensions
+        required: false
+      metadata:
+        type: tosca.datatypes.nfv.VnfInfoModifiableAttributesMetadata
+        required: false
+  onap.datatypes.monitoring.metricsPerEventName:
+    derived_from: tosca.datatypes.Root
+    properties:
+      controlLoopSchemaType:
+        constraints:
+        - valid_values:
+          - VM
+          - VNF
+        description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
+        required: true
+        type: string
+      eventName:
+        description: Event name to which thresholds need to be applied
+        required: true
+        type: string
+      policyName:
+        description: TCA Policy Scope Name
+        required: true
+        type: string
+      policyScope:
+        description: TCA Policy Scope
+        required: true
+        type: string
+      policyVersion:
+        description: TCA Policy Scope Version
+        required: true
+        type: string
+      thresholds:
+        description: Thresholds associated with eventName
+        entry_schema:
+          type: onap.datatypes.monitoring.thresholds
+        required: true
+        type: list
+  onap.datatypes.monitoring.tca_policy:
+    derived_from: tosca.datatypes.Root
+    properties:
+      domain:
+        constraints:
+        - equal: measurementsForVfScaling
+        default: measurementsForVfScaling
+        description: Domain name to which TCA needs to be applied
+        required: true
+        type: string
+      metricsPerEventName:
+        description: Contains eventName and threshold details that need to be applied to given eventName
+        entry_schema:
+          type: onap.datatypes.monitoring.metricsPerEventName
+        required: true
+        type: list
+  onap.datatypes.monitoring.thresholds:
+    derived_from: tosca.datatypes.Root
+    properties:
+      closedLoopControlName:
+        description: Closed Loop Control Name associated with the threshold
+        required: true
+        type: string
+      closedLoopEventStatus:
+        constraints:
+        - valid_values:
+          - ONSET
+          - ABATED
+        description: Closed Loop Event Status of the threshold
+        required: true
+        type: string
+      direction:
+        constraints:
+        - valid_values:
+          - LESS
+          - LESS_OR_EQUAL
+          - GREATER
+          - GREATER_OR_EQUAL
+          - EQUAL
+        description: Direction of the threshold
+        required: true
+        type: string
+      fieldPath:
+        constraints:
+        - valid_values:
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
+          - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
+          - $.event.measurementsForVfScalingFields.meanRequestLatency
+          - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
+          - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
+          - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
+          - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
+          - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
+          - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
+        description: Json field Path as per CEF message which needs to be analyzed for TCA
+        required: true
+        type: string
+      severity:
+        constraints:
+        - valid_values:
+          - CRITICAL
+          - MAJOR
+          - MINOR
+          - WARNING
+          - NORMAL
+        description: Threshold Event Severity
+        required: true
+        type: string
+      thresholdValue:
+        description: Threshold value for the field Path inside CEF message
+        required: true
+        type: integer
+      version:
+        description: Version number associated with the threshold
+        required: true
+        type: string
diff --git a/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar b/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar
new file mode 100755 (executable)
index 0000000..b3479ba
Binary files /dev/null and b/src/test/resources/example/sdc/service-Vloadbalancerms-csar.csar differ
diff --git a/src/test/resources/tosca/guard1-policy-payload.json b/src/test/resources/tosca/guard1-policy-payload.json
new file mode 100644 (file)
index 0000000..bacf174
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "policy-id": "guard1",
+       "contents": {
+               "recipe": "Rebuild",
+               "actor": "SO",
+               "clname": "testloop",
+               "guardTargets": ".*",
+               "minGuard": "3",
+               "maxGuard": "7",
+               "limitGuard": "",
+               "timeUnitsGuard": "",
+               "timeWindowGuard": "",
+               "guardActiveStart": "00:00:01-05:00",
+               "guardActiveEnd": "23:59:01-05:00"
+       }
+}
\ No newline at end of file
diff --git a/src/test/resources/tosca/guard2-policy-payload.json b/src/test/resources/tosca/guard2-policy-payload.json
new file mode 100644 (file)
index 0000000..89f7ec8
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "policy-id": "guard2",
+       "contents": {
+               "recipe": "Migrate",
+               "actor": "SO",
+               "clname": "testloop",
+               "guardTargets": ".*",
+               "minGuard": "1",
+               "maxGuard": "2",
+               "limitGuard": "",
+               "timeUnitsGuard": "",
+               "timeWindowGuard": "",
+               "guardActiveStart": "00:00:01-05:00",
+               "guardActiveEnd": "23:59:01-05:00"
+       }
+}
\ No newline at end of file
diff --git a/src/test/resources/tosca/micro-service-policy-payload.json b/src/test/resources/tosca/micro-service-policy-payload.json
new file mode 100644 (file)
index 0000000..01d6d27
--- /dev/null
@@ -0,0 +1,41 @@
+{
+       "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+       "topology_template": {
+               "policies": [
+                       {
+                               "testPolicy": {
+                                       "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
+                                       "version": "1.0.0",
+                                       "metadata": {
+                                               "policy-id": "testPolicy"
+                                       },
+                                       "properties": {
+                                               "tca_policy": {
+                                                       "domain": "measurementsForVfScaling",
+                                                       "metricsPerEventName": [
+                                                               {
+                                                                       "policyVersion": "1.0.0",
+                                                                       "thresholds": [
+                                                                               {
+                                                                                       "severity": "CRITICAL",
+                                                                                       "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta",
+                                                                                       "thresholdValue": 1,
+                                                                                       "closedLoopEventStatus": "ONSET",
+                                                                                       "closedLoopControlName": "test",
+                                                                                       "version": "1.0.0",
+                                                                                       "direction": "LESS"
+                                                                               }
+                                                                       ],
+                                                                       "policyName": "test",
+                                                                       "controlLoopSchemaType": "VM",
+                                                                       "policyScope": "test",
+                                                                       "eventName": "test"
+                                                               }
+                                                       ]
+                                               }
+                                       }
+                               }
+                       }
+               ]
+       }
+}
\ No newline at end of file
diff --git a/src/test/resources/tosca/micro-service-policy-properties.json b/src/test/resources/tosca/micro-service-policy-properties.json
new file mode 100644 (file)
index 0000000..6baa329
--- /dev/null
@@ -0,0 +1,23 @@
+{
+  "domain": "measurementsForVfScaling",
+  "metricsPerEventName": [
+    {
+      "policyVersion": "1.0.0",
+      "thresholds": [
+        {
+          "severity": "CRITICAL",
+          "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta",
+          "thresholdValue": 1,
+          "closedLoopEventStatus": "ONSET",
+          "closedLoopControlName": "test",
+          "version": "1.0.0",
+          "direction": "LESS"
+        }
+      ],
+      "policyName": "test",
+      "controlLoopSchemaType": "VM",
+      "policyScope": "test",
+      "eventName": "test"
+    }
+  ]
+}
diff --git a/src/test/resources/tosca/operational-policy-payload.yaml b/src/test/resources/tosca/operational-policy-payload.yaml
new file mode 100644 (file)
index 0000000..68116b0
--- /dev/null
@@ -0,0 +1,31 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+topology_template:
+  policies:
+  - testPolicy:
+      type: onap.policies.controlloop.Operational
+      version: 1.0.0
+      metadata: {policy-id: testPolicy}
+      properties:
+        controlLoop: {controlLoopName: control loop, version: 2.0.0, trigger_policy: new1,
+          timeout: '30', abatement: 'true'}
+        policies:
+        - id: new1
+          recipe: Rebuild
+          retry: '10'
+          timeout: '20'
+          actor: SO
+          payload: test
+          success: new2
+          failure: new2
+          failure_timeout: new2
+          failure_retries: new2
+          failure_exception: new2
+          failure_guard: new2
+          target: {type: VFC, resourceTargetId: test}
+        - id: new2
+          recipe: Migrate
+          retry: '30'
+          timeout: '40'
+          actor: SDNC
+          payload: test
+          target: {type: VFC, resourceTargetId: test}
diff --git a/src/test/resources/tosca/operational-policy-properties.json b/src/test/resources/tosca/operational-policy-properties.json
new file mode 100644 (file)
index 0000000..5036165
--- /dev/null
@@ -0,0 +1,71 @@
+{
+       "guard_policies": {
+               "guard1":{
+                       "recipe": "Rebuild",
+                       "actor": "SO",
+                       "clname": "testloop",
+                       "guardTargets": ".*",
+                       "minGuard": "3",
+                       "maxGuard": "7",
+                       "limitGuard": "",
+                       "timeUnitsGuard": "",
+                       "timeWindowGuard": "",
+                       "guardActiveStart": "00:00:01-05:00",
+                       "guardActiveEnd": "23:59:01-05:00"
+               },
+               "guard2":{
+                       "recipe": "Migrate",
+                       "actor": "SO",
+                       "clname": "testloop",
+                       "guardTargets": ".*",
+                       "minGuard": "1",
+                       "maxGuard": "2",
+                       "limitGuard": "",
+                       "timeUnitsGuard": "",
+                       "timeWindowGuard": "",
+                       "guardActiveStart": "00:00:01-05:00",
+                       "guardActiveEnd": "23:59:01-05:00"
+               }
+       },
+       "operational_policy": {
+               "controlLoop": {
+                       "controlLoopName": "control loop",
+                       "version": "2.0.0",
+                       "trigger_policy": "new1",
+                       "timeout": "30",
+                       "abatement": "true"
+               },
+               "policies": [
+                       {
+                               "id": "new1",
+                               "recipe": "Rebuild",
+                               "retry": "10",
+                               "timeout": "20",
+                               "actor": "SO",
+                               "payload": "test",
+                               "success": "new2",
+                               "failure": "new2",
+                               "failure_timeout": "new2",
+                               "failure_retries": "new2",
+                               "failure_exception": "new2",
+                               "failure_guard": "new2",
+                               "target": {
+                                       "type": "VFC",
+                                       "resourceTargetId": "test"
+                               }
+                       },
+                       {
+                               "id": "new2",
+                               "recipe": "Migrate",
+                               "retry": "30",
+                               "timeout": "40",
+                               "actor": "SDNC",
+                               "payload": "test",
+                               "target": {
+                                       "type": "VFC",
+                                       "resourceTargetId": "test"
+                               }
+                       }
+               ]
+       }
+}