Tosca convertor updated with datetime picker plugin feature 60/106160/4
authorAshwin Sharma <ashwin.shyam.sharma@att.com>
Thu, 16 Apr 2020 21:26:53 +0000 (21:26 +0000)
committerAshwin Sharma <ashwin.shyam.sharma@att.com>
Fri, 17 Apr 2020 21:33:50 +0000 (21:33 +0000)
Issue-ID: CLAMP-587
Signed-off-by: Ashwin Sharma <ashwin.shyam.sharma@att.com>
Change-Id: I1533b8e7a87c3e7c5af3572fef9ccd3a8fae85ef
Signed-off-by: Ashwin Sharma <ashwin.shyam.sharma@att.com>
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/test/java/org/onap/clamp/clds/tosca/ToscaYamlToJsonConvertorTestItCase.java
src/test/resources/example/json-editor-schema/tca-policy-json-editor-schema.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/tosca_metadata_clamp_possible_values_json_schema.json
src/test/resources/tosca/tosca_with_date_time_json_schema.json [new file with mode: 0644]

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 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 11b91df..9160397 100644 (file)
@@ -1,7 +1,7 @@
 {
        "schema": {
                "uniqueItems": "true",
-               "format": "tabs-top",
+               "format": "tabs",
                "type": "array",
                "title": "Thresholds",
                "items": {
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 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