diff options
14 files changed, 114 insertions, 46 deletions
diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 2e6fd4793..fa5d8b6a0 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,7 +5,7 @@ Release Notes ============= -Version: 2.0.0 +Version: 2.0.1 -------------- :Release Date: 2018-06-25 @@ -26,7 +26,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.onap.clamp</groupId> <artifactId>clds</artifactId> - <version>2.0.0-SNAPSHOT</version> + <version>2.0.1-SNAPSHOT</version> <name>clamp</name> <parent> diff --git a/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java b/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java index 35c438d9e..1478342c5 100644 --- a/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java +++ b/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java @@ -157,10 +157,9 @@ public class TcaRequestFormatter { private static void addThresholds(ClampProperties refProp, String service, ObjectNode appendToNode, TcaItem tcaItem, ModelProperties modelProperties) { ArrayNode tcaNodes = appendToNode.withArray("thresholds"); - ObjectNode tcaNode; try { - tcaNode = (ObjectNode) refProp.getJsonTemplate("tca.thresholds.template", service); for (TcaThreshold tcaThreshold : tcaItem.getTcaThresholds()) { + ObjectNode tcaNode = (ObjectNode) refProp.getJsonTemplate("tca.thresholds.template", service); tcaNode.put("closedLoopControlName", modelProperties.getControlNameAndPolicyUniqueId()); tcaNode.put("fieldPath", tcaThreshold.getFieldPath()); tcaNode.put("thresholdValue", tcaThreshold.getThreshold()); diff --git a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java index bb14b235f..337a97633 100644 --- a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java +++ b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java @@ -48,17 +48,17 @@ import java.util.List; * "targetResourceId","value":["Eace933104d443b496b8.nodes.heat.vpg"]}]]}] */ public class PolicyItem implements Cloneable { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyItem.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); - private String id; - private String recipe; - private int maxRetries; - private int retryTimeLimit; - private String parentPolicy; - private List<String> parentPolicyConditions; - private String actor; - private String targetResourceId; + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyItem.class); + protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); + private String id; + private String recipe; + private int maxRetries; + private int retryTimeLimit; + private String parentPolicy; + private List<String> parentPolicyConditions; + private String actor; + private String targetResourceId; /** * Parse Policy given json node. @@ -73,7 +73,9 @@ public class PolicyItem implements Cloneable { parentPolicy = AbstractModelElement.getValueByName(node, "parentPolicy"); parentPolicyConditions = AbstractModelElement.getValuesByName(node, "parentPolicyConditions"); targetResourceId = AbstractModelElement.getValueByName(node, "targetResourceId"); - + if (targetResourceId != null && targetResourceId.isEmpty()) { + this.setTargetResourceId(null); + } } /** 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 888b782e1..9b68845c0 100644 --- a/src/main/java/org/onap/clamp/clds/service/CldsService.java +++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java @@ -835,6 +835,10 @@ public class CldsService extends SecureServiceBase { fillInCldsModel(model); String bpmnJson = cldsBpmnTransformer.doXslTransformToString(model.getBpmnText()); logger.info("PUT bpmnJson={}", bpmnJson); + SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, + cldsPermissionInstance, CldsEvent.ACTION_DEPLOY); + isAuthorized(permisionManage); + isAuthorizedForVf(model); ModelProperties modelProp = new ModelProperties(modelName, model.getControlName(), CldsEvent.ACTION_DEPLOY, false, bpmnJson, model.getPropText()); checkForDuplicateServiceVf(modelName, model.getPropText()); @@ -890,6 +894,10 @@ public class CldsService extends SecureServiceBase { LoggingUtils.setRequestContext("CldsService: Undeploy model", getPrincipalName()); Boolean errorCase = false; try { + SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, + cldsPermissionInstance, CldsEvent.ACTION_UNDEPLOY); + isAuthorized(permisionManage); + isAuthorizedForVf(model); String operationStatusUndeployUrl = dcaeDispatcherServices.deleteExistingDeployment(model.getDeploymentId(), model.getTypeId()); String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(operationStatusUndeployUrl); diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/PolicyWindow_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/PolicyWindow_properties.html index 7dd2c4dd7..83fb337d9 100644 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/PolicyWindow_properties.html +++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/PolicyWindow_properties.html @@ -286,9 +286,13 @@ label { <label for="targetResourceId" class="col-sm-4 control-label"> Target ResourceId</label> <div class="col-sm-8"> - <input type="text" class="form-control" id="targetResourceId" - name="targetResourceId"> </input> + <select class="form-control" name="targetResourceId" id="targetResourceId" enableFilter="true" onchange="changeTargetResourceIdOther();" > + <option value=""></option> + <option value="Other:">Other:</option> + </select> </div> + <input type="text" style="display:none" class="form-control" id="targetResourceIdOther" + name="targetResourceIdOther" value=""></input> </div> </div> </form> @@ -304,6 +308,22 @@ label { </div> <script> + + function initTargetResourceId() { + // Set all the Resource Invariant UUID in the target resource ID list (+Empty and other) + Object.keys(vf_Services["shared"]["byVf"]).forEach(function(key){ + $('#targetResourceId').append($('<option></option>').val(key).html(key)); + }); + } + + function changeTargetResourceIdOther() { + if ($("#targetResourceId").val()==="Other:") { + $("#targetResourceIdOther").show(); + } else { + $("#targetResourceIdOther").hide(); + $("#targetResourceIdOther").val(""); + } + } //Basically this method will add a new form. All forms share the same class. When you want one form to show(active form) the other forms get the // css attribute display:none $("#add_one_more").click(function(event) { @@ -334,7 +354,8 @@ label { } } $("#pname").val(''); - + initTargetResourceId(); + //load recipes for a chosen policy function disperseConfig(policyObj, id){ parent_policy={}; @@ -360,7 +381,13 @@ label { parent_policy[num]=el[i][j].value if(el[i][j].name==='recipe' && el[i][j].value.toString()!==''){ $("#go_properties_tab"+num).text(el[i][j].value) - } + } + if(el[i][j].name==="targetResourceIdOther" && el[i][j].value.toString()!=='') { + // Add the entry and set it + $('#targetResourceId').append($('<option></option>').val($('#targetResourceIdOther').val()).html($('#targetResourceIdOther').val())); + $('#targetResourceId').val($('#targetResourceIdOther').val()); + } + } } } @@ -385,13 +412,14 @@ label { $("#formId"+k+" #parentPolicy").change(); } + // Now load all component with the right value defined in policyObj JSON for (headInd in policyObj[id]){ if (!(policyObj[id][headInd].hasOwnProperty("policyConfigurations"))){ $("#" + policyObj[id][headInd].name).val(policyObj[id][headInd].value); } } } - + setMultiSelect(); if (readMOnly){ @@ -454,6 +482,10 @@ label { } $("#savePropsBtn").click(function(event) { + if($("#targetResourceIdOther").is(":visible")) { + $('#targetResourceId').append($('<option></option>').val($("#targetResourceIdOther").val()).html($("#targetResourceIdOther").val())) + $("#targetResourceId").val($("#targetResourceIdOther").val()); + } $(".idError").hide(); if ($("#policyTable .highlight td").html() !== $("#pname").val()){ //repeated name @@ -483,7 +515,7 @@ label { finalSaveList[tableVal] = allPolicies[tableVal]; } }); - + saveProperties(finalSaveList); $("#close_button").click(); }) diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/deploy_parameters.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/deploy_parameters.html index 5693a875b..3fc1b0301 100644 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/deploy_parameters.html +++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/deploy_parameters.html @@ -26,11 +26,11 @@ <button type="button" class="close" ng-click="close()" aria-hidden="true" style="margin-top: -3px">×</button> <h4>Deployment parameters</h4> </div> - <div class="modal-body" style="height: 150px"> - <div style="height: 30px"> - Deployment parameters as JSON. + <div class="modal-body" style="display:block"> + <div style="height: 100%;clear: both;" id="deployPropertiesDiv" name="deployPropertiesDiv" ng-init="load_deploy_parameters()" > + Deployment parameters. </div> - <textarea class="form-control" focus="true" name="deployProperties" id="deployProperties" ng-init="load_deploy_parameters()"/> + </div> <div class="modal-footer"> <button ng-click="deploy()" class="btn btn-primary">Deploy</button> 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 950e59ca1..935091240 100644 --- a/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js +++ b/src/main/resources/META-INF/resources/designer/scripts/DeploymentCtrl.js @@ -26,10 +26,18 @@ app.controller('DeploymentCtrl', function( $scope, $rootScope, $modalInstance, data, dialogs, cldsModelService) { function validate_and_set_deploy_parameters () { - var parameters = $("#deployProperties").val(); + var inputList = document.getElementsByClassName("deployFormId"); + var jsonParameters="{"; + $.each(inputList, function(key) { + if (jsonParameters !== "{") { + jsonParameters = jsonParameters+","; + } + jsonParameters = jsonParameters+'"'+inputList[key].id+'":'+'"'+inputList[key].value+'"' + }); + jsonParameters = jsonParameters+"}"; try { - parameters = JSON.parse(parameters); - set_deploy_parameters(parameters); + //Try to validate the json + set_deploy_parameters(JSON.parse(jsonParameters)); } catch (e) { console.error("Couldn't parse deploy parameters json"); } @@ -39,7 +47,6 @@ app.controller('DeploymentCtrl', if (!'global' in elementMap) { elementMap["global"] = []; } - 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}); @@ -50,8 +57,14 @@ app.controller('DeploymentCtrl', $scope.load_deploy_parameters = function () { var index = elementMap["global"].findIndex(function (e) { return (typeof e == "object" && !(e instanceof Array)) && "deployParameters" == e["name"]; }); - if (index != -1) { - $('#deployProperties').val(JSON.stringify(elementMap["global"][index]["value"])) + if (index != -1) { + $('#deployPropertiesDiv').append($('<br/>')); + $.each(elementMap["global"][index].value, function(key) { + var propertyValue=elementMap["global"][index].value[key]; + $('#deployPropertiesDiv').append($('<label class="control-label">'+key+' </label>')); + $('#deployPropertiesDiv').append($('<input style="width: 100%; clear: both;" class="deployFormId" id="'+key+'"></input>').val(propertyValue).html(propertyValue)); + $('#deployPropertiesDiv').append($('<br/>')); + }); } } diff --git a/src/test/resources/example/model-properties/policy/modelBpmnProperties.json b/src/test/resources/example/model-properties/policy/modelBpmnProperties.json index 5c2214e84..0ef387529 100644 --- a/src/test/resources/example/model-properties/policy/modelBpmnProperties.json +++ b/src/test/resources/example/model-properties/policy/modelBpmnProperties.json @@ -100,7 +100,14 @@ "name": "targetResourceId", "value": [ - "resource-id" + "" + ] + }, + { + "name": "targetResourceIdOther", + "value": + [ + "" ] } ], @@ -162,6 +169,13 @@ [ "resource-id" ] + }, + { + "name": "targetResourceIdOther", + "value": + [ + "resource-idOther" + ] } ] ] @@ -227,13 +241,6 @@ [ "" ] - }, - { - "name": "targetResourceId", - "value": - [ - "resource-id" - ] } ], @@ -294,6 +301,13 @@ [ "resource-id" ] + }, + { + "name": "targetResourceIdOther", + "value": + [ + "resource-idOther" + ] } ] ] diff --git a/src/test/resources/example/operational-policy/yaml-policy-chain-1.yaml b/src/test/resources/example/operational-policy/yaml-policy-chain-1.yaml index fec0e1e6c..3d0252a00 100644 --- a/src/test/resources/example/operational-policy/yaml-policy-chain-1.yaml +++ b/src/test/resources/example/operational-policy/yaml-policy-chain-1.yaml @@ -31,7 +31,7 @@ policies: retry: 3 success: <generatedId> target: - resourceID: resource-id + resourceID: null type: VM timeout: 180 - actor: APPC diff --git a/src/test/resources/example/operational-policy/yaml-policy-chain-2.yaml b/src/test/resources/example/operational-policy/yaml-policy-chain-2.yaml index fec0e1e6c..3d0252a00 100644 --- a/src/test/resources/example/operational-policy/yaml-policy-chain-2.yaml +++ b/src/test/resources/example/operational-policy/yaml-policy-chain-2.yaml @@ -31,7 +31,7 @@ policies: retry: 3 success: <generatedId> target: - resourceID: resource-id + resourceID: null type: VM timeout: 180 - actor: APPC diff --git a/src/test/resources/example/tca-policy-req/blueprint-expected.yaml b/src/test/resources/example/tca-policy-req/blueprint-expected.yaml index 4116b9799..a35557cca 100644 --- a/src/test/resources/example/tca-policy-req/blueprint-expected.yaml +++ b/src/test/resources/example/tca-policy-req/blueprint-expected.yaml @@ -30,7 +30,7 @@ node_templates: subscriberMessageLimit: '-1', subscriberPollingInterval: '20000', subscriberProtocol: https, subscriberTimeoutMS: '-1', subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub, subscriberUserName: m00502@tca.af.dcae.onap.org, subscriberUserPassword: Te5021abc, - tca_policy: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"example_model01.ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_TCA_1jy9to4","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_null","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":123,"direction":"GREATER_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"},{"closedLoopControlName":"ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_null","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":123,"direction":"GREATER_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"}]}]}'} + tca_policy: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"example_model01.ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_TCA_1jy9to4","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_null","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":123,"direction":"LESS_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ABATED"},{"closedLoopControlName":"ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_null","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":123,"direction":"GREATER_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"}]}]}'} artifact_name: dcae-analytics-tca artifact_version: 1.0.0 connections: diff --git a/src/test/resources/example/tca-policy-req/tca-policy-expected.json b/src/test/resources/example/tca-policy-req/tca-policy-expected.json index 5bf007bc9..6e302dd6a 100644 --- a/src/test/resources/example/tca-policy-req/tca-policy-expected.json +++ b/src/test/resources/example/tca-policy-req/tca-policy-expected.json @@ -28,9 +28,9 @@ "version": "1.0.2", "fieldPath": "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value", "thresholdValue": 123, - "direction": "GREATER_OR_EQUAL", + "direction": "LESS_OR_EQUAL", "severity": "MAJOR", - "closedLoopEventStatus": "ONSET" + "closedLoopEventStatus": "ABATED" }, { "closedLoopControlName": "ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf_0", diff --git a/version.properties b/version.properties index a81893c7a..93dca4bb4 100644 --- a/version.properties +++ b/version.properties @@ -2,7 +2,7 @@ # ============LICENSE_START======================================================= # ONAP CLAMP # ================================================================================ -# Copyright (C) 2017 AT&T Intellectual Property. All rights +# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights # reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,7 +27,7 @@ major=2 minor=0 -patch=0 +patch=1 base_version=${major}.${minor}.${patch} |