From 540fff37e161d693e8f9168a3ddac1ff4866c33a Mon Sep 17 00:00:00 2001 From: "Determe, Sebastien (sd378r)" Date: Tue, 27 Mar 2018 18:19:32 +0200 Subject: [PATCH] Add blueprint input Add blueprint json input support for DCAE call Issue-ID: CLAMP-142 Change-Id: I52657ff7ead38681eae2744a30271f0a1b825bb6 Signed-off-by: Determe, Sebastien (sd378r) --- .../clamp/clds/client/DcaeDispatcherServices.java | 8 +- .../model/properties/AbstractModelElement.java | 28 +- .../onap/clamp/clds/model/properties/Global.java | 31 ++- .../org/onap/clamp/clds/service/CldsService.java | 50 ++-- .../clamp/clds/model/prop/ModelPropertiesTest.java | 23 ++ .../holmes/modelBpmnProperties.json | 227 ++++++++-------- .../model-properties/tca/modelBpmnProperties.json | 293 +++++++++++---------- 7 files changed, 370 insertions(+), 290 deletions(-) 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 f20668e5..26281dad 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 @@ package org.onap.clamp.clds.client; 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 @@ public class DcaeDispatcherServices { * 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 9b8d9d9c..118059d5 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 @@ package org.onap.clamp.clds.model.properties; 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 {}"; @@ -117,6 +114,27 @@ public abstract class AbstractModelElement { return value; } + /** + * 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 ef36fef9..c4532b2e 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. *

@@ -38,14 +38,15 @@ import com.fasterxml.jackson.databind.JsonNode; * ,"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 resourceVf; - private List resourceVfc; - private List 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 resourceVf; + private List resourceVfc; + private JsonNode deployParameters; + private List location; /** * Parse global given json node. @@ -58,6 +59,7 @@ public class Global { 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 @@ public class Global { return actionSet; } + public void setActionSet(String actionSet) { + this.actionSet = actionSet; + } + /** * @return the resourceVf */ @@ -128,4 +134,11 @@ public class Global { 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 e828f844..2b6862dc 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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { @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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { 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 @@ public class CldsService extends SecureServiceBase { if (service != null && resourceVf != null && !resourceVf.isEmpty()) { List 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 currentVf = AbstractModelElement.getValuesByName(currentNode, "vf"); if (currentVf != null && !currentVf.isEmpty()) { 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 a7ab94c5..25daf01f 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.assertNotNull; 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 @@ public class ModelPropertiesTest { 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 @@ public class ModelPropertiesTest { 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 43fecc9e..6ac97ec8 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 8e2780cd..ce0f317d 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": { + "": "" + } + } + } + } } -- 2.16.6