Merge "Add simulator cases for (un)deploy/stop + typo"
diff --git a/LICENSE.txt b/LICENSE.txt
index bb235ff..1de272e 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,7 +1,7 @@
 /*
 * ============LICENSE_START==========================================
 * ===================================================================
-* Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+* Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
 * ===================================================================
 *
 * Unless otherwise specified, all software contained herein is licensed
@@ -34,6 +34,4 @@
 *
 * ============LICENSE_END============================================
 *
-* ECOMP is a trademark and service mark of AT&T Intellectual Property.
-*
 */
diff --git a/extra/docker/elk/.env b/extra/docker/elk/.env
index 4f1781d..79d7943 100644
--- a/extra/docker/elk/.env
+++ b/extra/docker/elk/.env
@@ -1,13 +1,2 @@
 # docker compose related
 COMPOSE_PROJECT_NAME=clamp_elk
-
-# dmaap configuration for logstash
-dmaap_base_url=http://localhost:3904/
-dmaap_user=user
-dmaap_password=password
-dmaap_consumer_group=CG42
-dmaap_consumer_id=C42
-
-event_topic=EVENT_TOPIC
-notification_topic=NOTIFICATION_TOPIC
-request_topic=REQUEST_TOPIC
diff --git a/extra/docker/elk/docker-compose.yml b/extra/docker/elk/docker-compose.yml
index 9a610d0..3b7284d 100644
--- a/extra/docker/elk/docker-compose.yml
+++ b/extra/docker/elk/docker-compose.yml
@@ -19,6 +19,15 @@
       - elasticsearch
     networks:
       es_net:
+    environment:
+      - dmaap_base_url=http://localhost:3904/
+      - dmaap_user=user
+      - dmaap_password=password
+      - dmaap_consumer_group=CG42
+      - dmaap_consumer_id=C42
+      - event_topic=EVENT_TOPIC
+      - notification_topic=NOTIFICATION_TOPIC
+      - request_topic=REQUEST_TOPIC
 
   kibana:
     image: kibana
diff --git a/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py b/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py
index 05c1b98..c111606 100755
--- a/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py
+++ b/extra/docker/elk/tools/DMaaPServiceMocker/ds_mocker.py
@@ -194,19 +194,41 @@
             yield Notification.final().success(**config)
         raise StopIteration()
 
-test_datas = [CLStatus(missing=False, disabled=False, op_failure=False) for i in range(45)]  \
+def print_usage():
+    print("""
+    ./ds_mocker.py <DMAAP_URL> <EVENT_TOPIC> [NOTIFICATION_TOPIC [REQUEST_TOPIC]]
+    """)
+    exit()
+
+def push(test_datas):
+    for current_i, status in enumerate(test_datas):
+        time.sleep(random.randint(0,6))
+        for s in status:
+            # print(s)
+            status_code = s.publish()
+            if status_code != 200:
+                print("Error when publishing : status_code={}".format(status_code))
+                exit(1)
+            time.sleep(random.randint(0,3))
+        print("%03d,missing:%5s,disabled:%5s,op_failure:%5s - %s" % (current_i, status._missing, status._disabled, status._op_failure, status._config))
+
+
+def generate_dataset_1():
+    test_datas = [CLStatus(missing=False, disabled=False, op_failure=False) for i in range(45)]  \
              + [CLStatus(missing=True, disabled=False, op_failure=False) for i in range(5)]  \
              + [CLStatus(missing=False, disabled=True, op_failure=False) for i in range(6)]  \
              + [CLStatus(missing=False, disabled=False, op_failure=True) for i in range(7)]
-random.shuffle(test_datas)
-random.shuffle(test_datas)
+    random.shuffle(test_datas)
+    return test_datas
 
-for current_i, status in enumerate(test_datas):
-    time.sleep(random.randint(0,6))
-    for s in status:
-        status_code = s.publish()
-        if status_code != 200:
-            print("Error when publishing : status_code={}".format(status_code))
-            exit(1)
-        time.sleep(random.randint(0,3))
-    print("%03d,missing:%5s,disabled:%5s,op_failure:%5s - %s" % (current_i, status._missing, status._disabled, status._op_failure, status._config))
+
+if __name__ == "__main__":
+    import sys
+    if len(sys.argv) < 3:
+        print_usage()
+
+    DMaaPMessage.dmaap_host_url = sys.argv[1]
+    Event.topic = sys.argv[2]
+    Notification.topic = len(sys.argv) > 3 and sys.argv[3] or sys.argv[2]
+    # Request.topic = len(sys.argv) > 4 or Notification.topic
+    push(generate_dataset_1())
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
index f20668e..26281da 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
@@ -25,6 +25,7 @@
 

 import com.att.eelf.configuration.EELFLogger;

 import com.att.eelf.configuration.EELFManager;

