Merge "Remove legacy password encryption"
authorSébastien Determe <sebastien.determe@intl.att.com>
Tue, 21 Apr 2020 13:33:42 +0000 (13:33 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 21 Apr 2020 13:33:42 +0000 (13:33 +0000)
83 files changed:
pom.xml
releases/5.0.4-container.yaml [new file with mode: 0644]
releases/5.0.4.yaml [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/client/CdsServices.java
src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/JsonEditorSchemaConstants.java
src/main/java/org/onap/clamp/clds/tosca/ToscaSchemaConstants.java
src/main/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertor.java
src/main/java/org/onap/clamp/clds/tosca/update/execution/cds/ToscaMetadataCdsProcess.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/LoopService.java
src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java
src/main/java/org/onap/clamp/policy/Policy.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/LegacyOperationalPolicy.java
src/main/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilder.java
src/main/resources/clds/camel/rest/clamp-api-v2.xml
src/main/resources/clds/camel/routes/dcae-flows.xml
src/main/resources/clds/camel/routes/loop-flows.xml
src/main/resources/clds/camel/routes/policy-flows.xml
src/main/resources/clds/json-schema/operational_policies/operational_policy.json
src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java
src/test/java/org/onap/clamp/loop/PolicyComponentTest.java
src/test/java/org/onap/clamp/policy/operational/OperationalPolicyRepresentationBuilderTest.java
src/test/resources/example/cds-response/vFW-CDS-modify-config-wf-expected-result.json [new file with mode: 0644]
src/test/resources/example/cds-response/vFW-CDS-modify-config-workflow.json [new file with mode: 0644]
src/test/resources/example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json [new file with mode: 0644]
src/test/resources/example/cds-response/vFW-CDS-resource-assignment-workflow.json [new file with mode: 0644]
src/test/resources/example/json-editor-schema/tca-policy-json-editor-schema.json
src/test/resources/tosca/model-properties-cds.json [new file with mode: 0644]
src/test/resources/tosca/model-properties.json
src/test/resources/tosca/new-converter/tosca_apex_with_metadata.json
src/test/resources/tosca/operational-policy-cds-payload-with-list.json [new file with mode: 0644]
src/test/resources/tosca/operational-policy-json-schema.json
src/test/resources/tosca/operational-policy-payload-legacy.yaml
src/test/resources/tosca/operational-policy-payload.json
src/test/resources/tosca/operational-policy-payload.yaml
src/test/resources/tosca/operational-policy-properties.json
src/test/resources/tosca/pdp-group-policy-payload.json
src/test/resources/tosca/policy-yaml-to-json-with-constraints.json
src/test/resources/tosca/policy-yaml-to-json-with-datatypes.json
src/test/resources/tosca/policy-yaml-to-json.json
src/test/resources/tosca/resource-details.json
src/test/resources/tosca/tosca_metadata_clamp_possible_values_json_schema.json
src/test/resources/tosca/tosca_with_date_time_json_schema.json [new file with mode: 0644]
ui-react-lib/libIndex.js
ui-react/src/LoopUI.js
ui-react/src/LoopUI.test.js
ui-react/src/__snapshots__/LoopUI.test.js.snap
ui-react/src/__snapshots__/OnapClamp.test.js.snap
ui-react/src/api/LoopCache.js
ui-react/src/api/LoopService.js
ui-react/src/components/dialogs/ConfigurationPolicy/ConfigurationPolicyModal.js
ui-react/src/components/dialogs/Loop/CreateLoopModal.js
ui-react/src/components/dialogs/Loop/DeployLoopModal.js
ui-react/src/components/dialogs/Loop/DeployLoopModal.test.js
ui-react/src/components/dialogs/Loop/LoopPropertiesModal.js
ui-react/src/components/dialogs/Loop/ModifyLoopModal.js
ui-react/src/components/dialogs/Loop/OpenLoopModal.js
ui-react/src/components/dialogs/Loop/__snapshots__/DeployLoopModal.test.js.snap
ui-react/src/components/dialogs/Loop/__snapshots__/LoopPropertiesModal.test.js.snap
ui-react/src/components/dialogs/Loop/__snapshots__/OpenLoopModal.test.js.snap
ui-react/src/components/dialogs/ManageDictionaries/ManageDictionaries.js
ui-react/src/components/dialogs/ManageDictionaries/__snapshots__/ManageDictionaries.test.js.snap
ui-react/src/components/dialogs/OperationalPolicy/OperationalPolicyModal.js
ui-react/src/components/dialogs/PerformActions.js
ui-react/src/components/dialogs/PerformActions.test.js
ui-react/src/components/dialogs/Policy/PolicyModal.js
ui-react/src/components/dialogs/RefreshStatus.js
ui-react/src/components/dialogs/RefreshStatus.test.js
ui-react/src/components/dialogs/Tosca/UploadToscaPolicyModal.js
ui-react/src/components/dialogs/Tosca/ViewLoopTemplatesModal.js
ui-react/src/components/dialogs/Tosca/ViewToscaPolicyModal.js
ui-react/src/components/dialogs/Tosca/__snapshots__/ViewLoopTemplatesModal.test.js.snap
ui-react/src/components/dialogs/Tosca/__snapshots__/ViewToscaPolicyModal.test.js.snap
ui-react/src/components/loop_viewer/logs/LoopLogs.js
ui-react/src/components/loop_viewer/svg/LoopSvg.js
ui-react/src/components/loop_viewer/svg/__snapshots__/LoopSvg.test.js.snap
ui-react/src/theme/globalStyle.js
version.properties

diff --git a/pom.xml b/pom.xml
index 3a64149..f51acac 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.onap.clamp</groupId>
        <artifactId>clds</artifactId>
-       <version>5.0.3-SNAPSHOT</version>
+       <version>5.0.5-SNAPSHOT</version>
        <name>clamp</name>
 
 
                        <artifactId>snakeyaml</artifactId>
                        <version>1.26</version>
                </dependency>
+               <dependency>
+                       <groupId>org.dom4j</groupId>
+                       <artifactId>dom4j</artifactId>
+                       <version>2.1.3</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.springframework.security</groupId>
+                       <artifactId>spring-security-web</artifactId>
+                       <version>5.2.3.RELEASE</version>
+               </dependency>
+
                <!-- TESTING -->
                <dependency>
                        <groupId>org.assertj</groupId>
diff --git a/releases/5.0.4-container.yaml b/releases/5.0.4-container.yaml
new file mode 100644 (file)
index 0000000..94e8afa
--- /dev/null
@@ -0,0 +1,10 @@
+distribution_type: 'container'
+container_release_tag: '5.0.4'
+project: 'clamp'
+log_dir: 'clamp-maven-docker-stage-master/389/'
+ref: 9698b59ab5eab72437d8a0f501b21da22b302df3
+containers:
+    - name: 'clamp-backend'
+      version: '5.0-STAGING-20200420T122047Z'
+    - name: 'clamp-frontend'
+      version: '5.0-STAGING-20200420T122047Z'
\ No newline at end of file
diff --git a/releases/5.0.4.yaml b/releases/5.0.4.yaml
new file mode 100644 (file)
index 0000000..335c79c
--- /dev/null
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '5.0.4'
+project: 'clamp'
+log_dir: 'clamp-maven-stage-master/400/'
index fe1937a..b8eb419 100644 (file)
@@ -34,6 +34,7 @@ import java.util.Map;
 import org.apache.camel.CamelContext;\r
 import org.apache.camel.Exchange;\r
 import org.apache.camel.builder.ExchangeBuilder;\r
+import org.onap.clamp.clds.exception.cds.CdsParametersException;\r
 import org.onap.clamp.clds.model.cds.CdsBpWorkFlowListResponse;\r
 import org.onap.clamp.clds.util.JsonUtils;\r
 import org.onap.clamp.clds.util.LoggingUtils;\r
@@ -117,7 +118,7 @@ public class CdsServices {
         return null;\r
     }\r
 \r
-    private JsonObject parseCdsResponse(String response) {\r
+    protected JsonObject parseCdsResponse(String response) {\r
         JsonObject root = JsonParser.parseString(response).getAsJsonObject();\r
         JsonObject inputs = root.getAsJsonObject("workFlowData").getAsJsonObject("inputs");\r
         JsonObject dataTypes = root.getAsJsonObject("dataTypes");\r
@@ -135,13 +136,34 @@ public class CdsServices {
             String type = inputProperty.get("type").getAsString();\r
             if (isComplexType(type, dataTypes)) {\r
                 inputObject.add(key, handleComplexType(type, dataTypes));\r
+            } else if (type.equalsIgnoreCase("list")) {\r
+                inputObject.add(key, handleListType(key, inputProperty,\r
+                                                    dataTypes));\r
             } else {\r
-                inputObject.addProperty(key, "");\r
+                inputObject.add(key, entry.getValue());\r
             }\r
         }\r
         return inputObject;\r
     }\r
 \r
+    private JsonObject handleListType(String propertyName,\r
+                                      JsonObject inputProperty,\r
+                                      JsonObject dataTypes) {\r
+        if (inputProperty.get("entry_schema") != null) {\r
+            String type = inputProperty.get("entry_schema").getAsJsonObject().get(\r
+                            "type").getAsString();\r
+            if (dataTypes.get(type) != null) {\r
+                JsonObject jsonObject = new JsonObject();\r
+                jsonObject.addProperty("type", "list");\r
+                jsonObject.add("properties", handleComplexType(type, dataTypes));\r
+                return jsonObject;\r
+            } else {\r
+                return inputProperty;\r
+            }\r
+        }\r
+        throw new CdsParametersException("Entry schema is null for " + propertyName);\r
+    }\r
+\r
     private JsonObject handleComplexType(String key, JsonObject dataTypes) {\r
         JsonObject properties = dataTypes.get(key).getAsJsonObject().get("properties").getAsJsonObject();\r
         return getInputProperties(properties, dataTypes);\r
diff --git a/src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java b/src/main/java/org/onap/clamp/clds/exception/cds/CdsParametersException.java
new file mode 100644 (file)
index 0000000..73ce31f
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd.
+ * ================================================================================
+ * 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.clds.exception.cds;
+
+/**
+ * Exception while parsing CDS response.
+ */
+public class CdsParametersException extends RuntimeException {
+
+    /**
+     * serialization id.
+     */
+    private static final long serialVersionUID = 8425657297510362736L;
+
+    /**
+     * This constructor can be used to create a new CdsParametersException.
+     *
+     * @param message The message to dump
+     */
+    public CdsParametersException(final String message) {
+        super(message);
+    }
+
+    /**
+     * This constructor can be used to create a new CdsParametersException.
+     *
+     * @param message The message to dump
+     * @param cause The Throwable cause object
+     */
+    public CdsParametersException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
index fdc9423..e3c6616 100644 (file)
@@ -28,8 +28,10 @@ public class JsonEditorSchemaConstants {
     //Data types in JSON Schema
     public static final String TYPE_OBJECT = "object";
     public static final String TYPE_ARRAY = "array";
+    public static final String TYPE_MAP = "map";
     public static final String TYPE_STRING = "string";
     public static final String TYPE_INTEGER = "integer";
+    public static final String TYPE_DATE_TIME = "datetime";
 
     //Key elements in JSON Schema
     public static final String TYPE = "type";
@@ -43,6 +45,9 @@ public class JsonEditorSchemaConstants {
     public static final String ITEMS = "items";
     public static final String PROPERTIES = "properties";
     public static final String PROPERTY_ORDER = "propertyOrder";
+    public static final String VALUES = "values";
+    public static final String HEADER_TEMPLATE = "headerTemplate";
+    public static final String HEADER_TEMPLATE_VALUE = "{{self.name}}";
 
     public static final String MINIMUM = "minimum";
     public static final String MAXIMUM = "maximum";
@@ -50,9 +55,13 @@ public class JsonEditorSchemaConstants {
     public static final String MAX_LENGTH = "maxLength";
     public static final String EXCLUSIVE_MINIMUM = "exclusiveMinimum";
     public static final String EXCLUSIVE_MAXIMUM = "exclusiveMaximum";
+    public static final String MINITEMS = "minItems";
+    public static final String MAXITEMS = "maxItems";
 
     public static final String CUSTOM_KEY_FORMAT = "format";
     public static final String CUSTOM_KEY_FORMAT_TABS_TOP = "tabs-top";
+    public static final String CUSTOM_KEY_FORMAT_TABS = "tabs";
+    public static final String CUSTOM_KEY_FORMAT_INPUT = "input";
     public static final String FORMAT_SELECT = "select";
     public static final String UNIQUE_ITEMS = "uniqueItems";
     public static final String TRUE = "true";
@@ -67,5 +76,11 @@ public class JsonEditorSchemaConstants {
     public static final String SCHEMA = "schema";
     public static final String CURRENT_VALUES = "currentValues";
 
+    public static final String PLUGIN = "plugin";
+    public static final String DATE_TIME_PICKER = "datetimepicker";
+    public static final String VALIDATION = "validation";
+    public static final String DATE_TIME_FORMAT = "YYYY/MM/DD HH:mm:ss";
+    public static final String INPUT_EVENT = "input_event";
+    public static final String DP_CHANGE = "dp.change";
 
 }
index 9601649..d00c431 100644 (file)
@@ -30,8 +30,11 @@ public class ToscaSchemaConstants {
     public static final String TYPE_MAP = "map";
     public static final String TYPE_STRING = "string";
     public static final String TYPE_INTEGER = "integer";
+    public static final String TYPE_NUMBER = "number";
+    public static final String TYPE_DATE_TIME = "datetime";
     public static final String TYPE_FLOAT = "float";
     public static final String TYPE_BOOLEAN = "boolean";
+    public static final String TYPE_USER_DEFINED = "userDefined";
 
     // Key elements in Tosca
     public static final String NODE_TYPES = "policy_types";
@@ -46,6 +49,8 @@ public class ToscaSchemaConstants {
     public static final String METADATA = "metadata";
     public static final String METADATA_POLICY_MODEL_TYPE = "policy_model_type";
     public static final String METADATA_ACRONYM = "acronym";
+    public static final String METADATA_ELEMENT_NAME = "element_name";
+    public static final String METADATA_HEADER_TEMPLATE = "header_template";
     public static final String METADATA_CLAMP_POSSIBLE_VALUES = "clamp_possible_values";
 
     // Constraints
index 666ca67..45bb87e 100644 (file)
@@ -38,6 +38,7 @@ import java.util.stream.Collectors;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.onap.clamp.clds.config.ClampProperties;
+import org.onap.clamp.tosca.Dictionary;
 import org.onap.clamp.tosca.DictionaryElement;
 import org.onap.clamp.tosca.DictionaryService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -142,6 +143,13 @@ public class ToscaYamlToJsonConvertor {
         parseNodeAndDataType(loadedYaml, nodeTypes, dataNodes);
         populateJsonEditorObject(loadedYaml, nodeTypes, dataNodes, jsonParentObject, jsonTempObject,
             modelTypeToUse);
+
+        String headerTemplate = getValueFromMetadata(validateAndConvertToJson(yamlString),
+            ToscaSchemaConstants.METADATA_HEADER_TEMPLATE);
+        if (headerTemplate != null) {
+            jsonParentObject.put(JsonEditorSchemaConstants.HEADER_TEMPLATE,
+                JsonEditorSchemaConstants.HEADER_TEMPLATE_VALUE);
+        }
         if (jsonTempObject.length() > 0) {
             jsonParentObject = jsonTempObject;
         }
@@ -234,7 +242,7 @@ public class ToscaYamlToJsonConvertor {
                                         jsonTempObject.put(JsonEditorSchemaConstants.ITEMS,
                                             jsonParentObject);
                                         jsonTempObject.put(JsonEditorSchemaConstants.FORMAT,
-                                            JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS_TOP);
+                                            JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_TABS);
                                         jsonTempObject.put(JsonEditorSchemaConstants.UNIQUE_ITEMS,
                                             JsonEditorSchemaConstants.TRUE);
                                     }
@@ -652,12 +660,43 @@ public class ToscaYamlToJsonConvertor {
 
                     Optional.ofNullable(cldsDictionaryElements).get().stream().forEach(c -> {
                         JSONObject jsonObject = new JSONObject();
+                        if (c.getSubDictionary() != null) {
+                            Dictionary subDictionary =
+                                dictionaryService.getDictionary(c.getSubDictionary());
+                            if (subDictionary != null
+                                && !subDictionary.getDictionaryElements().isEmpty()) {
+
+                                jsonObject.put(JsonEditorSchemaConstants.CUSTOM_KEY_FORMAT_INPUT,
+                                    JsonEditorSchemaConstants.FORMAT_SELECT);
+
+                                List<String> shortNames = new ArrayList<>();
+                                subDictionary.getDictionaryElements().stream().forEach(c1 -> {
+                                    shortNames.add(c1.getShortName());
+                                });
+                                jsonObject.put(JsonEditorSchemaConstants.VALUES, shortNames);
+                            }
+                        }
                         jsonObject.put(JsonEditorSchemaConstants.TYPE, getJsonType(c.getType()));
+
                         if (c.getType() != null
-                            && c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)) {
+                            && (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_STRING)
+                                || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)
+                                || c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP))) {
                             jsonObject.put(JsonEditorSchemaConstants.MIN_LENGTH, 1);
 
+                            if (c.getType().equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) {
+                                jsonObject.put(JsonEditorSchemaConstants.PLUGIN,
+                                    JsonEditorSchemaConstants.DATE_TIME_PICKER);
+                                jsonObject.put(JsonEditorSchemaConstants.INPUT_EVENT,
+                                    JsonEditorSchemaConstants.DP_CHANGE);
+                                JSONObject formatJsonObject = new JSONObject();
+                                formatJsonObject.put(JsonEditorSchemaConstants.FORMAT,
+                                    JsonEditorSchemaConstants.DATE_TIME_FORMAT);
+                                jsonObject.put(JsonEditorSchemaConstants.VALIDATION,
+                                    formatJsonObject);
+                            }
                         }
+
                         jsonObject.put(JsonEditorSchemaConstants.ID, c.getName());
                         jsonObject.put(JsonEditorSchemaConstants.LABEL, c.getShortName());
                         jsonObject.put(JsonEditorSchemaConstants.OPERATORS, subCldsDictionaryNames);
@@ -678,32 +717,44 @@ public class ToscaYamlToJsonConvertor {
             String dictionaryKey = dictionaryReference.substring(
                 dictionaryReference.indexOf(ToscaSchemaConstants.DICTIONARY) + 11,
                 dictionaryReference.length());
+
             if (dictionaryKey != null) {
-                List<DictionaryElement> cldsDictionaryElements =
-                    dictionaryService.getDictionary(dictionaryKey).getDictionaryElements().stream()
-                        .collect(Collectors.toList());
-                if (cldsDictionaryElements != null) {
-                    List<String> cldsDictionaryNames = new ArrayList<>();
-                    List<String> cldsDictionaryFullNames = new ArrayList<>();
-                    cldsDictionaryElements.stream().forEach(c -> {
-                        // Json type will be translated before Policy creation
-                        if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) {
-                            cldsDictionaryFullNames.add(c.getName());
+                if (dictionaryKey.contains(ToscaSchemaConstants.TYPE_USER_DEFINED)) {
+                    childObject.put(JsonEditorSchemaConstants.ENUM, new ArrayList<>());
+                    // Add Enum titles for generated translated values during
+                    // JSON instance generation
+                    JSONObject enumTitles = new JSONObject();
+                    enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, new ArrayList<>());
+                    childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles);
+                } else {
+                    List<DictionaryElement> cldsDictionaryElements =
+                        dictionaryService.getDictionary(dictionaryKey).getDictionaryElements()
+                            .stream().collect(Collectors.toList());
+                    if (cldsDictionaryElements != null) {
+                        List<String> cldsDictionaryNames = new ArrayList<>();
+                        List<String> cldsDictionaryFullNames = new ArrayList<>();
+                        cldsDictionaryElements.stream().forEach(c -> {
+                            // Json type will be translated before Policy creation
+                            if (c.getType() != null && !c.getType().equalsIgnoreCase("json")) {
+                                cldsDictionaryFullNames.add(c.getName());
+                            }
+                            cldsDictionaryNames.add(c.getShortName());
+                        });
+
+                        if (!cldsDictionaryFullNames.isEmpty()) {
+                            childObject.put(JsonEditorSchemaConstants.ENUM,
+                                cldsDictionaryFullNames);
+                            // Add Enum titles for generated translated values during JSON instance
+                            // generation
+                            JSONObject enumTitles = new JSONObject();
+                            enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES,
+                                cldsDictionaryNames);
+                            childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles);
+                        } else {
+                            childObject.put(JsonEditorSchemaConstants.ENUM, cldsDictionaryNames);
                         }
-                        cldsDictionaryNames.add(c.getShortName());
-                    });
 
-                    if (!cldsDictionaryFullNames.isEmpty()) {
-                        childObject.put(JsonEditorSchemaConstants.ENUM, cldsDictionaryFullNames);
-                        // Add Enum titles for generated translated values during JSON instance
-                        // generation
-                        JSONObject enumTitles = new JSONObject();
-                        enumTitles.put(JsonEditorSchemaConstants.ENUM_TITLES, cldsDictionaryNames);
-                        childObject.put(JsonEditorSchemaConstants.OPTIONS, enumTitles);
-                    } else {
-                        childObject.put(JsonEditorSchemaConstants.ENUM, cldsDictionaryNames);
                     }
-
                 }
             }
         }
@@ -711,10 +762,15 @@ public class ToscaYamlToJsonConvertor {
 
     private String getJsonType(String toscaType) {
         String jsonType = null;
-        if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)) {
+        if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_INTEGER)
+            || toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_NUMBER)) {
             jsonType = JsonEditorSchemaConstants.TYPE_INTEGER;
+        } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_DATE_TIME)) {
+            jsonType = JsonEditorSchemaConstants.TYPE_DATE_TIME;
         } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_LIST)) {
             jsonType = JsonEditorSchemaConstants.TYPE_ARRAY;
+        } else if (toscaType.equalsIgnoreCase(ToscaSchemaConstants.TYPE_MAP)) {
+            jsonType = JsonEditorSchemaConstants.TYPE_MAP;
         } else {
             jsonType = JsonEditorSchemaConstants.TYPE_STRING;
         }
index 81e30cf..c156414 100644 (file)
 
 package org.onap.clamp.clds.tosca.update.execution.cds;
 
+import static org.onap.clamp.clds.tosca.ToscaSchemaConstants.PROPERTIES;
+import static org.onap.clamp.clds.tosca.ToscaSchemaConstants.TYPE;
+import static org.onap.clamp.clds.tosca.ToscaSchemaConstants.TYPE_LIST;
+
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+
 import java.util.Map;
+import java.util.Set;
+
 import org.onap.clamp.clds.tosca.update.execution.ToscaMetadataProcess;
 import org.onap.clamp.loop.service.Service;
 import org.onap.clamp.tosca.DictionaryService;
@@ -58,9 +65,11 @@ public class ToscaMetadataCdsProcess extends ToscaMetadataProcess {
     }
 
     private static void generatePayload(JsonObject childObject, Service serviceModel) {
-        generatePayloadPerResource(childObject, "VF", serviceModel);
-        generatePayloadPerResource(childObject, "PNF", serviceModel);
-        addToJsonArray(childObject, "anyOf", createBlankEntry());
+        JsonArray schemaAnyOf = new JsonArray();
+        schemaAnyOf.addAll(createBlankEntry());
+        schemaAnyOf.addAll(generatePayloadPerResource("VF", serviceModel));
+        schemaAnyOf.addAll(generatePayloadPerResource("PNF", serviceModel));
+        addToJsonArray(childObject, "anyOf", schemaAnyOf);
     }
 
     private static void generateOperation(JsonObject childObject, Service serviceModel) {
@@ -92,8 +101,8 @@ public class ToscaMetadataCdsProcess extends ToscaMetadataProcess {
 
     }
 
-    private static void generatePayloadPerResource(JsonObject childObject, String resourceName,
-                                                   Service serviceModel) {
+    private static JsonArray generatePayloadPerResource(String resourceName,
+                                                        Service serviceModel) {
         JsonArray schemaAnyOf = new JsonArray();
 
         for (Map.Entry<String, JsonElement> entry : serviceModel.getResourceDetails().getAsJsonObject(resourceName)
@@ -105,13 +114,14 @@ public class ToscaMetadataCdsProcess extends ToscaMetadataProcess {
                         .entrySet()) {
                     JsonObject obj = new JsonObject();
                     obj.addProperty("title", workflowsEntry.getKey());
-                    obj.add("properties", createPayloadProperty(workflowsEntry.getValue().getAsJsonObject(),
-                            controllerProperties));
+                    obj.add("properties",
+                            createInputPropertiesForPayload(workflowsEntry.getValue().getAsJsonObject(),
+                                                            controllerProperties));
                     schemaAnyOf.add(obj);
                 }
             }
         }
-        addToJsonArray(childObject, "anyOf", schemaAnyOf);
+        return schemaAnyOf;
     }
 
     private static JsonArray createBlankEntry() {
@@ -123,20 +133,6 @@ public class ToscaMetadataCdsProcess extends ToscaMetadataProcess {
         return result;
     }
 
-    private static JsonObject createPayloadProperty(JsonObject workFlow, JsonObject controllerProperties) {
-        JsonObject payloadResult = new JsonObject();
-
-        payloadResult.add("artifact_name",
-                createAnyOfJsonProperty("artifact_name", controllerProperties.get("sdnc_model_name").getAsString()));
-        payloadResult.add("artifact_version",
-                createAnyOfJsonProperty("artifact_version",
-                        controllerProperties.get("sdnc_model_version").getAsString()));
-        payloadResult.add("mode", createAnyOfJsonProperty("mode", "async"));
-
-        payloadResult.add("data", createAnyOfJsonObject("data", workFlow.getAsJsonObject("inputs")));
-        return payloadResult;
-    }
-
     private static JsonObject createAnyOfJsonProperty(String name, String defaultValue) {
         JsonObject result = new JsonObject();
         result.addProperty("title", name);
@@ -157,9 +153,86 @@ public class ToscaMetadataCdsProcess extends ToscaMetadataProcess {
     private static void addToJsonArray(JsonObject childObject, String section, JsonArray value) {
         if (childObject.getAsJsonArray(section) != null) {
             childObject.getAsJsonArray(section).addAll(value);
-        }
-        else {
+        } else {
             childObject.add(section, value);
         }
     }
+
+    /**
+     * Returns the properties of payload based on the cds work flows.
+     *
+     * @param workFlow cds work flows to update payload
+     * @param controllerProperties cds properties to get blueprint name and
+     *                            version
+     * @return returns the properties of payload
+     */
+    public static JsonObject createInputPropertiesForPayload(JsonObject workFlow,
+                                                             JsonObject controllerProperties) {
+        String artifactName = controllerProperties.get("sdnc_model_name").getAsString();
+        String artifactVersion = controllerProperties.get("sdnc_model_version").getAsString();
+        JsonObject inputs = workFlow.getAsJsonObject("inputs");
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.add("artifact_name", createAnyOfJsonProperty(
+                "artifact name", artifactName));
+        jsonObject.add("artifact_version", createAnyOfJsonProperty(
+                "artifact version", artifactVersion));
+        jsonObject.add("mode", createCdsInputProperty(
+                "mode", "string", "async", null));
+        jsonObject.add("data", createDataProperty(inputs));
+
+        return jsonObject;
+    }
+
+    private static JsonObject createDataProperty(JsonObject inputs) {
+        JsonObject data = new JsonObject();
+        data.addProperty("title", "data");
+        data.add(PROPERTIES, addDataFields(inputs));
+        return data;
+    }
+
+    private static JsonObject addDataFields(JsonObject inputs) {
+        JsonObject jsonObject = new JsonObject();
+        Set<Map.Entry<String, JsonElement>> entrySet = inputs.entrySet();
+        for (Map.Entry<String, JsonElement> entry : entrySet) {
+            String key = entry.getKey();
+            JsonObject inputProperty = inputs.getAsJsonObject(key);
+            if (inputProperty.get(TYPE) == null) {
+                jsonObject.add(entry.getKey(),
+                               createAnyOfJsonObject(key,
+                                                     addDataFields(entry.getValue().getAsJsonObject())));
+            } else {
+                jsonObject.add(entry.getKey(),
+                               createCdsInputProperty(key,
+                                                      inputProperty.get("type").getAsString(),
+                                                      null,
+                                                      entry.getValue().getAsJsonObject()));
+            }
+        }
+        return jsonObject;
+    }
+
+    private static JsonObject createCdsInputProperty(String title,
+                                                     String type,
+                                                     String defaultValue,
+                                                     JsonObject cdsProperty) {
+        JsonObject property = new JsonObject();
+        property.addProperty("title", title);
+
+        if (TYPE_LIST.equalsIgnoreCase(type)) {
+            property.addProperty(TYPE, "array");
+            if (cdsProperty.get(PROPERTIES) != null) {
+                JsonObject listProperties = new JsonObject();
+                listProperties.add(PROPERTIES,
+                                   addDataFields(cdsProperty.get(PROPERTIES).getAsJsonObject()));
+                property.add("items", listProperties);
+            }
+        } else {
+            property.addProperty(TYPE, type);
+        }
+
+        if (defaultValue != null) {
+            property.addProperty("default", defaultValue);
+        }
+        return property;
+    }
 }
index 19a17db..0813313 100644 (file)
@@ -330,6 +330,36 @@ public class Loop extends AuditEntity implements Serializable {
         }
     }
 
+    /**
+     * Return the operationalPolicy object with the opPolicyName.
+     *
+     * @param opPolicyName The operationalPolicy name
+     * @return The OperationalPolicy object found in loop object
+     */
+    public OperationalPolicy getOperationalPolicy(String opPolicyName) {
+        for (OperationalPolicy operationalPolicy : this.getOperationalPolicies()) {
+            if (operationalPolicy.getName().equals(opPolicyName)) {
+                return operationalPolicy;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Return the microServicePolicy object with the msPolicyName.
+     *
+     * @param msPolicyName The microServicePolicy name
+     * @return The MicroServicePolicy object found in loop object
+     */
+    public MicroServicePolicy getMicroServicePolicy(String msPolicyName) {
+        for (MicroServicePolicy microServicePolicy : this.getMicroServicePolicies()) {
+            if (microServicePolicy.getName().equals(msPolicyName)) {
+                return microServicePolicy;
+            }
+        }
+        return null;
+    }
+
     /**
      * Generate the loop name.
      *
index a2a4463..fad93bc 100644 (file)
@@ -137,11 +137,11 @@ public class LoopController {
     }
 
     /**
-     * This method remove an operational policy to a loop instance.
+     * This method removes an operational policy from a loop instance.
      *
      * @param loopName      The loop name
      * @param policyType    The policy model type
-     * @param policyVersion The policy model  version
+     * @param policyVersion The policy model version
      * @return The loop modified
      */
     public Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) {
index af1f58b..3f568a3 100644 (file)
@@ -98,7 +98,7 @@ public class LoopService {
     public void updateDcaeDeploymentFields(Loop loop, String deploymentId, String deploymentUrl) {
         loop.setDcaeDeploymentId(deploymentId);
         loop.setDcaeDeploymentStatusUrl(deploymentUrl);
-        loopsRepository.save(loop);
+        loopsRepository.saveAndFlush(loop);
     }
 
     public void updateLoopState(Loop loop, String newState) {
@@ -118,6 +118,12 @@ public class LoopService {
     Loop addOperationalPolicy(String loopName, String policyType, String policyVersion) throws IOException {
         Loop loop = getLoop(loopName);
         PolicyModel policyModel = policyModelsService.getPolicyModel(policyType, policyVersion);
+        Set<OperationalPolicy> opPolicySet = loop.getOperationalPolicies();
+        for (OperationalPolicy opPolicy : opPolicySet) {
+               if (opPolicy.getPolicyModel().equals(policyModel)) {
+                       throw new IllegalArgumentException("This type of Operational Policy is already added to the loop. Please choose another one.");
+               }
+        }
         if (policyModel == null) {
             return null;
         }
@@ -131,7 +137,7 @@ public class LoopService {
      *
      * @param loopName      The loop name
      * @param policyType    The policy model type
-     * @param policyVersion The policy model  version
+     * @param policyVersion The policy model version
      * @return The loop modified
      */
     Loop removeOperationalPolicy(String loopName, String policyType, String policyVersion) {
index 8270a96..227f40a 100644 (file)
@@ -28,7 +28,6 @@ import com.att.eelf.configuration.EELFManager;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -76,25 +75,33 @@ public class PolicyComponent extends ExternalComponent {
     /**
      * Generates the Json that must be sent to policy to add all policies to Active
      * PDP group.
-     *
+     * @param loop the loop object
+     * @param action POST (to add policy to group) or DELETE (to delete policy from group)
      * @return The json, payload to send
      */
-    public static String createPoliciesPayloadPdpGroup(Loop loop) {
+    public static String createPoliciesPayloadPdpGroup(Loop loop, String action) {
         Map<String, Map<String, List<JsonObject>>> pdpGroupMap = new HashMap<>();
         for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) {
             updatePdpGroupMap(opPolicy.getPdpGroup(), opPolicy.getPdpSubgroup(),
                     opPolicy.getName(),
-                    opPolicy.getPolicyModel().getVersion(), pdpGroupMap);
+                    "1.0.0", pdpGroupMap);
+            if (opPolicy.isLegacy()) {
+                for (String guardName:opPolicy.createGuardPolicyPayloads().keySet()) {
+                    updatePdpGroupMap(opPolicy.getPdpGroup(), opPolicy.getPdpSubgroup(),
+                            guardName,
+                            "1.0.0", pdpGroupMap);
+                }
+            }
         }
 
         for (MicroServicePolicy msPolicy : loop.getMicroServicePolicies()) {
             updatePdpGroupMap(msPolicy.getPdpGroup(), msPolicy.getPdpSubgroup(),
                     msPolicy.getName(),
-                    msPolicy.getPolicyModel().getVersion(), pdpGroupMap);
+                    "1.0.0", pdpGroupMap);
         }
 
         String payload = new GsonBuilder().setPrettyPrinting().create()
-                .toJson(generateActivatePdpGroupPayload(pdpGroupMap));
+                .toJson(generateActivatePdpGroupPayload(pdpGroupMap, action));
         logger.info("PdpGroup policy payload: " + payload);
         return payload;
     }
@@ -102,12 +109,12 @@ public class PolicyComponent extends ExternalComponent {
     private static void updatePdpGroupMap(String pdpGroup,
                                           String pdpSubGroup,
                                           String policyName,
-                                          String policyModelVersion,
+                                          String policyVersion,
                                           Map<String, Map<String,
                                                   List<JsonObject>>> pdpGroupMap) {
         JsonObject policyJson = new JsonObject();
         policyJson.addProperty("name", policyName);
-        policyJson.addProperty("version", policyModelVersion);
+        policyJson.addProperty("version", policyVersion);
         Map<String, List<JsonObject>> pdpSubGroupMap;
         List<JsonObject> policyList;
         if (pdpGroupMap.get(pdpGroup) == null) {
@@ -129,7 +136,7 @@ public class PolicyComponent extends ExternalComponent {
     }
 
     private static JsonObject generateActivatePdpGroupPayload(
-            Map<String, Map<String, List<JsonObject>>> pdpGroupMap) {
+            Map<String, Map<String, List<JsonObject>>> pdpGroupMap, String action) {
         JsonArray payloadArray = new JsonArray();
         for (Entry<String, Map<String, List<JsonObject>>> pdpGroupInfo : pdpGroupMap.entrySet()) {
             JsonObject pdpGroupNode = new JsonObject();
@@ -141,7 +148,7 @@ public class PolicyComponent extends ExternalComponent {
                 JsonObject pdpSubGroupNode = new JsonObject();
                 subPdpArray.add(pdpSubGroupNode);
                 pdpSubGroupNode.addProperty("pdpType", pdpSubGroupInfo.getKey());
-                pdpSubGroupNode.addProperty("action", "POST");
+                pdpSubGroupNode.addProperty("action", action);
 
                 JsonArray policyArray = new JsonArray();
                 pdpSubGroupNode.add("policies", policyArray);
@@ -157,25 +164,6 @@ public class PolicyComponent extends ExternalComponent {
         return jsonObject;
     }
 
-    /**
-     * Generates the list of policy names that must be send/remove to/from active
-     * PDP group.
-     *
-     * @return A list of policy names
-     */
-    public static List<String> listPolicyNamesPdpGroup(Loop loop) {
-        List<String> policyNamesList = new ArrayList<>();
-        for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) {
-            policyNamesList.add(opPolicy.getName());
-            policyNamesList.addAll(opPolicy.createGuardPolicyPayloads().keySet());
-        }
-        for (MicroServicePolicy microServicePolicy : loop.getMicroServicePolicies()) {
-            policyNamesList.add(microServicePolicy.getName());
-        }
-        logger.info("Policies that will be removed from PDP:  " + policyNamesList);
-        return policyNamesList;
-    }
-
     private static ExternalComponentState findNewState(boolean found, boolean deployed) {
 
         ExternalComponentState newState = NOT_SENT;
index d84f2c8..65e88d1 100644 (file)
@@ -284,4 +284,6 @@ public abstract class Policy extends AuditEntity {
                 .append(blueprintFilename.replaceAll(".yaml", ""));
         return buffer.toString().replace('.', '_').replaceAll(" ", "");
     }
+
+    public abstract Boolean isLegacy();
 }
index 77627a3..127f495 100644 (file)
@@ -157,6 +157,11 @@ public class MicroServicePolicy extends Policy implements Serializable {
                         this.getPolicyModel().getPolicyModelType(), serviceModel));
     }
 
+    @Override
+    public Boolean isLegacy() {
+        return false;
+    }
+
     public Boolean getShared() {
         return shared;
     }
index 37533c1..060e79a 100644 (file)
@@ -91,7 +91,7 @@ public class MicroServicePolicyService implements PolicyService<MicroServicePoli
                                            String deploymentUrl) {
         microServicePolicy.setDcaeDeploymentId(deploymentId);
         microServicePolicy.setDcaeDeploymentStatusUrl(deploymentUrl);
-        microServiceRepository.save(microServicePolicy);
+        microServiceRepository.saveAndFlush(microServicePolicy);
     }
 
 
index 033f2ce..3765277 100644 (file)
@@ -201,11 +201,13 @@ public class LegacyOperationalPolicy {
             policy.getAsJsonObject().remove(ACTOR);
             String actorStr = actor.getAsJsonObject().get(ACTOR).getAsString();
             policy.getAsJsonObject().addProperty(ACTOR, actorStr);
-            policy.getAsJsonObject().addProperty(RECIPE, getRecipe(actor));
 
             if ("CDS".equalsIgnoreCase(actorStr)) {
-                addPayloadAttributes(actor.getAsJsonObject(ACTOR).getAsJsonObject(RECIPE), policy);
+                policy.getAsJsonObject().addProperty(RECIPE, getRecipe(actor));
+                addCdsPayloadAttributes(actor.getAsJsonObject(RECIPE), policy);
             } else {
+                policy.getAsJsonObject().addProperty(RECIPE,
+                                                     actor.getAsJsonObject().get(RECIPE).getAsString());
                 addPayloadAttributes(actor, policy);
             }
         }
@@ -226,7 +228,20 @@ public class LegacyOperationalPolicy {
         }
     }
 
+    private static void addCdsPayloadAttributes(JsonObject jsonObject,
+                                             JsonElement policy) {
+        JsonElement payloadElem = jsonObject.getAsJsonObject().get(PAYLOAD);
+        JsonObject payloadObject = payloadElem != null ?
+                payloadElem.getAsJsonObject() : null;
+        if (payloadObject != null) {
+            policy.getAsJsonObject().add(PAYLOAD,
+                                         payloadObject);
+        } else {
+            policy.getAsJsonObject().addProperty(PAYLOAD, "");
+        }
+    }
+
     private static String getRecipe(JsonObject actor) {
-        return actor.getAsJsonObject().get("type").getAsString();
+        return actor.getAsJsonObject().get("recipe").getAsJsonObject().get("recipe").getAsString();
     }
 }
index 44ee119..4e362d8 100644 (file)
 
 package org.onap.clamp.policy.operational;
 
+import static org.onap.clamp.clds.tosca.update.execution.cds.ToscaMetadataCdsProcess.createInputPropertiesForPayload;
+
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+
 import java.io.IOException;
 import java.util.Map.Entry;
+
 import org.onap.clamp.clds.util.JsonUtils;
 import org.onap.clamp.clds.util.ResourceFileUtil;
 import org.onap.clamp.loop.service.Service;
@@ -70,7 +74,7 @@ public class OperationalPolicyRepresentationBuilder {
 
             for (JsonElement actor : actors) {
                 if ("CDS".equalsIgnoreCase(actor.getAsJsonObject().get("title").getAsString())) {
-                    actor.getAsJsonObject().get("properties").getAsJsonObject().get("type").getAsJsonObject()
+                    actor.getAsJsonObject().get("properties").getAsJsonObject().get("recipe").getAsJsonObject()
                             .get("anyOf").getAsJsonArray()
                             .addAll(createAnyOfArrayForCdsRecipe(modelJson));
                 }
@@ -195,8 +199,9 @@ public class OperationalPolicyRepresentationBuilder {
                 for (Entry<String, JsonElement> workflowsEntry : workflows.entrySet()) {
                     JsonObject obj = new JsonObject();
                     obj.addProperty("title", workflowsEntry.getKey());
+                    obj.addProperty("type", "object");
                     obj.add("properties", createPayloadProperty(workflowsEntry.getValue().getAsJsonObject(),
-                            controllerProperties));
+                            controllerProperties, workflowsEntry.getKey()));
                     schemaArray.add(obj);
                 }
 
@@ -205,26 +210,27 @@ public class OperationalPolicyRepresentationBuilder {
         return schemaArray;
     }
 
-    private static JsonObject createPayloadProperty(JsonObject workFlow, JsonObject controllerProperties) {
-        JsonObject type = new JsonObject();
-        type.addProperty("title", "Payload (YAML)");
-        type.addProperty("type", "string");
-        type.addProperty("default", createDefaultStringForPayload(workFlow, controllerProperties));
-        type.addProperty("format", "textarea");
+    private static JsonObject createPayloadProperty(JsonObject workFlow,
+                                                    JsonObject controllerProperties, String workFlowName) {
+        JsonObject payload = new JsonObject();
+        payload.addProperty("title", "Payload (YAML)");
+        payload.addProperty("type", "object");
+        payload.add("properties", createInputPropertiesForPayload(workFlow,
+                                                                  controllerProperties));
         JsonObject properties = new JsonObject();
-        properties.add("type", type);
+        properties.add("recipe", createRecipeForCdsWorkflow(workFlowName));
+        properties.add("payload", payload);
         return properties;
     }
 
-    private static String createDefaultStringForPayload(JsonObject workFlow, JsonObject controllerProperties) {
-        String artifactName = controllerProperties.get("sdnc_model_name").toString();
-        String artifactVersion = controllerProperties.get("sdnc_model_version").toString();
-        String data = workFlow.getAsJsonObject("inputs").toString();
-        StringBuilder builder = new StringBuilder("'").append("artifact_name : ").append(artifactName).append("\n")
-                .append("artifact_version : ").append(artifactVersion).append("\n")
-                .append("mode : async").append("\n")
-                .append("data : ").append("'").append("\\").append("'").append(data).append("\\").append("'")
-                .append("'");
-        return builder.toString();
+    private static JsonObject createRecipeForCdsWorkflow(String workflow) {
+        JsonObject recipe = new JsonObject();
+        recipe.addProperty("title", "recipe");
+        recipe.addProperty("type", "string");
+        recipe.addProperty("default", workflow);
+        JsonObject options = new JsonObject();
+        options.addProperty("hidden", true);
+        recipe.add("options", options);
+        return recipe;
     }
 }
index e6741d6..879c9b7 100644 (file)
                                                uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DELETE request','INFO',${exchangeProperty[loopObject]})" />
                                        <to uri="direct:undeploy-loop" />
                                        <to uri="direct:remove-all-policy-from-active-pdp-group" />
+                                       <log loggingLevel="INFO"
+                                               message="Deleting all MICRO-SERVICES policies defined in loop ${exchangeProperty[loopObject].getName()}" />
                                        <split>
                                                <simple>${exchangeProperty[loopObject].getMicroServicePolicies()}
                                                </simple>
-                                               <setProperty propertyName="microServicePolicy">
+                                               <setProperty propertyName="policy">
                                                        <simple>${body}</simple>
                                                </setProperty>
                                                <log loggingLevel="INFO"
-                                                       message="Processing Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" />
-                                               <to uri="direct:delete-micro-service-policy" />
+                                                       message="Deleting Micro Service Policy: ${exchangeProperty[policy].getName()}" />
+                                               <setProperty propertyName="raiseHttpExceptionFlag">
+                                                       <simple resultType="java.lang.Boolean">false</simple>
+                                               </setProperty>
+                                               <to uri="direct:delete-policy" />
                                        </split>
-
                                        <log loggingLevel="INFO"
-                                               message="Processing all OPERATIONAL policies defined in loop ${exchangeProperty[loopObject].getName()}" />
+                                               message="Deleting all OPERATIONAL policies defined in loop ${exchangeProperty[loopObject].getName()}" />
                                        <split>
                                                <simple>${exchangeProperty[loopObject].getOperationalPolicies()}
                                                </simple>
-                                               <setProperty propertyName="operationalPolicy">
+                                               <setProperty propertyName="policy">
                                                        <simple>${body}</simple>
                                                </setProperty>
                                                <log loggingLevel="INFO"
-                                                       message="Processing Operational Policy: ${exchangeProperty[operationalPolicy].getName()}" />
-                                               <to uri="direct:delete-operational-policy" />
-                                               <log loggingLevel="INFO"
-                                                       message="Processing all GUARD policies defined in loop ${exchangeProperty[loopObject].getName()}" />
-                                               <split>
-                                                       <simple>${exchangeProperty[operationalPolicy].createGuardPolicyPayloads().entrySet()}
-                                                       </simple>
-                                                       <setProperty propertyName="guardPolicy">
-                                                               <simple>${body}</simple>
-                                                       </setProperty>
-                                                       <log loggingLevel="INFO"
-                                                               message="Processing Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" />
-                                                       <to uri="direct:delete-guard-policy" />
-                                               </split>
+                                                       message="Deleting Operational Policy: ${exchangeProperty[policy].getName()}" />
+                                               <setProperty propertyName="raiseHttpExceptionFlag">
+                                                       <simple resultType="java.lang.Boolean">false</simple>
+                                               </setProperty>
+                                               <to uri="direct:delete-policy" />
+                                               <choice>
+                                                       <when>
+                                                               <simple>${exchangeProperty['policy'].isLegacy()} == true
+                                                               </simple>
+                                                               <log loggingLevel="INFO"
+                                                                       message="Deleting all GUARD policies (LEGACY) defined in loop ${exchangeProperty[loopObject].getName()}" />
+                                                               <split>
+                                                                       <simple>${exchangeProperty[operationalPolicy].createGuardPolicyPayloads().entrySet()}
+                                                                       </simple>
+                                                                       <setProperty propertyName="guardPolicy">
+                                                                               <simple>${body}</simple>
+                                                                       </setProperty>
+                                                                       <log loggingLevel="INFO"
+                                                                               message="Deleting Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" />
+                                                                       <setProperty propertyName="raiseHttpExceptionFlag">
+                                                                               <simple resultType="java.lang.Boolean">false</simple>
+                                                                       </setProperty>
+                                                                       <to uri="direct:delete-guard-policy" />
+                                                               </split>
+                                                       </when>
+                                               </choice>
                                        </split>
                                        <to
-                                               uri="bean:org.onap.clamp.loop.log.LoopController?method=deleteLoop(${header.loopName})" />
+                                               uri="bean:org.onap.clamp.loop.LoopController?method=deleteLoop(${header.loopName})" />
                                        <log loggingLevel="INFO"
                                                message="DELETE request successfully executed for loop: ${header.loopName}" />
-                                       <to
-                                               uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DELETE request successfully executed','INFO',${exchangeProperty[loopObject]})" />
                                        <to
                                                uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
                                        <doCatch>
                                        <to uri="direct:load-loop" />
                                        <to
                                                uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request','INFO',${exchangeProperty[loopObject]})" />
-                                       <doTry>
-                                               <to uri="direct:update-policy-status-for-loop" />
-                                               <to uri="direct:update-dcae-status-for-loop" />
-                                               <to uri="direct:update-loop-state" />
+                                       <to uri="direct:update-policy-status-for-loop" />
+                                       <to uri="direct:update-dcae-status-for-loop" />
+                                       <to uri="direct:update-loop-state" />
 
-                                               <to
+                                       <to
                                                        uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request successfully executed','INFO',${exchangeProperty[loopObject]})" />
-                                               <to
+                                       <to
                                                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" />
-                                       </doTry>
                                        <doCatch>
                                                <exception>java.lang.Exception</exception>
                                                <handled>
                                                         message="GET STATUS request FAILED for loop: ${header.loopName}, ${exception.stacktrace}" />
                                                <to
                                                                uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" />
-                                               <setHeader headerName="CamelHttpResponseCode">
-                                                       <constant>500</constant>
-                                               </setHeader>
-                                               <setBody>
-                                                       <simple>GET STATUS request FAILED</simple>
-                                               </setBody>
                                        </doCatch>
                                        <doFinally>
                                                <setBody>
                                                        <simple>${exchangeProperty[loopObject]}</simple>
                                                </setBody>
+                                               <setHeader headerName="CamelHttpResponseCode">
+                                                       <constant>200</constant>
+                                               </setHeader>
                                        </doFinally>
                                </doTry>
                        </route>
                                </doTry>
                        </route>
                </put>
-               <put uri="/v2/loop/removeOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}" outType="org.onap.clamp.loop.Loop" produces="application/json">
+               <put uri="/v2/loop/removeOperationaPolicy/{loopName}/policyModel/{policyType}/{policyVersion}/{policyName}" outType="org.onap.clamp.loop.Loop" produces="application/json">
                        <route>
-                               <removeHeaders pattern="*" excludePattern="loopName|policyType|policyVersion" />
+                               <removeHeaders pattern="*" excludePattern="loopName|policyType|policyVersion|policyName" />
                                <doTry>
                                        <to
                                                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=startLog(*, 'REMOVE operational Policy')" />
                                        <to
                                                        uri="bean:org.onap.clamp.authorization.AuthorizationController?method=authorize(*,'cl','','update')" />
                                        <to uri="direct:load-loop" />
+                                       <setProperty propertyName="policyName">
+                                               <simple>${header.policyName}</simple>
+                                       </setProperty>
+                                       <setProperty propertyName="policy">
+                                               <simple>${exchangeProperty[loopObject].getOperationalPolicy(header.policyName)}</simple>
+                                       </setProperty>
+                                       <setProperty propertyName="raiseHttpExceptionFlag">
+                                               <simple resultType="java.lang.Boolean">false</simple>
+                                       </setProperty>
+                                       <to uri="direct:remove-one-policy-from-active-pdp-group" />
+                                       <setProperty propertyName="raiseHttpExceptionFlag">
+                                               <simple resultType="java.lang.Boolean">false</simple>
+                                       </setProperty>
+                                       <to uri="direct:delete-policy" />
                                        <to
                                                        uri="bean:org.onap.clamp.loop.LoopController?method=removeOperationalPolicy(${header.loopName},${header.policyType},${header.policyVersion})" />
                                        <to
index f40207c..e36f28a 100644 (file)
                                message="Endpoint to query Closed Loop status: ${exchangeProperty[getStatusUrl]}"></log>
                        <toD
                                uri="${exchangeProperty[getStatusUrl]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.dcae.deployment.userName}}&amp;authPassword={{clamp.config.dcae.deployment.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=30000&amp;authenticationPreemptive=true&amp;connectionClose=true" />
+                       <doCatch>
+                               <exception>java.lang.Exception</exception>
+                               <handled>
+                                       <constant>true</constant>
+                               </handled>
+
+                               <log loggingLevel="ERROR"
+                                        message="GET policy request FAILED for loop: ${header.loopName}, ${exception.stacktrace}" />
+                               <to
+                                               uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET policy request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" />
+                       </doCatch>
                        <doFinally>
                                <to uri="direct:reset-raise-http-exception-flag" />
                                <to
index 8c22743..2f4d9c8 100644 (file)
@@ -40,6 +40,9 @@
                        <setProperty propertyName="policyType">
                                <simple>${body.getPolicyModel().getPolicyModelType()}</simple>
                        </setProperty>
+                       <setProperty propertyName="policyTypeVersion">
+                               <simple>${body.getPolicyModel().getVersion()}</simple>
+                       </setProperty>
                        <setProperty propertyName="policyVersion">
                                <simple>1.0.0</simple>
                        </setProperty>
                        <setProperty propertyName="policyType">
                                <simple>${body.getPolicyModel().getPolicyModelType()}</simple>
                        </setProperty>
-                       <setProperty propertyName="policyVersion">
-                               <simple>1.0.0</simple>
+                       <setProperty propertyName="policyTypeVersion">
+                               <simple>${body.getPolicyModel().getVersion()}</simple>
                        </setProperty>
+                       <choice>
+                               <when>
+                                       <simple>${body.isLegacy()} == true</simple>
+                                       <setProperty propertyName="policyVersion">
+                                               <simple>1</simple>
+                                       </setProperty>
+                               </when>
+                               <otherwise>
+                                       <setProperty propertyName="policyVersion">
+                                               <simple>1.0.0</simple>
+                                       </setProperty>
+                               </otherwise>
+                       </choice>
                        <setProperty propertyName="operationalPolicy">
                                <simple>${body}</simple>
                        </setProperty>
                                <setProperty propertyName="policyType">
                                        <simple>onap.policies.controlloop.Guard</simple>
                                </setProperty>
+                               <setProperty propertyName="policyTypeVersion">
+                                       <simple>1.0.0</simple>
+                               </setProperty>
                                <setProperty propertyName="policyVersion">
                                        <simple>1</simple>
                                </setProperty>
index a2c7a4c..1731308 100644 (file)
-
 <routes xmlns="http://camel.apache.org/schema/spring">
-               <route id="verify-one-policy">
-                               <from uri="direct:verify-one-policy"/>
-                               <setProperty propertyName="raiseHttpExceptionFlag">
-                                               <simple resultType="java.lang.Boolean">false</simple>
-                               </setProperty>
-                               <to uri="direct:get-policy"/>
-                               <when>
-                                               <simple> ${header.CamelHttpResponseCode} != 200 </simple>
-                                               <setProperty propertyName="policyFound">
-                                                               <simple resultType="java.lang.Boolean">false</simple>
-                                               </setProperty>
-                                               <log loggingLevel="WARN"
-                                                               message="At least one policy has not been found on policy engine: ${exchangeProperty[policyName]}"/>
-                               </when>
-                               <setProperty propertyName="raiseHttpExceptionFlag">
-                                               <simple resultType="java.lang.Boolean">false</simple>
-                               </setProperty>
-                               <to uri="direct:get-deployment-policy"/>
-                               <when>
-                                               <simple> ${header.CamelHttpResponseCode} != 200 </simple>
-                                               <setProperty propertyName="policyDeployed">
-                                                               <simple resultType="java.lang.Boolean">false</simple>
-                                               </setProperty>
-                                               <log loggingLevel="WARN"
-                                                               message="At least one policy has not been deployed on policy engine: ${exchangeProperty[policyName]}"/>
-                               </when>
-                               <setProperty propertyName="newPolicyState">
-                                               <simple>${exchangeProperty[policyComponent].computeState(*)}</simple>
-                               </setProperty>
-               </route>
-
-               <route id="get-policy">
-                               <from uri="direct:get-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Getting Policy: ${exchangeProperty[policyName]}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Get Policy')"/>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>GET</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to get policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/${exchangeProperty[policyVersion]}"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/${exchangeProperty[policyVersion]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[policyName]} GET
-                                                                                               Policy status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
-
-               <route id="get-deployment-policy">
-                               <from uri="direct:get-deployment-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Getting the policy deployment in PDP: ${exchangeProperty[policyName]}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy deployment in PDP')"/>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>GET</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[policyName]} GET Policy deployment
-                                                                                               status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
-               <route id="get-all-policy-models">
-                               <from uri="direct:get-all-policy-models"/>
-                               <doTry>
-                                               <log loggingLevel="INFO" message="Getting all the policy models"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting all the policy models')"/>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>GET</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to get all policy models: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <convertBodyTo type="java.lang.String"/>                
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
-               <route id="get-policy-model">
-                               <from uri="direct:get-policy-model"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Getting the policy model: ${exchangeProperty[policyModelName]}/${exchangeProperty[policyModelVersion]}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy model')"/>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>GET</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to get policy model: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyModelName]}/versions/${exchangeProperty[policyModelVersion]}"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyModelName]}/versions/${exchangeProperty[policyModelVersion]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <convertBodyTo type="java.lang.String"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
-               <route id="create-policy">
-                       <from uri="direct:create-policy"/>
-                       <doTry>
-                               <log loggingLevel="INFO"
-                                        message="Creating Policy: ${exchangeProperty[policy].getName()}"/>
-                               <to
-                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Policy')"/>
-                               <setBody>
-                                       <simple>${exchangeProperty[policy].createPolicyPayload()}
-                                       </simple>
-                               </setBody>
-                               <setHeader headerName="CamelHttpMethod">
-                                       <constant>POST</constant>
-                               </setHeader>
-                               <setHeader headerName="Content-Type">
-                                       <constant>application/json</constant>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-RequestID">
-                                       <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                       </simple>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-InvocationID">
-                                       <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                       </simple>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-PartnerName">
-                                       <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                       </simple>
-                               </setHeader>
-                               <log loggingLevel="INFO"
-                                        message="Endpoint to create policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies"></log>
-                               <toD
-                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                               <doFinally>
-                                       <to uri="direct:reset-raise-http-exception-flag"/>
-                                       <to
-                                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                       <setProperty propertyName="logMessage">
-                                               <simple>${exchangeProperty[policy].getName()} creation
-                                                       status
-                                               </simple>
-                                       </setProperty>
-                                       <setProperty propertyName="logComponent">
-                                               <simple>POLICY</simple>
-                                       </setProperty>
-                                       <to uri="direct:dump-loop-log-http-response"/>
-                               </doFinally>
-                       </doTry>
-               </route>
+    <route id="verify-one-policy">
+        <from uri="direct:verify-one-policy"/>
+        <setProperty propertyName="raiseHttpExceptionFlag">
+            <simple resultType="java.lang.Boolean">false</simple>
+        </setProperty>
+        <to uri="direct:get-policy"/>
+        <when>
+            <simple>${header.CamelHttpResponseCode} != 200</simple>
+            <setProperty propertyName="policyFound">
+                <simple resultType="java.lang.Boolean">false</simple>
+            </setProperty>
+            <log loggingLevel="WARN"
+                 message="At least one policy has not been found on policy engine: ${exchangeProperty[policyName]}"/>
+        </when>
+        <setProperty propertyName="raiseHttpExceptionFlag">
+            <simple resultType="java.lang.Boolean">false</simple>
+        </setProperty>
+        <to uri="direct:get-deployment-policy"/>
+        <when>
+            <simple>${header.CamelHttpResponseCode} != 200</simple>
+            <setProperty propertyName="policyDeployed">
+                <simple resultType="java.lang.Boolean">false</simple>
+            </setProperty>
+            <log loggingLevel="WARN"
+                 message="At least one policy has not been deployed on policy engine: ${exchangeProperty[policyName]}"/>
+        </when>
+        <setProperty propertyName="newPolicyState">
+            <simple>${exchangeProperty[policyComponent].computeState(*)}</simple>
+        </setProperty>
+    </route>
 
-               <route id="delete-policy">
-                       <from uri="direct:delete-policy"/>
-                       <doTry>
-                               <log loggingLevel="INFO"
-                                        message="Deleting Policy: ${exchangeProperty[policy].getName()}"/>
-                               <to
-                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Policy')"/>
-                               <setBody>
-                                       <constant>null</constant>
-                               </setBody>
-                               <setHeader headerName="CamelHttpMethod">
-                                       <constant>DELETE</constant>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-RequestID">
-                                       <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                       </simple>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-InvocationID">
-                                       <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                       </simple>
-                               </setHeader>
-                               <setHeader headerName="X-ONAP-PartnerName">
-                                       <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                       </simple>
-                               </setHeader>
-                               <log loggingLevel="INFO"
-                                        message="Endpoint to delete microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies/${exchangeProperty[policy].getName()}/versions/1.0.0"></log>
-                               <toD
-                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies/${exchangeProperty[policy].getName()}/versions/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+    <route id="get-policy">
+        <from uri="direct:get-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Getting Policy: ${exchangeProperty[policyName]}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Get Policy')"/>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/${exchangeProperty[policyTypeVersion]}/policies/${exchangeProperty[policyName]}/versions/${exchangeProperty[policyVersion]}"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/${exchangeProperty[policyTypeVersion]}/policies/${exchangeProperty[policyName]}/versions/${exchangeProperty[policyVersion]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doCatch>
+                <exception>java.lang.Exception</exception>
+                <handled>
+                    <constant>true</constant>
+                </handled>
 
-                               <doFinally>
-                                       <to uri="direct:reset-raise-http-exception-flag"/>
-                                       <to
-                                                       uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                       <setProperty propertyName="logMessage">
-                                               <simple>${exchangeProperty[policy].getName()} removal
-                                                       status
-                                               </simple>
-                                       </setProperty>
-                                       <setProperty propertyName="logComponent">
-                                               <simple>POLICY</simple>
-                                       </setProperty>
-                                       <to uri="direct:dump-loop-log-http-response"/>
-                               </doFinally>
-                       </doTry>
-               </route>
-               <route id="create-micro-service-policy">
-                               <from uri="direct:create-micro-service-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Creating Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Micro Service Policy')"/>
-                                               <setBody>
-                                                               <simple>${exchangeProperty[microServicePolicy].createPolicyPayload()}
-                                                               </simple>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>POST</constant>
-                                               </setHeader>
-                                               <setHeader headerName="Content-Type">
-                                                               <constant>application/json</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to create microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getPolicyModel().getPolicyModelType()}/versions/1.0.0/policies"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getPolicyModel().getPolicyModelType()}/versions/1.0.0/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[microServicePolicy].getName()} creation
-                                                                                               status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+                <log loggingLevel="ERROR"
+                     message="GET policy request FAILED for loop: ${header.loopName}, ${exception.stacktrace}" />
+                <to
+                        uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET policy request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" />
+            </doCatch>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[policyName]} GET
+                        Policy status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
 
-               <route id="delete-micro-service-policy">
-                               <from uri="direct:delete-micro-service-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Deleting Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Micro Service Policy')"/>
-                                               <setBody>
-                                                               <constant>null</constant>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>DELETE</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to delete microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getPolicyModel().getPolicyModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getPolicyModel().getPolicyModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+    <route id="get-deployment-policy">
+        <from uri="direct:get-deployment-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Getting the policy deployment in PDP: ${exchangeProperty[policyName]}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy deployment in PDP')"/>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log>
+            <toD
+                    uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doCatch>
+                <exception>java.lang.Exception</exception>
+                <handled>
+                    <constant>true</constant>
+                </handled>
 
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[microServicePolicy].getName()} removal
-                                                                                               status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+                <log loggingLevel="ERROR"
+                     message="GET policy request FAILED for loop: ${header.loopName}, ${exception.stacktrace}" />
+                <to
+                        uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET policy request failed, Error reported: ${exception.message}','ERROR',${exchangeProperty[loopObject]})" />
+            </doCatch>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[policyName]} GET Policy deployment
+                        status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="get-all-policy-models">
+        <from uri="direct:get-all-policy-models"/>
+        <doTry>
+            <log loggingLevel="INFO" message="Getting all the policy models"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting all the policy models')"/>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get all policy models: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <convertBodyTo type="java.lang.String"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="get-policy-model">
+        <from uri="direct:get-policy-model"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Getting the policy model: ${exchangeProperty[policyModelName]}/${exchangeProperty[policyModelVersion]}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy model')"/>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get policy model: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyModelName]}/versions/${exchangeProperty[policyModelVersion]}"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyModelName]}/versions/${exchangeProperty[policyModelVersion]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <convertBodyTo type="java.lang.String"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="create-policy">
+        <from uri="direct:create-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Creating Policy: ${exchangeProperty[policy].getName()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Policy')"/>
+            <setBody>
+                <simple>${exchangeProperty[policy].createPolicyPayload()}
+                </simple>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>POST</constant>
+            </setHeader>
+            <setHeader headerName="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to create policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[policy].getName()} creation
+                        status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
 
-               <route id="create-operational-policy">
-                               <from uri="direct:create-operational-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Creating Operational Policy: ${exchangeProperty[operationalPolicy].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Operational Policy')"/>
-                                               <setBody>
-                                                               <simple>${exchangeProperty[operationalPolicy].createPolicyPayload()}
-                                                               </simple>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>POST</constant>
-                                               </setHeader>
-                                               <setHeader headerName="Content-Type">
-                                                               <constant>application/json</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to create operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[operationalPolicy].getName()} creation
-                                                                                               status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+    <route id="delete-policy">
+        <from uri="direct:delete-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Deleting Policy: ${exchangeProperty[policy].getName()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Policy')"/>
+            <setBody>
+                <constant>null</constant>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>DELETE</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <choice>
+                <when>
+                    <simple>${exchangeProperty[policy].isLegacy()} == true</simple>
+                    <setProperty propertyName="policyVersion">
+                        <simple>1</simple>
+                    </setProperty>
+                </when>
+                <otherwise>
+                    <setProperty propertyName="policyVersion">
+                        <simple>1.0.0</simple>
+                    </setProperty>
+                </otherwise>
+            </choice>
+            <log loggingLevel="INFO"
+                 message="Endpoint to delete policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies/${exchangeProperty[policy].getName()}/versions/${exchangeProperty[policyVersion]}"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policy].getPolicyModel().getPolicyModelType()}/versions/${exchangeProperty[policy].getPolicyModel().getVersion()}/policies/${exchangeProperty[policy].getName()}/versions/${exchangeProperty[policyVersion]}?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
 
-               <route id="delete-operational-policy">
-                               <from uri="direct:delete-operational-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Deleting Operational Policy: ${exchangeProperty[operationalPolicy].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Operational Policy')"/>
-                                               <setBody>
-                                                               <constant>null</constant>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>DELETE</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to delete operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[operationalPolicy].getName()} removal
-                                                                                               status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[policy].getName()} removal
+                        status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="create-guard-policy">
+        <from uri="direct:create-guard-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Creating Guard Policy: ${exchangeProperty[guardPolicy].getKey()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Guard Policy')"/>
+            <setBody>
+                <simple>${exchangeProperty[guardPolicy].getValue()}
+                </simple>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>POST</constant>
+            </setHeader>
+            <setHeader headerName="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to create guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[guardPolicy].getKey()} creation status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
 
-               <route id="create-guard-policy">
-                               <from uri="direct:create-guard-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Creating Guard Policy: ${exchangeProperty[guardPolicy].getKey()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Guard Policy')"/>
-                                               <setBody>
-                                                               <simple>${exchangeProperty[guardPolicy].getValue()}
-                                                               </simple>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>POST</constant>
-                                               </setHeader>
-                                               <setHeader headerName="Content-Type">
-                                                               <constant>application/json</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to create guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[guardPolicy].getKey()} creation status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+    <route id="delete-guard-policy">
+        <from uri="direct:delete-guard-policy"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Deleting Guard Policy: ${exchangeProperty[guardPolicy].getKey()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Guard Policy')"/>
+            <setBody>
+                <constant>null</constant>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>DELETE</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to delete guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1"></log>
+            <toD
+                    uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
 
-               <route id="delete-guard-policy">
-                               <from uri="direct:delete-guard-policy"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Deleting Guard Policy: ${exchangeProperty[guardPolicy].getKey()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Guard Policy')"/>
-                                               <setBody>
-                                                               <constant>null</constant>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>DELETE</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to delete guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;deleteWithBody=false&amp;mapHttpMessageBody=false&amp;mapHttpMessageFormUrlEncodedBody=false&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>${exchangeProperty[guardPolicy].getKey()} removal status
+                    </simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
 
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[guardPolicy].getKey()} removal status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+    <route id="add-all-to-active-pdp-group">
+        <from uri="direct:add-all-to-active-pdp-group"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Adding loop policies to PDP Group: ${exchangeProperty[loopObject].getName()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Add policies to PDP group')"/>
+            <setBody>
+                <simple>
+                    ${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject],"POST")}
+                </simple>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>POST</constant>
+            </setHeader>
+            <setHeader headerName="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to add policies to PDP Group: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch"></log>
+            <toD
+                    uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch?bridgeEndpoint=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;useSystemProperties=true&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
 
-               <route id="add-all-to-active-pdp-group">
-                               <from uri="direct:add-all-to-active-pdp-group"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Adding loop policies to PDP Group: ${exchangeProperty[loopObject].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Add policies to PDP group')"/>
-                                               <setBody>
-                                                               <simple>${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject])}
-                                                               </simple>
-                                               </setBody>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>POST</constant>
-                                               </setHeader>
-                                               <setHeader headerName="Content-Type">
-                                                               <constant>application/json</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to add policies to PDP Group: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch?bridgeEndpoint=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;useSystemProperties=true&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>PDP Group push ALL status</simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
 
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>PDP Group push ALL status</simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+    <route id="remove-all-policy-from-active-pdp-group">
+        <from uri="direct:remove-all-policy-from-active-pdp-group"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Removing loop policies from PDP Group: ${exchangeProperty[loopObject].getName()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Remove policies from PDP group')"/>
+            <setBody>
+                <simple>
+                    ${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject],"DELETE")}
+                </simple>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>POST</constant>
+            </setHeader>
+            <setHeader headerName="Content-Type">
+                <constant>application/json</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to remove policies from PDP Group: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch"></log>
+            <toD
+                    uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch?bridgeEndpoint=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;useSystemProperties=true&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
 
