diff options
author | sebdet <sd378r@intl.att.com> | 2018-09-20 18:27:17 +0200 |
---|---|---|
committer | sebdet <sd378r@intl.att.com> | 2018-09-20 18:27:17 +0200 |
commit | 57ea28b4de97b23a52254e9632e32c26652ef67d (patch) | |
tree | 1a1d6c17c7a4f2f57d14cef4828b7c0d020b2927 | |
parent | a9cdc79ba7e928b38ed132d38426b6c8b70635bf (diff) |
Add tests
Add some tests and fix event for Submit action
Issue-ID: CLAMP-217
Change-Id: I1882a35da110130529085fad5524e82a509cd7e1
Signed-off-by: sebdet <sd378r@intl.att.com>
7 files changed, 1105 insertions, 145 deletions
diff --git a/src/main/java/org/onap/clamp/clds/model/CldsModel.java b/src/main/java/org/onap/clamp/clds/model/CldsModel.java index 55f4dfd6..d7228cfc 100644 --- a/src/main/java/org/onap/clamp/clds/model/CldsModel.java +++ b/src/main/java/org/onap/clamp/clds/model/CldsModel.java @@ -18,7 +18,7 @@ * limitations under the License. * ============LICENSE_END============================================ * =================================================================== - * + * */ package org.onap.clamp.clds.model; @@ -45,13 +45,13 @@ public class CldsModel { private static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsModel.class); private static final int UUID_LENGTH = 36; - private static final String STATUS_DESIGN = "DESIGN"; - private static final String STATUS_DISTRIBUTED = "DISTRIBUTED"; - private static final String STATUS_ACTIVE = "ACTIVE"; - private static final String STATUS_STOPPED = "STOPPED"; - private static final String STATUS_DELETING = "DELETING"; - private static final String STATUS_ERROR = "ERROR"; - private static final String STATUS_UNKNOWN = "UNKNOWN"; + public static final String STATUS_DESIGN = "DESIGN"; + public static final String STATUS_DISTRIBUTED = "DISTRIBUTED"; + public static final String STATUS_ACTIVE = "ACTIVE"; + public static final String STATUS_STOPPED = "STOPPED"; + public static final String STATUS_DELETING = "DELETING"; + public static final String STATUS_ERROR = "ERROR"; + public static final String STATUS_UNKNOWN = "UNKNOWN"; private String id; private String templateId; private String templateName; @@ -99,7 +99,7 @@ public class CldsModel { boolean canCall = false; /* Below checks the clds event is submit/resubmit/distribute */ if (event.isActionCd(CldsEvent.ACTION_SUBMIT) || event.isActionCd(CldsEvent.ACTION_RESUBMIT) - || event.isActionCd(CldsEvent.ACTION_DISTRIBUTE) || event.isActionCd(CldsEvent.ACTION_SUBMITDCAE)) { + || event.isActionCd(CldsEvent.ACTION_DISTRIBUTE) || event.isActionCd(CldsEvent.ACTION_SUBMITDCAE)) { canCall = true; } return canCall; @@ -125,22 +125,22 @@ public class CldsModel { } else if (event.isActionStateCd(CldsEvent.ACTION_STATE_ERROR)) { status = STATUS_ERROR; } else if (event.isActionAndStateCd(CldsEvent.ACTION_CREATE, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED) - || event.isActionAndStateCd(CldsEvent.ACTION_MODIFY, CldsEvent.ACTION_STATE_ANY)) { + || event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED) + || event.isActionAndStateCd(CldsEvent.ACTION_MODIFY, CldsEvent.ACTION_STATE_ANY)) { status = STATUS_DESIGN; } else if (event.isActionAndStateCd(CldsEvent.ACTION_DISTRIBUTE, CldsEvent.ACTION_STATE_RECEIVED) - || event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) { + || event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) { status = STATUS_DISTRIBUTED; } else if (event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_SENT)) { status = STATUS_DELETING; } else if (event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_RECEIVED) - || event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_ANY) - || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITPOLICY, CldsEvent.ACTION_STATE_ANY)) { + || event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_ANY) + || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITPOLICY, CldsEvent.ACTION_STATE_ANY)) { status = STATUS_ACTIVE; } else if (event.isActionAndStateCd(CldsEvent.ACTION_STOP, CldsEvent.ACTION_STATE_ANY)) { status = STATUS_STOPPED; @@ -182,69 +182,69 @@ public class CldsModel { private void determinePermittedActionCd() { String actionCd = getCurrentActionCd(); switch (actionCd) { - case CldsEvent.ACTION_CREATE: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST, - CldsEvent.ACTION_DELETE); - if (isSimplifiedModel()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY, - CldsEvent.ACTION_TEST, CldsEvent.ACTION_DELETE); - } - break; - case CldsEvent.ACTION_MODIFY: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); - if (isSimplifiedModel()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY, - CldsEvent.ACTION_DELETE); - } - break; - case CldsEvent.ACTION_SUBMIT: - case CldsEvent.ACTION_RESUBMIT: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); - break; - case CldsEvent.ACTION_SUBMITDCAE: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE); - break; - case CldsEvent.ACTION_SUBMITPOLICY: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); - break; - case CldsEvent.ACTION_DISTRIBUTE: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT, - CldsEvent.ACTION_DELETE); - if (isSimplifiedModel()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_SUBMITDCAE, - CldsEvent.ACTION_DELETE); - } - break; - case CldsEvent.ACTION_UNDEPLOY: + case CldsEvent.ACTION_CREATE: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST, + CldsEvent.ACTION_DELETE); + if (isSimplifiedModel()) { + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY, + CldsEvent.ACTION_TEST, CldsEvent.ACTION_DELETE); + } + break; + case CldsEvent.ACTION_MODIFY: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); + if (isSimplifiedModel()) { + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY, + CldsEvent.ACTION_DELETE); + } + break; + case CldsEvent.ACTION_SUBMIT: + case CldsEvent.ACTION_RESUBMIT: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); + break; + case CldsEvent.ACTION_SUBMITDCAE: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE); + break; + case CldsEvent.ACTION_SUBMITPOLICY: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); + break; + case CldsEvent.ACTION_DISTRIBUTE: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT, + CldsEvent.ACTION_DELETE); + if (isSimplifiedModel()) { + permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_SUBMITDCAE, + CldsEvent.ACTION_DELETE); + } + break; + case CldsEvent.ACTION_UNDEPLOY: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY, + CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); + if (isSimplifiedModel()) { permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY, - CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE); - if (isSimplifiedModel()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY, - CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE); - } - break; - case CldsEvent.ACTION_DEPLOY: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UNDEPLOY, - CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); - break; - case CldsEvent.ACTION_RESTART: - case CldsEvent.ACTION_UPDATE: - permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE, - CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY); - if (isPolicyOnly()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); - } - break; - case CldsEvent.ACTION_STOP: + CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE); + } + break; + case CldsEvent.ACTION_DEPLOY: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UNDEPLOY, + CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); + break; + case CldsEvent.ACTION_RESTART: + case CldsEvent.ACTION_UPDATE: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE, + CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY); + if (isPolicyOnly()) { + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); + } + break; + case CldsEvent.ACTION_STOP: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART, + CldsEvent.ACTION_UNDEPLOY); + if (isPolicyOnly()) { permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART, - CldsEvent.ACTION_UNDEPLOY); - if (isPolicyOnly()) { - permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART, - CldsEvent.ACTION_DELETE); - } - break; - default: - logger.warn("Invalid current actionCd: " + actionCd); + CldsEvent.ACTION_DELETE); + } + break; + default: + logger.warn("Invalid current actionCd: " + actionCd); } } @@ -289,8 +289,8 @@ public class CldsModel { determinePermittedActionCd(); if (!permittedActionCd.contains(requestedActionCd)) { throw new IllegalArgumentException( - "Invalid requestedActionCd: " + requestedActionCd + ". Given current actionCd: " - + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd); + "Invalid requestedActionCd: " + requestedActionCd + ". Given current actionCd: " + + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd); } } @@ -303,8 +303,8 @@ public class CldsModel { public static CldsModel createUsingControlName(String fullControlName) { if (fullControlName == null || fullControlName.length() < UUID_LENGTH) { throw new BadRequestException( - "closed loop id / control name length, " + (fullControlName != null ? fullControlName.length() : 0) - + ", less than the minimum of: " + UUID_LENGTH); + "closed loop id / control name length, " + (fullControlName != null ? fullControlName.length() : 0) + + ", less than the minimum of: " + UUID_LENGTH); } CldsModel model = new CldsModel(); model.setControlNamePrefix(fullControlName.substring(0, fullControlName.length() - UUID_LENGTH)); @@ -328,10 +328,10 @@ public class CldsModel { cldsModel = cldsDao.getModelByUuid(cldsModel.getControlNameUuid()); cldsModel.determineStatus(); if (dcaeEvent.getCldsActionCd().equals(CldsEvent.ACTION_UNDEPLOY) || (dcaeEvent.getCldsActionCd() - .equals(CldsEvent.ACTION_DEPLOY) - && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) { + .equals(CldsEvent.ACTION_DEPLOY) + && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) { CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); + CldsEvent.ACTION_STATE_RECEIVED, null); } cldsDao.insModelInstance(cldsModel, dcaeEvent.getInstances()); return cldsModel; 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 243881f6..5e35b895 100644 --- a/src/main/java/org/onap/clamp/clds/service/CldsService.java +++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java @@ -118,6 +118,7 @@ public class CldsService extends SecureServiceBase { @Autowired private HttpServletRequest request; + @Autowired public CldsService(CldsDao cldsDao, XslTransformer cldsBpmnTransformer, ClampProperties refProp, SdcCatalogServices sdcCatalogServices, DcaeDispatcherServices dcaeDispatcherServices, @@ -127,7 +128,7 @@ public class CldsService extends SecureServiceBase { @Value("${clamp.config.security.permission.type.cl.event:permission-type-cl-event}") String cldsPermissionTypeClEvent, @Value("${clamp.config.security.permission.type.filter.vf:permission-type-filter-vf}") String cldsPermissionTypeFilterVf, @Value("${clamp.config.security.permission.type.template:permission-type-template}") String cldsPermissionTypeTemplate, - @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") String cldsPermissionTypeTosca, + @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") String cldsPermissionTypeTosca, @Value("${clamp.config.security.permission.instance:dev}") String cldsPermissionInstance) { this.cldsDao = cldsDao; this.cldsBpmnTransformer = cldsBpmnTransformer; @@ -149,7 +150,7 @@ public class CldsService extends SecureServiceBase { "update"); permissionReadTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance, "read"); permissionUpdateTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance, - "update"); + "update"); } /* @@ -222,7 +223,7 @@ public class CldsService extends SecureServiceBase { * @return image xml text - content of image given name */ public String getImageXml(String modelName) { - util.entering(request, "CldsService: GET model image"); + util.entering(request, "CldsService: GET model image"); Date startTime = new Date(); isAuthorized(permissionReadCl); logger.info("GET imageText for modelName={}", modelName); @@ -241,7 +242,7 @@ public class CldsService extends SecureServiceBase { * @return clds model - clds model for the given model name */ public CldsModel getModel(String modelName) { - util.entering(request, "CldsService: GET model"); + util.entering(request, "CldsService: GET model"); Date startTime = new Date(); isAuthorized(permissionReadCl); logger.debug("GET model for modelName={}", modelName); @@ -270,7 +271,7 @@ public class CldsService extends SecureServiceBase { * @param modelName */ public CldsModel putModel(String modelName, CldsModel cldsModel) { - util.entering(request, "CldsService: PUT model"); + util.entering(request, "CldsService: PUT model"); Date startTime = new Date(); isAuthorized(permissionUpdateCl); isAuthorizedForVf(cldsModel); @@ -339,9 +340,8 @@ public class CldsService extends SecureServiceBase { * @throws DecoderException * In case of issues with the Hex String decoding */ - public ResponseEntity<?> putModelAndProcessAction(String action, - String modelName,String test, CldsModel model) - throws TransformerException, ParseException { + public ResponseEntity<?> putModelAndProcessAction(String action, String modelName, String test, CldsModel model) + throws TransformerException, ParseException { util.entering(request, "CldsService: Process model action"); Date startTime = new Date(); CldsModel retrievedModel = null; @@ -364,7 +364,7 @@ public class CldsService extends SecureServiceBase { this.fillInCldsModel(model); // save model to db model.setName(modelName); - updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_MODIFY); + updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_SUBMIT); model.save(cldsDao, getUserId()); // get vars and format if necessary String prop = model.getPropText(); @@ -376,10 +376,10 @@ public class CldsService extends SecureServiceBase { // Flag indicates whether it is triggered by Validation Test button // from // UI - boolean isTest = Boolean.valueOf(test); + boolean isTest = Boolean.parseBoolean(test); if (!isTest) { String actionTestOverride = refProp.getStringValue("action.test.override"); - if (Boolean.valueOf(actionTestOverride)) { + if (Boolean.parseBoolean(actionTestOverride)) { logger.info("PUT actionTestOverride={}", actionTestOverride); logger.info("PUT override test indicator and setting it to true"); isTest = true; @@ -387,7 +387,7 @@ public class CldsService extends SecureServiceBase { } logger.info("PUT isTest={}", isTest); String insertTestEvent = refProp.getStringValue("action.insert.test.event"); - boolean isInsertTestEvent = Boolean.valueOf(insertTestEvent); + boolean isInsertTestEvent = Boolean.parseBoolean(insertTestEvent); logger.info("PUT isInsertTestEvent={}", isInsertTestEvent); // determine if requested action is permitted @@ -407,12 +407,14 @@ public class CldsService extends SecureServiceBase { retrievedModel = CldsModel.retrieve(cldsDao, modelName, false); } if (retrievedModel != null) { - if (!isTest && !errorCase && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT) - || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT) - || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) { + if (!isTest && !errorCase + && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT) + || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT) + || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) { if (retrievedModel.getTemplateName().startsWith(CsarInstallerImpl.TEMPLATE_NAME_PREFIX)) { // SDC artifact case - logger.info("Skipping DCAE inventory call as closed loop has been created from SDC notification"); + logger + .info("Skipping DCAE inventory call as closed loop has been created from SDC notification"); DcaeEvent dcaeEvent = new DcaeEvent(); dcaeEvent.setArtifactName(retrievedModel.getControlName() + ".yml"); dcaeEvent.setEvent(DcaeEvent.EVENT_DISTRIBUTION); @@ -432,15 +434,19 @@ public class CldsService extends SecureServiceBase { auditLogger.info("Process model action completed"); } else { logger.error("CldsModel not found in database with modelName: " + modelName); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "CldsModel not found in database with modelName " + "modelName", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); - return new ResponseEntity<String>("CldsModel not found in database with modelName: \" + modelName", HttpStatus.INTERNAL_SERVER_ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), + "CldsModel not found in database with modelName " + "modelName", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); + return new ResponseEntity<String>("CldsModel not found in database with modelName: \" + modelName", + HttpStatus.INTERNAL_SERVER_ERROR); } } catch (Exception e) { errorCase = true; logger.error("Exception occured during putModelAndProcessAction", e); } if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); return new ResponseEntity<>(retrievedModel, HttpStatus.INTERNAL_SERVER_ERROR); } util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); @@ -467,7 +473,7 @@ public class CldsService extends SecureServiceBase { } // Flag indicates whether it is triggered by Validation Test button from // UI - boolean isTest = Boolean.valueOf(test); + boolean isTest = Boolean.parseBoolean(test); int instanceCount = 0; if (dcaeEvent.getInstances() != null) { instanceCount = dcaeEvent.getInstances().size(); @@ -540,9 +546,8 @@ public class CldsService extends SecureServiceBase { * @throws IOException * In case of issue to convert CldsServiceCache to InputStream */ - public String getSdcPropertiesByServiceUUIDForRefresh( - String serviceInvariantUUID, Boolean refresh) - throws GeneralSecurityException, DecoderException, IOException { + public String getSdcPropertiesByServiceUUIDForRefresh(String serviceInvariantUUID, Boolean refresh) + throws GeneralSecurityException, DecoderException, IOException { util.entering(request, "CldsService: GET sdc properties by uuid"); Date startTime = new Date(); CldsServiceData cldsServiceData = new CldsServiceData(); @@ -561,7 +566,8 @@ public class CldsService extends SecureServiceBase { // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("GET sdc properties by uuid completed"); - util.exiting("200", "Get sdc properties by uuid success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + util.exiting("200", "Get sdc properties by uuid success", Level.INFO, + ONAPLogConstants.ResponseStatus.COMPLETED); return sdcProperties; } @@ -774,7 +780,8 @@ public class CldsService extends SecureServiceBase { model.save(cldsDao, getUserId()); } else { logger.info("Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); } @@ -787,7 +794,8 @@ public class CldsService extends SecureServiceBase { logger.error("Exception occured during deployModel", e); } if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); } util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); @@ -821,7 +829,8 @@ public class CldsService extends SecureServiceBase { model.save(cldsDao, getUserId()); } else { logger.info("Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); } @@ -834,7 +843,8 @@ public class CldsService extends SecureServiceBase { logger.error("Exception occured during unDeployModel", e); } if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); } util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); @@ -879,7 +889,7 @@ public class CldsService extends SecureServiceBase { } // Created for the integration test - public void setLoggingUtil (LoggingUtils utilP) { - util = utilP; + public void setLoggingUtil(LoggingUtils utilP) { + util = utilP; } }
\ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java index 695aa2d1..9cca936c 100644 --- a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java +++ b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java @@ -55,6 +55,7 @@ import org.onap.clamp.clds.model.CldsInfo; import org.onap.clamp.clds.model.CldsModel; import org.onap.clamp.clds.model.CldsServiceData; import org.onap.clamp.clds.model.CldsTemplate; +import org.onap.clamp.clds.model.DcaeEvent; import org.onap.clamp.clds.service.CldsService; import org.onap.clamp.clds.util.LoggingUtils; import org.onap.clamp.clds.util.ResourceFileUtil; @@ -85,22 +86,26 @@ public class CldsServiceItCase { private String bpmnText; private String imageText; private String bpmnPropText; + private String docText; + @Autowired private CldsDao cldsDao; private Authentication authentication; - private List<GrantedAuthority> authList = new LinkedList<GrantedAuthority>(); + private List<GrantedAuthority> authList = new LinkedList<GrantedAuthority>(); private LoggingUtils util; + /** * Setup the variable before the tests execution. * * @throws IOException - * In case of issues when opening the files + * In case of issues when opening the files */ @Before public void setupBefore() throws IOException { - bpmnText = ResourceFileUtil.getResourceAsString("example/dao/bpmn-template.xml"); - imageText = ResourceFileUtil.getResourceAsString("example/dao/image-template.xml"); - bpmnPropText = ResourceFileUtil.getResourceAsString("example/dao/bpmn-prop.json"); + bpmnText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/tca-template.xml"); + imageText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/tca-img.xml"); + bpmnPropText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/model-properties.json"); + docText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/doc-text.yaml"); authList.add(new SimpleGrantedAuthority("permission-type-cl-manage|dev|*")); authList.add(new SimpleGrantedAuthority("permission-type-cl|dev|read")); @@ -108,7 +113,8 @@ public class CldsServiceItCase { authList.add(new SimpleGrantedAuthority("permission-type-template|dev|read")); authList.add(new SimpleGrantedAuthority("permission-type-template|dev|update")); authList.add(new SimpleGrantedAuthority("permission-type-filter-vf|dev|*")); - authentication = new UsernamePasswordAuthenticationToken(new User("admin", "", authList), "", authList); + authList.add(new SimpleGrantedAuthority("permission-type-cl-event|dev|*")); + authentication = new UsernamePasswordAuthenticationToken(new User("admin", "", authList), "", authList); util = Mockito.mock(LoggingUtils.class); Mockito.doNothing().when(util).entering(Matchers.any(HttpServletRequest.class), Matchers.any(String.class)); @@ -179,52 +185,63 @@ public class CldsServiceItCase { newModel.setControlNamePrefix("ClosedLoop-"); newModel.setTemplateName(randomNameTemplate); newModel.setTemplateId(newTemplate.getId()); - newModel.setDocText(newTemplate.getPropText()); + newModel.setDocText(docText); // Test the PutModel method cldsService.putModel(randomNameModel, newModel); // Verify whether it has been added properly or not assertNotNull(cldsDao.getModel(randomNameModel)); - CldsModel model= cldsService.getModel(randomNameModel); + CldsModel model = cldsService.getModel(randomNameModel); // Verify with GetModel - assertEquals(model.getTemplateName(),randomNameTemplate); - assertEquals(model.getName(),randomNameModel); + assertEquals(model.getTemplateName(), randomNameTemplate); + assertEquals(model.getName(), randomNameModel); assertTrue(cldsService.getModelNames().size() >= 1); // Should fail - ResponseEntity<?> responseEntity = cldsService.putModelAndProcessAction(CldsEvent.ACTION_SUBMIT, randomNameModel, "true", model); - assertTrue(responseEntity.getStatusCode().equals(HttpStatus.INTERNAL_SERVER_ERROR)); - model=(CldsModel)responseEntity.getBody(); - assertNull(model); + ResponseEntity<?> responseEntity = cldsService.putModelAndProcessAction(CldsEvent.ACTION_SUBMIT, + randomNameModel, "false", cldsService.getModel(randomNameModel)); + assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK)); + assertNotNull(responseEntity.getBody()); + assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(((CldsModel) responseEntity.getBody()).getStatus())); + assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(cldsService.getModel(randomNameModel).getStatus())); - responseEntity=cldsService.deployModel(randomNameModel, cldsService.getModel(randomNameModel)); + responseEntity = cldsService.deployModel(randomNameModel, cldsService.getModel(randomNameModel)); assertNotNull(responseEntity); - assertNotNull(responseEntity.getStatusCode()); - model=(CldsModel)responseEntity.getBody(); - assertNotNull(model); + assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK)); + assertNotNull(responseEntity.getBody()); + assertTrue(CldsModel.STATUS_ACTIVE.equals(((CldsModel) responseEntity.getBody()).getStatus())); + assertTrue(CldsModel.STATUS_ACTIVE.equals(cldsService.getModel(randomNameModel).getStatus())); - responseEntity=cldsService.unDeployModel(randomNameModel, cldsService.getModel(randomNameModel)); + responseEntity = cldsService.unDeployModel(randomNameModel, cldsService.getModel(randomNameModel)); assertNotNull(responseEntity); - assertNotNull(responseEntity.getStatusCode()); - model=(CldsModel)responseEntity.getBody(); - assertNotNull(model); + assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK)); + assertNotNull(responseEntity.getBody()); + assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(((CldsModel) responseEntity.getBody()).getStatus())); + assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(cldsService.getModel(randomNameModel).getStatus())); + + DcaeEvent dcaeEvent = new DcaeEvent(); + dcaeEvent.setArtifactName("ClosedLoop_with-enough-characters_TestArtifact.yml"); + dcaeEvent.setEvent(DcaeEvent.EVENT_CREATED); + dcaeEvent.setResourceUUID("1"); + dcaeEvent.setServiceUUID("2"); + assertEquals(cldsService.postDcaeEvent("false", dcaeEvent), + "event=created serviceUUID=2 resourceUUID=1 artifactName=ClosedLoop_with-enough-characters_TestArtifact.yml instance count=0 isTest=false"); } @Test public void testGetSdcProperties() throws IOException { JSONAssert.assertEquals( - ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-global.json"), cldsService.getSdcProperties(), - true); + ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-global.json"), + cldsService.getSdcProperties(), true); } @Test public void testGetSdcServices() throws GeneralSecurityException, DecoderException, JSONException, IOException { String result = cldsService.getSdcServices(); JSONAssert.assertEquals( - ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result, - true); + ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result, true); } @Test @@ -238,8 +255,8 @@ public class CldsServiceItCase { String result = cldsService.getSdcPropertiesByServiceUUIDForRefresh("4cc5b45a-1f63-4194-8100-cd8e14248c92", false); JSONAssert.assertEquals( - ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"), - result, true); + ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"), result, + true); // Now test the Cache effect CldsServiceData cldsServiceDataCache = cldsDao.getCldsServiceCache("c95b0e7c-c1f0-4287-9928-7964c5377a46"); // Should not be there, so should be null diff --git a/src/test/resources/example/model-properties/tca_new/doc-text.yaml b/src/test/resources/example/model-properties/tca_new/doc-text.yaml new file mode 100644 index 00000000..947cfdb1 --- /dev/null +++ b/src/test/resources/example/model-properties/tca_new/doc-text.yaml @@ -0,0 +1,170 @@ +{"global":[{"name":"service","value":["tosca_definitions_version: cloudify_dsl_1_3 +imports: + - "http://www.getcloudify.org/spec/cloudify/3.4/types.yaml" + - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dockerplugin/3.2.0/dockerplugin_types.yaml + - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/relationshipplugin/1.0.0/relationshipplugin_types.yaml + - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml + +inputs: + dh_override: + type: string + default: "component_dockerhost" + dh_location_id: + type: string + default: "zone1" + aaiEnrichmentHost: + type: string + default: "none" + aaiEnrichmentPort: + type: string + default: 8443 + enableAAIEnrichment: + type: string + default: false + dmaap_host: + type: string + default: dmaap.onap-message-router + dmaap_port: + type: string + default: 3904 + enableRedisCaching: + type: string + default: false + redisHosts: + type: string + tag_version: + type: string + default: "nexus3.onap.org:10001/onap//onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0" + consul_host: + type: string + default: consul-server.onap-consul + consul_port: + type: string + default: "8500" + cbs_host: + type: string + default: "config-binding-service.dcae" + cbs_port: + type: string + default: "10000" + policy_id: + type: string + default: "none" + external_port: + type: string + description: "Port for CDAPgui to be exposed" + default: "32010" + +node_templates: + docker_service_host: + properties: + docker_host_override: + get_input: dh_override + location_id: + get_input: dh_location_id + type: dcae.nodes.SelectedDockerHost + tca_docker: + relationships: + - type: dcae.relationships.component_contained_in + target: docker_service_host + - target: tca_policy + type: cloudify.relationships.depends_on + type: dcae.nodes.DockerContainerForComponentsUsingDmaap + properties: + application_config: + app_config: + appDescription: DCAE Analytics Threshold Crossing Alert Application + appName: dcae-tca + tcaAlertsAbatementTableName: TCAAlertsAbatementTable + tcaAlertsAbatementTableTTLSeconds: '1728000' + tcaSubscriberOutputStreamName: TCASubscriberOutputStream + tcaVESAlertsTableName: TCAVESAlertsTable + tcaVESAlertsTableTTLSeconds: '1728000' + tcaVESMessageStatusTableName: TCAVESMessageStatusTable + tcaVESMessageStatusTableTTLSeconds: '86400' + thresholdCalculatorFlowletInstances: '2' + app_preferences: + aaiEnrichmentHost: + get_input: aaiEnrichmentHost + aaiEnrichmentIgnoreSSLCertificateErrors: 'true' + aaiEnrichmentPortNumber: '8443' + aaiEnrichmentProtocol: https + aaiEnrichmentUserName: DCAE + aaiEnrichmentUserPassword: DCAE + aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query + aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf + enableAAIEnrichment: + get_input: enableAAIEnrichment + enableRedisCaching: + get_input: enableRedisCaching + redisHosts: + get_input: redisHosts + enableAlertCEFFormat: 'false' + publisherContentType: application/json + publisherHostName: + get_input: dmaap_host + publisherHostPort: + get_input: dmaap_port + publisherMaxBatchSize: '1' + publisherMaxRecoveryQueueSize: '100000' + publisherPollingInterval: '20000' + publisherProtocol: http + publisherTopicName: unauthenticated.DCAE_CL_OUTPUT + subscriberConsumerGroup: OpenDCAE-c12 + subscriberConsumerId: c12 + subscriberContentType: application/json + subscriberHostName: + get_input: dmaap_host + subscriberHostPort: + get_input: dmaap_port + subscriberMessageLimit: '-1' + subscriberPollingInterval: '30000' + subscriberProtocol: http + subscriberTimeoutMS: '-1' + subscriberTopicName: unauthenticated.SEC_MEASUREMENT_OUTPUT + tca_policy_default: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"LESS_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"},{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":700,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"vLoadBalancer","controlLoopSchemaType":"VM","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"Measurement_vGMUX","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"EQUAL","severity":"MAJOR","closedLoopEventStatus":"ABATED"},{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"GREATER","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]}]}' + service_component_type: dcaegen2-analytics_tca + docker_config: + healthcheck: + endpoint: /healthcheck + interval: 15s + timeout: 1s + type: http + image: + get_input: tag_version + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + envs: + DMAAPHOST: + { get_input: dmaap_host } + DMAAPPORT: + { get_input: dmaap_port } + DMAAPPUBTOPIC: "unauthenticated.DCAE_CL_OUTPUT" + DMAAPSUBTOPIC: "unauthenticated.SEC_MEASUREMENT_OUTPUT" + AAIHOST: + { get_input: aaiEnrichmentHost } + AAIPORT: + { get_input: aaiEnrichmentPort } + CONSUL_HOST: + { get_input: consul_host } + CONSUL_PORT: + { get_input: consul_port } + CBS_HOST: + { get_input: cbs_host } + CBS_PORT: + { get_input: cbs_port } + CONFIG_BINDING_SERVICE: "config_binding_service" + ports: + - concat: ["11011:", { get_input: external_port }] + stop: + inputs: + cleanup_image: true + tca_policy: + type: dcae.nodes.policy + properties: + policy_id: + get_input: policy_id + +"]}]}
\ No newline at end of file diff --git a/src/test/resources/example/model-properties/tca_new/model-properties.json b/src/test/resources/example/model-properties/tca_new/model-properties.json new file mode 100644 index 00000000..c4299fa5 --- /dev/null +++ b/src/test/resources/example/model-properties/tca_new/model-properties.json @@ -0,0 +1,359 @@ +{ + "global": [ + { + "name": "service", + "value": [ + "4cc5b45a-1f63-4194-8100-cd8e14248c92" + ] + }, + { + "name": "vf", + "value": [ + "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad" + ] + }, + { + "name": "actionSet", + "value": [ + "vnfRecipe" + ] + }, + { + "name": "location", + "value": [ + "DC1" + ] + }, + { + "name": "deployParameters", + "value": { + "dh_override": "component_dockerhost", + "dh_location_id": "zone1", + "aaiEnrichmentHost": "none", + "aaiEnrichmentPort": 8443, + "enableAAIEnrichment": false, + "dmaap_host": "dmaap.onap-message-router", + "dmaap_port": 3904, + "enableRedisCaching": false, + "redisHosts": "", + "tag_version": "nexus3.onap.org:10001/onap//onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0", + "consul_host": "consul-server.onap-consul", + "consul_port": "8500", + "cbs_host": "config-binding-service.dcae", + "cbs_port": "10000", + "external_port": "32010", + "policy_id": "AUTO_GENERATED_POLICY_ID_AT_SUBMIT" + } + } + ], + "Policy_12lup3h": { + "policy1": [ + { + "name": "pname", + "value": "policy1" + }, + { + "name": "pid", + "value": "0" + }, + { + "name": "timeout", + "value": "345" + }, + { + "policyConfigurations": [ + [ + { + "name": "recipe", + "value": [ + "restart" + ] + }, + { + "name": "maxRetries", + "value": [ + "3" + ] + }, + { + "name": "retryTimeLimit", + "value": [ + "180" + ] + }, + { + "name": "_id", + "value": [ + "6TtHGPq" + ] + }, + { + "name": "parentPolicy", + "value": [ + "" + ] + }, + { + "name": "actor", + "value": [ + "APPC" + ] + }, + { + "name": "recipeInput", + "value": [ + "" + ] + }, + { + "name": "recipeLevel", + "value": [ + "VM" + ] + }, + { + "name": "targetResourceId", + "value": [ + "07e266fc-49ab-4cd7-8378-ca4676f1b9ec" + ] + }, + { + "name": "targetResourceIdOther", + "value": [ + "" + ] + }, + { + "name": "enableGuardPolicy", + "value": [ + "on" + ] + }, + { + "name": "guardPolicyType", + "value": [ + "FrequencyLimiter" + ] + }, + { + "name": "guardTargets", + "value": [ + ".*" + ] + }, + { + "name": "minGuard", + "value": [ + "1" + ] + }, + { + "name": "maxGuard", + "value": [ + "1" + ] + }, + { + "name": "limitGuard", + "value": [ + "1" + ] + }, + { + "name": "timeUnitsGuard", + "value": [ + "minute" + ] + }, + { + "name": "timeWindowGuard", + "value": [ + "10" + ] + }, + { + "name": "guardActiveStart", + "value": [ + "00:00:01-05:00" + ] + }, + { + "name": "guardActiveEnd", + "value": [ + "00:00:00-05:00" + ] + } + ], + [ + { + "name": "recipe", + "value": [ + "rebuild" + ] + }, + { + "name": "maxRetries", + "value": [ + "3" + ] + }, + { + "name": "retryTimeLimit", + "value": [ + "180" + ] + }, + { + "name": "_id", + "value": [ + "aulXWRT" + ] + }, + { + "name": "parentPolicy", + "value": [ + "6TtHGPq" + ] + }, + { + "name": "parentPolicyConditions", + "value": [ + "Failure" + ] + }, + { + "name": "actor", + "value": [ + "APPC" + ] + }, + { + "name": "recipeInput", + "value": [ + "" + ] + }, + { + "name": "recipeLevel", + "value": [ + "VM" + ] + }, + { + "name": "targetResourceId", + "value": [ + "07e266fc-49ab-4cd7-8378-ca4676f1b9ec" + ] + }, + { + "name": "targetResourceIdOther", + "value": [ + "" + ] + }, + { + "name": "guardPolicyType", + "value": [ + "MinMax" + ] + }, + { + "name": "guardTargets", + "value": [ + ".*" + ] + }, + { + "name": "minGuard", + "value": [ + "1" + ] + }, + { + "name": "maxGuard", + "value": [ + "1" + ] + }, + { + "name": "limitGuard", + "value": [ + "1" + ] + }, + { + "name": "timeUnitsGuard", + "value": [ + "minute" + ] + }, + { + "name": "timeWindowGuard", + "value": [ + "10" + ] + }, + { + "name": "guardActiveStart", + "value": [ + "00:00:01-05:00" + ] + }, + { + "name": "guardActiveEnd", + "value": [ + "00:00:00-05:00" + ] + } + ] + ] + } + ] + }, + "TCA_1d13unw": { + "tca1": [ + { + "name": "tname", + "value": "tca1" + }, + { + "name": "tuuid", + "value": "7f14fe1f-68ac-t628-8fff-7f1de86f7038" + }, + { + "name": "tcaPol", + "value": "policy1" + }, + { + "name": "eventName", + "value": "vLoadBalancer" + }, + { + "name": "controlLoopSchemaType", + "value": "VM" + }, + { + "name": "tcaPolId", + "value": "0" + }, + { + "serviceConfigurations": [ + [ + "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value", + "GREATER", + "10", + "ONSET", + "undefined" + ], + [ + "$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta", + "GREATER_OR_EQUAL", + "20", + "ABATED", + "undefined" + ] + ] + } + ] + } +}
\ No newline at end of file diff --git a/src/test/resources/example/model-properties/tca_new/tca-img.xml b/src/test/resources/example/model-properties/tca_new/tca-img.xml new file mode 100644 index 00000000..a2ec5af2 --- /dev/null +++ b/src/test/resources/example/model-properties/tca_new/tca-img.xml @@ -0,0 +1,309 @@ +<?xml version="1.0" encoding="utf-8"?><!-- created with bpmn-js / http://bpmn.io --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + width="924" height="92" viewBox="44 134 924 92" version="1.1"> + <defs> + <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" + orient="auto" refX="11" refY="10" id="markerSjdype4kmnw"> + <path d="M 1 5 L 11 10 L 1 15 Z" + style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;" + fill="#000000" /> + </marker> + <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20" + orient="auto" refX="6" refY="6" id="markerSjdype4kmny"> + <circle cx="6" cy="6" r="3.5" + style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;" + fill="#ffffff" stroke="#000000" /> + </marker> + <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20" + orient="auto" refX="8.5" refY="5" id="markerSjdype4kmo0"> + <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z" + style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;" + fill="#ffffff" stroke="#000000" /> + </marker> + <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" + orient="auto" refX="11" refY="10" id="markerSjdype4kmo2"> + <path d="M 1 5 L 11 10 L 1 15" + style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;" + fill="#ffffff" stroke="#000000" /> + </marker> + <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" + orient="auto" refX="-1" refY="10" id="markerSjdype4kmo4"> + <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z" + style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;" + fill="#ffffff" stroke="#000000" /> + </marker> + <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" + orient="auto" refX="-5" refY="10" id="markerSjdype4kmo6"> + <path d="M 1 4 L 5 16" + style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;" + fill="#000000" stroke="#000000" /> + </marker> + </defs> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="StartEvent_1" + transform="matrix(1,0,0,1,50,162)" style="display: block;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="48" + height="48"></rect> + <g class="djs-visual"> + <circle cx="18" cy="18" r="18" style="stroke-width: 2;" + stroke="#000000" fill="#ffffff"></circle> + </g> + <rect x="0" y="0" width="36" height="36" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="StartEvent_1_label" + transform="matrix(1,0,0,1,23,198)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="VesCollector_1g9cmz0" + transform="matrix(1,0,0,1,207,140)" style="display: block;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="132" + height="92"></rect> + <g class="djs-visual"> + <rect x="0" y="0" width="120" height="80" rx="0" ry="0" + style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect> + <polyline points="120,80 120,20 " style="stroke-width: 2;" + fill="none" stroke="#000000"></polyline> + <polyline points="20,0 20,80 " style="stroke-width: 2;" + fill="none" stroke="#000000"></polyline> + <text style="font-family: Arial,sans-serif; font-size: 12px;"> + <tspan x="5" y="14">V</tspan> + </text> + <text style="font-family: Arial,sans-serif; font-size: 12px;"> + <tspan x="5" y="26">E</tspan> + </text> + <text style="font-family: Arial,sans-serif; font-size: 12px;"> + <tspan x="5" y="38">S</tspan> + </text> + <text style="font-family: Arial,sans-serif; font-size: 12px;" + class=" djs-label"> + <tspan x="25.5" y="43.5">VesCollector</tspan> + </text> + </g> + <rect x="0" y="0" width="120" height="80" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="TCA_1d13unw" + transform="matrix(1,0,0,1,453,140)" style="display: block;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="132" + height="92"></rect> + <g class="djs-visual"> + <rect x="0" y="0" width="120" height="80" rx="0" ry="0" + style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect> + <polyline points="0,60 120,60 " style="stroke-width: 2;" + fill="none" stroke="#000000"></polyline> + <text style="font-family: Arial,sans-serif; font-size: 12px;" + class=" djs-label"> + <tspan x="48" y="43.5">TCA</tspan> + </text> + </g> + <rect x="0" y="0" width="120" height="80" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="Policy_12lup3h" + transform="matrix(1,0,0,1,687,140)" style="display: block;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="132" + height="92"></rect> + <g class="djs-visual"> + <rect x="0" y="0" width="120" height="80" rx="0" ry="0" + style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect> + <polyline points="0,40 60,0 " style="stroke-width: 2;" + fill="none" stroke="#000000"></polyline> + <text style="font-family: Arial,sans-serif; font-size: 12px;" + class=" djs-label"> + <tspan x="43.5" y="43.5">Policy</tspan> + </text> + </g> + <rect x="0" y="0" width="120" height="80" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape selected" data-element-id="EndEvent_16kg9fx" + transform="matrix(1,0,0,1,925,162)" style="display: block;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="48" + height="48"></rect> + <g class="djs-visual"> + <circle cx="18" cy="18" r="18" style="stroke-width: 4;" + stroke="#000000" fill="#ffffff"></circle> + </g> + <rect x="0" y="0" width="36" height="36" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + <g class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)"> + <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect> + <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect> + </g> + <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)"> + <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect> + <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect> + </g> + <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)"> + <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect> + <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect> + </g> + <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)"> + <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect> + <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect> + </g> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="EndEvent_16kg9fx_label" + transform="matrix(1,0,0,1,898,198)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-connection" data-element-id="SequenceFlow_1ahk7jg" + style="display: block;"> + <rect fill="none" class="djs-outline" x="80" y="174" width="133" + height="12"></rect> + <g class="djs-visual"> + <path d="m 86,180L207,180 " + style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSjdype4kmnw");" + fill="none" stroke="#000000"></path> + </g> + <polyline points="86,180 207,180 " style="stroke-opacity: 0; stroke-width: 15;" + fill="none" stroke="#ffffff" class="djs-hit"></polyline> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="SequenceFlow_1ahk7jg_label" + transform="matrix(1,0,0,1,101.5,170)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-connection" data-element-id="SequenceFlow_18ahat1" + style="display: block;"> + <rect fill="none" class="djs-outline" x="321" y="174" width="138" + height="12"></rect> + <g class="djs-visual"> + <path d="m 327,180L453,180 " + style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSjdype4kmnw");" + fill="none" stroke="#000000"></path> + </g> + <polyline points="327,180 453,180 " style="stroke-opacity: 0; stroke-width: 15;" + fill="none" stroke="#ffffff" class="djs-hit"></polyline> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="SequenceFlow_18ahat1_label" + transform="matrix(1,0,0,1,345,170)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-connection" data-element-id="SequenceFlow_1mo9gxb" + style="display: block;"> + <rect fill="none" class="djs-outline" x="567" y="174" width="126" + height="12"></rect> + <g class="djs-visual"> + <path d="m 573,180L687,180 " + style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSjdype4kmnw");" + fill="none" stroke="#000000"></path> + </g> + <polyline points="573,180 687,180 " style="stroke-opacity: 0; stroke-width: 15;" + fill="none" stroke="#ffffff" class="djs-hit"></polyline> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="SequenceFlow_1mo9gxb_label" + transform="matrix(1,0,0,1,585,170)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-connection" data-element-id="SequenceFlow_1dgtrrq" + style="display: block;"> + <rect fill="none" class="djs-outline" x="801" y="174" width="130" + height="12"></rect> + <g class="djs-visual"> + <path d="m 807,180L925,180 " + style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSjdype4kmnw");" + fill="none" stroke="#000000"></path> + </g> + <polyline points="807,180 925,180 " style="stroke-opacity: 0; stroke-width: 15;" + fill="none" stroke="#ffffff" class="djs-hit"></polyline> + </g> + </g> + <g class="djs-group" xmlns="http://www.w3.org/2000/svg"> + <g class="djs-element djs-shape" data-element-id="SequenceFlow_1dgtrrq_label" + transform="matrix(1,0,0,1,821,170)" style="display: none;"> + <rect fill="none" class="djs-outline" x="-6" y="-6" width="102" + height="32"></rect> + <g class="djs-visual"> + <text style="font-family: Arial,sans-serif; font-size: 11px;" + class=" djs-label"> + <tspan x="45" y="0"></tspan> + </text> + </g> + <rect x="0" y="0" width="90" height="20" + style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff" + class="djs-hit"></rect> + </g> + </g> +</svg>
\ No newline at end of file diff --git a/src/test/resources/example/model-properties/tca_new/tca-template.xml b/src/test/resources/example/model-properties/tca_new/tca-template.xml new file mode 100644 index 00000000..cc942ef9 --- /dev/null +++ b/src/test/resources/example/model-properties/tca_new/tca-template.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" + xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" + xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn"> + <bpmn:process id="Process_1" isExecutable="false"> + <bpmn:startEvent id="StartEvent_1"> + <bpmn:outgoing>SequenceFlow_1ahk7jg</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:vesCollector id="VesCollector_1g9cmz0"> + <bpmn:incoming>SequenceFlow_1ahk7jg</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_18ahat1</bpmn:outgoing> + </bpmn:vesCollector> + <bpmn:tCA id="TCA_1d13unw"> + <bpmn:incoming>SequenceFlow_18ahat1</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1mo9gxb</bpmn:outgoing> + </bpmn:tCA> + <bpmn:policy id="Policy_12lup3h"> + <bpmn:incoming>SequenceFlow_1mo9gxb</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_1dgtrrq</bpmn:outgoing> + </bpmn:policy> + <bpmn:endEvent id="EndEvent_16kg9fx"> + <bpmn:incoming>SequenceFlow_1dgtrrq</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="SequenceFlow_1ahk7jg" + sourceRef="StartEvent_1" targetRef="VesCollector_1g9cmz0" /> + <bpmn:sequenceFlow id="SequenceFlow_18ahat1" + sourceRef="VesCollector_1g9cmz0" targetRef="TCA_1d13unw" /> + <bpmn:sequenceFlow id="SequenceFlow_1mo9gxb" + sourceRef="TCA_1d13unw" targetRef="Policy_12lup3h" /> + <bpmn:sequenceFlow id="SequenceFlow_1dgtrrq" + sourceRef="Policy_12lup3h" targetRef="EndEvent_16kg9fx" /> + </bpmn:process> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1"> + <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" + bpmnElement="StartEvent_1"> + <dc:Bounds x="50" y="162" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="VesCollector_1g9cmz0_di" + bpmnElement="VesCollector_1g9cmz0"> + <dc:Bounds x="207" y="140" width="120" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="TCA_1d13unw_di" + bpmnElement="TCA_1d13unw"> + <dc:Bounds x="453" y="140" width="120" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Policy_12lup3h_di" + bpmnElement="Policy_12lup3h"> + <dc:Bounds x="687" y="140" width="120" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_16kg9fx_di" + bpmnElement="EndEvent_16kg9fx"> + <dc:Bounds x="925" y="162" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="898" y="198" width="90" height="20" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_1ahk7jg_di" + bpmnElement="SequenceFlow_1ahk7jg"> + <di:waypoint xsi:type="dc:Point" x="86" y="180" /> + <di:waypoint xsi:type="dc:Point" x="207" y="180" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="101.5" y="170" width="90" height="20" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_18ahat1_di" + bpmnElement="SequenceFlow_18ahat1"> + <di:waypoint xsi:type="dc:Point" x="327" y="180" /> + <di:waypoint xsi:type="dc:Point" x="453" y="180" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="345" y="170" width="90" height="20" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1mo9gxb_di" + bpmnElement="SequenceFlow_1mo9gxb"> + <di:waypoint xsi:type="dc:Point" x="573" y="180" /> + <di:waypoint xsi:type="dc:Point" x="687" y="180" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="585" y="170" width="90" height="20" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_1dgtrrq_di" + bpmnElement="SequenceFlow_1dgtrrq"> + <di:waypoint xsi:type="dc:Point" x="807" y="180" /> + <di:waypoint xsi:type="dc:Point" x="925" y="180" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="821" y="170" width="90" height="20" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + +</bpmn:definitions>
\ No newline at end of file |