+import com.fasterxml.jackson.databind.JsonNode;

 import com.fasterxml.jackson.databind.node.ObjectNode;

 

 import java.util.Date;

@@ -152,16 +153,19 @@
      *            The deployment ID

      * @param serviceTypeId

      *            Service type ID

-     * @param blueprintInput

+     * @param blueprintInputJson

      *            The value for each blueprint parameters in a flat JSON

      * @return The status URL

      */

-    public String createNewDeployment(String deploymentId, String serviceTypeId) {

+    public String createNewDeployment(String deploymentId, String serviceTypeId, JsonNode blueprintInputJson) {

         Date startTime = new Date();

         LoggingUtils.setTargetContext("DCAE", "createNewDeployment");

         try {

             ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("dcae.deployment.template");

             rootNode.put("serviceTypeId", serviceTypeId);

+            if (blueprintInputJson != null) {

+                rootNode.put("inputs", blueprintInputJson);

+            }

             String apiBodyString = rootNode.toString();

             logger.info("Dcae api Body String - " + apiBodyString);

             String url = refProp.getStringValue(DCAE_URL_PROPERTY_NAME) + DCAE_URL_PREFIX + deploymentId;

diff --git a/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java b/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
index 9b8d9d9..118059d 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
@@ -26,29 +26,26 @@
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.fasterxml.jackson.databind.JsonNode;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
 /**
  * Provide base ModelElement functionality. Perform base parsing of properties
- * for a ModelElement (such as, VesCollector, Policy, Tca, Holmes,
- * ...)
+ * for a ModelElement (such as, VesCollector, Policy, Tca, Holmes, ...)
  */
 public abstract class AbstractModelElement {
 
     protected static final EELFLogger logger = EELFManager.getInstance().getLogger(AbstractModelElement.class);
     protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
-
     private final String type;
     private final ModelBpmn modelBpmn;
     private final String id;
     protected String topicPublishes;
     protected final JsonNode modelElementJsonNode;
     private boolean isFound;
-
     private final ModelProperties modelProp;
-
     private static final String LOG_ELEMENT_NOT_FOUND = "Value '{}' for key 'name' not found in JSON";
     private static final String LOG_ELEMENT_NOT_FOUND_IN_JSON = "Value '{}' for key 'name' not found in JSON {}";
 
@@ -118,6 +115,27 @@
     }
 
     /**
+     * Return the Json value field of the json node element that has a name
+     * field equals to the given name.
+     */
+    public static JsonNode getJsonNodeByName(JsonNode nodeIn, String name) {
+        JsonNode vnode = null;
+        if (nodeIn != null) {
+            for (JsonNode node : nodeIn) {
+                if (node.path("name").asText().equals(name)) {
+                    vnode = node.path("value");
+                }
+            }
+        }
+        if (vnode == null) {
+            logger.warn(LOG_ELEMENT_NOT_FOUND, name);
+        } else {
+            logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, nodeIn.toString());
+        }
+        return vnode;
+    }
+
+    /**
      * Return the value field of the json node element that has a name field
      * that equals the given name.
      */
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Global.java b/src/main/java/org/onap/clamp/clds/model/properties/Global.java
index ef36fef..c4532b2 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Global.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Global.java
@@ -23,12 +23,12 @@
 
 package org.onap.clamp.clds.model.properties;
 
-import java.util.List;
-
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.fasterxml.jackson.databind.JsonNode;
 
+import java.util.List;
+
 /**
  * Parse global json properties.
  * <p>
@@ -38,14 +38,15 @@
  * ,"kings_mountain","Secaucus","lisle","concord","houston","akron"]}]
  */
 public class Global {
-    protected static final EELFLogger       logger      = EELFManager.getInstance().getLogger(Global.class);
-    protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
 
-    private String                  service;
-    private String                  actionSet;
-    private List<String>            resourceVf;
-    private List<String>            resourceVfc;
-    private List<String>            location;
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(Global.class);
+    protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
+    private String service;
+    private String actionSet;
+    private List<String> resourceVf;
+    private List<String> resourceVfc;
+    private JsonNode deployParameters;
+    private List<String> location;
 
     /**
      * Parse global given json node.
@@ -58,6 +59,7 @@
         actionSet = AbstractModelElement.getValueByName(globalNode, "actionSet");
         resourceVf = AbstractModelElement.getValuesByName(globalNode, "vf");
         resourceVfc = AbstractModelElement.getValuesByName(globalNode, "vfc");
+        deployParameters = AbstractModelElement.getJsonNodeByName(globalNode, "deployParameters");
         location = AbstractModelElement.getValuesByName(globalNode, "location");
     }
 
@@ -83,6 +85,10 @@
         return actionSet;
     }
 
+    public void setActionSet(String actionSet) {
+        this.actionSet = actionSet;
+    }
+
     /**
      * @return the resourceVf
      */
@@ -128,4 +134,11 @@
         this.location = location;
     }
 
+    public JsonNode getDeployParameters() {
+        return deployParameters;
+    }
+
+    public void setDeployParameters(JsonNode deployParameters) {
+        this.deployParameters = deployParameters;
+    }
 }
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java
index e828f84..2b6862d 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java
@@ -377,6 +377,20 @@
         return names;
     }
 