-               <route id="remove-all-policy-from-active-pdp-group">
-                               <from uri="direct:remove-all-policy-from-active-pdp-group"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Removing policies from active PDP group for loop: ${exchangeProperty[loopObject].getName()}"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Removing policies PDP group')"/>
-                                               <split>
-                                                               <simple>${exchangeProperty[loopObject].getComponent("POLICY").listPolicyNamesPdpGroup(exchangeProperty[loopObject])}
-                                                               </simple>
-                                                               <setProperty propertyName="policyName">
-                                                                               <simple>${body}</simple>
-                                                               </setProperty>
-                                                               <setBody>
-                                                                               <constant>null</constant>
-                                                               </setBody>
-                                                               <setHeader headerName="CamelHttpMethod">
-                                                                               <constant>DELETE</constant>
-                                                               </setHeader>
-                                                               <setHeader headerName="X-ONAP-RequestID">
-                                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                                               </simple>
-                                                               </setHeader>
-                                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                                               </simple>
-                                                               </setHeader>
-                                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                                               </simple>
-                                                               </setHeader>
-                                                               <log loggingLevel="INFO"
-                                                                               message="Endpoint to delete policy from PDP Group: {{clamp.config.policy.pap.url}}/pdps/deployments/batch/${exchangeProperty[policyName]}/versions/1.0.0"></log>
-                                                               <toD
-                                                                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/deployments/batch/${exchangeProperty[policyName]}/versions/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>${exchangeProperty[policyName]} PDP Group removal status
-                                                                               </simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </split>
-                                               <doCatch>
-                                                               <exception>java.lang.Exception</exception>
-                                                               <handled>
-                                                                               <constant>false</constant>
-                                                               </handled>
-                                                               <setProperty propertyName="logMessage">
-                                                                               <simple>PDP Group removal, Error reported: ${exception}</simple>
-                                                               </setProperty>
-                                                               <setProperty propertyName="logComponent">
-                                                                               <simple>POLICY</simple>
-                                                               </setProperty>
-                                                               <to uri="direct:dump-loop-log-http-response"/>
-                                               </doCatch>
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
-               <route id="get-all-pdp-groups">
-                               <from uri="direct:get-all-pdp-groups"/>
-                               <doTry>
-                                               <log loggingLevel="INFO"
-                                                               message="Getting the list of PDP Groups"/>
-                                               <to
-                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the PDP Group list')"/>
-                                               <setHeader headerName="CamelHttpMethod">
-                                                               <constant>GET</constant>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-RequestID">
-                                                               <simple>${exchangeProperty[X-ONAP-RequestID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-InvocationID">
-                                                               <simple>${exchangeProperty[X-ONAP-InvocationID]}
-                                                               </simple>
-                                               </setHeader>
-                                               <setHeader headerName="X-ONAP-PartnerName">
-                                                               <simple>${exchangeProperty[X-ONAP-PartnerName]}
-                                                               </simple>
-                                               </setHeader>
-                                               <log loggingLevel="INFO"
-                                                               message="Endpoint to get policy model: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps"></log>
-                                               <toD
-                                                               uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
-                                               <convertBodyTo type="java.lang.String" />
-                                               <doFinally>
-                                                               <to uri="direct:reset-raise-http-exception-flag"/>
-                                                               <to
-                                                                               uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
-                                               </doFinally>
-                               </doTry>
-               </route>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+                <setProperty propertyName="logMessage">
+                    <simple>PDP Group remove ALL status</simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="get-all-pdp-groups">
+        <from uri="direct:get-all-pdp-groups"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Getting the list of PDP Groups"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the PDP Group list')"/>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>GET</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to get policy model: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps"></log>
+            <toD
+                    uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps?bridgeEndpoint=true&amp;useSystemProperties=true&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authMethod=Basic&amp;authUsername={{clamp.config.policy.api.userName}}&amp;authPassword={{clamp.config.policy.api.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <convertBodyTo type="java.lang.String"/>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
+    <route id="remove-one-policy-from-active-pdp-group">
+        <from uri="direct:remove-one-policy-from-active-pdp-group"/>
+        <doTry>
+            <log loggingLevel="INFO"
+                 message="Removing policy from active PDP group for loop: ${exchangeProperty[loopObject].getName()}"/>
+            <to
+                    uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Removing one policy PDP group')"/>
+            <setBody>
+                <constant>null</constant>
+            </setBody>
+            <setHeader headerName="CamelHttpMethod">
+                <constant>DELETE</constant>
+            </setHeader>
+            <setHeader headerName="X-ONAP-RequestID">
+                <simple>${exchangeProperty[X-ONAP-RequestID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-InvocationID">
+                <simple>${exchangeProperty[X-ONAP-InvocationID]}
+                </simple>
+            </setHeader>
+            <setHeader headerName="X-ONAP-PartnerName">
+                <simple>${exchangeProperty[X-ONAP-PartnerName]}
+                </simple>
+            </setHeader>
+            <log loggingLevel="INFO"
+                 message="Endpoint to delete policy from PDP Group: {{clamp.config.policy.pap.url}}/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0"></log>
+            <toD
+                    uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0?bridgeEndpoint=true&amp;useSystemProperties=true&amp;mapHttpMessageHeaders=false&amp;throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&amp;authUsername={{clamp.config.policy.pap.userName}}&amp;authPassword={{clamp.config.policy.pap.password}}&amp;connectionTimeToLive=5000&amp;httpClient.connectTimeout=10000&amp;httpClient.socketTimeout=20000&amp;authenticationPreemptive=true&amp;connectionClose=true"/>
+            <setProperty propertyName="logMessage">
+                <simple>${exchangeProperty[policyName]} PDP Group removal status
+                </simple>
+            </setProperty>
+            <setProperty propertyName="logComponent">
+                <simple>POLICY</simple>
+            </setProperty>
+            <to uri="direct:dump-loop-log-http-response"/>
+            <doCatch>
+                <exception>java.lang.Exception</exception>
+                <handled>
+                    <constant>false</constant>
+                </handled>
+                <setProperty propertyName="logMessage">
+                    <simple>PDP Group removal, Error reported: ${exception}</simple>
+                </setProperty>
+                <setProperty propertyName="logComponent">
+                    <simple>POLICY</simple>
+                </setProperty>
+                <to uri="direct:dump-loop-log-http-response"/>
+            </doCatch>
+            <doFinally>
+                <to uri="direct:reset-raise-http-exception-flag"/>
+                <to
+                        uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()"/>
+            </doFinally>
+        </doTry>
+    </route>
 </routes>
\ No newline at end of file
index 49d7878..7214b02 100644 (file)
@@ -99,6 +99,7 @@
                 "anyOf": [
                   {
                     "title": "APPC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "SO",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "SDNC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "VFC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
-                        "required": [
-                          "payload"
-                        ],
                         "default": "",
                         "enum": [
                           "ModifyConfig"
                   },
                   {
                     "title": "CDS",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "object",
-                        "required": [
-                          "payload"
-                        ],
                         "anyOf": [
                           {
                             "title": "user-defined",
+                            "type": "object",
                             "properties": {
-                              "type": {
+                              "recipe": {
+                                "title": "recipe",
+                                "type": "string",
+                                "default": "user-defined",
+                                "format": "textarea"
+                              },
+                              "payload": {
                                 "title": "Payload (YAML)",
                                 "type": "string",
                                 "default": "",
diff --git a/src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java b/src/test/java/org/onap/clamp/clds/client/CdsServicesTest.java
new file mode 100644 (file)
index 0000000..ec39fc3
--- /dev/null
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd.
+ * ================================================================================
+ * 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.clds.client;
+
+import com.google.gson.JsonObject;
+
+import java.io.IOException;
+
+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 CdsServicesTest {
+
+    @Test
+    public void testParseCdsListTypeProperties() throws IOException {
+        String cdsResponse = ResourceFileUtil
+                .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-workflow.json");
+        CdsServices services = new CdsServices();
+        JsonObject output = services.parseCdsResponse(cdsResponse);
+        JSONAssert.assertEquals(ResourceFileUtil
+                .getResourceAsString("example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json"),
+                        JsonUtils.GSON.toJson(output), true);
+    }
+
+    @Test
+    public void testParseCdsResponse() throws IOException {
+        String cdsResponse = ResourceFileUtil
+                .getResourceAsString("example/cds-response/vFW-CDS-modify-config-workflow.json");
+        CdsServices services = new CdsServices();
+        JsonObject output = services.parseCdsResponse(cdsResponse);
+        JSONAssert.assertEquals(ResourceFileUtil
+                .getResourceAsString("example/cds-response/vFW-CDS-modify-config-wf-expected-result.json"),
+                        JsonUtils.GSON.toJson(output), true);
+    }
+
+}
\ No newline at end of file
index a32d499..b26f3ed 100644 (file)
@@ -57,7 +57,7 @@ public class ToscaYamlToJsonConvertorTestItCase {
      * Schema.
      *
      * @throws IOException In case of issue when opening the tosca yaml file and
-     *                     converted json file
+     *         converted json file
      */
     @Test
     public final void testParseToscaYaml() throws IOException {
@@ -65,11 +65,11 @@ public class ToscaYamlToJsonConvertorTestItCase {
         ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor();
 
         String parsedJsonSchema =
-                convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.cdap.tca.hi.lo.app");
+            convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.cdap.tca.hi.lo.app");
         assertNotNull(parsedJsonSchema);
         JSONAssert.assertEquals(
-                ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json.json"),
-                parsedJsonSchema, true);
+            ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json.json"),
+            parsedJsonSchema, true);
     }
 
     /**
@@ -77,20 +77,20 @@ public class ToscaYamlToJsonConvertorTestItCase {
      * based on JSON Editor Schema.
      *
      * @throws IOException In case of issue when opening the tosca yaml file and
-     *                     converted json file
+     *         converted json file
      */
     @Test
     public final void testParseToscaYamlWithConstraints() throws IOException {
         String toscaModelYaml =
-                ResourceFileUtil.getResourceAsString("tosca/tosca-with-constraints.yaml");
+            ResourceFileUtil.getResourceAsString("tosca/tosca-with-constraints.yaml");
         ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor();
 
         String parsedJsonSchema =
-                convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app");
+            convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app");
         assertNotNull(parsedJsonSchema);
         JSONAssert.assertEquals(
-                ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json-with-constraints.json"),
-                parsedJsonSchema, true);
+            ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json-with-constraints.json"),
+            parsedJsonSchema, true);
     }
 
     /**
@@ -98,20 +98,20 @@ public class ToscaYamlToJsonConvertorTestItCase {
      * conversion based on JSON Editor Schema.
      *
      * @throws IOException In case of issue when opening the tosca yaml file and
-     *                     converted json file
+     *         converted json file
      */
     @Test
     public final void testParseToscaYamlWithTypes() throws IOException {
         String toscaModelYaml =
-                ResourceFileUtil.getResourceAsString("tosca/tosca-with-datatypes.yaml");
+            ResourceFileUtil.getResourceAsString("tosca/tosca-with-datatypes.yaml");
         ToscaYamlToJsonConvertor convertor = new ToscaYamlToJsonConvertor();
 
         String parsedJsonSchema =
-                convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app");
+            convertor.parseToscaYaml(toscaModelYaml, "onap.policies.monitoring.example.app");
         assertNotNull(parsedJsonSchema);
         JSONAssert.assertEquals(
-                ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json-with-datatypes.json"),
-                parsedJsonSchema, true);
+            ResourceFileUtil.getResourceAsString("tosca/policy-yaml-to-json-with-datatypes.json"),
+            parsedJsonSchema, true);
     }
 
     /**
@@ -119,11 +119,35 @@ public class ToscaYamlToJsonConvertorTestItCase {
      * parameters which defines the Tosca Policy name and its short name.
      *
      * @throws IOException In case of issue when opening the tosca yaml file and
-     *                     converted json file
+     *         converted json file
      */
     @Test
     @Transactional
     public final void testMetadataClampPossibleValues() throws IOException {
+        setupDictionary();
+        String toscaModelYaml =
+            ResourceFileUtil.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml");
+
+        JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(toscaModelYaml);
+        assertNotNull(jsonObject);
+        String policyModelType = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
+            ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE);
+        String acronym = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
+            ToscaSchemaConstants.METADATA_ACRONYM);
+        String parsedJsonSchema =
+            toscaYamlToJsonConvertor.parseToscaYaml(toscaModelYaml, policyModelType);
+
+        assertNotNull(parsedJsonSchema);
+        assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyModelType);
+        assertEquals("tca", acronym);
+        JSONAssert.assertEquals(
+            ResourceFileUtil
+                .getResourceAsString("tosca/tosca_metadata_clamp_possible_values_json_schema.json"),
+            parsedJsonSchema, true);
+
+    }
+
+    private void setupDictionary() {
 
         // Set up dictionary elements
         Dictionary dictionaryTest = new Dictionary();
@@ -150,6 +174,15 @@ public class ToscaYamlToJsonConvertorTestItCase {
         element1.setDescription("Alarm Condition");
         dictionaryTest1.addDictionaryElements(element1);
 
+        dictionaryTest1 = dictionaryService.saveOrUpdateDictionary(dictionaryTest1);
+
+        DictionaryElement element3 = new DictionaryElement();
+        element3.setName("timeEpoch");
+        element3.setShortName("timeEpoch");
+        element3.setType("datetime");
+        element3.setDescription("Time Epoch");
+        dictionaryTest1.addDictionaryElements(element3);
+
         dictionaryService.saveOrUpdateDictionary(dictionaryTest1);
 
         Dictionary dictionaryTest2 = new Dictionary();
@@ -159,30 +192,10 @@ public class ToscaYamlToJsonConvertorTestItCase {
         DictionaryElement element2 = new DictionaryElement();
         element2.setName("equals");
         element2.setShortName("equals");
-        element2.setType("string");
+        element2.setType("string|datetime");
         element2.setDescription("equals");
         dictionaryTest2.addDictionaryElements(element2);
         dictionaryService.saveOrUpdateDictionary(dictionaryTest2);
-
-        String toscaModelYaml =
-                ResourceFileUtil.getResourceAsString("tosca/tosca_metadata_clamp_possible_values.yaml");
-
-        JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(toscaModelYaml);
-        assertNotNull(jsonObject);
-        String policyModelType = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
-                ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE);
-        String acronym = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
-                ToscaSchemaConstants.METADATA_ACRONYM);
-        String parsedJsonSchema =
-                toscaYamlToJsonConvertor.parseToscaYaml(toscaModelYaml, policyModelType);
-
-        assertNotNull(parsedJsonSchema);
-        assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyModelType);
-        assertEquals("tca", acronym);
-        JSONAssert.assertEquals(
-                ResourceFileUtil
-                        .getResourceAsString("tosca/tosca_metadata_clamp_possible_values_json_schema.json"),
-                parsedJsonSchema, true);
     }
 
 }
index 432de60..6449a89 100644 (file)
@@ -24,7 +24,6 @@
 package org.onap.clamp.loop;
 
 import static org.assertj.core.api.Assertions.assertThat;
-
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import java.io.IOException;
@@ -32,6 +31,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.onap.clamp.clds.config.LegacyOperationalPolicyController;
 import org.onap.clamp.clds.util.ResourceFileUtil;
 import org.onap.clamp.loop.components.external.ExternalComponentState;
 import org.onap.clamp.loop.components.external.PolicyComponent;
@@ -267,7 +267,8 @@ public class PolicyComponentTest {
                 new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), null, "pdpGroup2", "pdpSubgroup1");
         loopTest.addMicroServicePolicy(microServicePolicy2);
 
-        PolicyModel policyModel2 = new PolicyModel("onap.policies.controlloop.Operational", null, "1.0.0");
+        PolicyModel policyModel2 = new PolicyModel(LegacyOperationalPolicyController.OPERATIONAL_POLICY_LEGACY, null,
+                "1.0.0");
         OperationalPolicy opPolicy =
                 new OperationalPolicy("opPolicy", new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class),
                         new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null,
@@ -275,16 +276,22 @@ public class PolicyComponentTest {
                         "pdpSubgroup2");
 
         loopTest.addOperationalPolicy(opPolicy);
+        OperationalPolicy opLegacyPolicy =
+                new OperationalPolicy("opLegacyPolicy", new Gson().fromJson(
+                        "{\"guard_policies\":[{\"policy-id\":\"guard1\"}]}", JsonObject.class),
+                        new Gson().fromJson("{\"jsonschema\":\"schema\"}", JsonObject.class), policyModel2, null,
+                        "pdpGroup2",
+                        "pdpSubgroup2");
+
+        loopTest.addOperationalPolicy(opLegacyPolicy);
 
         LoopTemplate loopTemplate = new LoopTemplate("test", "yaml", "svg", 1, null);
         loopTemplate.setDcaeBlueprintId("UUID-blueprint");
         loopTest.setLoopTemplate(loopTemplate);
 
-        String payload = PolicyComponent.createPoliciesPayloadPdpGroup(loopTest);
+        String payload = PolicyComponent.createPoliciesPayloadPdpGroup(loopTest, "POST");
         String expectedRes = ResourceFileUtil.getResourceAsString("tosca/pdp-group-policy-payload.json");
 
         assertThat(payload).isEqualTo(expectedRes);
-
-        assertThat(PolicyComponent.listPolicyNamesPdpGroup(loopTest)).containsExactlyInAnyOrder("opPolicy","configPolicyTest","configPolicyTest2");
     }
 }
index 4e9b562..a6a4968 100644 (file)
@@ -50,4 +50,17 @@ public class OperationalPolicyRepresentationBuilderTest {
                 new GsonBuilder().create().toJson(jsonSchema), false);
     }
 
+    @Test
+    public void testOperationalPolicyPayloadConstructionForCds() throws IOException {
+        JsonObject jsonModel = new GsonBuilder().create()
+                .fromJson(ResourceFileUtil.getResourceAsString("tosca/model-properties-cds.json"), JsonObject.class);
+        Service service = new Service(jsonModel.get("serviceDetails").getAsJsonObject(),
+                                      jsonModel.get("resourceDetails").getAsJsonObject(),
+                                      "1.0");
+
+        JsonObject jsonSchema = OperationalPolicyRepresentationBuilder.generateOperationalPolicySchema(service);
+        assertThat(jsonSchema).isNotNull();
+        JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/operational-policy-cds-payload-with-list.json"),
+                                new GsonBuilder().create().toJson(jsonSchema), false);
+    }
 }
diff --git a/src/test/resources/example/cds-response/vFW-CDS-modify-config-wf-expected-result.json b/src/test/resources/example/cds-response/vFW-CDS-modify-config-wf-expected-result.json
new file mode 100644 (file)
index 0000000..7e78bb0
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  "inputs": {
+    "resolution-key": {
+      "required": true,
+      "type": "string"
+    },
+    "modify-config-properties": {
+      "vpg_onap_private_ip_0": {
+        "description": "",
+        "required": false,
+        "type": "string",
+        "status": "",
+        "constraints": [
+          {}
+        ],
+        "entry_schema": {
+          "type": ""
+        }
+      },
+      "service-instance.service-instance-id": {
+        "type": "string"
+      },
+      "vnf-id": {
+        "type": "string"
+      },
+      "data": {
+        "description": "",
+        "required": false,
+        "type": "string",
+        "status": "",
+        "constraints": [
+          {}
+        ],
+        "entry_schema": {
+          "type": "dt-data"
+        }
+      },
+      "service-instance-id": {
+        "type": "string"
+      },
+      "update-active-streams": {
+        "description": "",
+        "required": false,
+        "type": "string",
+        "status": "",
+        "constraints": [
+          {}
+        ],
+        "entry_schema": {
+          "type": "dt-data"
+        }
+      },
+      "generic-vnf.vnf-id": {
+        "type": "string"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/example/cds-response/vFW-CDS-modify-config-workflow.json b/src/test/resources/example/cds-response/vFW-CDS-modify-config-workflow.json
new file mode 100644 (file)
index 0000000..e46da67
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "blueprintName": "vFW-CDS",
+  "version": "1.0.0",
+  "workFlowData": {
+    "workFlowName": "modify-config",
+    "inputs": {
+      "resolution-key": {
+        "required": true,
+        "type": "string"
+      },
+      "modify-config-properties": {
+        "description": "Dynamic PropertyDefinition for workflow(modify-config).",
+        "required": true,
+        "type": "dt-modify-config-properties"
+      }
+    }
+  },
+  "dataTypes": {
+    "dt-modify-config-properties": {
+      "description": "Dynamic DataType definition for workflow(modify-config).",
+      "version": "1.0.0",
+      "properties": {
+        "vpg_onap_private_ip_0": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": ""
+          }
+        },
+        "service-instance.service-instance-id": {
+          "type": "string"
+        },
+        "vnf-id": {
+          "type": "string"
+        },
+        "data": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": "dt-data"
+          }
+        },
+        "service-instance-id": {
+          "type": "string"
+        },
+        "update-active-streams": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": "dt-data"
+          }
+        },
+        "generic-vnf.vnf-id": {
+          "type": "string"
+        }
+      },
+      "derived_from": "tosca.datatypes.Dynamic"
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json b/src/test/resources/example/cds-response/vFW-CDS-resource-assignment-wf-expected-result.json
new file mode 100644 (file)
index 0000000..5b373a4
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "inputs": {
+    "template-prefix": {
+      "required": true,
+      "type": "list",
+      "entry_schema": {
+        "type": "string"
+      }
+    },
+    "template-prefix-with-complex-type": {
+      "type": "list",
+      "properties": {
+        "prefix-id": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": ""
+          }
+        }
+      }
+    },
+    "resource-assignment-properties": {
+      "private1-prefix-id": {
+        "description": "",
+        "required": false,
+        "type": "string",
+        "status": "",
+        "constraints": [
+          {}
+        ],
+        "entry_schema": {
+          "type": ""
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/example/cds-response/vFW-CDS-resource-assignment-workflow.json b/src/test/resources/example/cds-response/vFW-CDS-resource-assignment-workflow.json
new file mode 100644 (file)
index 0000000..d0f78cf
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "blueprintName": "vFW-CDS",
+  "version": "1.0.0",
+  "workFlowData": {
+    "workFlowName": "resource-assignment",
+    "inputs": {
+      "template-prefix": {
+        "required": true,
+        "type": "list",
+        "entry_schema": {
+          "type": "string"
+        }
+      },
+      "template-prefix-with-complex-type": {
+        "required": true,
+        "type": "list",
+        "entry_schema": {
+          "type": "dt-template-prefix-properties"
+        }
+      },
+      "resource-assignment-properties": {
+        "description": "Dynamic PropertyDefinition for workflow(resource-assignment).",
+        "required": true,
+        "type": "dt-resource-assignment-properties"
+      }
+    },
+    "outputs": {
+      "meshed-template": {
+        "type": "json",
+        "value": {
+          "get_attribute": [
+            "resource-assignment",
+            "assignment-params"
+          ]
+        }
+      }
+    }
+  },
+  "dataTypes": {
+    "dt-resource-assignment-properties": {
+      "description": "Dynamic DataType definition for workflow(resource-assignment).",
+      "version": "1.0.0",
+      "properties": {
+        "private1-prefix-id": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": ""
+          }
+        }
+      },
+      "derived_from": "tosca.datatypes.Dynamic"
+    },
+    "dt-template-prefix-properties": {
+      "description": "Dynamic DataType definition for workflow(template-prefix).",
+      "version": "1.0.0",
+      "properties": {
+        "prefix-id": {
+          "description": "",
+          "required": false,
+          "type": "string",
+          "status": "",
+          "constraints": [
+            {}
+          ],
+          "entry_schema": {
+            "type": ""
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
index 11b91df..9160397 100644 (file)
@@ -1,7 +1,7 @@
 {
        "schema": {
                "uniqueItems": "true",
-               "format": "tabs-top",
+               "format": "tabs",
                "type": "array",
                "title": "Thresholds",
                "items": {
diff --git a/src/test/resources/tosca/model-properties-cds.json b/src/test/resources/tosca/model-properties-cds.json
new file mode 100644 (file)
index 0000000..591840b
--- /dev/null
@@ -0,0 +1,151 @@
+{
+       "serviceDetails": {
+               "serviceType": "",
+               "namingPolicy": "",
+               "environmentContext": "General_Revenue-Bearing",
+               "serviceEcompNaming": "true",
+               "serviceRole": "",
+               "name": "vLoadBalancerMS",
+               "description": "vLBMS",
+               "invariantUUID": "30ec5b59-4799-48d8-ac5f-1058a6b0e48f",
+               "ecompGeneratedNaming": "true",
+               "category": "Network L4+",
+               "type": "Service",
+               "UUID": "63cac700-ab9a-4115-a74f-7eac85e3fce0",
+               "instantiationType": "A-la-carte"
+       },
+       "resourceDetails": {
+               "CP": {},
+               "VL": {},
+               "VF": {
+                       "vLoadBalancerMS 0": {
+                               "resourceVendor": "Test",
+                               "resourceVendorModelNumber": "",
+                               "name": "vLoadBalancerMS",
+                               "description": "vLBMS",
+                               "invariantUUID": "1a31b9f2-e50d-43b7-89b3-a040250cf506",
+                               "subcategory": "Load Balancer",
+                               "category": "Application L4+",
+                               "type": "VF",
+                               "UUID": "b4c4f3d7-929e-4b6d-a1cd-57e952ddc3e6",
+                               "version": "1.0",
+                               "resourceVendorRelease": "1.0",
+                               "customizationUUID": "465246dc-7748-45f4-a013-308d92922552",
+                               "controllerProperties": {
+                                       "sdnc_model_name": "baseconfiguration",
+                                       "sdnc_model_version": "1.0.0",
+                                       "workflows": {
+                                               "resource-assignment": {
+                                                       "inputs": {
+                                                               "template-prefix": {
+                                                                       "required": true,
+                                                                       "type": "list",
+                                                                       "entry_schema": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "template-prefix-with-complex-type": {
+                                                                       "type": "list",
+                                                                       "properties": {
+                                                                               "prefix-id": {
+                                                                                       "description": "",
+                                                                                       "required": false,
+                                                                                       "type": "string",
+                                                                                       "status": "",
+                                                                                       "constraints": [
+                                                                                               {}
+                                                                                       ],
+                                                                                       "entry_schema": {
+                                                                                               "type": ""
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "resource-assignment-properties": {
+                                                                       "private1-prefix-id": {
+                                                                               "description": "",
+                                                                               "required": false,
+                                                                               "type": "string",
+                                                                               "status": "",
+                                                                               "constraints": [
+                                                                                       {}
+                                                                               ],
+                                                                               "entry_schema": {
+                                                                                       "type": ""
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "CR": {},
+               "VFC": {},
+               "PNF": {},
+               "Service": {},
+               "CVFC": {},
+               "Service Proxy": {},
+               "Configuration": {},
+               "AllottedResource": {},
+               "VFModule": {
+                       "Vloadbalancerms..vpkg..module-1": {
+                               "vfModuleModelInvariantUUID": "ca052563-eb92-4b5b-ad41-9111768ce043",
+                               "vfModuleModelVersion": "1",
+                               "vfModuleModelName": "Vloadbalancerms..vpkg..module-1",
+                               "vfModuleModelUUID": "1e725ccc-b823-4f67-82b9-4f4367070dbc",
+                               "vfModuleModelCustomizationUUID": "1bffdc31-a37d-4dee-b65c-dde623a76e52",
+                               "min_vf_module_instances": 0,
+                               "vf_module_label": "vpkg",
+                               "max_vf_module_instances": 1,
+                               "vf_module_type": "Expansion",
+                               "isBase": false,
+                               "initial_count": 0,
+                               "volume_group": false
+                       },
+                       "Vloadbalancerms..vdns..module-3": {
+                               "vfModuleModelInvariantUUID": "4c10ba9b-f88f-415e-9de3-5d33336047fa",
+                               "vfModuleModelVersion": "1",
+                               "vfModuleModelName": "Vloadbalancerms..vdns..module-3",
+                               "vfModuleModelUUID": "4fa73b49-8a6c-493e-816b-eb401567b720",
+                               "vfModuleModelCustomizationUUID": "bafcdab0-801d-4d81-9ead-f464640a38b1",
+                               "min_vf_module_instances": 0,
+                               "vf_module_label": "vdns",
+                               "max_vf_module_instances": 50,
+                               "vf_module_type": "Expansion",
+                               "isBase": false,
+                               "initial_count": 0,
+                               "volume_group": false
+                       },
+                       "Vloadbalancerms..base_template..module-0": {
+                               "vfModuleModelInvariantUUID": "921f7c96-ebdd-42e6-81b9-1cfc0c9796f3",
+                               "vfModuleModelVersion": "1",
+                               "vfModuleModelName": "Vloadbalancerms..base_template..module-0",
+                               "vfModuleModelUUID": "63734409-f745-4e4d-a38b-131638a0edce",
+                               "vfModuleModelCustomizationUUID": "86baddea-c730-4fb8-9410-cd2e17fd7f27",
+                               "min_vf_module_instances": 1,
+                               "vf_module_label": "base_template",
+                               "max_vf_module_instances": 1,
+                               "vf_module_type": "Base",
+                               "isBase": true,
+                               "initial_count": 1,
+                               "volume_group": false
+                       },
+                       "Vloadbalancerms..vlb..module-2": {
+                               "vfModuleModelInvariantUUID": "a772a1f4-0064-412c-833d-4749b15828dd",
+                               "vfModuleModelVersion": "1",
+                               "vfModuleModelName": "Vloadbalancerms..vlb..module-2",
+                               "vfModuleModelUUID": "0f5c3f6a-650a-4303-abb6-fff3e573a07a",
+                               "vfModuleModelCustomizationUUID": "96a78aad-4ffb-4ef0-9c4f-deb03bf1d806",
+                               "min_vf_module_instances": 0,
+                               "vf_module_label": "vlb",
+                               "max_vf_module_instances": 1,
+                               "vf_module_type": "Expansion",
+                               "isBase": false,
+                               "initial_count": 0,
+                               "volume_group": false
+                       }
+               }
+       }
+}
\ No newline at end of file
index c405964..688a09a 100644 (file)
                                                "resource-assignment": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate-restconf": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate-cli": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "assign-activate": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "imperative-test-wf": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                } 
index 58dff23..793ba5e 100644 (file)
                 "type": "object",
                 "description": "Name/value pairs of payload information passed by Policy to the actor",
                 "anyOf": [
+                  {
+                    "title": "User defined",
+                    "properties": {}
+                  },
                   {
                     "title": "resource-assignment",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     "title": "activate",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     "title": "activate-restconf",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     "title": "activate-cli",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     "title": "assign-activate",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     "title": "imperative-test-wf",
                     "properties": {
                       "artifact_name": {
-                        "title": "artifact_name",
+                        "title": "artifact name",
                         "type": "string",
                         "default": "baseconfiguration",
                         "readOnly": "True"
                       },
                       "artifact_version": {
-                        "title": "artifact_version",
+                        "title": "artifact version",
                         "type": "string",
                         "default": "1.0.0",
                         "readOnly": "True"
                       "mode": {
                         "title": "mode",
                         "type": "string",
-                        "default": "async",
-                        "readOnly": "True"
+                        "default": "async"
                       },
                       "data": {
                         "title": "data",
-                        "type": "object",
                         "properties": {
                           "resource-assignment-properties": {
-                            "request-id": "",
-                            "service-instance-id": "",
-                            "vnf-id": "",
-                            "action-name": "",
-                            "scope-type": "",
-                            "hostname": "",
-                            "vnf_name": ""
+                            "title": "resource-assignment-properties",
+                            "type": "object",
+                            "properties": {
+                              "request-id": {
+                                "title": "request-id",
+                                "type": "string"
+                              },
+                              "service-instance-id": {
+                                "title": "service-instance-id",
+                                "type": "string"
+                              },
+                              "vnf-id": {
+                                "title": "vnf-id",
+                                "type": "string"
+                              },
+                              "action-name": {
+                                "title": "action-name",
+                                "type": "string"
+                              },
+                              "scope-type": {
+                                "title": "scope-type",
+                                "type": "string"
+                              },
+                              "hostname": {
+                                "title": "hostname",
+                                "type": "string"
+                              },
+                              "vnf_name": {
+                                "title": "vnf_name",
+                                "type": "string"
+                              }
+                            }
                           }
                         }
                       }
                     }
-                  },
-                  {
-                    "title": "User defined",
-                    "properties": {}
                   }
                 ]
               },
diff --git a/src/test/resources/tosca/operational-policy-cds-payload-with-list.json b/src/test/resources/tosca/operational-policy-cds-payload-with-list.json
new file mode 100644 (file)
index 0000000..24269ec
--- /dev/null
@@ -0,0 +1,742 @@
+{
+  "type": "object",
+  "title": "Configuration",
+  "required": [
+    "operational_policy",
+    "guard_policies"
+  ],
+  "properties": {
+    "operational_policy": {
+      "type": "object",
+      "title": "Related Parameters",
+      "required": [
+        "controlLoop",
+        "policies"
+      ],
+      "properties": {
+        "controlLoop": {
+          "type": "object",
+          "title": "Control Loop details",
+          "required": [
+            "timeout",
+            "abatement",
+            "trigger_policy",
+            "controlLoopName"
+          ],
+          "properties": {
+            "timeout": {
+              "type": "string",
+              "title": "Overall Time Limit",
+              "default": "0",
+              "format": "number"
+            },
+            "abatement": {
+              "type": "string",
+              "title": "Abatement",
+              "enum": [
+                "True",
+                "False"
+              ]
+            },
+            "trigger_policy": {
+              "type": "string",
+              "title": "Policy Decision Entry"
+            },
+            "controlLoopName": {
+              "type": "string",
+              "title": "Control loop name",
+              "readOnly": "True"
+            }
+          }
+        },
+        "policies": {
+          "uniqueItems": "true",
+          "id": "policies_array",
+          "type": "array",
+          "title": "Policy Decision Tree",
+          "format": "tabs-top",
+          "items": {
+            "title": "Policy Decision",
+            "type": "object",
+            "id": "policy_item",
+            "headerTemplate": "{{self.id}} - {{self.recipe}}",
+            "format": "categories",
+            "basicCategoryTitle": "recipe",
+            "required": [
+              "id",
+              "retry",
+              "timeout",
+              "actor",
+              "success",
+              "failure",
+              "failure_timeout",
+              "failure_retries",
+              "failure_exception",
+              "failure_guard",
+              "target"
+            ],
+            "properties": {
+              "id": {
+                "default": "Policy 1",
+                "title": "Policy ID",
+                "type": "string"
+              },
+              "retry": {
+                "default": "0",
+                "title": "Number of Retry",
+                "type": "string",
+                "format": "number"
+              },
+              "timeout": {
+                "default": "0",
+                "title": "Timeout",
+                "type": "string",
+                "format": "number"
+              },
+              "actor": {
+                "type": "object",
+                "title": "Actor",
+                "anyOf": [
+                  {
+                    "title": "APPC",
+                    "type": "object",
+                    "properties": {
+                      "actor": {
+                        "title": "actor",
+                        "type": "string",
+                        "default": "APPC",
+                        "options": {
+                          "hidden": true
+                        }
+                      },
+                      "recipe": {
+                        "title": "recipe",
+                        "type": "string",
+                        "default": "",
+                        "enum": [
+                          "Restart",
+                          "Rebuild",
+                          "Migrate",
+                          "Health-Check",
+                          "ModifyConfig"
+                        ]
+                      },
+                      "payload": {
+                        "title": "Payload (YAML)",
+                        "type": "string",
+                        "format": "textarea"
+                      }
+                    }
+                  },
+                  {
+                    "title": "SO",
+                    "type": "object",
+                    "properties": {
+                      "actor": {
+                        "title": "actor",
+                        "type": "string",
+                        "default": "SO",
+                        "options": {
+                          "hidden": true
+                        }
+                      },
+                      "recipe": {
+                        "title": "recipe",
+                        "type": "string",
+                        "default": "",
+                        "enum": [
+                          "VF Module Create",
+                          "VF Module Delete"
+                        ]
+                      },
+                      "payload": {
+                        "title": "Payload (YAML)",
+                        "type": "string",
+                        "format": "textarea"
+                      }
+                    }
+                  },
+                  {
+                    "title": "SDNC",
+                    "type": "object",
+                    "properties": {
+                      "actor": {
+                        "title": "actor",
+                        "type": "string",
+                        "default": "SDNC",
+                        "options": {
+                          "hidden": true
+                        }
+                      },
+                      "recipe": {
+                        "title": "recipe",
+                        "type": "string",
+                        "default": "",
+                        "enum": [
+                          "Reroute",
+                          "BandwidthOnDemand"
+                        ]
+                      },
+                      "payload": {
+                        "title": "Payload (YAML)",
+                        "type": "string",
+                        "format": "textarea"
+                      }
+                    }
+                  },
+                  {
+                    "title": "VFC",
+                    "type": "object",
+                    "properties": {
+                      "actor": {
+                        "title": "actor",
+                        "type": "string",
+                        "default": "VFC",
+                        "options": {
+                          "hidden": true
+                        }
+                      },
+                      "recipe": {
+                        "title": "recipe",
+                        "type": "string",
+                        "default": "",
+                        "enum": [
+                          "ModifyConfig"
+                        ]
+                      },
+                      "payload": {
+                        "title": "Payload (YAML)",
+                        "type": "string",
+                        "format": "textarea"
+                      }
+                    }
+                  },
+                  {
+                    "title": "CDS",
+                    "type": "object",
+                    "properties": {
+                      "actor": {
+                        "title": "actor",
+                        "type": "string",
+                        "default": "CDS",
+                        "options": {
+                          "hidden": true
+                        }
+                      },
+                      "recipe": {
+                        "title": "recipe",
+                        "type": "object",
+                        "anyOf": [
+                          {
+                            "title": "user-defined",
+                            "type": "object",
+                            "properties": {
+                              "recipe": {
+                                "title": "recipe",
+                                "type": "string",
+                                "default": "user-defined",
+                                "format": "textarea"
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "string",
+                                "default": "",
+                                "format": "textarea"
+                              }
+                            }
+                          },
+                          {
+                            "title": "resource-assignment",
+                            "type": "object",
+                            "properties": {
+                              "recipe": {
+                                "title": "recipe",
+                                "type": "string",
+                                "default": "resource-assignment",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "template-prefix": {
+                                        "title": "template-prefix",
+                                        "type": "array"
+                                      },
+                                      "template-prefix-with-complex-type": {
+                                        "title": "template-prefix-with-complex-type",
+                                        "type": "array",
+                                        "items": {
+                                          "properties": {
+                                            "prefix-id": {
+                                              "title": "prefix-id",
+                                              "type": "string"
+                                            }
+                                          }
+                                        }
+                                      },
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "private1-prefix-id": {
+                                            "title": "private1-prefix-id",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
+                              }
+                            }
+                          }
+                        ]
+                      }
+                    }
+                  }
+                ]
+              },
+              "success": {
+                "default": "final_success",
+                "title": "When Success",
+                "type": "string"
+              },
+              "failure": {
+                "default": "final_failure",
+                "title": "When Failure",
+                "type": "string"
+              },
+              "failure_timeout": {
+                "default": "final_failure_timeout",
+                "title": "When Failure Timeout",
+                "type": "string"
+              },
+              "failure_retries": {
+                "default": "final_failure_retries",
+                "title": "When Failure Retries",
+                "type": "string"
+              },
+              "failure_exception": {
+                "default": "final_failure_exception",
+                "title": "When Failure Exception",
+                "type": "string"
+              },
+              "failure_guard": {
+                "default": "final_failure_guard",
+                "title": "When Failure Guard",
+                "type": "string"
+              },
+              "target": {
+                "type": "object",
+                "required": [
+                  "type",
+                  "resourceID"
+                ],
+                "anyOf": [
+                  {
+                    "title": "User Defined",
+                    "additionalProperties": "True",
+                    "properties": {
+                      "type": {
+                        "title": "Target type",
+                        "type": "string",
+                        "default": "",
+                        "enum": [
+                          "VNF",
+                          "VFMODULE",
+                          "VM"
+                        ]
+                      },
+                      "resourceID": {
+                        "title": "Target type",
+                        "type": "string",
+                        "default": ""
+                      }
+                    }
+                  },
+                  {
+                    "title": "VNF-vLoadBalancerMS 0",
+                    "properties": {
+                      "type": {
+                        "title": "Type",
+                        "type": "string",
+                        "default": "VNF",
+                        "readOnly": "True"
+                      },
+                      "resourceID": {
+                        "title": "Resource ID",
+                        "type": "string",
+                        "default": "vLoadBalancerMS",
+                        "readOnly": "True"
+                      }
+                    }
+                  },
+                  {
+                    "title": "VFMODULE-Vloadbalancerms..vpkg..module-1",
+                    "properties": {
+                      "type": {
+                        "title": "Type",
+                        "type": "string",
+                        "default": "VFMODULE",
+                        "readOnly": "True"
+                      },
+                      "resourceID": {
+                        "title": "Resource ID",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vpkg..module-1",
+                        "readOnly": "True"
+                      },
+                      "modelInvariantId": {
+                        "title": "Model Invariant Id (ModelInvariantUUID)",
+                        "type": "string",
+                        "default": "ca052563-eb92-4b5b-ad41-9111768ce043",
+                        "readOnly": "True"
+                      },
+                      "modelVersionId": {
+                        "title": "Model Version Id (ModelUUID)",
+                        "type": "string",
+                        "default": "1e725ccc-b823-4f67-82b9-4f4367070dbc",
+                        "readOnly": "True"
+                      },
+                      "modelName": {
+                        "title": "Model Name",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vpkg..module-1",
+                        "readOnly": "True"
+                      },
+                      "modelVersion": {
+                        "title": "Model Version",
+                        "type": "string",
+                        "default": "1",
+                        "readOnly": "True"
+                      },
+                      "modelCustomizationId": {
+                        "title": "Customization ID",
+                        "type": "string",
+                        "default": "1bffdc31-a37d-4dee-b65c-dde623a76e52",
+                        "readOnly": "True"
+                      }
+                    }
+                  },
+                  {
+                    "title": "VFMODULE-Vloadbalancerms..vdns..module-3",
+                    "properties": {
+                      "type": {
+                        "title": "Type",
+                        "type": "string",
+                        "default": "VFMODULE",
+                        "readOnly": "True"
+                      },
+                      "resourceID": {
+                        "title": "Resource ID",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vdns..module-3",
+                        "readOnly": "True"
+                      },
+                      "modelInvariantId": {
+                        "title": "Model Invariant Id (ModelInvariantUUID)",
+                        "type": "string",
+                        "default": "4c10ba9b-f88f-415e-9de3-5d33336047fa",
+                        "readOnly": "True"
+                      },
+                      "modelVersionId": {
+                        "title": "Model Version Id (ModelUUID)",
+                        "type": "string",
+                        "default": "4fa73b49-8a6c-493e-816b-eb401567b720",
+                        "readOnly": "True"
+                      },
+                      "modelName": {
+                        "title": "Model Name",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vdns..module-3",
+                        "readOnly": "True"
+                      },
+                      "modelVersion": {
+                        "title": "Model Version",
+                        "type": "string",
+                        "default": "1",
+                        "readOnly": "True"
+                      },
+                      "modelCustomizationId": {
+                        "title": "Customization ID",
+                        "type": "string",
+                        "default": "bafcdab0-801d-4d81-9ead-f464640a38b1",
+                        "readOnly": "True"
+                      }
+                    }
+                  },
+                  {
+                    "title": "VFMODULE-Vloadbalancerms..base_template..module-0",
+                    "properties": {
+                      "type": {
+                        "title": "Type",
+                        "type": "string",
+                        "default": "VFMODULE",
+                        "readOnly": "True"
+                      },
+                      "resourceID": {
+                        "title": "Resource ID",
+                        "type": "string",
+                        "default": "Vloadbalancerms..base_template..module-0",
+                        "readOnly": "True"
+                      },
+                      "modelInvariantId": {
+                        "title": "Model Invariant Id (ModelInvariantUUID)",
+                        "type": "string",
+                        "default": "921f7c96-ebdd-42e6-81b9-1cfc0c9796f3",
+                        "readOnly": "True"
+                      },
+                      "modelVersionId": {
+                        "title": "Model Version Id (ModelUUID)",
+                        "type": "string",
+                        "default": "63734409-f745-4e4d-a38b-131638a0edce",
+                        "readOnly": "True"
+                      },
+                      "modelName": {
+                        "title": "Model Name",
+                        "type": "string",
+                        "default": "Vloadbalancerms..base_template..module-0",
+                        "readOnly": "True"
+                      },
+                      "modelVersion": {
+                        "title": "Model Version",
+                        "type": "string",
+                        "default": "1",
+                        "readOnly": "True"
+                      },
+                      "modelCustomizationId": {
+                        "title": "Customization ID",
+                        "type": "string",
+                        "default": "86baddea-c730-4fb8-9410-cd2e17fd7f27",
+                        "readOnly": "True"
+                      }
+                    }
+                  },
+                  {
+                    "title": "VFMODULE-Vloadbalancerms..vlb..module-2",
+                    "properties": {
+                      "type": {
+                        "title": "Type",
+                        "type": "string",
+                        "default": "VFMODULE",
+                        "readOnly": "True"
+                      },
+                      "resourceID": {
+                        "title": "Resource ID",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vlb..module-2",
+                        "readOnly": "True"
+                      },
+                      "modelInvariantId": {
+                        "title": "Model Invariant Id (ModelInvariantUUID)",
+                        "type": "string",
+                        "default": "a772a1f4-0064-412c-833d-4749b15828dd",
+                        "readOnly": "True"
+                      },
+                      "modelVersionId": {
+                        "title": "Model Version Id (ModelUUID)",
+                        "type": "string",
+                        "default": "0f5c3f6a-650a-4303-abb6-fff3e573a07a",
+                        "readOnly": "True"
+                      },
+                      "modelName": {
+                        "title": "Model Name",
+                        "type": "string",
+                        "default": "Vloadbalancerms..vlb..module-2",
+                        "readOnly": "True"
+                      },
+                      "modelVersion": {
+                        "title": "Model Version",
+                        "type": "string",
+                        "default": "1",
+                        "readOnly": "True"
+                      },
+                      "modelCustomizationId": {
+                        "title": "Customization ID",
+                        "type": "string",
+                        "default": "96a78aad-4ffb-4ef0-9c4f-deb03bf1d806",
+                        "readOnly": "True"
+                      }
+                    }
+                  }
+                ]
+              }
+            }
+          }
+        }
+      }
+    },
+    "guard_policies": {
+      "type": "array",
+      "format": "tabs-top",
+      "title": "Associated Guard policies",
+      "items": {
+        "headerTemplate": "{{self.policy-id}} - {{self.content.recipe}}",
+        "anyOf": [
+          {
+            "title": "Guard MinMax",
+            "type": "object",
+            "properties": {
+              "policy-id": {
+                "type": "string",
+                "default": "guard.minmax.new",
+                "pattern": "^(guard.minmax\\..*)$"
+              },
+              "content": {
+                "properties": {
+                  "actor": {
+                    "type": "string",
+                    "enum": [
+                      "APPC",
+                      "SO",
+                      "VFC",
+                      "SDNC",
+                      "SDNR"
+                    ]
+                  },
+                  "recipe": {
+                    "type": "string",
+                    "enum": [
+                      "Restart",
+                      "Rebuild",
+                      "Migrate",
+                      "Health-Check",
+                      "ModifyConfig",
+                      "VF Module Create",
+                      "VF Module Delete",
+                      "Reroute"
+                    ]
+                  },
+                  "targets": {
+                    "type": "string",
+                    "default": ".*"
+                  },
+                  "clname": {
+                    "type": "string",
+                    "template": "{{loopName}}",
+                    "watch": {
+                      "loopName": "operational_policy.controlLoop.controlLoopName"
+                    }
+                  },
+                  "guardActiveStart": {
+                    "type": "string",
+                    "default": "00:00:00Z"
+                  },
+                  "guardActiveEnd": {
+                    "type": "string",
+                    "default": "10:00:00Z"
+                  },
+                  "min": {
+                    "type": "string",
+                    "default": "0"
+                  },
+                  "max": {
+                    "type": "string",
+                    "default": "1"
+                  }
+                }
+              }
+            }
+          },
+          {
+            "title": "Guard Frequency",
+            "type": "object",
+            "properties": {
+              "policy-id": {
+                "type": "string",
+                "default": "guard.frequency.new",
+                "pattern": "^(guard.frequency\\..*)$"
+              },
+              "content": {
+                "properties": {
+                  "actor": {
+                    "type": "string",
+                    "enum": [
+                      "APPC",
+                      "SO",
+                      "VFC",
+                      "SDNC",
+                      "SDNR"
+                    ]
+                  },
+                  "recipe": {
+                    "type": "string",
+                    "enum": [
+                      "Restart",
+                      "Rebuild",
+                      "Migrate",
+                      "Health-Check",
+                      "ModifyConfig",
+                      "VF Module Create",
+                      "VF Module Delete",
+                      "Reroute"
+                    ]
+                  },
+                  "targets": {
+                    "type": "string",
+                    "default": ".*"
+                  },
+                  "clname": {
+                    "type": "string",
+                    "template": "{{loopName}}",
+                    "watch": {
+                      "loopName": "operational_policy.controlLoop.controlLoopName"
+                    }
+                  },
+                  "guardActiveStart": {
+                    "type": "string",
+                    "default": "00:00:00Z"
+                  },
+                  "guardActiveEnd": {
+                    "type": "string",
+                    "default": "10:00:00Z"
+                  },
+                  "limit": {
+                    "type": "string"
+                  },
+                  "timeWindow": {
+                    "type": "string"
+                  },
+                  "timeUnits": {
+                    "type": "string",
+                    "enum": [
+                      "minute",
+                      "hour",
+                      "day",
+                      "week",
+                      "month",
+                      "year"
+                    ]
+                  }
+                }
+              }
+            }
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
index 6ab84a8..87457f1 100644 (file)
@@ -99,6 +99,7 @@
                 "anyOf": [
                   {
                     "title": "APPC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "SO",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "SDNC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
                         "default": "",
                   },
                   {
                     "title": "VFC",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "string",
-                        "required": [
-                          "payload"
-                        ],
                         "default": "",
                         "enum": [
                           "ModifyConfig"
                   },
                   {
                     "title": "CDS",
+                    "type": "object",
                     "properties": {
                       "actor": {
                         "title": "actor",
                           "hidden": true
                         }
                       },
-                      "type": {
+                      "recipe": {
                         "title": "recipe",
                         "type": "object",
-                        "required": [
-                          "payload"
-                        ],
                         "anyOf": [
                           {
                             "title": "user-defined",
+                            "type": "object",
                             "properties": {
-                              "type": {
+                              "recipe": {
+                                "title": "recipe",
+                                "type": "string",
+                                "default": "user-defined",
+                                "format": "textarea"
+                              },
+                              "payload": {
                                 "title": "Payload (YAML)",
                                 "type": "string",
                                 "default": "",
                           },
                           {
                             "title": "resource-assignment",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "resource-assignment",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           },
                           {
                             "title": "activate",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "activate",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           },
                           {
                             "title": "activate-restconf",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "activate-restconf",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           },
                           {
                             "title": "activate-cli",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "activate-cli",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           },
                           {
                             "title": "assign-activate",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "assign-activate",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           },
                           {
                             "title": "imperative-test-wf",
+                            "type": "object",
                             "properties": {
-                              "type": {
-                                "title": "Payload (YAML)",
+                              "recipe": {
+                                "title": "recipe",
                                 "type": "string",
-                                "default": "\u0027artifact_name : \"baseconfiguration\"\nartifact_version : \"1.0.0\"\nmode : async\ndata : \u0027\\\u0027{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"vnf-id\":\"\",\"action-name\":\"\",\"scope-type\":\"\",\"hostname\":\"\",\"vnf_name\":\"\"}}\\\u0027\u0027",
-                                "format": "textarea"
+                                "default": "imperative-test-wf",
+                                "options": {
+                                  "hidden": true
+                                }
+                              },
+                              "payload": {
+                                "title": "Payload (YAML)",
+                                "type": "object",
+                                "properties": {
+                                  "artifact_name": {
+                                    "title": "artifact name",
+                                    "type": "string",
+                                    "default": "baseconfiguration",
+                                    "readOnly": "True"
+                                  },
+                                  "artifact_version": {
+                                    "title": "artifact version",
+                                    "type": "string",
+                                    "default": "1.0.0",
+                                    "readOnly": "True"
+                                  },
+                                  "mode": {
+                                    "title": "mode",
+                                    "type": "string",
+                                    "default": "async"
+                                  },
+                                  "data": {
+                                    "title": "data",
+                                    "properties": {
+                                      "resource-assignment-properties": {
+                                        "title": "resource-assignment-properties",
+                                        "type": "object",
+                                        "properties": {
+                                          "request-id": {
+                                            "title": "request-id",
+                                            "type": "string"
+                                          },
+                                          "service-instance-id": {
+                                            "title": "service-instance-id",
+                                            "type": "string"
+                                          },
+                                          "vnf-id": {
+                                            "title": "vnf-id",
+                                            "type": "string"
+                                          },
+                                          "action-name": {
+                                            "title": "action-name",
+                                            "type": "string"
+                                          },
+                                          "scope-type": {
+                                            "title": "scope-type",
+                                            "type": "string"
+                                          },
+                                          "hostname": {
+                                            "title": "hostname",
+                                            "type": "string"
+                                          },
+                                          "vnf_name": {
+                                            "title": "vnf_name",
+                                            "type": "string"
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
                               }
                             }
                           }
       }
     }
   }
-}
\ No newline at end of file
+}
index f4708eb..72bbf9b 100644 (file)
@@ -40,3 +40,35 @@ policies:
     resourceID: Vloadbalancerms..vpkg..module-1
     type: VFMODULE
   timeout: 0
+- actor: CDS
+  failure: final_failure
+  failure_exception: final_failure_exception
+  failure_guard: final_failure_guard
+  failure_retries: final_failure_retries
+  failure_timeout: final_failure_timeout
+  id: policy3
+  payload:
+    artifact_name: baseconfiguration
+    artifact_version: 1.0.0
+    data:
+      resource-assignment-properties:
+        action-name: action-name
+        hostname: hostname
+        request-id: request-id
+        scope-type: scope-type
+        service-instance-id: service-instance-id
+        vnf-id: vnf-id
+        vnf_name: vnf_name
+    mode: async
+  recipe: resource-assignment
+  retry: 0
+  success: final_success
+  target:
+    modelCustomizationId: 1bffdc31-a37d-4dee-b65c-dde623a76e52
+    modelInvariantId: ca052563-eb92-4b5b-ad41-9111768ce043
+    modelName: Vloadbalancerms..vpkg..module-1
+    modelVersion: 1
+    modelVersionId: 1e725ccc-b823-4f67-82b9-4f4367070dbc
+    resourceID: Vloadbalancerms..vpkg..module-1
+    type: VFMODULE
+  timeout: 0
index 033eecd..e53950a 100644 (file)
@@ -1,4 +1,4 @@
 {
   "policy-id": "testPolicy.legacy",
-  "content": "controlLoop%3A%0A++abatement%3A+true%0A++controlLoopName%3A+LOOP_ASJOy_v1_0_ResourceInstanceName1_tca%0A++timeout%3A+0%0A++trigger_policy%3A+policy1%0Apolicies%3A%0A-+actor%3A+APPC%0A++failure%3A+policy2%0A++failure_exception%3A+final_failure_exception%0A++failure_guard%3A+final_failure_guard%0A++failure_retries%3A+final_failure_retries%0A++failure_timeout%3A+final_failure_timeout%0A++id%3A+policy1%0A++payload%3A%0A++++configurationParameters%3A+%27%5B%7B%22ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B10%5D.value%22%2C%22oam-ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B15%5D.value%22%2C%22enabled%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B22%5D.value%22%7D%5D%27%0A++++requestParameters%3A+%27%7B%22usePreload%22%3Atrue%2C%22userParams%22%3A%5B%5D%7D%27%0A++recipe%3A+Restart%0A++retry%3A+0%0A++success%3A+final_success%0A++target%3A%0A++++resourceID%3A+vLoadBalancerMS%0A++++type%3A+VNF%0A++timeout%3A+0%0A-+actor%3A+SO%0A++failure%3A+final_failure%0A++failure_exception%3A+final_failure_exception%0A++failure_guard%3A+final_failure_guard%0A++failure_retries%3A+final_failure_retries%0A++failure_timeout%3A+final_failure_timeout%0A++id%3A+policy2%0A++recipe%3A+VF+Module+Create%0A++retry%3A+0%0A++success%3A+final_success%0A++target%3A%0A++++modelCustomizationId%3A+1bffdc31-a37d-4dee-b65c-dde623a76e52%0A++++modelInvariantId%3A+ca052563-eb92-4b5b-ad41-9111768ce043%0A++++modelName%3A+Vloadbalancerms..vpkg..module-1%0A++++modelVersion%3A+1%0A++++modelVersionId%3A+1e725ccc-b823-4f67-82b9-4f4367070dbc%0A++++resourceID%3A+Vloadbalancerms..vpkg..module-1%0A++++type%3A+VFMODULE%0A++timeout%3A+0%0A"
+  "content": "controlLoop%3A%0A++abatement%3A+true%0A++controlLoopName%3A+LOOP_ASJOy_v1_0_ResourceInstanceName1_tca%0A++timeout%3A+0%0A++trigger_policy%3A+policy1%0Apolicies%3A%0A-+actor%3A+APPC%0A++failure%3A+policy2%0A++failure_exception%3A+final_failure_exception%0A++failure_guard%3A+final_failure_guard%0A++failure_retries%3A+final_failure_retries%0A++failure_timeout%3A+final_failure_timeout%0A++id%3A+policy1%0A++payload%3A%0A++++configurationParameters%3A+%27%5B%7B%22ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B10%5D.value%22%2C%22oam-ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B15%5D.value%22%2C%22enabled%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B22%5D.value%22%7D%5D%27%0A++++requestParameters%3A+%27%7B%22usePreload%22%3Atrue%2C%22userParams%22%3A%5B%5D%7D%27%0A++recipe%3A+Restart%0A++retry%3A+0%0A++success%3A+final_success%0A++target%3A%0A++++resourceID%3A+vLoadBalancerMS%0A++++type%3A+VNF%0A++timeout%3A+0%0A-+actor%3A+SO%0A++failure%3A+final_failure%0A++failure_exception%3A+final_failure_exception%0A++failure_guard%3A+final_failure_guard%0A++failure_retries%3A+final_failure_retries%0A++failure_timeout%3A+final_failure_timeout%0A++id%3A+policy2%0A++recipe%3A+VF+Module+Create%0A++retry%3A+0%0A++success%3A+final_success%0A++target%3A%0A++++modelCustomizationId%3A+1bffdc31-a37d-4dee-b65c-dde623a76e52%0A++++modelInvariantId%3A+ca052563-eb92-4b5b-ad41-9111768ce043%0A++++modelName%3A+Vloadbalancerms..vpkg..module-1%0A++++modelVersion%3A+1%0A++++modelVersionId%3A+1e725ccc-b823-4f67-82b9-4f4367070dbc%0A++++resourceID%3A+Vloadbalancerms..vpkg..module-1%0A++++type%3A+VFMODULE%0A++timeout%3A+0%0A-+actor%3A+CDS%0A++failure%3A+final_failure%0A++failure_exception%3A+final_failure_exception%0A++failure_guard%3A+final_failure_guard%0A++failure_retries%3A+final_failure_retries%0A++failure_timeout%3A+final_failure_timeout%0A++id%3A+policy3%0A++payload%3A%0A++++artifact_name%3A+baseconfiguration%0A++++artifact_version%3A+1.0.0%0A++++data%3A%0A++++++resource-assignment-properties%3A%0A++++++++action-name%3A+action-name%0A++++++++hostname%3A+hostname%0A++++++++request-id%3A+request-id%0A++++++++scope-type%3A+scope-type%0A++++++++service-instance-id%3A+service-instance-id%0A++++++++vnf-id%3A+vnf-id%0A++++++++vnf_name%3A+vnf_name%0A++++mode%3A+async%0A++recipe%3A+resource-assignment%0A++retry%3A+0%0A++success%3A+final_success%0A++target%3A%0A++++modelCustomizationId%3A+1bffdc31-a37d-4dee-b65c-dde623a76e52%0A++++modelInvariantId%3A+ca052563-eb92-4b5b-ad41-9111768ce043%0A++++modelName%3A+Vloadbalancerms..vpkg..module-1%0A++++modelVersion%3A+1%0A++++modelVersionId%3A+1e725ccc-b823-4f67-82b9-4f4367070dbc%0A++++resourceID%3A+Vloadbalancerms..vpkg..module-1%0A++++type%3A+VFMODULE%0A++timeout%3A+0%0A"
 }
\ No newline at end of file
index 69c86cc..aaa9627 100644 (file)
@@ -50,3 +50,35 @@ topology_template:
           actor: SO
           recipe: VF Module Create
           payload: ''
+        - id: policy3
+          retry: '0'
+          timeout: '0'
+          success: final_success
+          failure: final_failure
+          failure_timeout: final_failure_timeout
+          failure_retries: final_failure_retries
+          failure_exception: final_failure_exception
+          failure_guard: final_failure_guard
+          target:
+            type: VFMODULE
+            resourceID: Vloadbalancerms..vpkg..module-1
+            modelInvariantId: ca052563-eb92-4b5b-ad41-9111768ce043
+            modelVersionId: 1e725ccc-b823-4f67-82b9-4f4367070dbc
+            modelName: Vloadbalancerms..vpkg..module-1
+            modelVersion: '1'
+            modelCustomizationId: 1bffdc31-a37d-4dee-b65c-dde623a76e52
+          actor: CDS
+          recipe: resource-assignment
+          payload:
+            artifact_name: baseconfiguration
+            artifact_version: 1.0.0
+            mode: async
+            data:
+              resource-assignment-properties:
+                request-id: request-id
+                service-instance-id: service-instance-id
+                vnf-id: vnf-id
+                action-name: action-name
+                scope-type: scope-type
+                hostname: hostname
+                vnf_name: vnf_name
index a2de76a..2777a15 100644 (file)
@@ -10,7 +10,7 @@
       {
         "actor": {
           "actor": "APPC",
-          "type": "Restart",
+          "recipe": "Restart",
           "payload": "requestParameters: '{\"usePreload\":true,\"userParams\":[]}'\r\nconfigurationParameters: '[{\"ip-addr\":\"$.vf-module-topology.vf-module-parameters.param[10].value\",\"oam-ip-addr\":\"$.vf-module-topology.vf-module-parameters.param[15].value\",\"enabled\":\"$.vf-module-topology.vf-module-parameters.param[22].value\"}]'"
         },
         "id": "policy1",
           "resourceID": "vLoadBalancerMS"
         }
       },
-    {
+      {
         "actor": {
-         "actor": "SO",
-         "type": "VF Module Create",
-         "payload": ""
+          "actor": "SO",
+          "recipe": "VF Module Create",
+          "payload": ""
         },
         "id": "policy2",
         "retry": "0",
           "modelVersion": "1",
           "modelCustomizationId": "1bffdc31-a37d-4dee-b65c-dde623a76e52"
         }
+      },
+      {
+        "actor": {
+          "actor": "CDS",
+          "recipe": {
+            "recipe": "resource-assignment",
+            "payload": {
+              "artifact_name": "baseconfiguration",
+              "artifact_version": "1.0.0",
+              "mode": "async",
+              "data": {
+                "resource-assignment-properties": {
+                  "request-id": "request-id",
+                  "service-instance-id": "service-instance-id",
+                  "vnf-id": "vnf-id",
+                  "action-name": "action-name",
+                  "scope-type": "scope-type",
+                  "hostname": "hostname",
+                  "vnf_name": "vnf_name"
+                }
+              }
+            }
+          }
+        },
+        "id": "policy3",
+        "retry": "0",
+        "timeout": "0",
+        "success": "final_success",
+        "failure": "final_failure",
+        "failure_timeout": "final_failure_timeout",
+        "failure_retries": "final_failure_retries",
+        "failure_exception": "final_failure_exception",
+        "failure_guard": "final_failure_guard",
+        "target": {
+          "type": "VFMODULE",
+          "resourceID": "Vloadbalancerms..vpkg..module-1",
+          "modelInvariantId": "ca052563-eb92-4b5b-ad41-9111768ce043",
+          "modelVersionId": "1e725ccc-b823-4f67-82b9-4f4367070dbc",
+          "modelName": "Vloadbalancerms..vpkg..module-1",
+          "modelVersion": "1",
+          "modelCustomizationId": "1bffdc31-a37d-4dee-b65c-dde623a76e52"
+        }
       }
     ]
   },
index c81440e..dce740f 100644 (file)
           "pdpType": "pdpSubgroup2",
           "action": "POST",
           "policies": [
+            {
+              "name": "opLegacyPolicy",
+              "version": "1.0.0"
+            },
+            {
+              "name": "guard1",
+              "version": "1.0.0"
+            },
             {
               "name": "opPolicy",
               "version": "1.0.0"
index b257548..fe9b84d 100644 (file)
@@ -1,7 +1,7 @@
 {
     "schema": {
         "uniqueItems": "true",
-        "format": "tabs-top",
+        "format": "tabs",
         "type": "array",
         "title": "Properties with constraints",
         "items": {
index d470d92..ef9c2c0 100644 (file)
@@ -1,7 +1,7 @@
 {
     "schema": {
         "uniqueItems": "true",
-        "format": "tabs-top",
+        "format": "tabs",
         "type": "array",
         "title": "Properties with different types",
         "items": {
index dd6a9ff..b83d3f2 100644 (file)
@@ -1,7 +1,7 @@
 {
        "schema": {
                "uniqueItems": "true",
-               "format": "tabs-top",
+               "format": "tabs",
                "type": "array",
                "title": "TCA Policy JSON",
                "items": {
index a638c35..dc47b44 100644 (file)
                                                "resource-assignment": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate-restconf": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "activate-cli": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "assign-activate": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                },
                                                "imperative-test-wf": {
                                                        "inputs": {
                                                                "resource-assignment-properties": {
-                                                                       "request-id": "",
-                                                                       "service-instance-id": "",
-                                                                       "vnf-id": "",
-                                                                       "action-name": "",
-                                                                       "scope-type": "",
-                                                                       "hostname": "",
-                                                                       "vnf_name": ""
+                                                                       "request-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "service-instance-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf-id": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "action-name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "scope-type": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "hostname": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       },
+                                                                       "vnf_name": {
+                                                                               "type": "string",
+                                                                               "required": true
+                                                                       }
                                                                }
                                                        }
                                                } 
index af8c1f9..418ee71 100644 (file)
@@ -1,7 +1,7 @@
 {
    "schema":{
       "uniqueItems":"true",
-      "format":"tabs-top",
+      "format":"tabs",
       "type":"array",
       "title":"TCA Policy JSON",
       "items":{
                                        "id":"alarmCondition",
                                        "label":"alarmCondition",
                                        "type":"string"
+                                    },
+                                    {
+                                       "plugin":"datetimepicker",
+                                       "operators":[
+                                          "equals"
+                                       ],
+                                       "minLength":1,
+                                       "id":"timeEpoch",
+                                       "label":"timeEpoch",
+                                       "type":"datetime",
+                                       "input_event":"dp.change",
+                                       "validation":{
+                                          "format":"YYYY/MM/DD HH:mm:ss"
+                                       }
                                     }
                                  ]
                               },
diff --git a/src/test/resources/tosca/tosca_with_date_time_json_schema.json b/src/test/resources/tosca/tosca_with_date_time_json_schema.json
new file mode 100644 (file)
index 0000000..e15942c
--- /dev/null
@@ -0,0 +1,240 @@
+{
+   "schema":{
+      "uniqueItems":"true",
+      "format":"tabs",
+      "type":"array",
+      "title":"TCA Policy JSON",
+      "items":{
+         "type":"object",
+         "title":"TCA Policy JSON",
+         "required":[
+            "domain",
+            "metricsPerEventName"
+         ],
+         "properties":{
+            "domain":{
+               "propertyOrder":1001,
+               "default":"measurementsForVfScaling",
+               "title":"Domain name to which TCA needs to be applied",
+               "type":"string"
+            },
+            "metricsPerEventName":{
+               "propertyOrder":1002,
+               "uniqueItems":"true",
+               "format":"tabs-top",
+               "title":"Contains eventName and threshold details that need to be applied to given eventName",
+               "type":"array",
+               "items":{
+                  "type":"object",
+                  "required":[
+                     "controlLoopSchemaType",
+                     "eventName",
+                     "policyName",
+                     "policyScope",
+                     "policyVersion",
+                     "thresholds",
+                     "context",
+                     "signature"
+                  ],
+                  "properties":{
+                     "policyVersion":{
+                        "propertyOrder":1007,
+                        "title":"TCA Policy Scope Version",
+                        "type":"string"
+                     },
+                     "thresholds":{
+                        "propertyOrder":1008,
+                        "uniqueItems":"true",
+                        "format":"tabs-top",
+                        "title":"Thresholds associated with eventName",
+                        "type":"array",
+                        "items":{
+                           "type":"object",
+                           "required":[
+                              "closedLoopControlName",
+                              "closedLoopEventStatus",
+                              "direction",
+                              "fieldPath",
+                              "severity",
+                              "thresholdValue",
+                              "version"
+                           ],
+                           "properties":{
+                              "severity":{
+                                 "propertyOrder":1013,
+                                 "title":"Threshold Event Severity",
+                                 "type":"string",
+                                 "enum":[
+                                    "CRITICAL",
+                                    "MAJOR",
+                                    "MINOR",
+                                    "WARNING",
+                                    "NORMAL"
+                                 ]
+                              },
+                              "fieldPath":{
+                                 "propertyOrder":1012,
+                                 "title":"Json field Path as per CEF message which needs to be analyzed for TCA",
+                                 "type":"string",
+                                 "enum":[
+                                    "$.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"
+                                 ]
+                              },
+                              "thresholdValue":{
+                                 "propertyOrder":1014,
+                                 "title":"Threshold value for the field Path inside CEF message",
+                                 "type":"integer"
+                              },
+                              "closedLoopEventStatus":{
+                                 "propertyOrder":1010,
+                                 "title":"Closed Loop Event Status of the threshold",
+                                 "type":"string",
+                                 "enum":[
+                                    "ONSET",
+                                    "ABATED"
+                                 ]
+                              },
+                              "closedLoopControlName":{
+                                 "propertyOrder":1009,
+                                 "title":"Closed Loop Control Name associated with the threshold",
+                                 "type":"string"
+                              },
+                              "version":{
+                                 "propertyOrder":1015,
+                                 "title":"Version number associated with the threshold",
+                                 "type":"string"
+                              },
+                              "direction":{
+                                 "propertyOrder":1011,
+                                 "title":"Direction of the threshold",
+                                 "type":"string",
+                                 "enum":[
+                                    "LESS",
+                                    "LESS_OR_EQUAL",
+                                    "GREATER",
+                                    "GREATER_OR_EQUAL",
+                                    "EQUAL"
+                                 ]
+                              }
+                           }
+                        }
+                     },
+                     "policyName":{
+                        "propertyOrder":1005,
+                        "title":"TCA Policy Scope Name",
+                        "type":"string"
+                     },
+                     "signature":{
+                        "propertyOrder":1017,
+                        "title":"Signature",
+                        "required":[
+                           "filter_clause"
+                        ],
+                        "properties":{
+                           "filter_clause":{
+                              "propertyOrder":30002,
+                              "qschema":{
+                                 "filters":[
+                                    {
+                                       "plugin":"datetimepicker",
+                                       "operators":[
+                                          "equals"
+                                       ],
+                                       "minLength":1,
+                                       "id":"timeEpoch",
+                                       "label":"timeEpoch",
+                                       "type":"datetime",
+                                       "input_event":"dp.change",
+                                       "validation":{
+                                          "format":"YYYY/MM/DD HH:mm:ss"
+                                       }
+                                    }
+                                 ]
+                              },
+                              "minLength":1,
+                              "title":"Filter Clause",
+                              "type":"qbldr"
+                           }
+                        }
+                     },
+                     "controlLoopSchemaType":{
+                        "propertyOrder":1003,
+                        "title":"Specifies Control Loop Schema Type for the event Name e.g. VNF, VM",
+                        "type":"string",
+                        "enum":[
+                           "VM",
+                           "VNF"
+                        ]
+                     },
+                     "policyScope":{
+                        "propertyOrder":1006,
+                        "title":"TCA Policy Scope",
+                        "type":"string"
+                     },
+                     "context":{
+                        "propertyOrder":1016,
+                        "options":{
+                           "enum_titles":[
+                              "PROD"
+                           ]
+                        },
+                        "title":"TCA Policy Dummy Context",
+                        "type":"string",
+                        "enum":[
+                           "PROD"
+                        ]
+                     },
+                     "eventName":{
+                        "propertyOrder":1004,
+                        "title":"Event name to which thresholds need to be applied",
+                        "type":"string"
+                     }
+                  }
+               }
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
index fae47e7..da98df4 100755 (executable)
@@ -33,13 +33,19 @@ export { default as LoopService } from './src/api/LoopService';
 export { default as LoopStatus } from './src/components/loop_viewer/status/LoopStatus';
 export { default as LoopSvg } from './src/components/loop_viewer/svg/LoopSvg';
 export { default as LoopUI } from './src/LoopUI';
+export { default as ManageDictionaries } from './src/components/dialogs/ManageDictionaries/ManageDictionaries';
 export { default as MenuBar } from './src/components/menu/MenuBar';
+export { default as ModifyLoopModal } from './src/components/dialogs/Loop/ModifyLoopModal';
 export { default as NotFound } from './src/NotFound';
 export { default as OpenLoopModal } from './src/components/dialogs/Loop/OpenLoopModal';
 export { default as CreateLoopModal } from './src/components/dialogs/Loop/CreateLoopModal';
 export { default as OperationalPolicyModal } from './src/components/dialogs/OperationalPolicy/OperationalPolicyModal';
 export { default as PerformActions } from './src/components/dialogs/PerformActions';
+export { default as PolicyToscaService } from './src/api/PolicyToscaService';
 export { default as RefreshStatus } from './src/components/dialogs/RefreshStatus';
+export { default as TemplateService } from './src/api/TemplateService';
 export { default as UserInfoModal } from './src/components/dialogs/UserInfoModal';
 export { default as UserService } from './src/api/UserService';
+export { default as UploadToscaPolicyModal } from './src/components/dialogs/Tosca/UploadToscaPolicyModal';
+export { default as ViewLoopTemplatesModal } from './src/components/dialogs/Tosca/ViewLoopTemplatesModal';
 export { default as ViewToscaPolicyModal } from './src/components/dialogs/Tosca/ViewToscaPolicyModal';
index bc3f235..efd02b4 100644 (file)
@@ -109,7 +109,8 @@ export default class LoopUI extends React.Component {
                userName: null,
                loopName: OnapConstants.defaultLoopName,
                loopCache: new LoopCache({}),
-               showAlert: false
+               showSucAlert: false,
+               showFailAlert: false
        };
 
        constructor() {
@@ -119,7 +120,8 @@ export default class LoopUI extends React.Component {
                this.updateLoopCache = this.updateLoopCache.bind(this);
                this.loadLoop = this.loadLoop.bind(this);
                this.closeLoop = this.closeLoop.bind(this);
-               this.showAlert =  this.showAlert.bind(this);
+               this.showSucAlert =  this.showSucAlert.bind(this);
+               this.showFailAlert =  this.showFailAlert.bind(this);
                this.disableAlert =  this.disableAlert.bind(this);
        }
 
@@ -168,9 +170,14 @@ export default class LoopUI extends React.Component {
 
        renderAlertBar() {
                return (
-                               <Alert variant="danger" show={this.state.showAlert} onClose={this.disableAlert} dismissible>
+                       <div>
+                               <Alert variant="success" show={this.state.showSucAlert} onClose={this.disableAlert} dismissible>
                                        {this.state.showMessage}
                                </Alert>
+                               <Alert variant="danger" show={this.state.showFailAlert} onClose={this.disableAlert} dismissible>
+                                       {this.state.showMessage}
+                               </Alert>
+                       </div>
                );
        }
 
@@ -188,7 +195,7 @@ export default class LoopUI extends React.Component {
        renderLoopViewHeader() {
                return (
                        <LoopViewHeaderDivStyled>
-                               Loop Viewer - {this.state.loopName}
+                               Loop Viewer - {this.state.loopName} - ({this.state.loopCache.getTemplateName()})
                        </LoopViewHeaderDivStyled>
                );
        }
@@ -223,12 +230,16 @@ export default class LoopUI extends React.Component {
                console.info(this.state.loopName+" loop loaded successfully");
        }
 
-       showAlert(message) {
-               this.setState ({ showAlert: true, showMessage:message });
+       showSucAlert(message) {
+               this.setState ({ showSucAlert: true, showMessage:message });
        }
 
+       showFailAlert(message) {
+               this.setState ({ showFailAlert: true, showMessage:message });
+       }
        disableAlert() {
-               this.setState ({ showAlert: false });
+               this.setState ({ showSucAlert: false, showFailAlert: false });
        }
 
        loadLoop(loopName) {
@@ -258,7 +269,7 @@ export default class LoopUI extends React.Component {
                                <Route path="/ViewLoopTemplatesModal" render={(routeProps) => (<ViewLoopTemplatesModal {...routeProps} />)} />
                                <Route path="/ManageDictionaries" render={(routeProps) => (<ManageDictionaries {...routeProps} />)} />
                                <Route path="/operationalPolicyModal"
-                                       render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
+                                       render={(routeProps) => (<OperationalPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
                                <Route path="/policyModal/:policyInstanceType/:policyName" render={(routeProps) => (<PolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
                                <Route path="/configurationPolicyModal/:policyName" render={(routeProps) => (<ConfigurationPolicyModal {...routeProps} loopCache={this.getLoopCache()} loadLoopFunction={this.loadLoop}/>)} />
                                <Route path="/createLoop" render={(routeProps) => (<CreateLoopModal {...routeProps} loadLoopFunction={this.loadLoop} />)} />
@@ -268,13 +279,13 @@ export default class LoopUI extends React.Component {
 
                                <Route path="/userInfo" render={(routeProps) => (<UserInfoModal {...routeProps} />)} />
                                <Route path="/closeLoop" render={this.closeLoop} />
-                               <Route path="/submit" render={(routeProps) => (<PerformAction {...routeProps} loopAction="submit" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/stop" render={(routeProps) => (<PerformAction {...routeProps} loopAction="stop" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/restart" render={(routeProps) => (<PerformAction {...routeProps} loopAction="restart" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/delete" render={(routeProps) => (<PerformAction {...routeProps} loopAction="delete" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/undeploy" render={(routeProps) => (<PerformAction {...routeProps} loopAction="undeploy" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/deploy" render={(routeProps) => (<DeployLoopModal {...routeProps} loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
-                               <Route path="/refreshStatus" render={(routeProps) => (<RefreshStatus {...routeProps} loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showAlert={this.showAlert}/>)} />
+                               <Route path="/submit" render={(routeProps) => (<PerformAction {...routeProps} loopAction="submit" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/stop" render={(routeProps) => (<PerformAction {...routeProps} loopAction="stop" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/restart" render={(routeProps) => (<PerformAction {...routeProps} loopAction="restart" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/delete" render={(routeProps) => (<PerformAction {...routeProps} loopAction="delete" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/undeploy" render={(routeProps) => (<PerformAction {...routeProps} loopAction="undeploy" loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/deploy" render={(routeProps) => (<DeployLoopModal {...routeProps} loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
+                               <Route path="/refreshStatus" render={(routeProps) => (<RefreshStatus {...routeProps} loopCache={this.getLoopCache()} updateLoopFunction={this.updateLoopCache} showSucAlert={this.showSucAlert} showFailAlert={this.showFailAlert}/>)} />
                                <Route path="/logout" render={this.logout} />
                                <GlobalClampStyle />
                                        {this.renderAlertBar()}
index d1b76aa..6885e79 100644 (file)
@@ -66,7 +66,8 @@ describe('Verify LoopUI', () => {
                const component = shallow(<LoopUI />)
                component.setState({
                        loopName: "testLoopName",
-                       showAlert: false 
+                       showSucAlert: false,
+                       showFailAlert: false 
                });
                await flushPromises();
                expect(component).toMatchSnapshot();
@@ -158,15 +159,22 @@ describe('Verify LoopUI', () => {
 
        test('Test alert methods', () => {
                const component = shallow(<LoopUI />)
-               expect(component.state('showAlert')).toEqual(false);
+               expect(component.state('showSucAlert')).toEqual(false);
 
                const instance = component.instance();
-               instance.showAlert("testAlert");
-               expect(component.state('showAlert')).toEqual(true);
+               instance.showSucAlert("testAlert");
+               expect(component.state('showSucAlert')).toEqual(true);
+               expect(component.state('showFailAlert')).toEqual(false);
                expect(component.state('showMessage')).toEqual("testAlert");
 
                instance.disableAlert();
                        
-               expect(component.state('showAlert')).toEqual(false);
+               expect(component.state('showSucAlert')).toEqual(false);
+               expect(component.state('showFailAlert')).toEqual(false);
+
+               instance.showFailAlert("testAlert2");
+               expect(component.state('showSucAlert')).toEqual(false);
+               expect(component.state('showFailAlert')).toEqual(true);
+               expect(component.state('showMessage')).toEqual("testAlert2");
        })
 });
index 9de232d..ff08f7a 100644 (file)
@@ -89,27 +89,50 @@ exports[`Verify LoopUI Test the render method 1`] = `
     render={[Function]}
   />
   <GlobalStyleComponent />
-  <Alert
-    closeLabel="Close alert"
-    dismissible={true}
-    onClose={[Function]}
-    show={false}
-    transition={
-      Object {
-        "$$typeof": Symbol(react.forward_ref),
-        "defaultProps": Object {
-          "appear": false,
-          "in": false,
-          "mountOnEnter": false,
-          "timeout": 300,
-          "unmountOnExit": false,
-        },
-        "displayName": "Fade",
-        "render": [Function],
+  <div>
+    <Alert
+      closeLabel="Close alert"
+      dismissible={true}
+      onClose={[Function]}
+      show={false}
+      transition={
+        Object {
+          "$$typeof": Symbol(react.forward_ref),
+          "defaultProps": Object {
+            "appear": false,
+            "in": false,
+            "mountOnEnter": false,
+            "timeout": 300,
+            "unmountOnExit": false,
+          },
+          "displayName": "Fade",
+          "render": [Function],
+        }
       }
-    }
-    variant="danger"
-  />
+      variant="success"
+    />
+    <Alert
+      closeLabel="Close alert"
+      dismissible={true}
+      onClose={[Function]}
+      show={false}
+      transition={
+        Object {
+          "$$typeof": Symbol(react.forward_ref),
+          "defaultProps": Object {
+            "appear": false,
+            "in": false,
+            "mountOnEnter": false,
+            "timeout": 300,
+            "unmountOnExit": false,
+          },
+          "displayName": "Fade",
+          "render": [Function],
+        }
+      }
+      variant="danger"
+    />
+  </div>
   <Navbar
     collapseOnSelect={false}
     expand={true}
@@ -153,6 +176,8 @@ exports[`Verify LoopUI Test the render method 1`] = `
     <styled.div>
       Loop Viewer - 
       testLoopName
+       - (
+      )
     </styled.div>
     <styled.div>
       <withRouter(LoopViewSvg)
index 91812b7..93dc442 100644 (file)
@@ -13,6 +13,8 @@ exports[`Verify OnapClamp Test the render method 1`] = `
       "fontNormal": "black",
       "fontSize": "16px",
       "fontWarning": "#eb238e",
+      "loopLogsHeaderBackgroundColor": "white",
+      "loopLogsHeaderFontColor": "black",
       "loopViewerBackgroundColor": "white",
       "loopViewerFontColor": "yellow",
       "loopViewerHeaderBackgroundColor": "#337ab7",
@@ -114,27 +116,50 @@ exports[`Verify OnapClamp Test the render method 1`] = `
       render={[Function]}
     />
     <GlobalStyleComponent />
-    <Alert
-      closeLabel="Close alert"
-      dismissible={true}
-      onClose={[Function]}
-      show={false}
-      transition={
-        Object {
-          "$$typeof": Symbol(react.forward_ref),
-          "defaultProps": Object {
-            "appear": false,
-            "in": false,
-            "mountOnEnter": false,
-            "timeout": 300,
-            "unmountOnExit": false,
-          },
-          "displayName": "Fade",
-          "render": [Function],
+    <div>
+      <Alert
+        closeLabel="Close alert"
+        dismissible={true}
+        onClose={[Function]}
+        show={false}
+        transition={
+          Object {
+            "$$typeof": Symbol(react.forward_ref),
+            "defaultProps": Object {
+              "appear": false,
+              "in": false,
+              "mountOnEnter": false,
+              "timeout": 300,
+              "unmountOnExit": false,
+            },
+            "displayName": "Fade",
+            "render": [Function],
+          }
         }
-      }
-      variant="danger"
-    />
+        variant="success"
+      />
+      <Alert
+        closeLabel="Close alert"
+        dismissible={true}
+        onClose={[Function]}
+        show={false}
+        transition={
+          Object {
+            "$$typeof": Symbol(react.forward_ref),
+            "defaultProps": Object {
+              "appear": false,
+              "in": false,
+              "mountOnEnter": false,
+              "timeout": 300,
+              "unmountOnExit": false,
+            },
+            "displayName": "Fade",
+            "render": [Function],
+          }
+        }
+        variant="danger"
+      />
+    </div>
     <Navbar
       collapseOnSelect={false}
       expand={true}
@@ -176,6 +201,8 @@ exports[`Verify OnapClamp Test the render method 1`] = `
       <styled.div>
         Loop Viewer - 
         Empty (NO loop loaded yet)
+         - (
+        )
       </styled.div>
       <styled.div>
         <withRouter(LoopViewSvg)
index c54337f..4f22dc2 100644 (file)
@@ -219,4 +219,11 @@ export default class LoopCache {
        getComponentStates() {
                return this.loopJsonCache.components;
        }
+
+       getTemplateName() {
+           if (this.loopJsonCache["loopTemplate"] !== undefined) {
+                               return this.loopJsonCache["loopTemplate"].name;
+        }
+           return null;
+       }
 }
index 698ee28..3b9ed86 100644 (file)
@@ -226,22 +226,21 @@ export default class LoopService {
                        credentials: 'same-origin'
                })
                                .then(function (response) {
-                                       console.debug("Add Operational Policy response received: ", response.status);
+                               console.debug("Add Operational Policy response received: ", response.status);
                                if (response.ok) {
                                        return response.json();
                                } else {
-                                       console.error("Add Operational Policy query failed");
-                                       return {};
+                                       return response.text();
                                }
                        })
-                       .catch(function (error) {
-                               console.error("Add Operational Policy error received", error);
-                               return {};
-                       });
+                       .then(function (object) {
+                               console.error("Add Operational Policy query failed");
+                               throw new Error(object);
+                       })
        }
 
-       static removeOperationalPolicyType(loopName, policyType, policyVersion) {
-               return fetch('/restservices/clds/v2/loop/removeOperationaPolicy/' + loopName + '/policyModel/' + policyType +'/' + policyVersion , {
+       static removeOperationalPolicyType(loopName, policyType, policyVersion, policyName) {
+               return fetch('/restservices/clds/v2/loop/removeOperationaPolicy/' + loopName + '/policyModel/' + policyType +'/' + policyVersion + '/' + policyName , {
                        method: 'PUT',
                        headers: {
                                "Content-Type": "application/json"
index da65ac9..3ff1ebe 100644 (file)
@@ -104,7 +104,7 @@ export default class ConfigurationPolicyModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Configuration policies</Modal.Title>
                                </Modal.Header>
index c5762a8..e98b595 100644 (file)
@@ -34,13 +34,20 @@ import TemplateService from '../../../api/TemplateService';
 const ModalStyled = styled(Modal)`
        background-color: transparent;
 `
-const LoopViewSvgDivStyled = styled.div`
-       overflow: hidden;
+const LoopViewSvgDivStyled = styled.svg`
+       display: flex;
+       flex-direction: row;
+       overflow-x: scroll;
        background-color: ${props => (props.theme.loopViewerBackgroundColor)};
        border-color: ${props => (props.theme.loopViewerHeaderColor)};
+       margin-top: 3em;
        margin-left: auto;
        margin-right:auto;
+       margin-bottom: -1em;
        text-align: center;
+       align-items: center;
+       height: 100%;
+       width: 100%;
 `
 
 export default class CreateLoopModal extends React.Component {
@@ -118,24 +125,28 @@ export default class CreateLoopModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Create Model</Modal.Title>
                                </Modal.Header>
                                <Modal.Body>
                                        <Form.Group as={Row} controlId="formPlaintextEmail">
-                                               <Form.Label column sm="2">Template Name</Form.Label>
+                                               <Form.Label column sm="2">Template Name:</Form.Label>
                                                <Col sm="10">
                                                        <Select onChange={this.handleDropdownListChange} options={this.state.templateNames} />
                                                </Col>
                                        </Form.Group>
-                                       <Form.Group controlId="formPlaintextEmail">
-                                               <LoopViewSvgDivStyled dangerouslySetInnerHTML={{ __html: this.state.content }} value={this.state.content} >
-                                               </LoopViewSvgDivStyled>
-                                       </Form.Group>
-                                       <Form.Group controlId="formPlaintextEmail">
+                                        <Form.Group as={Row} style={{alignItems: 'center'}} controlId="formSvgPreview">
+                                                <Form.Label column sm="2">Model Preview:</Form.Label>
+                                                <Col sm="10">
+                                                        <LoopViewSvgDivStyled dangerouslySetInnerHTML={{ __html: this.state.content }}
+                                                                value={this.state.content} >
+                                                        </LoopViewSvgDivStyled>
+                                                </Col>
+                                        </Form.Group>
+                                       <Form.Group as={Row} controlId="formPlaintextEmail">
                                                <Form.Label column sm="2">Model Name:</Form.Label>
-                                               <input type="text" style={{width: '50%'}}
+                                               <input type="text" style={{width: '50%', marginLeft: '1em' }}
                                                        value={this.state.modelName}
                                                        onChange={this.handleModelName}
                                                />
@@ -148,4 +159,4 @@ export default class CreateLoopModal extends React.Component {
                        </ModalStyled>
                );
        }
-}
\ No newline at end of file
+}
index d034ee5..2155977 100644 (file)
@@ -29,6 +29,12 @@ import Form from 'react-bootstrap/Form';
 import Tabs from 'react-bootstrap/Tabs';
 import Tab from 'react-bootstrap/Tab';
 import styled from 'styled-components';
+import Spinner from 'react-bootstrap/Spinner'
+
+const StyledSpinnerDiv = styled.div`
+       justify-content: center !important;
+       display: flex !important;
+`;
 
 const ModalStyled = styled(Modal)`
        background-color: transparent;
@@ -48,6 +54,7 @@ export default class DeployLoopModal extends React.Component {
                this.handleChange = this.handleChange.bind(this);
                this.refreshStatus = this.refreshStatus.bind(this);
                this.renderDeployParam = this.renderDeployParam.bind(this);
+               this.renderSpinner = this.renderSpinner.bind(this);
 
                const propertiesJson = JSON.parse(JSON.stringify(this.props.loopCache.getGlobalProperties()));
                this.state = {
@@ -79,31 +86,48 @@ export default class DeployLoopModal extends React.Component {
                this.props.history.push('/');
        }
 
+       renderSpinner() {
+               if (this.state.deploying) {
+                       return (
+                               <StyledSpinnerDiv>
+                                       <Spinner animation="border" role="status">
+                                               <span className="sr-only">Loading...</span>
+                                       </Spinner>
+                               </StyledSpinnerDiv>
+                       );
+               } else {
+                       return (<div></div>);
+               }
+       }
+
        handleSave() {
                const loopName = this.props.loopCache.getLoopName();
                // save the global propserties
+               this.setState({ deploying: true });
                LoopService.updateGlobalProperties(loopName, this.state.temporaryPropertiesJson).then(resp => {
                        LoopActionService.performAction(loopName, "deploy").then(pars => {
-                               this.props.showAlert("Action deploy successfully performed");
+                               this.props.showSucAlert("Action deploy successfully performed");
                                // refresh status and update loop logs
                                this.refreshStatus(loopName);
                        })
                        .catch(error => {
-                               this.props.showAlert("Action deploy failed");
+                               this.props.showFailAlert("Action deploy failed");
                                // refresh status and update loop logs
                                this.refreshStatus(loopName);
                        });
                });
-               this.setState({ show: false });
-               this.props.history.push('/');
        }
 
        refreshStatus(loopName) {
                LoopActionService.refreshStatus(loopName).then(data => {
                        this.props.updateLoopFunction(data);
+                       this.setState({ show: false, deploying: false });
+                       this.props.history.push('/');
                })
                .catch(error => {
-                       this.props.showAlert("Refresh status failed");
+                       this.props.showFailAlert("Refresh status failed");
+                       this.setState({ show: false, deploying: false  });
+                       this.props.history.push('/');
                });
        }
        handleChange(event) {
@@ -137,13 +161,14 @@ export default class DeployLoopModal extends React.Component {
        }
        render() {
                return (
-                                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose} >
+                                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                                <Modal.Header closeButton>
                                                        <Modal.Title>Deployment parameters</Modal.Title>
                                                </Modal.Header>
                                                <Tabs id="controlled-tab-example" activeKey={this.state.key} onSelect={key => this.setState({ key })}>
                                                {this.renderDeployParamTabs()}
                                                </Tabs>
+                                               {this.renderSpinner()}
                                                <Modal.Footer>
                                                        <Button variant="secondary" type="null" onClick={this.handleClose}>Cancel</Button>
                                                        <Button variant="primary" type="submit" onClick={this.handleSave}>Deploy</Button>
index 5f1dcd5..84dbfd1 100644 (file)
@@ -63,7 +63,8 @@ describe('Verify DeployLoopModal', () => {
                const flushPromises = () => new Promise(setImmediate);
                const historyMock = { push: jest.fn() };
                const updateLoopFunction = jest.fn();
-               const showAlert = jest.fn();
+               const showSucAlert = jest.fn();
+               const showFailAlert = jest.fn();
                const handleSave = jest.spyOn(DeployLoopModal.prototype,'handleSave');
                LoopService.updateGlobalProperties = jest.fn().mockImplementation(() => {
                        return Promise.resolve({
@@ -88,7 +89,7 @@ describe('Verify DeployLoopModal', () => {
                });
 
                const component = shallow(<DeployLoopModal history={historyMock} 
-                                               loopCache={loopCache} updateLoopFunction={updateLoopFunction} showAlert={showAlert} />)
+                                               loopCache={loopCache} updateLoopFunction={updateLoopFunction} showSucAlert={showSucAlert} showFailAlert={showFailAlert} />)
 
                component.find('[variant="primary"]').prop('onClick')();
                await flushPromises();
index 73946f4..c0a2084 100644 (file)
@@ -102,7 +102,7 @@ export default class LoopPropertiesModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose} >
+                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Model Properties</Modal.Title>
                                </Modal.Header>
index 42c03da..5154a88 100644 (file)
@@ -37,7 +37,7 @@ import Search from '@material-ui/icons/Search';
 import LoopService from '../../../api/LoopService';
 import Tabs from 'react-bootstrap/Tabs';
 import Tab from 'react-bootstrap/Tab';
-
+import Alert from 'react-bootstrap/Alert';
 
 const ModalStyled = styled(Modal)`
        background-color: transparent;
@@ -65,6 +65,7 @@ export default class ModifyLoopModal extends React.Component {
                toscaPolicyModelsData: [],
                selectedPolicyModelsData: [],
                key: 'add',
+               showFailAlert: false,
                toscaColumns: [
                        { title: "#", field: "index", render: rowData => rowData.tableData.id + 1,
                                cellStyle: cellStyle,
@@ -78,6 +79,10 @@ export default class ModifyLoopModal extends React.Component {
                                cellStyle: cellStyle,
                                headerStyle: headerStyle
                        },
+                       { title: "Policy Name", field: "policyName",
+               cellStyle: cellStyle,
+                headerStyle: headerStyle
+            },
                        { title: "Version", field: "version",
                                cellStyle: cellStyle,
                                headerStyle: headerStyle
@@ -90,7 +95,7 @@ export default class ModifyLoopModal extends React.Component {
                                cellStyle: cellStyle,
                                headerStyle: headerStyle
                        },
-             { title: "Add", field: "updatedDate", editable: 'never',
+             { title: "Created Date", field: "createdDate", editable: 'never',
                cellStyle: cellStyle,
                headerStyle: headerStyle
              }
@@ -128,7 +133,9 @@ export default class ModifyLoopModal extends React.Component {
                var operationalPolicies = this.state.loopCache.getOperationalPolicies();
                var selectedPolicyModels = [];
                for (var policy in operationalPolicies) {
-                       selectedPolicyModels.push(operationalPolicies[policy]["policyModel"]);
+                   var newRow = operationalPolicies[policy]["policyModel"];
+                   newRow["policyName"] = operationalPolicies[policy].name;
+                       selectedPolicyModels.push(newRow);
                }
 
                PolicyToscaService.getToscaPolicyModels().then(allToscaModels => {
@@ -160,21 +167,36 @@ export default class ModifyLoopModal extends React.Component {
                this.props.history.push('/');
        }
 
+       renderAlert() {
+               return (
+                       <div>
+                               <Alert variant="danger" show={this.state.showFailAlert} onClose={this.disableAlert} dismissible>
+                                       {this.state.showMessage}
+                               </Alert>
+                       </div>
+               );
+       }
+
        handleAdd() {
-               LoopService.addOperationalPolicyType(this.state.loopCache.getLoopName(),this.state.selectedRowData.policyModelType,this.state.selectedRowData.version);
-               this.props.loadLoopFunction(this.state.loopCache.getLoopName());
-               this.handleClose();
+               LoopService.addOperationalPolicyType(this.state.loopCache.getLoopName(),this.state.selectedRowData.policyModelType,this.state.selectedRowData.version)
+               .then(pars => {
+                       this.props.loadLoopFunction(this.state.loopCache.getLoopName());
+                       this.handleClose();
+               })
+               .catch(error => {
+                       this.setState({ showFailAlert: true, showMessage: "Adding failed with error: " + error.message});
+               });
        }
 
        handleRemove() {
-               LoopService.removeOperationalPolicyType(this.state.loopCache.getLoopName(),this.state.selectedRowData.policyModelType,this.state.selectedRowData.version);
+               LoopService.removeOperationalPolicyType(this.state.loopCache.getLoopName(),this.state.selectedRowData.policyModelType,this.state.selectedRowData.version,this.state.selectedRowData.policyName);
                this.props.loadLoopFunction(this.state.loopCache.getLoopName());
                this.handleClose();
        }
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Modify Loop Operational Policies</Modal.Title>
                                </Modal.Header>
@@ -192,18 +214,19 @@ export default class ModifyLoopModal extends React.Component {
                                                                rowStyle: rowData => ({
                                                                        backgroundColor: (this.state.selectedRowData !== {} && this.state.selectedRowData.tableData !== undefined
                                                                        && this.state.selectedRowData.tableData.id === rowData.tableData.id) ? '#EEE' : '#FFF'
-                                                               })
+                                                                       })
                                                        }}
                                                        />
                                                        <div>
                                                                <TextModal value={this.state.content} onChange={this.handleYamlContent}/>
                                                        </div>
                                                </Modal.Body>
+                                               {this.renderAlert()}
                                        </Tab>
                                        <Tab eventKey="remove" title="Remove Operational Policies">
                                                <Modal.Body>
                                                        <MaterialTable
-                                                       title={"Already added Tosca Policy Models"}
+                                                       title={"Tosca Policy Models already added"}
                                                        data={this.state.selectedPolicyModelsData}
                                                        columns={this.state.toscaColumns}
                                                        icons={this.state.tableIcons}
index 7c98fab..c048834 100644 (file)
@@ -37,13 +37,20 @@ const ModalStyled = styled(Modal)`
 const CheckBoxStyled = styled(FormCheck.Input)`
        margin-left:3rem;
 `
-const LoopViewSvgDivStyled = styled.div`
-       overflow: hidden;
+const LoopViewSvgDivStyled = styled.svg`
+       overflow-x: scroll;
+       display: flex;
+       flex-direction: row;
        background-color: ${props => (props.theme.loopViewerBackgroundColor)};
        border-color: ${props => (props.theme.loopViewerHeaderColor)};
+       margin-top: 2em;
        margin-left: auto;
        margin-right:auto;
+       margin-bottom: -3em;
        text-align: center;
+       align-items: center;
+       height: 100%;
+       width: 100%;
 `
 
 export default class OpenLoopModal extends React.Component {
@@ -54,6 +61,7 @@ export default class OpenLoopModal extends React.Component {
                this.handleOpen = this.handleOpen.bind(this);
                this.handleClose = this.handleClose.bind(this);
                this.handleDropdownListChange = this.handleDropdownListChange.bind(this);
+               this.showReadOnly = props.showReadOnly ? props.showReadOnly : true;
                this.state = {
                        show: true,
                        chosenLoopName: '',
@@ -101,28 +109,34 @@ export default class OpenLoopModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Open Model</Modal.Title>
                                </Modal.Header>
                                <Modal.Body>
                                        <Form.Group as={Row} controlId="formPlaintextEmail">
-                                               <Form.Label column sm="2">Model Name</Form.Label>
+                                               <Form.Label column sm="2">Model Name:</Form.Label>
                                                <Col sm="10">
                                                        <Select onChange={this.handleDropdownListChange}
                                                        options={this.state.loopNames} />
                                                </Col>
                                        </Form.Group>
-                                       <Form.Group controlId="formPlaintextEmail">
-                         <LoopViewSvgDivStyled dangerouslySetInnerHTML={{ __html: this.state.content }}   value={this.state.content} >
-                         </LoopViewSvgDivStyled>
-                    </Form.Group>
-                                       <Form.Group controlId="formBasicChecbox">
-                                               <Form.Check>
-                                                       <FormCheck.Label>Read Only</FormCheck.Label>
-                                                       <CheckBoxStyled type="checkbox" />
-                                               </Form.Check>
+                                       <Form.Group as={Row} style={{alignItems: 'center'}} controlId="formSvgPreview">
+                                               <Form.Label column sm="2">Model Preview:</Form.Label>
+                                               <Col sm="10">
+                                                       <LoopViewSvgDivStyled dangerouslySetInnerHTML={{ __html: this.state.content }}
+                                                               value={this.state.content} >
+                                                       </LoopViewSvgDivStyled>
+                                               </Col>
                                        </Form.Group>
+                                       {this.showReadOnly === true ?
+                                               <Form.Group as={Row} controlId="formBasicChecbox">
+                                                       <Form.Check>
+                                                               <FormCheck.Label>Read Only Mode:</FormCheck.Label>
+                                                               <CheckBoxStyled style={{marginLeft: '3.5em'}} type="checkbox" />
+                                                       </Form.Check>
+                                               </Form.Group>
+                                       : null}
                                </Modal.Body>
                                <Modal.Footer>
                                        <Button variant="secondary" type="null" onClick={this.handleClose}>Cancel</Button>
index 0f86aa3..8d0faa5 100644 (file)
@@ -2,6 +2,8 @@
 
 exports[`Verify DeployLoopModal Test the render method 1`] = `
 <Styled(Bootstrap(Modal))
+  backdrop="static"
+  keyboard={false}
   onHide={[Function]}
   show={true}
   size="lg"
@@ -56,6 +58,7 @@ exports[`Verify DeployLoopModal Test the render method 1`] = `
       </Styled(FormGroup)>
     </Tab>
   </Tabs>
+  <div />
   <ModalFooter>
     <Button
       active={false}
index fe9aee2..233c560 100644 (file)
@@ -2,6 +2,8 @@
 
 exports[`Verify LoopPropertiesModal Test the render method 1`] = `
 <Styled(Bootstrap(Modal))
+  backdrop="static"
+  keyboard={false}
   onHide={[Function]}
   show={true}
   size="lg"
index 1aa0b5a..1968544 100644 (file)
@@ -2,6 +2,8 @@
 
 exports[`Verify OpenLoopModal Test the render method 1`] = `
 <Styled(Bootstrap(Modal))
+  backdrop="static"
+  keyboard={false}
   onHide={[Function]}
   show={true}
   size="xl"
@@ -32,7 +34,7 @@ exports[`Verify OpenLoopModal Test the render method 1`] = `
         sm="2"
         srOnly={false}
       >
-        Model Name
+        Model Name:
       </FormLabel>
       <Col
         sm="10"
@@ -47,18 +49,52 @@ exports[`Verify OpenLoopModal Test the render method 1`] = `
       </Col>
     </FormGroup>
     <FormGroup
-      controlId="formPlaintextEmail"
+      as={
+        Object {
+          "$$typeof": Symbol(react.forward_ref),
+          "defaultProps": Object {
+            "noGutters": false,
+          },
+          "render": [Function],
+        }
+      }
+      controlId="formSvgPreview"
+      style={
+        Object {
+          "alignItems": "center",
+        }
+      }
     >
-      <styled.div
-        dangerouslySetInnerHTML={
-          Object {
-            "__html": "",
+      <FormLabel
+        column={true}
+        sm="2"
+        srOnly={false}
+      >
+        Model Preview:
+      </FormLabel>
+      <Col
+        sm="10"
+      >
+        <styled.svg
+          dangerouslySetInnerHTML={
+            Object {
+              "__html": "",
+            }
           }
-        }
-        value=""
-      />
+          value=""
+        />
+      </Col>
     </FormGroup>
     <FormGroup
+      as={
+        Object {
+          "$$typeof": Symbol(react.forward_ref),
+          "defaultProps": Object {
+            "noGutters": false,
+          },
+          "render": [Function],
+        }
+      }
       controlId="formBasicChecbox"
     >
       <FormCheck
@@ -70,9 +106,14 @@ exports[`Verify OpenLoopModal Test the render method 1`] = `
         type="checkbox"
       >
         <FormCheckLabel>
-          Read Only
+          Read Only Mode:
         </FormCheckLabel>
         <Styled(FormCheckInput)
+          style={
+            Object {
+              "marginLeft": "3.5em",
+            }
+          }
           type="checkbox"
         />
       </FormCheck>
index d8065ed..2af1b7c 100644 (file)
@@ -376,7 +376,7 @@ export default class ManageDictionaries extends React.Component {
     
     render() {
         return (
-            <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+            <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                 <Modal.Header closeButton>
                     <Modal.Title>Manage Dictionaries</Modal.Title>
                 </Modal.Header>
index 89e7079..77dce16 100644 (file)
@@ -56,7 +56,7 @@ export default class OperationalPolicyModal extends React.Component {
 
                if (errors.length !== 0) {
                        console.error("Errors detected during config policy data validation ", errors);
-                       this.props.showAlert(errors);
+                       this.props.showFailAlert(errors);
                }
                else {
                        console.info("NO validation errors found in config policy data");
@@ -147,7 +147,7 @@ export default class OperationalPolicyModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Operational policies</Modal.Title>
                                </Modal.Header>
index 66b1928..cf5a3c2 100644 (file)
@@ -52,12 +52,12 @@ export default class PerformActions extends React.Component {
                const loopName = this.state.loopName;
 
                LoopActionService.performAction(loopName, action).then(pars => {
-                       this.props.showAlert("Action " + action + " successfully performed");
+                       this.props.showSucAlert("Action " + action + " successfully performed");
                        // refresh status and update loop logs
                        this.refreshStatus(loopName);
                })
                .catch(error => {
-                       this.props.showAlert("Action " + action + " failed");
+                       this.props.showFailAlert("Action " + action + " failed");
                        // refresh status and update loop logs
                        this.refreshStatus(loopName);
                });
index 0b07862..b833a92 100644 (file)
@@ -36,7 +36,8 @@ describe('Verify PerformActions', () => {
                const flushPromises = () => new Promise(setImmediate);
                const historyMock = { push: jest.fn() };
                const updateLoopFunction = jest.fn();
-               const showAlert = jest.fn();
+               const showSucAlert = jest.fn();
+               const showFailAlert = jest.fn();
                
                LoopActionService.refreshStatus = jest.fn().mockImplementation(() => {
                        return Promise.resolve({
@@ -46,7 +47,7 @@ describe('Verify PerformActions', () => {
                        });
                });
                const component = shallow(<PerformActions loopCache={loopCache} 
-                                       loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showAlert={showAlert} />)
+                                       loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showSucAlert={showSucAlert} showFailAlert={showFailAlert} />)
                await flushPromises();
                component.update();
 
@@ -57,7 +58,8 @@ describe('Verify PerformActions', () => {
                const flushPromises = () => new Promise(setImmediate);
                const historyMock = { push: jest.fn() };
                const updateLoopFunction = jest.fn();
-               const showAlert = jest.fn();
+               const showSucAlert = jest.fn();
+               const showFailAlert = jest.fn();
 
                LoopActionService.performAction = jest.fn().mockImplementation(() => {
                        return Promise.resolve({
@@ -74,7 +76,7 @@ describe('Verify PerformActions', () => {
                        });
                });
                const component = shallow(<PerformActions loopCache={loopCache} 
-                                               loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showAlert={showAlert} />)
+                                               loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showSucAlert={showSucAlert} showFailAlert={showFailAlert} />)
                await flushPromises();
                component.update();
 
index 8b49d91..5930386 100644 (file)
@@ -74,6 +74,10 @@ export default class PolicyModal extends React.Component {
 
                if (errors.length !== 0) {
                        console.error("Errors detected during policy data validation ", errors);
+                       this.setState({
+                       showFailAlert: true,
+                       showMessage: "Errors detected during policy data validation " + errors
+            });
                        return;
                }
                else {
@@ -252,7 +256,7 @@ export default class PolicyModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose } backdrop="static">
                                <Modal.Header closeButton>
                                        <Modal.Title>Edit the policy</Modal.Title>
                                </Modal.Header>
index 64b35d9..bb09391 100644 (file)
@@ -44,12 +44,12 @@ export default class RefreshStatus extends React.Component {
        componentDidMount() {
                // refresh status and update loop logs
                LoopActionService.refreshStatus(this.state.loopName).then(data => {
-                       this.props.showAlert("Status successfully refreshed");
+                       this.props.showSucAlert("Status successfully refreshed");
                        this.props.updateLoopFunction(data);
                        this.props.history.push('/');
                })
                .catch(error => {
-                       this.props.showAlert("Status refreshing failed");
+                       this.props.showFailAlert("Status refreshing failed");
                        this.props.history.push('/');
                });
        }
index 3038eb3..e08c50d 100644 (file)
@@ -35,9 +35,10 @@ describe('Verify RefreshStatus', () => {
        it('Test refresh status failed', async () => {
                const flushPromises = () => new Promise(setImmediate);
                const historyMock = { push: jest.fn() };
-               const showAlert = jest.fn();
+               const showSucAlert = jest.fn();
+               const showFailAlert = jest.fn();
 
-               const component = shallow(<RefreshStatus loopCache={loopCache} history={historyMock} showAlert={showAlert} />)
+               const component = shallow(<RefreshStatus loopCache={loopCache} history={historyMock} showSucAlert={showSucAlert} showFailAlert={showFailAlert} />)
                await flushPromises();
                component.update();
 
@@ -48,7 +49,8 @@ describe('Verify RefreshStatus', () => {
                const flushPromises = () => new Promise(setImmediate);
                const historyMock = { push: jest.fn() };
                const updateLoopFunction = jest.fn();
-               const showAlert = jest.fn();
+               const showSucAlert = jest.fn();
+               const showFailAlert = jest.fn();
 
                LoopActionService.refreshStatus = jest.fn().mockImplementation(() => {
                        return Promise.resolve({
@@ -59,7 +61,7 @@ describe('Verify RefreshStatus', () => {
                });
 
                const component = shallow(<RefreshStatus loopCache={loopCache} 
-                                               loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showAlert={showAlert} />)
+                                               loopAction="submit" history={historyMock} updateLoopFunction={updateLoopFunction} showSucAlert={showSucAlert} showFailAlert={showFailAlert} />)
                await flushPromises();
                component.update();
 
index 1937485..fa95ca9 100644 (file)
@@ -86,14 +86,14 @@ export default class UploadToscaPolicyModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="lg" show={this.state.show} onHide={this.handleClose} backdrop="static"  keyboard={false} >
                                <Modal.Header closeButton>
                                        <Modal.Title>Upload Tosca Model</Modal.Title>
                                </Modal.Header>
                                <Modal.Body>
                                        <Form.Group as={Row} controlId="formPlaintextEmail">
                                                <Col sm="10">
-                                               <input style={{display: 'none'}} type="file" name="file" accept=".yaml" onChange={this.fileSelectedHandler}
+                                               <input style={{display: 'none'}} type="file" name="file" accept=".yaml,.yml" onChange={this.fileSelectedHandler}
                                                        ref={fileInput => this.fileInput = fileInput}/>
                                                <button onClick={() => this.fileInput.click()}>Pick Tosca File</button>
                                                        <Alert variant="secondary">
index cec6722..7cf02f7 100644 (file)
@@ -38,16 +38,24 @@ import MaterialTable from "material-table";
 const ModalStyled = styled(Modal)`
        background-color: transparent;
 `
-const LoopViewSvgDivStyled = styled.div`
-       overflow: hidden;
+const LoopViewSvgDivStyled = styled.svg`
+       overflow-x: scroll;
        background-color: ${props => (props.theme.loopViewerBackgroundColor)};
        border-color: ${props => (props.theme.loopViewerHeaderColor)};
-       margin-left: auto;
+       margin-top: 3em;
+       margin-left: 2em;
        margin-right:auto;
        text-align: center;
-       margin-top: 20px;
+       height: 100%;
+       width: 100%;
+       display: flex;
+       flex-direction: row;
+       align-items: center;
+       
 `
 const SvgContainerDivStyled = styled.div`
+       display: flex;
+       align-items: center;
        border: 1px solid;
 `
 
@@ -133,7 +141,7 @@ export default class ViewLoopTemplatesModal extends React.Component {
 
        render() {
     return (
-               <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+               <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static"  keyboard={false}>
                        <Modal.Header closeButton>
                        </Modal.Header>
                        <Modal.Body>
index 6500805..d49232f 100644 (file)
@@ -139,7 +139,7 @@ export default class ViewToscalPolicyModal extends React.Component {
 
        render() {
                return (
-                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose}>
+                       <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false}>
                                <Modal.Header closeButton>
                                </Modal.Header>
                                <Modal.Body>
index 253820f..3f6dc94 100644 (file)
@@ -2,6 +2,8 @@
 
 exports[`Verify ViewLoopTemplatesModal Test the tosca model view render method 1`] = `
 <Styled(Bootstrap(Modal))
+  backdrop="static"
+  keyboard={false}
   onHide={[Function]}
   show={true}
   size="xl"
@@ -141,7 +143,7 @@ exports[`Verify ViewLoopTemplatesModal Test the tosca model view render method 1
       title="View Blueprint MicroService Templates"
     />
     <styled.div>
-      <styled.div
+      <styled.svg
         dangerouslySetInnerHTML={
           Object {
             "__html": "Please select a loop template to display it",
index fc5eef0..5f19a9b 100644 (file)
@@ -2,6 +2,8 @@
 
 exports[`Verify ViewToscaPolicyModal Test the tosca model view render method 1`] = `
 <Styled(Bootstrap(Modal))
+  backdrop="static"
+  keyboard={false}
   onHide={[Function]}
   show={true}
   size="xl"
index 6abdc4b..b3f0526 100644 (file)
@@ -26,9 +26,9 @@ import LoopCache from '../../../api/LoopCache';
 import styled from 'styled-components';
 
 const LoopLogsHeaderDivStyled = styled.div`
-       background-color: ${props => props.theme.loopViewerHeaderBackgroundColor};
+       background-color: ${props => props.theme.loopLogsHeaderBackgroundColor};
        padding: 10px 10px;
-       color: ${props => props.theme.loopViewerHeaderFontColor};
+       color: ${props => props.theme.loopLogsHeaderFontColor};
 `
 const TableStyled = styled(Table)`
     
index 4bbf608..048f630 100644 (file)
@@ -27,14 +27,20 @@ import { withRouter } from "react-router-dom";
 import LoopService from '../../../api/LoopService';
 import LoopComponentConverter from './LoopComponentConverter';
 
-const LoopViewSvgDivStyled = styled.div`
-       overflow: hidden;
+const LoopViewSvgDivStyled = styled.svg`
+       display: flex;
+       flex-direction: row;
+       overflow-x: scroll;
        background-color: ${props => (props.theme.loopViewerBackgroundColor)};
        border: 1px solid;
        border-color: ${props => (props.theme.loopViewerHeaderColor)};
+       margin-top: 1em;
        margin-left: auto;
        margin-right:auto;
-       text-align: center;
+       margin-bottom: -3em;
+       align-items: center;
+       height: 100%;
+       width: 100%;
 
 `
 
@@ -101,4 +107,4 @@ class LoopViewSvg extends React.Component {
        }
 }
 
-export default withRouter(LoopViewSvg);
\ No newline at end of file
+export default withRouter(LoopViewSvg);
index cecfb42..e05f1c7 100644 (file)
@@ -1,7 +1,7 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`Verify LoopSvg Test the render method 1`] = `
-<styled.div
+<styled.svg
   dangerouslySetInnerHTML={
     Object {
       "__html": "<svg><text x=\\"20\\" y=\\"40\\">No LOOP (SVG)</text></svg>",
@@ -12,7 +12,7 @@ exports[`Verify LoopSvg Test the render method 1`] = `
 `;
 
 exports[`Verify LoopSvg Test the render method no loopName 1`] = `
-<styled.div
+<styled.svg
   dangerouslySetInnerHTML={
     Object {
       "__html": "<svg><text x=\\"20\\" y=\\"40\\">No LOOP (SVG)</text></svg>",
@@ -23,7 +23,7 @@ exports[`Verify LoopSvg Test the render method no loopName 1`] = `
 `;
 
 exports[`Verify LoopSvg Test the render method svg not empty 1`] = `
-<styled.div
+<styled.svg
   dangerouslySetInnerHTML={
     Object {
       "__html": "<svg><text test</text></svg>",
index 3656f9e..64fd7c5 100644 (file)
@@ -87,6 +87,9 @@ export const DefaultClampTheme = {
        loopViewerHeaderBackgroundColor: '#337ab7',
        loopViewerHeaderFontColor: 'white',
 
+    loopLogsHeaderBackgroundColor:  'white',
+    loopLogsHeaderFontColor: 'black',
+
        menuBackgroundColor: 'white',
        menuFontColor: 'black',
        menuHighlightedBackgroundColor: '#337ab7',
index 578d597..cdbe71c 100644 (file)
@@ -27,7 +27,7 @@
 
 major=5
 minor=0
-patch=3
+patch=5
 
 base_version=${major}.${minor}.${patch}