diff options
28 files changed, 367 insertions, 231 deletions
@@ -68,12 +68,12 @@ committers: timezone: 'Europe/Ireland' - name: 'Ram Krishna Verma' email: 'ram_krishna.verma@bell.ca' - company: 'Ericsson' + company: 'Bell Canada' id: 'ramverma' timezone: 'America/Montreal' - name: 'Ajith Sreekumar' email: 'ajith.sreekumar@bell.ca' - company: 'Ericsson' + company: 'Bell Canada' id: 'a.sreekumar' timezone: 'Europe/Ireland' tsc: @@ -27,7 +27,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.onap.policy</groupId> <artifactId>clamp</artifactId> - <version>6.0.0-SNAPSHOT</version> + <version>6.0.1-SNAPSHOT</version> <name>policy-clamp</name> @@ -52,7 +52,7 @@ - The POLICY-CLAMP backend, JAVA unit testing - The POLICY-CLAMP backend, JAVA integration tests (with Spring + docker mariadb database + docker policy/dcae emulator written in python) - - The POLICY-CLAMP frontend, Javascrip tests (NodeJS(NPM) + JEST and Enzyme for React) + - The POLICY-CLAMP frontend, Javascript tests (NodeJS(NPM) + JEST and Enzyme for React) The test coverage for dev's can be found after a "clean install" build in: - Clamp backend: target/jacoco-dev.exec (unit tests + integration tests merged) @@ -80,8 +80,8 @@ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <eelf.core.version>1.0.0</eelf.core.version> - <camel.version>2.25.2</camel.version> - <springboot.version>2.2.10.RELEASE</springboot.version> + <camel.version>2.25.3</camel.version> + <springboot.version>2.2.13.RELEASE</springboot.version> <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath> @@ -110,6 +110,8 @@ <ui.react.src>ui-react</ui.react.src> <ui.react.lib.src>ui-react-lib</ui.react.lib.src> <npm.publish.url>https://nexus3.onap.org/repository/npm.snapshot/</npm.publish.url> + + <policy.models.version>2.4.0</policy.models.version> </properties> <profiles> @@ -382,7 +384,7 @@ <dependency> <groupId>org.onap.policy.models</groupId> <artifactId>policy-models-pdp</artifactId> - <version>2.3.5</version> + <version>${policy.models.version}</version> </dependency> <!-- Others dependencies --> @@ -512,6 +514,7 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> + <version>4.13</version> </dependency> <dependency> <groupId>org.assertj</groupId> diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupsAnalyzer.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupsAnalyzer.java index 1d6d21977..768872750 100644 --- a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupsAnalyzer.java +++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupsAnalyzer.java @@ -33,7 +33,7 @@ import org.onap.policy.models.pdp.concepts.PdpGroup; import org.onap.policy.models.pdp.concepts.PdpGroups; import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; /** * This is an utility class to do searching in pdp groups and create json object describing the result. @@ -118,12 +118,12 @@ public class PdpGroupsAnalyzer { JsonObject assignedPdpGroups = new JsonObject(); pdpGroupInfo.add(ASSIGNED_PDP_GROUPS_INFO, assignedPdpGroups); - ToscaPolicyIdentifier toscaPolicyIdentifier = new ToscaPolicyIdentifier(policyName, version); + ToscaConceptIdentifier toscaConceptIdentifier = new ToscaConceptIdentifier(policyName, version); pdpGroups.getGroups().stream().anyMatch(pdpGroup -> pdpGroup.getPdpSubgroups().stream().anyMatch( pdpSubGroup -> { if (pdpSubGroup.getPolicies() != null && pdpSubGroup.getPolicies() - .contains(toscaPolicyIdentifier)) { + .contains(toscaConceptIdentifier)) { assignedPdpGroups.addProperty("pdpGroup", pdpGroup.getName()); assignedPdpGroups.addProperty("pdpSubGroup", pdpSubGroup.getPdpType()); return true; diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMerger.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMerger.java index cf3c1656c..44b11119b 100644 --- a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMerger.java +++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMerger.java @@ -105,9 +105,11 @@ public class PoliciesPdpMerger { /** * This method removes the pdp States added for one policy. * - * @param policyJsonNode The policy node in Json + * @param policyJsonNode The policy node Json as String + * @return The Json with pdp group info removed */ public static JsonObject removePdpStatesOnePolicy(JsonObject policyJsonNode) { + //JsonObject policyJson = JsonUtils.GSON.fromJson(policyJsonNode, JsonObject.class); // Simply remove the nodes we have added. policyJsonNode.remove(PdpGroupsAnalyzer.ASSIGNED_PDP_GROUPS_INFO); policyJsonNode.remove(PdpGroupsAnalyzer.SUPPORTED_PDP_GROUPS_INFO); diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml index bcad3ea33..f924a8a24 100644 --- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml +++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml @@ -803,6 +803,107 @@ </doTry> </route> </post> + <get uri="/v2/templates" + outType="org.onap.policy.clamp.loop.template.LoopTemplate" + produces="application/json"> + <route> + <removeHeaders pattern="*"/> + <doTry> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Templates')"/> + <to + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> + <to + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getAllLoopTemplates()"/> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> + <doCatch> + <exception>java.lang.Exception</exception> + <handled> + <constant>true</constant> + </handled> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> + <log loggingLevel="ERROR" + message="GET ALL templates request failed: ${exception.stacktrace}"/> + <setHeader headerName="CamelHttpResponseCode"> + <constant>500</constant> + </setHeader> + <setBody> + <simple>GET ALL templates FAILED</simple> + </setBody> + </doCatch> + </doTry> + </route> + </get> + <get uri="/v2/templates/{templateName}" + outType="org.onap.policy.clamp.loop.template.LoopTemplate" + produces="application/json"> + <route> + <removeHeaders pattern="*" + excludePattern="templateName"/> + <doTry> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET a Template by NAME')"/> + <to + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> + <to + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplate(${header.templateName})"/> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> + <doCatch> + <exception>java.lang.Exception</exception> + <handled> + <constant>true</constant> + </handled> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> + <log loggingLevel="ERROR" + message="GET Template request failed for template: ${header.templateName}, ${exception.stacktrace}"/> + <setHeader headerName="CamelHttpResponseCode"> + <constant>500</constant> + </setHeader> + <setBody> + <simple>GET Template FAILED</simple> + </setBody> + </doCatch> + </doTry> + </route> + </get> + <get uri="/v2/templates/names" outType="java.lang.String[]" + produces="application/json"> + <route> + <removeHeaders pattern="*"/> + <doTry> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Loop Template Names')"/> + <to + uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> + <to + uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplateNames()"/> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> + <doCatch> + <exception>java.lang.Exception</exception> + <handled> + <constant>true</constant> + </handled> + <to + uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> + <log loggingLevel="ERROR" + message="GET All Template names request failed for template: ${exception.stacktrace}"/> + <setHeader headerName="CamelHttpResponseCode"> + <constant>500</constant> + </setHeader> + <setBody> + <simple>GET All Template names FAILED</simple> + </setBody> + </doCatch> + </doTry> + </route> + </get> + + <!-- NON LOOP related endpoints --> <get uri="/v2/dictionary" outType="org.onap.policy.clamp.tosca.Dictionary" produces="application/json"> <route> @@ -1217,106 +1318,6 @@ </route> </put> - <get uri="/v2/templates" - outType="org.onap.policy.clamp.loop.template.LoopTemplate" - produces="application/json"> - <route> - <removeHeaders pattern="*"/> - <doTry> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Templates')"/> - <to - uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> - <to - uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getAllLoopTemplates()"/> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> - <doCatch> - <exception>java.lang.Exception</exception> - <handled> - <constant>true</constant> - </handled> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> - <log loggingLevel="ERROR" - message="GET ALL templates request failed: ${exception.stacktrace}"/> - <setHeader headerName="CamelHttpResponseCode"> - <constant>500</constant> - </setHeader> - <setBody> - <simple>GET ALL templates FAILED</simple> - </setBody> - </doCatch> - </doTry> - </route> - </get> - <get uri="/v2/templates/{templateName}" - outType="org.onap.policy.clamp.loop.template.LoopTemplate" - produces="application/json"> - <route> - <removeHeaders pattern="*" - excludePattern="templateName"/> - <doTry> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET a Template by NAME')"/> - <to - uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> - <to - uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplate(${header.templateName})"/> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> - <doCatch> - <exception>java.lang.Exception</exception> - <handled> - <constant>true</constant> - </handled> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> - <log loggingLevel="ERROR" - message="GET Template request failed for template: ${header.templateName}, ${exception.stacktrace}"/> - <setHeader headerName="CamelHttpResponseCode"> - <constant>500</constant> - </setHeader> - <setBody> - <simple>GET Template FAILED</simple> - </setBody> - </doCatch> - </doTry> - </route> - </get> - <get uri="/v2/templates/names" outType="java.lang.String[]" - produces="application/json"> - <route> - <removeHeaders pattern="*"/> - <doTry> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'GET ALL Loop Template Names')"/> - <to - uri="bean:org.onap.policy.clamp.authorization.AuthorizationController?method=authorize(*,'template','','read')"/> - <to - uri="bean:org.onap.policy.clamp.loop.template.LoopTemplatesService?method=getLoopTemplateNames()"/> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=endLog()"/> - <doCatch> - <exception>java.lang.Exception</exception> - <handled> - <constant>true</constant> - </handled> - <to - uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=errorLog()"/> - <log loggingLevel="ERROR" - message="GET All Template names request failed for template: ${exception.stacktrace}"/> - <setHeader headerName="CamelHttpResponseCode"> - <constant>500</constant> - </setHeader> - <setBody> - <simple>GET All Template names FAILED</simple> - </setBody> - </doCatch> - </doTry> - </route> - </get> - <!-- Policy Related endpoints, not related to LOOP --> <get uri="/v2/policies" outType="com.google.gson.JsonObject" produces="application/json"> <route> @@ -1360,11 +1361,13 @@ </doTry> </route> </get> - <!-- Update an existing policy, therefore it removes it from pdp first, delete it and then recreate it --> - <!-- TO BE DONE --> <!-- Create a new policy --> - <post uri="/v2/policies/{policyModelName}/{policyModelVersion}" outType="com.google.gson.JsonObject" produces="application/json"> + <post uri="/v2/policies/{policyModelName}/{policyModelVersion}" + type="com.google.gson.JsonElement" + consumes="application/json" + outType="com.google.gson.JsonObject" + produces="application/json"> <route> <removeHeaders pattern="*" excludePattern="policyModelName|policyModelVersion"/> @@ -1382,6 +1385,9 @@ <setBody> <method ref="org.onap.policy.clamp.policy.pdpgroup.PoliciesPdpMerger" method="removePdpStatesOnePolicy(${body})"/> + </setBody> + <setBody> + <simple>${body.toString()}</simple> </setBody> <to uri="direct:create-policy"/> <to diff --git a/src/main/resources/clds/camel/routes/loop-flows.xml b/src/main/resources/clds/camel/routes/loop-flows.xml index d5ab050cf..f6a838ef0 100644 --- a/src/main/resources/clds/camel/routes/loop-flows.xml +++ b/src/main/resources/clds/camel/routes/loop-flows.xml @@ -43,6 +43,9 @@ <setProperty propertyName="policyTypeVersion"> <simple>${body.getPolicyModel().getVersion()}</simple> </setProperty> + <setProperty propertyName="policyPdpGroup"> + <simple>${body.getPdpGroup()}</simple> + </setProperty> <setProperty propertyName="policyVersion"> <simple>1.0.0</simple> </setProperty> @@ -70,8 +73,8 @@ <setProperty propertyName="policyVersion"> <simple>1.0.0</simple> </setProperty> - <setProperty propertyName="operationalPolicy"> - <simple>${body}</simple> + <setProperty propertyName="policyPdpGroup"> + <simple>${body.getPdpGroup()}</simple> </setProperty> <setBody> <constant>null</constant> diff --git a/src/main/resources/clds/camel/routes/policy-flows.xml b/src/main/resources/clds/camel/routes/policy-flows.xml index dda5f2cf2..0a9c1f511 100644 --- a/src/main/resources/clds/camel/routes/policy-flows.xml +++ b/src/main/resources/clds/camel/routes/policy-flows.xml @@ -107,9 +107,9 @@ </simple> </setHeader> <log loggingLevel="INFO" - message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0"></log> + message="Endpoint to get policy deployment status: {{clamp.config.policy.pap.url}}/policy/pap/v1/policies/status/${exchangeProperty[policyPdpGroup]}/${exchangeProperty[policyName]}/1.0.0"></log> <toD - uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/deployed/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true"/> + uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/policies/status/${exchangeProperty[policyPdpGroup]}/${exchangeProperty[policyName]}/1.0.0?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true"/> <doCatch> <exception>java.lang.Exception</exception> <handled> diff --git a/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java b/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java index 35ae9ed64..b6c60d84c 100644 --- a/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java +++ b/src/test/java/org/onap/policy/clamp/loop/PolicyModelServiceItCase.java @@ -47,7 +47,7 @@ import org.onap.policy.models.pdp.concepts.PdpGroup; import org.onap.policy.models.pdp.concepts.PdpGroups; import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.skyscreamer.jsonassert.JSONAssert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -275,20 +275,20 @@ public class PolicyModelServiceItCase { policyModelsService.saveOrUpdatePolicyModel(getPolicyModel(POLICY_MODEL_TYPE_3, "yaml", POLICY_MODEL_TYPE_3_VERSION_1, "TEST", "VARIANT", "user")); - ToscaPolicyTypeIdentifier type1 = new ToscaPolicyTypeIdentifier("org.onap.testos", "1.0.0"); - ToscaPolicyTypeIdentifier type2 = new ToscaPolicyTypeIdentifier("org.onap.testos2", "2.0.0"); + ToscaConceptIdentifier type1 = new ToscaConceptIdentifier("org.onap.testos", "1.0.0"); + ToscaConceptIdentifier type2 = new ToscaConceptIdentifier("org.onap.testos2", "2.0.0"); PdpSubGroup pdpSubgroup1 = new PdpSubGroup(); pdpSubgroup1.setPdpType("subGroup1"); - List<ToscaPolicyTypeIdentifier> pdpTypeList = new LinkedList<>(); + List<ToscaConceptIdentifier> pdpTypeList = new LinkedList<>(); pdpTypeList.add(type1); pdpTypeList.add(type2); pdpSubgroup1.setSupportedPolicyTypes(pdpTypeList); - ToscaPolicyTypeIdentifier type3 = new ToscaPolicyTypeIdentifier("org.onap.testos3", "2.0.0"); + ToscaConceptIdentifier type3 = new ToscaConceptIdentifier("org.onap.testos3", "2.0.0"); PdpSubGroup pdpSubgroup2 = new PdpSubGroup(); pdpSubgroup2.setPdpType("subGroup2"); - List<ToscaPolicyTypeIdentifier> pdpTypeList2 = new LinkedList<>(); + List<ToscaConceptIdentifier> pdpTypeList2 = new LinkedList<>(); pdpTypeList2.add(type2); pdpTypeList2.add(type3); pdpSubgroup2.setSupportedPolicyTypes(pdpTypeList2); diff --git a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupAnalyzerTest.java b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupAnalyzerTest.java index 5a9cac07b..e6717418a 100644 --- a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupAnalyzerTest.java +++ b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupAnalyzerTest.java @@ -33,8 +33,7 @@ import org.onap.policy.models.pdp.concepts.PdpGroup; import org.onap.policy.models.pdp.concepts.PdpGroups; import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; /** * This test class validates the PdpGroupAnalyzer class. @@ -52,33 +51,33 @@ public class PdpGroupAnalyzerTest { // Those that do not work first PdpSubGroup pdpSubgroupBad = new PdpSubGroup(); pdpSubgroupBad.setPdpType("subGroupBad"); - pdpSubgroupBad.setSupportedPolicyTypes(Arrays.asList(new ToscaPolicyTypeIdentifier("org.onap.test", "2.0.0"), - new ToscaPolicyTypeIdentifier("org.onap.test.*", "1.0.0"), - new ToscaPolicyTypeIdentifier("org.onip.testos", "1.0.0"), - new ToscaPolicyTypeIdentifier("org.onap.testos3", "2.0.0"), - new ToscaPolicyTypeIdentifier("org.onap.tes", "1.0.0"), - new ToscaPolicyTypeIdentifier("org.onap", "1.0.0") + pdpSubgroupBad.setSupportedPolicyTypes(Arrays.asList(new ToscaConceptIdentifier("org.onap.test", "2.0.0"), + new ToscaConceptIdentifier("org.onap.test.*", "1.0.0"), + new ToscaConceptIdentifier("org.onip.testos", "1.0.0"), + new ToscaConceptIdentifier("org.onap.testos3", "2.0.0"), + new ToscaConceptIdentifier("org.onap.tes", "1.0.0"), + new ToscaConceptIdentifier("org.onap", "1.0.0") )); - pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap", "1.0.0"))); - pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos", "2.0.0"))); - pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos", "1.0.1"))); - pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos.new", "1.0.0"))); - pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.*", "1.0.0"))); + pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap", "1.0.0"))); + pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos", "2.0.0"))); + pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos", "1.0.1"))); + pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos.new", "1.0.0"))); + pdpSubgroupBad.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.*", "1.0.0"))); PdpSubGroup pdpSubgroup1 = new PdpSubGroup(); pdpSubgroup1.setPdpType("subGroup1"); pdpSubgroup1.setSupportedPolicyTypes( - Arrays.asList(new ToscaPolicyTypeIdentifier("org.onap.*", "1.0.0"))); + Arrays.asList(new ToscaConceptIdentifier("org.onap.*", "1.0.0"))); PdpSubGroup pdpSubgroup2 = new PdpSubGroup(); pdpSubgroup2.setPdpType("subGroup2"); - pdpSubgroup2.setSupportedPolicyTypes(Arrays.asList(new ToscaPolicyTypeIdentifier("org.onap.test", "1.0.0"))); - pdpSubgroup2.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos", "1.0.0"))); + pdpSubgroup2.setSupportedPolicyTypes(Arrays.asList(new ToscaConceptIdentifier("org.onap.test", "1.0.0"))); + pdpSubgroup2.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos", "1.0.0"))); PdpSubGroup pdpSubgroup3 = new PdpSubGroup(); pdpSubgroup3.setPdpType("subGroup3"); - pdpSubgroup3.setSupportedPolicyTypes(Arrays.asList(new ToscaPolicyTypeIdentifier("org.onap.test*", "1.0.0"))); - pdpSubgroup3.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos", "2.0.0"))); + pdpSubgroup3.setSupportedPolicyTypes(Arrays.asList(new ToscaConceptIdentifier("org.onap.test*", "1.0.0"))); + pdpSubgroup3.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos", "2.0.0"))); // Should match pdpSubgroup1 PdpGroup pdpGroup1 = new PdpGroup(); diff --git a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMergerTest.java b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMergerTest.java index adb797897..7b8cbd824 100644 --- a/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMergerTest.java +++ b/src/test/java/org/onap/policy/clamp/policy/pdpgroup/PoliciesPdpMergerTest.java @@ -36,8 +36,7 @@ import org.onap.policy.models.pdp.concepts.PdpGroup; import org.onap.policy.models.pdp.concepts.PdpGroups; import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.enums.PdpState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; -import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.skyscreamer.jsonassert.JSONAssert; /** @@ -56,23 +55,23 @@ public class PoliciesPdpMergerTest { PdpSubGroup pdpSubgroup1 = new PdpSubGroup(); pdpSubgroup1.setPdpType("subGroup1"); pdpSubgroup1.setSupportedPolicyTypes( - Arrays.asList(new ToscaPolicyTypeIdentifier("org.onap.*", "1.0.0"))); + Arrays.asList(new ToscaConceptIdentifier("org.onap.*", "1.0.0"))); PdpSubGroup pdpSubgroup2 = new PdpSubGroup(); pdpSubgroup2.setPdpType("subGroup2"); pdpSubgroup2.setSupportedPolicyTypes( - Arrays.asList(new ToscaPolicyTypeIdentifier("onap.policies.monitoring.tcagen2", "1.0.0"), - new ToscaPolicyTypeIdentifier("onap.policies.controlloop.operational.common.Drools", "1.0.0"))); + Arrays.asList(new ToscaConceptIdentifier("onap.policies.monitoring.tcagen2", "1.0.0"), + new ToscaConceptIdentifier("onap.policies.controlloop.operational.common.Drools", "1.0.0"))); pdpSubgroup2.setPolicies(Arrays.asList( - new ToscaPolicyIdentifier("MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0", "1.0.0"))); + new ToscaConceptIdentifier("MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0", "1.0.0"))); PdpSubGroup pdpSubgroup3 = new PdpSubGroup(); pdpSubgroup3.setPdpType("subGroup3"); pdpSubgroup3.setSupportedPolicyTypes( - Arrays.asList(new ToscaPolicyTypeIdentifier("onap.policies.monitoring.tcagen2", "1.0.0"), - new ToscaPolicyTypeIdentifier("onap.policies.controlloop.operational.common.Drools", "1.0.0"))); - pdpSubgroup3.setPolicies(Arrays.asList(new ToscaPolicyIdentifier("org.onap.testos", "2.0.0"), - new ToscaPolicyIdentifier("OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd", "1.0.0"))); + Arrays.asList(new ToscaConceptIdentifier("onap.policies.monitoring.tcagen2", "1.0.0"), + new ToscaConceptIdentifier("onap.policies.controlloop.operational.common.Drools", "1.0.0"))); + pdpSubgroup3.setPolicies(Arrays.asList(new ToscaConceptIdentifier("org.onap.testos", "2.0.0"), + new ToscaConceptIdentifier("OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd", "1.0.0"))); // Should match pdpSubgroup1 PdpGroup pdpGroup1 = new PdpGroup(); @@ -103,9 +102,8 @@ public class PoliciesPdpMergerTest { @Test public void testRemovePdpStatesOnePolicy() throws IOException { - JsonObject policiesList = PoliciesPdpMerger.removePdpStatesOnePolicy(JsonUtils.GSON - .fromJson(ResourceFileUtils.getResourceAsString("example/policy/single-policy-enriched.json"), - JsonObject.class)); + JsonObject policiesList = PoliciesPdpMerger.removePdpStatesOnePolicy(JsonUtils.GSON.fromJson( + ResourceFileUtils.getResourceAsString("example/policy/single-policy-enriched.json"), JsonObject.class)); assertThat(policiesList.get(PdpGroupsAnalyzer.ASSIGNED_PDP_GROUPS_INFO)).isNull(); assertThat(policiesList.get(PdpGroupsAnalyzer.SUPPORTED_PDP_GROUPS_INFO)).isNull(); diff --git a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java index 3a5ab59d8..8edcc3c11 100644 --- a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java +++ b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java @@ -25,6 +25,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.onap.policy.models.base.PfUtils; @Getter @Setter @@ -34,4 +35,13 @@ import lombok.ToString; @EqualsAndHashCode public class ControlLoops { private List<ControlLoop> controlLoopList; + + /** + * Copy contructor, does a deep copy. + * + * @param otherControlLoops the other element to copy from + */ + public ControlLoops(final ControlLoops otherControlLoops) { + this.controlLoopList = PfUtils.mapList(controlLoopList, ControlLoop::new); + } } diff --git a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java index 2146f7dc2..4b27e0df3 100644 --- a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java +++ b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java @@ -20,6 +20,7 @@ package org.onap.policy.clamp.controlloop.models.messages.dmaap.participant; +import java.time.Instant; import java.util.UUID; import lombok.AccessLevel; import lombok.Getter; @@ -39,13 +40,13 @@ public class ParticipantMessage { @Setter(AccessLevel.NONE) private ParticipantMessageType messageType; - private UUID requestId = UUID.randomUUID(); + private UUID messageId = UUID.randomUUID(); /** * Time-stamp, in milliseconds, when the message was created. Defaults to the current * time. */ - private long timestampMs = System.currentTimeMillis(); + private Instant timestamp = Instant.now(); /** * Participant ID, or {@code null} for state-change broadcast messages. diff --git a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java index 2c9bcd911..4c771b405 100644 --- a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java +++ b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java @@ -41,6 +41,17 @@ public class ParticipantResponseDetails { private String responseMessage; /** + * Constructs the object as a response to. + * + * @param triggerMessage the message to which this is a response + */ + public ParticipantResponseDetails(ParticipantMessage triggerMessage) { + this.responseMessage = null; + this.responseStatus = ParticipantResponseStatus.FAIL; + this.responseTo = triggerMessage.getMessageId(); + } + + /** * Constructs the object, making a deep copy. * * @param source source from which to copy diff --git a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java index 95e9d7429..f014529b3 100644 --- a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java +++ b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java @@ -33,5 +33,10 @@ public enum ParticipantResponseStatus { /** * participant operation failed. */ - FAIL + FAIL, + + /** + * periodic response. + */ + PERIODIC } diff --git a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java index 4bc865c3f..b7140d4b8 100644 --- a/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java +++ b/tosca-controlloop/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java @@ -20,17 +20,12 @@ package org.onap.policy.clamp.controlloop.models.messages.dmaap.participant; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; -import org.onap.policy.models.base.PfUtils; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; /** * Class to represent the PARTICIPANT_STATUS message that all the participants send to the control loop runtime. @@ -46,11 +41,8 @@ public class ParticipantStatus extends ParticipantMessage { private ParticipantState state; private ParticipantHealthStatus healthStatus; - // This map is a map of the state of all control loop elements the participant has. The ToscaConceptIdentifier key - // of the outer map is a key that identifies the control loop. There is an inner map for each control loop the - // participant has. Each inner map has the UUID that identifies the ControlLoopElement instance, and the value is - // the ControlLoopInstance itself. - private Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElement>> elements; + // Control Loops on the participant + private ControlLoops controlLoops; // Description. May be left {@code null}. private String message; @@ -74,7 +66,7 @@ public class ParticipantStatus extends ParticipantMessage { this.state = source.state; this.healthStatus = source.healthStatus; this.message = source.message; - this.elements = PfUtils.mapMap(elements, LinkedHashMap::new); + this.controlLoops = (source.controlLoops == null ? null : new ControlLoops(source.controlLoops)); this.response = (source.response == null ? null : new ParticipantResponseDetails(source.response)); } } diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java index 05721b6a4..2c0a45541 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java @@ -53,7 +53,7 @@ public class ControlLoopTest { ControlLoop cl0 = new ControlLoop(); assertThat(cl0.toString()).contains("ControlLoop("); - assertEquals(false, cl0.hashCode() == 0); + assertThat(cl0.hashCode()).isNotZero(); assertEquals(true, cl0.equals(cl0)); assertEquals(false, cl0.equals(null)); diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java index 3250ce713..06d6ecf77 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState; @@ -50,9 +51,9 @@ public class ParticipantControlLoopStateChangeTest { id.setVersion("1.2.3"); orig.setControlLoopId(id); orig.setParticipantId(id); - orig.setRequestId(UUID.randomUUID()); + orig.setMessageId(UUID.randomUUID()); orig.setOrderedState(ControlLoopOrderedState.RUNNING); - orig.setTimestampMs(Long.valueOf(3000)); + orig.setTimestamp(Instant.ofEpochMilli(3000)); assertEquals(removeVariableFields(orig.toString()), removeVariableFields(new ParticipantControlLoopStateChange(orig).toString())); diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java index 6be84ca8b..4397bf158 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop; @@ -46,8 +47,8 @@ public class ParticipantControlLoopUpdateTest { id.setVersion("1.2.3"); orig.setControlLoopId(id); orig.setParticipantId(id); - orig.setRequestId(UUID.randomUUID()); - orig.setTimestampMs(Long.valueOf(3000)); + orig.setMessageId(UUID.randomUUID()); + orig.setTimestamp(Instant.ofEpochMilli(3000)); ControlLoop controlLoop = new ControlLoop(); controlLoop.setName("controlLoop"); diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java index f78365c00..1cc356627 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; @@ -50,9 +51,9 @@ public class ParticipantHealthCheckTest { id.setVersion("1.2.3"); orig.setControlLoopId(id); orig.setParticipantId(id); - orig.setRequestId(UUID.randomUUID()); + orig.setMessageId(UUID.randomUUID()); orig.setState(ParticipantState.ACTIVE); - orig.setTimestampMs(Long.valueOf(3000)); + orig.setTimestamp(Instant.ofEpochMilli(3000)); assertEquals(removeVariableFields(orig.toString()), removeVariableFields(new ParticipantHealthCheck(orig).toString())); diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java index a17b0f873..f66c99262 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @@ -40,15 +41,15 @@ public class ParticipantMessageTest { // verify with null values message = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE); ParticipantMessage newmsg = new ParticipantMessage(message); - newmsg.setRequestId(message.getRequestId()); - newmsg.setTimestampMs(message.getTimestampMs()); + newmsg.setMessageId(message.getMessageId()); + newmsg.setTimestamp(message.getTimestamp()); assertEquals(message.toString(), newmsg.toString()); // verify with all values message = makeMessage(); newmsg = new ParticipantMessage(message); - newmsg.setRequestId(message.getRequestId()); - newmsg.setTimestampMs(message.getTimestampMs()); + newmsg.setMessageId(message.getMessageId()); + newmsg.setTimestamp(message.getTimestamp()); assertEquals(message.toString(), newmsg.toString()); } @@ -93,8 +94,8 @@ public class ParticipantMessageTest { id.setVersion("1.2.3"); msg.setControlLoopId(id); msg.setParticipantId(id); - msg.setRequestId(UUID.randomUUID()); - msg.setTimestampMs(Long.valueOf(3000)); + msg.setMessageId(UUID.randomUUID()); + msg.setTimestamp(Instant.ofEpochMilli(3000)); return msg; } diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java index a7a76c05b..dfbc25d1b 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java @@ -30,6 +30,6 @@ public class ParticipantMessageUtils { } public static String removeVariableFields(String text) { - return text.replaceAll("requestId=[^,]*", "requestId=xxx").replaceAll("timestampMs=[^,]*", "timestampMs=nnn"); + return text.replaceAll("messageId=[^,]*", "messageId=xxx").replaceAll("timestamp=[^,]*", "timestamp=nnn"); } } diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java index 192f36342..235532681 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; @@ -50,9 +51,9 @@ public class ParticipantStateChangeTest { id.setVersion("1.2.3"); orig.setControlLoopId(id); orig.setParticipantId(id); - orig.setRequestId(UUID.randomUUID()); + orig.setMessageId(UUID.randomUUID()); orig.setState(ParticipantState.ACTIVE); - orig.setTimestampMs(Long.valueOf(3000)); + orig.setTimestamp(Instant.ofEpochMilli(3000)); assertEquals(removeVariableFields(orig.toString()), removeVariableFields(new ParticipantStateChange(orig).toString())); diff --git a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java index 62b3d9d02..9b5722bce 100644 --- a/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java +++ b/tosca-controlloop/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java @@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields; +import java.time.Instant; import java.util.UUID; import org.junit.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; @@ -47,9 +48,9 @@ public class ParticipantStatusTest { id.setVersion("1.2.3"); orig.setControlLoopId(id); orig.setParticipantId(id); - orig.setRequestId(UUID.randomUUID()); + orig.setMessageId(UUID.randomUUID()); orig.setState(ParticipantState.ACTIVE); - orig.setTimestampMs(Long.valueOf(3000)); + orig.setTimestamp(Instant.ofEpochMilli(3000)); final ParticipantResponseDetails resp = new ParticipantResponseDetails(); resp.setResponseMessage("my-response"); diff --git a/ui-react/src/api/PolicyService.js b/ui-react/src/api/PolicyService.js index fdbb5d5ea..16cc1f322 100644 --- a/ui-react/src/api/PolicyService.js +++ b/ui-react/src/api/PolicyService.js @@ -40,4 +40,27 @@ export default class PolicyService { return {}; }); } + static createNewPolicy(policyModelType, policyModelVersion, policyJson) { + return fetch(window.location.pathname + 'restservices/clds/v2/policies/' + policyModelType + '/' + policyModelVersion, { + method: 'POST', + credentials: 'same-origin', + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(policyJson) + }) + .then(function (response) { + console.debug("createNewPolicy response received: ", response.status); + if (response.ok) { + return response.text; + } else { + console.error("createNewPolicy query failed"); + return ""; + } + }) + .catch(function (error) { + console.error("createNewPolicy error received", error); + throw new Error(error) + }); + } } diff --git a/ui-react/src/components/dialogs/Policy/ViewAllPolicies.js b/ui-react/src/components/dialogs/Policy/ViewAllPolicies.js index a1cf9d5c1..dfebc51d8 100644 --- a/ui-react/src/components/dialogs/Policy/ViewAllPolicies.js +++ b/ui-react/src/components/dialogs/Policy/ViewAllPolicies.js @@ -47,6 +47,12 @@ import PolicyService from '../../../api/PolicyService'; import PolicyToscaService from '../../../api/PolicyToscaService'; import Select from 'react-select'; import JSONEditor from '@json-editor/json-editor'; +import OnapUtils from '../../../utils/OnapUtils'; +import Alert from 'react-bootstrap/Alert'; + +const DivWhiteSpaceStyled = styled.div` + white-space: pre; +` const ModalStyled = styled(Modal)` @media (min-width: 1200px) { @@ -76,9 +82,11 @@ export default class ViewAllPolicies extends React.Component { state = { show: true, content: 'Please select a policy to display it', - selectedRow: -1, + selectedRowId: -1, policiesListData: [], prefixGrouping: false, + showSuccessAlert: false, + showFailAlert: false, policyColumnsDefinition: [ { title: "Policy Name", field: "name", @@ -148,7 +156,8 @@ export default class ViewAllPolicies extends React.Component { this.handlePrefixGrouping = this.handlePrefixGrouping.bind(this); this.handleDeletePolicy = this.handleDeletePolicy.bind(this); this.handleUpdatePolicy = this.handleUpdatePolicy.bind(this); - this.handleCreateNewVersion = this.handleCreateNewVersion(this); + this.handleCreateNewVersion = this.handleCreateNewVersion.bind(this); + this.disableAlert = this.disableAlert.bind(this); this.getAllPolicies(); } @@ -159,10 +168,10 @@ export default class ViewAllPolicies extends React.Component { let selectedSubPdpGroup = pdpSplit[1]; if (typeof selectedSubPdpGroup !== "undefined") { let temp = this.state.policiesListData; - temp[this.state.selectedRow]["pdpGroupInfo"] = {"pdpGroup":selectedPdpGroup,"pdpSubGroup":selectedSubPdpGroup}; + temp[this.state.selectedRowId]["pdpGroupInfo"] = {"pdpGroup":selectedPdpGroup,"pdpSubGroup":selectedSubPdpGroup}; this.setState({policiesListData: temp}); } else { - delete this.state.policiesListData[this.state.selectedRow]["pdpGroupInfo"]; + delete this.state.policiesListData[this.state.selectedRowId]["pdpGroupInfo"]; } } @@ -237,9 +246,9 @@ export default class ViewAllPolicies extends React.Component { handleOnRowClick(rowData) { PolicyToscaService.getToscaPolicyModel(rowData["type"], rowData["type_version"]).then(respJsonPolicyTosca => { this.setState({ - selectedRow: rowData.tableData.id, - selectedRowJsonSchema: respJsonPolicyTosca, - selectedRowPolicyProperties: rowData["properties"], + selectedRowId: rowData.tableData.id, + selectedRowIdJsonSchema: respJsonPolicyTosca, + selectedRowIdPolicyProperties: rowData["properties"], jsonEditorForPolicy: this.createJsonEditor(respJsonPolicyTosca, rowData["properties"]) }); }); @@ -253,8 +262,52 @@ export default class ViewAllPolicies extends React.Component { return null; } - handleCreateNewVersion(event,rowData) { - return null; + customValidation(editorData) { + // method for sub-classes to override with customized validation + return []; + } + + handleCreateNewVersion() { + var editorData = this.state.jsonEditorForPolicy.getValue(); + var errors = this.state.jsonEditorForPolicy.validate(); + errors = errors.concat(this.customValidation(editorData)); + + if (errors.length !== 0) { + console.error("Errors detected during policy data validation ", errors); + this.setState({ + showFailAlert: true, + showMessage: 'Errors detected during policy data validation:\n' + OnapUtils.jsonEditorErrorFormatter(errors) + }); + return; + } else { + console.info("NO validation errors found in policy data"); + let newPolicy = JSON.parse(JSON.stringify(this.state.policiesListData[this.state.selectedRowId])); + newPolicy["properties"] = editorData; + let newVersion = this.bumpVersion(newPolicy["version"]); + newPolicy["version"] = newVersion; + newPolicy["metadata"]["policy-version"] = newVersion; + // Remove stuff added by UI + delete newPolicy["tableData"]; + PolicyService.createNewPolicy(newPolicy["type"], newPolicy["type_version"], newPolicy).then(respPolicyCreation => { + if (respPolicyCreation === "") { + //it indicates a failure + this.setState({ + showFailAlert: true, + showMessage: 'Policy Creation Failure' + }); + } else { + this.setState({ + showSuccessAlert: true, + showMessage: 'Policy in version ' + newVersion + ' created successfully' + }); + } + }) + } + } + + bumpVersion(versionToBump) { + let semVer = versionToBump.split("."); + return parseInt(semVer[0])+1 + "." + semVer[1] + "." + semVer[2]; } handleUpdatePolicy() { @@ -262,11 +315,16 @@ export default class ViewAllPolicies extends React.Component { this.props.history.push('/') } + disableAlert() { + this.setState ({ showSuccessAlert: false, showFailAlert: false }); + } + render() { return ( <ModalStyled size="xl" show={this.state.show} onHide={this.handleClose} backdrop="static" keyboard={false}> <Modal.Header closeButton> </Modal.Header> + <Modal.Body> <FormControlLabel control={<Switch checked={this.state.prefixGrouping} onChange={this.handlePrefixGrouping} />} @@ -283,7 +341,7 @@ export default class ViewAllPolicies extends React.Component { exportButton: true, headerStyle:rowHeaderStyle, rowStyle: rowData => ({ - backgroundColor: (this.state.selectedRow !== -1 && this.state.selectedRow === rowData.tableData.id) ? '#EEE' : '#FFF' + backgroundColor: (this.state.selectedRowId !== -1 && this.state.selectedRowId === rowData.tableData.id) ? '#EEE' : '#FFF' }) }} actions={[ @@ -293,14 +351,25 @@ export default class ViewAllPolicies extends React.Component { onClick: (event, rowData) => this.handleDeletePolicy(event, rowData) } ]} - /> <JsonEditorDiv> <h5>Policy Properties Editor</h5> <div id="policy-editor" title="Policy Properties"/> - <Button variant="secondary" title="Create a new policy version from the defined parameters" onClick={this.handleCreateNewVersion}>Create New Version</Button> - <Button variant="secondary" title="Update the current policy version, BE CAREFUL this will undeploy the policy from PDP, delete it and then recreate the policy" onClick={this.handleUpdatePolicy}>Update Current Version</Button> + <Button variant="secondary" title="Create a new policy version from the defined parameters" + onClick={this.handleCreateNewVersion}>Create New Version</Button> + <Button variant="secondary" title="Update the current policy version, BE CAREFUL this will undeploy the policy from PDP, delete it and then recreate the policy" + onClick={this.handleUpdatePolicy}>Update Current Version</Button> </JsonEditorDiv> + <Alert variant="success" show={this.state.showSuccessAlert} onClose={this.disableAlert} dismissible> + <DivWhiteSpaceStyled> + {this.state.showMessage} + </DivWhiteSpaceStyled> + </Alert> + <Alert variant="danger" show={this.state.showFailAlert} onClose={this.disableAlert} dismissible> + <DivWhiteSpaceStyled> + {this.state.showMessage} + </DivWhiteSpaceStyled> + </Alert> </Modal.Body> <Modal.Footer> <Button variant="secondary" onClick={this.handleClose}>Close</Button> diff --git a/ui-react/src/components/menu/MenuBar.js b/ui-react/src/components/menu/MenuBar.js index 40a3890a5..ae1387912 100644 --- a/ui-react/src/components/menu/MenuBar.js +++ b/ui-react/src/components/menu/MenuBar.js @@ -86,16 +86,18 @@ export default class MenuBar extends React.Component { render () { return ( <Navbar.Collapse> - <StyledNavDropdown title="Loop Templates"> - <NavDropdown.Item as={StyledLink} to="/viewLoopTemplatesModal">View All Templates</NavDropdown.Item> - </StyledNavDropdown> - <StyledNavDropdown title="Policy Models"> - <NavDropdown.Item as={StyledLink} to="/uploadToscaPolicyModal">Upload Tosca Model</NavDropdown.Item> - <NavDropdown.Item as={StyledLink} to="/viewToscaPolicyModal">View Tosca Models</NavDropdown.Item> + <StyledNavDropdown title="POLICY Framework"> <NavDropdown.Item as={StyledLink} to="/manageDictionaries">Manage Metadata Dictionaries</NavDropdown.Item> + <NavDropdown.Divider /> <NavDropdown.Item as={StyledLink} to="/viewAllPolicies">View All Policies</NavDropdown.Item> + <NavDropdown.Item as={StyledLink} to="/viewToscaPolicyModal">View Tosca Models</NavDropdown.Item> + <NavDropdown.Divider /> + <NavDropdown.Item as={StyledLink} to="/uploadToscaPolicyModal">Upload Tosca Model</NavDropdown.Item> + </StyledNavDropdown> + <StyledNavDropdown title="LOOP Templates"> + <NavDropdown.Item as={StyledLink} to="/viewLoopTemplatesModal">View All Templates</NavDropdown.Item> </StyledNavDropdown> - <StyledNavDropdown title="Loop Instance"> + <StyledNavDropdown title="LOOP Instance"> <NavDropdown.Item as={StyledLink} to="/createLoop">Create</NavDropdown.Item> <NavDropdown.Item as={StyledLink} to="/openLoop">Open</NavDropdown.Item> <NavDropdown.Item as={StyledLink} to="/closeLoop" disabled={this.state.disabled}>Close</NavDropdown.Item> @@ -104,10 +106,10 @@ export default class MenuBar extends React.Component { <NavDropdown.Item as={StyledLink} to="/loopProperties" disabled={this.state.disabled}>Properties</NavDropdown.Item> <NavDropdown.Item as={StyledLink} to="/refreshStatus" disabled={this.state.disabled}>Refresh Status</NavDropdown.Item> </StyledNavDropdown> - <StyledNavDropdown title="Loop Operations"> - <NavDropdown.Item as={StyledLink} to="/submit" disabled={this.state.disabled}>Create and deploy to Policy Engine(SUBMIT)</NavDropdown.Item> - <NavDropdown.Item as={StyledLink} to="/stop" disabled={this.state.disabled}>Undeploy from Policy Engine (STOP)</NavDropdown.Item> - <NavDropdown.Item as={StyledLink} to="/restart" disabled={this.state.disabled}>ReDeploy to Policy Engine (RESTART)</NavDropdown.Item> + <StyledNavDropdown title="LOOP Operations"> + <NavDropdown.Item as={StyledLink} to="/submit" disabled={this.state.disabled}>Create and deploy to Policy Framework (SUBMIT)</NavDropdown.Item> + <NavDropdown.Item as={StyledLink} to="/stop" disabled={this.state.disabled}>Undeploy from Policy Framework (STOP)</NavDropdown.Item> + <NavDropdown.Item as={StyledLink} to="/restart" disabled={this.state.disabled}>ReDeploy to Policy Framework (RESTART)</NavDropdown.Item> <NavDropdown.Item as={StyledLink} to="/delete" disabled={this.state.disabled}>Delete loop instance (DELETE)</NavDropdown.Item> <NavDropdown.Divider /> <NavDropdown.Item as={StyledLink} to="/deploy" disabled={this.state.disabled}>Deploy to DCAE (DEPLOY)</NavDropdown.Item> diff --git a/ui-react/src/components/menu/__snapshots__/MenuBar.test.js.snap b/ui-react/src/components/menu/__snapshots__/MenuBar.test.js.snap index 69a0e85db..fd9956ed2 100644 --- a/ui-react/src/components/menu/__snapshots__/MenuBar.test.js.snap +++ b/ui-react/src/components/menu/__snapshots__/MenuBar.test.js.snap @@ -3,7 +3,7 @@ exports[`Verify MenuBar Test the render method 1`] = ` <NavbarCollapse> <Styled(NavDropdown) - title="Loop Templates" + title="POLICY Framework" > <DropdownItem as={ @@ -52,14 +52,13 @@ exports[`Verify MenuBar Test the render method 1`] = ` } } disabled={false} - to="/viewLoopTemplatesModal" + to="/manageDictionaries" > - View All Templates + Manage Metadata Dictionaries </DropdownItem> - </Styled(NavDropdown)> - <Styled(NavDropdown) - title="Policy Models" - > + <DropdownDivider + role="separator" + /> <DropdownItem as={ Object { @@ -107,9 +106,9 @@ exports[`Verify MenuBar Test the render method 1`] = ` } } disabled={false} - to="/uploadToscaPolicyModal" + to="/viewAllPolicies" > - Upload Tosca Model + View All Policies </DropdownItem> <DropdownItem as={ @@ -162,6 +161,9 @@ exports[`Verify MenuBar Test the render method 1`] = ` > View Tosca Models </DropdownItem> + <DropdownDivider + role="separator" + /> <DropdownItem as={ Object { @@ -209,10 +211,14 @@ exports[`Verify MenuBar Test the render method 1`] = ` } } disabled={false} - to="/manageDictionaries" + to="/uploadToscaPolicyModal" > - Manage Metadata Dictionaries + Upload Tosca Model </DropdownItem> + </Styled(NavDropdown)> + <Styled(NavDropdown) + title="LOOP Templates" + > <DropdownItem as={ Object { @@ -260,13 +266,13 @@ exports[`Verify MenuBar Test the render method 1`] = ` } } disabled={false} - to="/viewAllPolicies" + to="/viewLoopTemplatesModal" > - View All Policies + View All Templates </DropdownItem> </Styled(NavDropdown)> <Styled(NavDropdown) - title="Loop Instance" + title="LOOP Instance" > <DropdownItem as={ @@ -579,7 +585,7 @@ exports[`Verify MenuBar Test the render method 1`] = ` </DropdownItem> </Styled(NavDropdown)> <Styled(NavDropdown) - title="Loop Operations" + title="LOOP Operations" > <DropdownItem as={ @@ -630,7 +636,7 @@ exports[`Verify MenuBar Test the render method 1`] = ` disabled={true} to="/submit" > - Create and deploy to Policy Engine(SUBMIT) + Create and deploy to Policy Framework (SUBMIT) </DropdownItem> <DropdownItem as={ @@ -681,7 +687,7 @@ exports[`Verify MenuBar Test the render method 1`] = ` disabled={true} to="/stop" > - Undeploy from Policy Engine (STOP) + Undeploy from Policy Framework (STOP) </DropdownItem> <DropdownItem as={ @@ -732,7 +738,7 @@ exports[`Verify MenuBar Test the render method 1`] = ` disabled={true} to="/restart" > - ReDeploy to Policy Engine (RESTART) + ReDeploy to Policy Framework (RESTART) </DropdownItem> <DropdownItem as={ diff --git a/version.properties b/version.properties index 35775d32e..a55d4d200 100644 --- a/version.properties +++ b/version.properties @@ -27,7 +27,7 @@ major=6 minor=0 -patch=0 +patch=1 base_version=${major}.${minor}.${patch} |