+    private void fillInCldsModel(CldsModel model) {
+        if (model.getTemplateName() != null) {
+            CldsTemplate template = cldsDao.getTemplate(model.getTemplateName());
+            if (template != null) {
+                model.setTemplateId(template.getId());
+                model.setDocText(template.getPropText());
+                // This is to provide the Bpmn XML when Template part in UI
+                // is
+                // disabled
+                model.setBpmnText(template.getBpmnText());
+            }
+        }
+    }
+
     /**
      * REST service that saves and processes an action for a CLDS model by name.
      *
@@ -400,7 +414,7 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response putModelAndProcessAction(@PathParam("action") String action,
             @PathParam("modelName") String modelName, @QueryParam("test") String test, CldsModel model)
-            throws TransformerException, ParseException, GeneralSecurityException, DecoderException {
+            throws TransformerException, ParseException {
         Date startTime = new Date();
         CldsModel retrievedModel = null;
         Boolean errorCase = false;
@@ -412,9 +426,7 @@
             isAuthorized(permisionManage);
             isAuthorizedForVf(model);
             String userId = getUserId();
-            String actionStateCd = CldsEvent.ACTION_STATE_INITIATED;
             logger.info("PUT actionCd={}", actionCd);
-            logger.info("PUT actionStateCd={}", actionStateCd);
             logger.info("PUT modelName={}", modelName);
             logger.info("PUT test={}", test);
             logger.info("PUT bpmnText={}", model.getBpmnText());
@@ -422,17 +434,7 @@
             logger.info("PUT userId={}", userId);
             logger.info("PUT getTypeId={}", model.getTypeId());
             logger.info("PUT deploymentId={}", model.getDeploymentId());
-            if (model.getTemplateName() != null) {
-                CldsTemplate template = cldsDao.getTemplate(model.getTemplateName());
-                if (template != null) {
-                    model.setTemplateId(template.getId());
-                    model.setDocText(template.getPropText());
-                    // This is to provide the Bpmn XML when Template part in UI
-                    // is
-                    // disabled
-                    model.setBpmnText(template.getBpmnText());
-                }
-            }
+            this.fillInCldsModel(model);
             // save model to db
             model.setName(modelName);
             model.save(cldsDao, getUserId());
@@ -568,9 +570,8 @@
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: GET sdc services", getPrincipalName());
         String retStr;
-        String responseStr = sdcCatalogServices.getSdcServicesInformation(null);
         try {
-            retStr = createUiServiceFormatJson(responseStr);
+            retStr = createUiServiceFormatJson(sdcCatalogServices.getSdcServicesInformation(null));
         } catch (IOException e) {
             logger.error("IOException during SDC communication", e);
             throw new SdcCommunicationException("IOException during SDC communication", e);
@@ -814,12 +815,12 @@
         LoggingUtils.setRequestContext("CldsService: Deploy model", getPrincipalName());
         Boolean errorCase = false;
         try {
-            try {
-                checkForDuplicateServiceVf(modelName, model.getPropText());
-            } catch (IOException | BadRequestException e) {
-                errorCase = true;
-                logger.error("Exception occured during duplicate check for service and VF", e);
-            }
+            fillInCldsModel(model);
+            String bpmnJson = cldsBpmnTransformer.doXslTransformToString(model.getBpmnText());
+            logger.info("PUT bpmnJson={}", bpmnJson);
+            ModelProperties modelProp = new ModelProperties(modelName, model.getControlName(), CldsEvent.ACTION_DEPLOY,
+                    false, bpmnJson, model.getPropText());
+            checkForDuplicateServiceVf(modelName, model.getPropText());
             String deploymentId = "";
             // If model is already deployed then pass same deployment id
             if (model.getDeploymentId() != null && !model.getDeploymentId().isEmpty()) {
@@ -828,7 +829,7 @@
                 deploymentId = "closedLoop_" + UUID.randomUUID() + "_deploymentId";
             }
             String createNewDeploymentStatusUrl = dcaeDispatcherServices.createNewDeployment(deploymentId,
-                    model.getTypeId());
+                    model.getTypeId(), modelProp.getGlobal().getDeployParameters());
             String operationStatus = "processing";
             long waitingTime = System.nanoTime() + TimeUnit.MINUTES.toNanos(10);
             while ("processing".equalsIgnoreCase(operationStatus)) {
@@ -930,7 +931,8 @@
         if (service != null && resourceVf != null && !resourceVf.isEmpty()) {
             List<CldsModelProp> cldsModelPropList = cldsDao.getDeployedModelProperties();
             for (CldsModelProp cldsModelProp : cldsModelPropList) {
-                JsonNode currentNode = JacksonUtils.getObjectMapperInstance().readTree(cldsModelProp.getPropText()).get("global");
+                JsonNode currentNode = JacksonUtils.getObjectMapperInstance().readTree(cldsModelProp.getPropText())
+                        .get("global");
                 String currentService = AbstractModelElement.getValueByName(currentNode, "service");
                 List<String> currentVf = AbstractModelElement.getValuesByName(currentNode, "vf");
                 if (currentVf != null && !currentVf.isEmpty()) {
diff --git a/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js
index 3a5faf5..04ba83a 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js
@@ -30,11 +30,11 @@
                    elementMap["global"] = [];
                }
 
-               var index = elementMap["global"].findIndex(function (e) { return (typeof e == "object" && !(e instanceof Array)) && "deployParameters" in e; });
-               if (index == -1) {
-                   elementMap["global"].push({"deployParameters": parameters});
-               } else {
-                   elementMap["global"][index]["deployParameters"] =  parameters;
+               var index = elementMap["global"].findIndex(function (e) { return (typeof e == "object" && !(e instanceof Array)) && "deployParameters" == e["name"]; }); 
+               if (index == -1) { 
+                   elementMap["global"].push({"name": "deployParameters", "value": parameters}); 
+               } else { 
+                   elementMap["global"][index]["value"] =  parameters; 
                }
            }
 
diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
index 40dffcd..fc5cb04 100644
--- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
@@ -57,8 +57,8 @@
 public class CsarInstallerItCase {
 
     private static final String CSAR_ARTIFACT_NAME = "testArtifact.csar";
-    private static final String SERVICE_UUID = "serviceUUID";
-    private static final String RESOURCE1_UUID = "resource1UUID";
+    private static final String INVARIANT_SERVICE_UUID = "4cc5b45a-1f63-4194-8100-cd8e14248c92";
+    private static final String INVARIANT_RESOURCE1_UUID = "ba4d4b5d-f861-4155-886b-b1cdba5e0957";
     @Autowired
     private CsarInstaller csarInstaller;
     @Autowired
@@ -84,8 +84,8 @@
         Mockito.when(csarHelper.getServiceMetadata()).thenReturn(data);
         Mockito.when(csarHandler.getSdcCsarHelper()).thenReturn(csarHelper);
         Mockito.when(csarHandler.getBlueprintArtifactName()).thenReturn(CSAR_ARTIFACT_NAME);
-        Mockito.when(csarHandler.getBlueprintInvariantServiceUuid()).thenReturn(SERVICE_UUID);
-        Mockito.when(csarHandler.getBlueprintInvariantResourceUuid()).thenReturn(RESOURCE1_UUID);
+        Mockito.when(csarHandler.getBlueprintInvariantServiceUuid()).thenReturn(INVARIANT_SERVICE_UUID);
+        Mockito.when(csarHandler.getBlueprintInvariantResourceUuid()).thenReturn(INVARIANT_RESOURCE1_UUID);
         return csarHandler;
     }
 
diff --git a/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java b/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
index a7ab94c..25daf01 100644
--- a/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
@@ -28,6 +28,7 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -84,6 +85,17 @@
                 tca.getTcaItem().getTcaThresholds().get(1).getFieldPath());
         assertEquals("GREATER_OR_EQUAL", tca.getTcaItem().getTcaThresholds().get(1).getOperator());
         assertEquals(Integer.valueOf(123), tca.getTcaItem().getTcaThresholds().get(1).getThreshold());
+        // Test global prop
+        assertEquals("vnfRecipe", prop.getGlobal().getActionSet());
+        assertEquals("4cc5b45a-1f63-4194-8100-cd8e14248c92", prop.getGlobal().getService());
+        assertTrue(Arrays.equals(new String[] {
+                "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"
+        }, prop.getGlobal().getResourceVf().toArray()));
+        assertTrue(Arrays.equals(new String[] {
+                "SNDGCA64", "ALPRGAED", "LSLEILAA", "MDTWNJC1"
+        }, prop.getGlobal().getLocation().toArray()));
+        assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").asText());
+        assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").asText());
     }
 
     @Test
@@ -108,6 +120,17 @@
         assertTrue(holmes.isFound());
         assertEquals("configPolicy1", holmes.getConfigPolicyName());
         assertEquals("blabla", holmes.getCorrelationLogic());
+        // Test global prop
+        assertEquals("vnfRecipe", prop.getGlobal().getActionSet());
+        assertEquals("4cc5b45a-1f63-4194-8100-cd8e14248c92", prop.getGlobal().getService());
+        assertTrue(Arrays.equals(new String[] {
+                "f5213e3a-9191-4362-93b5-b67f8d770e44"
+        }, prop.getGlobal().getResourceVf().toArray()));
+        assertTrue(Arrays.equals(new String[] {
+                "SNDGCA64", "ALPRGAED", "LSLEILAA", "MDTWNJC1"
+        }, prop.getGlobal().getLocation().toArray()));
+        assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").asText());
+        assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").asText());
     }
 
     @Test
diff --git a/src/test/resources/example/model-properties/holmes/modelBpmnProperties.json b/src/test/resources/example/model-properties/holmes/modelBpmnProperties.json
index 43fecc9..6ac97ec 100644
--- a/src/test/resources/example/model-properties/holmes/modelBpmnProperties.json
+++ b/src/test/resources/example/model-properties/holmes/modelBpmnProperties.json
@@ -1,109 +1,122 @@
 {
-  "Holmes_0i4n2mm": [
-    {
-      "name": "correlationalLogic",
-      "value": "blabla"
-    },
-    {
-      "name": "configPolicyName",
-      "value": "configPolicy1"
-    }
-  ],
-  "Policy_0honxgv": {
-    "policy1": [
-      {
-        "name": "pname",
-        "value": "policy1"
-      },
-      {
-        "name": "pid",
-        "value": "0"
-      },
-      {
-        "name": "timeout",
-        "value": "345"
-      },
-      {
-        "policyConfigurations": [
-          [
-            {
-              "name": "maxRetries",
-              "value": [
-                "3"
-              ]
-            },
-            {
-              "name": "retryTimeLimit",
-              "value": [
-                "180"
-              ]
-            },
-            {
-              "name": "_id",
-              "value": [
-                "dGLuNqg"
-              ]
-            },
-            {
-              "name": "parentPolicy",
-              "value": [
-                ""
-              ]
-            },
-            {
-              "name": "targetResourceId",
-              "value": [
-                "resourceid"
-              ]
-            }
-          ]
-        ]
-      }
-    ]
-  },
-  "global": [
-    {
-      "name": "actionSet",
-      "value": [
-        "vnfRecipe"
-      ]
-    },
-    {
-      "name": "vf",
-      "value": [
-        "f5213e3a-9191-4362-93b5-b67f8d770e44"
-      ]
-    },
-    {
-      "name": "location",
-      "value": [
-        "SNDGCA64",
-        "ALPRGAED",
-        "LSLEILAA",
-        "MDTWNJC1"
-      ]
-    }
-  ],
-  "shared": {
-    "byService": {
-      "": {
-        "vf": {
-          "": ""
-        },
-        "location": {
-          "": ""
-        },
-        "alarmCondition": {
-          "": ""
-        }
-      }
-    },
-    "byVf": {
-      "": {
-        "vfc": {
-          "": ""
-        }
-      }
-    }
-  }
+	"Holmes_0i4n2mm": [
+		{
+			"name": "correlationalLogic",
+			"value": "blabla"
+		},
+		{
+			"name": "configPolicyName",
+			"value": "configPolicy1"
+		}
+	],
+	"Policy_0honxgv": {
+		"policy1": [
+			{
+				"name": "pname",
+				"value": "policy1"
+			},
+			{
+				"name": "pid",
+				"value": "0"
+			},
+			{
+				"name": "timeout",
+				"value": "345"
+			},
+			{
+				"policyConfigurations": [
+					[
+						{
+							"name": "maxRetries",
+							"value": [
+								"3"
+							]
+						},
+						{
+							"name": "retryTimeLimit",
+							"value": [
+								"180"
+							]
+						},
+						{
+							"name": "_id",
+							"value": [
+								"dGLuNqg"
+							]
+						},
+						{
+							"name": "parentPolicy",
+							"value": [
+								""
+							]
+						},
+						{
+							"name": "targetResourceId",
+							"value": [
+								"resourceid"
+							]
+						}
+					]
+				]
+			}
+		]
+	},
+	"global": [
+		{
+			"name": "actionSet",
+			"value": [
+				"vnfRecipe"
+			]
+		},
+		{
+			"name": "service",
+			"value": [
+				"4cc5b45a-1f63-4194-8100-cd8e14248c92"
+			]
+		},
+		{
+			"name": "vf",
+			"value": [
+				"f5213e3a-9191-4362-93b5-b67f8d770e44"
+			]
+		},
+		{
+			"name": "location",
+			"value": [
+				"SNDGCA64",
+				"ALPRGAED",
+				"LSLEILAA",
+				"MDTWNJC1"
+			]
+		},
+		{
+			"name": "deployParameters",
+			"value": {
+				"input1": "value1",
+				"input2": "value2"
+			}
+		}
+	],
+	"shared": {
+		"byService": {
+			"": {
+				"vf": {
+					"": ""
+				},
+				"location": {
+					"": ""
+				},
+				"alarmCondition": {
+					"": ""
+				}
+			}
+		},
+		"byVf": {
+			"": {
+				"vfc": {
+					"": ""
+				}
+			}
+		}
+	}
 }
diff --git a/src/test/resources/example/model-properties/tca/modelBpmnProperties.json b/src/test/resources/example/model-properties/tca/modelBpmnProperties.json
index 8e2780c..ce0f317 100644
--- a/src/test/resources/example/model-properties/tca/modelBpmnProperties.json
+++ b/src/test/resources/example/model-properties/tca/modelBpmnProperties.json
@@ -1,145 +1,152 @@
 {
-  "TCA_1jy9to4": {
-    "group1": [
-      {
-        "name": "tname",
-        "value": "group1"
-      },
-      {
-        "name": "tuuid",
-        "value": "f734f031-10aa-t8fb-330f-04dde2886325"
-      },
-      {
-        "name": "tcaPolId",
-        "value": "policy1"
-      },
-      {
-        "name": "eventName",
-        "value": "vFirewallBroadcastPackets"
-      },
-      {
-        "name": "controlLoopSchemaType",
-        "value": "VNF"
-      },
-      {
-        "serviceConfigurations": [
-          [
-            "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-            "LESS_OR_EQUAL",
-            "123",
-            "ABATED"
-          ],
-          [
-            "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta",
-            "GREATER_OR_EQUAL",
-            "123",
-            "ONSET"
-          ]
-        ]
-      }
-    ]
-  },
-  "Policy_0honxgv": {
-    "policy1": [
-      {
-        "name": "pname",
-        "value": "policy1"
-      },
-      {
-        "name": "pid",
-        "value": "0"
-      },
-      {
-        "name": "timeout",
-        "value": "345"
-      },
-      {
-        "policyConfigurations": [
-          [
-            {
-              "name": "maxRetries",
-              "value": [
-                "3"
-              ]
-            },
-            {
-              "name": "retryTimeLimit",
-              "value": [
-                "180"
-              ]
-            },
-            {
-              "name": "_id",
-              "value": [
-                "dGLuNqg"
-              ]
-            },
-            {
-              "name": "parentPolicy",
-              "value": [
-                ""
-              ]
-            },
-            {
-              "name": "targetResourceId",
-              "value": [
-                "resourceid"
-              ]
-            }
-          ]
-        ]
-      }
-    ]
-  },
-  "global": [
-    {
-      "name": "actionSet",
-      "value": [
-        "vnfRecipe"
-      ]
-    },
-    {
-      "name": "service",
-      "value": [
-        "4cc5b45a-1f63-4194-8100-cd8e14248c92"
-      ]
-    },
-    {
-      "name": "vf",
-      "value": [
-        "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"
-      ]
-    },
-    {
-      "name": "location",
-      "value": [
-        "SNDGCA64",
-        "ALPRGAED",
-        "LSLEILAA",
-        "MDTWNJC1"
-      ]
-    }
-  ],
-  "shared": {
-    "byService": {
-      "": {
-        "vf": {
-          "": ""
-        },
-        "location": {
-          "": ""
-        },
-        "alarmCondition": {
-          "": ""
-        }
-      }
-    },
-    "byVf": {
-      "": {
-        "vfc": {
-          "": ""
-        }
-      }
-    }
-  }
+	"TCA_1jy9to4": {
+		"group1": [
+			{
+				"name": "tname",
+				"value": "group1"
+			},
+			{
+				"name": "tuuid",
+				"value": "f734f031-10aa-t8fb-330f-04dde2886325"
+			},
+			{
+				"name": "tcaPolId",
+				"value": "policy1"
+			},
+			{
+				"name": "eventName",
+				"value": "vFirewallBroadcastPackets"
+			},
+			{
+				"name": "controlLoopSchemaType",
+				"value": "VNF"
+			},
+			{
+				"serviceConfigurations": [
+					[
+						"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+						"LESS_OR_EQUAL",
+						"123",
+						"ABATED"
+					],
+					[
+						"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta",
+						"GREATER_OR_EQUAL",
+						"123",
+						"ONSET"
+					]
+				]
+			}
+		]
+	},
+	"Policy_0honxgv": {
+		"policy1": [
+			{
+				"name": "pname",
+				"value": "policy1"
+			},
+			{
+				"name": "pid",
+				"value": "0"
+			},
+			{
+				"name": "timeout",
+				"value": "345"
+			},
+			{
+				"policyConfigurations": [
+					[
+						{
+							"name": "maxRetries",
+							"value": [
+								"3"
+							]
+						},
+						{
+							"name": "retryTimeLimit",
+							"value": [
+								"180"
+							]
+						},
+						{
+							"name": "_id",
+							"value": [
+								"dGLuNqg"
+							]
+						},
+						{
+							"name": "parentPolicy",
+							"value": [
+								""
+							]
+						},
+						{
+							"name": "targetResourceId",
+							"value": [
+								"resourceid"
+							]
+						}
+					]
+				]
+			}
+		]
+	},
+	"global": [
+		{
+			"name": "actionSet",
+			"value": [
+				"vnfRecipe"
+			]
+		},
+		{
+			"name": "service",
+			"value": [
+				"4cc5b45a-1f63-4194-8100-cd8e14248c92"
+			]
+		},
+		{
+			"name": "vf",
+			"value": [
+				"023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"
+			]
+		},
+		{
+			"name": "location",
+			"value": [
+				"SNDGCA64",
+				"ALPRGAED",
+				"LSLEILAA",
+				"MDTWNJC1"
+			]
+		},
+		{
+			"name": "deployParameters",
+			"value": {
+				"input1": "value1",
+				"input2": "value2"
+			}
+		}
+	],
+	"shared": {
+		"byService": {
+			"": {
+				"vf": {
+					"": ""
+				},
+				"location": {
+					"": ""
+				},
+				"alarmCondition": {
+					"": ""
+				}
+			}
+		},
+		"byVf": {
+			"": {
+				"vfc": {
+					"": ""
+				}
+			}
+		}
+	}
 }