aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrameshiyer27 <ramesh.murugan.iyer@est.tech>2022-02-07 17:07:38 +0000
committerrameshiyer27 <ramesh.murugan.iyer@est.tech>2022-02-10 14:20:42 +0000
commit45b653fc5a8d641452247eca5c80cf580609e9bf (patch)
tree06cfd4529db05dc23cbd63d2fe2e53799eb07bdf
parent303d42453fbfcf2381f810b10a496b69aa8bc34b (diff)
Add policy metadataSet handling as node templates
Each metadataSet is represented as a 'node_template' in Tosca mapped to a specific node type. Support added for db operations of node templates as independent entities. Detailed documentation available here : https://wiki.onap.org/display/DW/Enable+Handling+of+Policy+Type+Metadata Issue-ID: POLICY-3832 Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech> Change-Id: I6c189142b1778ba858aae27cd92d4f136d950208
-rw-r--r--models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json1578
-rw-r--r--models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml1336
-rw-r--r--models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml130
-rw-r--r--models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml338
-rw-r--r--models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java60
-rw-r--r--models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java45
-rw-r--r--models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java48
-rw-r--r--models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java38
-rw-r--r--models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java (renamed from models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java)61
-rw-r--r--models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json46
-rw-r--r--models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json (renamed from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json)0
-rw-r--r--models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json (renamed from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json)0
-rw-r--r--models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json (renamed from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json)0
-rw-r--r--models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json (renamed from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json)0
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java6
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java123
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java6
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java248
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java7
-rw-r--r--models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java35
-rw-r--r--models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java315
-rw-r--r--models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json31
-rw-r--r--models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json23
23 files changed, 4460 insertions, 14 deletions
diff --git a/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json b/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json
new file mode 100644
index 000000000..e91a7b568
--- /dev/null
+++ b/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json
@@ -0,0 +1,1578 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+ "node_types": {
+ "org.onap.nodetypes.policy.MetadataSet": {
+ "derived_from": "tosca.nodetypes.Root",
+ "version": "1.0.0"
+ }
+ },
+
+ "topology_template": {
+ "node_templates": {
+ "apexMetadata_grpc": {
+ "version": "1.2.1",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Metadata set for GRPC",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "GrpcPolicyModel",
+ "version": "1.0.1"
+ }
+ },
+ "threshold": 3.14,
+ "state": "active"
+ }
+ },
+ "apexMetadata_adaptive": {
+ "version": "2.3.1",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Metadata set for an Adaptive Policy",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "AdaptivePolicyModel",
+ "version": "1.2.1"
+ }
+ },
+ "radius": 1.23,
+ "height": 2.13,
+ "length": 45
+ }
+ },
+ "apexMetadata_decisionMaker": {
+ "version": "1.0.0",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Metadata set for an Adaptive Policy",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "DecisionMakerPolicyModel",
+ "version": "1.0.0"
+ },
+ "keyInformation": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_KeyInfo",
+ "version": "0.0.1"
+ },
+ "keyInfoMap": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ "UUID": "4ea21a2c-5dc7-337f-ba13-f427a4ae79a1",
+ "description": "Generated description for concept referred to by key \"AnswerAlbum:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "UUID": "ce2233b8-bb89-3c5e-a18f-1d13089d2bb6",
+ "description": "Generated description for concept referred to by key \"AnswerEvent:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "AnswerInitPolicy",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerInitPolicy",
+ "version": "0.0.1"
+ },
+ "UUID": "c8254064-b171-3ccb-85c0-29b5719ee8fc",
+ "description": "Generated description for concept referred to by key \"AnswerInitPolicy:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "UUID": "28fb33d2-a4e0-3046-8302-7baf9a2056d1",
+ "description": "Generated description for concept referred to by key \"AnswerInitTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "UUID": "487acc75-b5a1-3285-90cf-98ecd6fb3500",
+ "description": "Generated description for concept referred to by key \"DecisionEvent:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicy",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicy",
+ "version": "0.0.1"
+ },
+ "UUID": "9e8dda9a-6f85-311d-842b-00b5b5578edd",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicy:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel",
+ "version": "0.0.1"
+ },
+ "UUID": "d7789464-e4d1-382e-8481-fba53fa7b9a9",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Albums",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Albums",
+ "version": "0.0.1"
+ },
+ "UUID": "e5dfbadd-5229-3ad9-996c-eda030ef5dc1",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_Albums:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Events",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Events",
+ "version": "0.0.1"
+ },
+ "UUID": "b4248202-ff8e-3d45-8b3d-0ed0fd2eaed4",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_Events:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_KeyInfo",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_KeyInfo",
+ "version": "0.0.1"
+ },
+ "UUID": "693b1b29-c4c6-34ba-98e1-bc1a7576f0f8",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_KeyInfo:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Policies",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Policies",
+ "version": "0.0.1"
+ },
+ "UUID": "2dee1e42-9caa-32b1-9298-784dcdcb9cae",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_Policies:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Schemas",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Schemas",
+ "version": "0.0.1"
+ },
+ "UUID": "c256f102-2681-3f35-bbbd-1f4948587e15",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_Schemas:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Tasks",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Tasks",
+ "version": "0.0.1"
+ },
+ "UUID": "660cbdba-687d-3a05-ba26-69daf93a8158",
+ "description": "Generated description for concept referred to by key \"DecisionMakerPolicyModel_Tasks:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "DitheringAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DitheringAnswerTask",
+ "version": "0.0.1"
+ },
+ "UUID": "da31cee8-2e84-39d2-9337-9ee3bf347c98",
+ "description": "Generated description for concept referred to by key \"DitheringAnswerTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ },
+ "UUID": "21399145-3fbe-39a5-b863-8a59a8add4a8",
+ "description": "Generated description for concept referred to by key \"LastAnswerAlbum:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "UUID": "02ec632a-aeae-31fe-8f6d-656e1875749f",
+ "description": "Generated description for concept referred to by key \"MakeDecisionEvent:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "OptimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "OptimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "UUID": "818e6b9e-0109-31f5-a95c-17f6fb016027",
+ "description": "Generated description for concept referred to by key \"OptimisticAnswerTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "PessimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "PessimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "UUID": "8f4a707e-0d8b-3e09-b921-332f6f81f302",
+ "description": "Generated description for concept referred to by key \"PessimisticAnswerTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "UUID": "bfb0af88-b454-3b08-911f-7ff2475350bf",
+ "description": "Generated description for concept referred to by key \"RandomAnswerTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "RoundRobinAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "RoundRobinAnswerTask",
+ "version": "0.0.1"
+ },
+ "UUID": "eac6fb59-8aca-3011-b7ba-69875f1db4b6",
+ "description": "Generated description for concept referred to by key \"RoundRobinAnswerTask:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "SimpleIntegerType",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "SimpleIntegerType",
+ "version": "0.0.1"
+ },
+ "UUID": "ab00a5b8-7edd-340f-8140-4d14f571edfb",
+ "description": "Generated description for concept referred to by key \"SimpleIntegerType:0.0.1\""
+ }
+ },
+ {
+ "key": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "UUID": "8a4957cf-9493-3a76-8c22-a208e23259af",
+ "description": "Generated description for concept referred to by key \"SimpleStringType:0.0.1\""
+ }
+ }
+ ]
+ }
+ },
+ "policies": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Policies",
+ "version": "0.0.1"
+ },
+ "policyMap": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerInitPolicy",
+ "version": "0.0.1"
+ },
+ "value": {
+ "policyKey": {
+ "name": "AnswerInitPolicy",
+ "version": "0.0.1"
+ },
+ "template": "freestyle",
+ "state": {
+ "entry": [
+ {
+ "key": "AnswerInitState",
+ "value": {
+ "stateKey": {
+ "parentKeyName": "AnswerInitPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "NULL",
+ "localName": "AnswerInitState"
+ },
+ "trigger": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "stateOutputs": {
+ "entry": [
+ {
+ "key": "AnswerInitOutput",
+ "value": {
+ "key": {
+ "parentKeyName": "AnswerInitPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "AnswerInitState",
+ "localName": "AnswerInitOutput"
+ },
+ "outgoingEvent": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "outgoingEventReference": [
+ {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ }
+ ],
+ "nextState": {
+ "parentKeyName": "NULL",
+ "parentKeyVersion": "0.0.0",
+ "parentLocalName": "NULL",
+ "localName": "NULL"
+ }
+ }
+ }
+ ]
+ },
+ "contextAlbumReference": [],
+ "taskSelectionLogic": {
+ "key": "NULL",
+ "logicFlavour": "UNDEFINED",
+ "logic": ""
+ },
+ "stateFinalizerLogicMap": {
+ "entry": []
+ },
+ "defaultTask": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "taskReferences": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "AnswerInitPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "AnswerInitState",
+ "localName": "AnswerInitPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "AnswerInitPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "AnswerInitState",
+ "localName": "AnswerInitOutput"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "firstState": "AnswerInitState"
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionMakerPolicy",
+ "version": "0.0.1"
+ },
+ "value": {
+ "policyKey": {
+ "name": "DecisionMakerPolicy",
+ "version": "0.0.1"
+ },
+ "template": "freestyle",
+ "state": {
+ "entry": [
+ {
+ "key": "MakeDecisionState",
+ "value": {
+ "stateKey": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "NULL",
+ "localName": "MakeDecisionState"
+ },
+ "trigger": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "stateOutputs": {
+ "entry": [
+ {
+ "key": "DecisionFinalOutput",
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ },
+ "outgoingEvent": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "outgoingEventReference": [
+ {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ }
+ ],
+ "nextState": {
+ "parentKeyName": "NULL",
+ "parentKeyVersion": "0.0.0",
+ "parentLocalName": "NULL",
+ "localName": "NULL"
+ }
+ }
+ }
+ ]
+ },
+ "contextAlbumReference": [],
+ "taskSelectionLogic": {
+ "key": "TaskSelectionLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nif (executor.inFields.get(\"mode\").equals(\"random\")) {\n executor.subject.getTaskKey(\"RandomAnswerTask\").copyTo(executor.selectedTask);\n}\nelse if (executor.inFields.get(\"mode\").equals(\"pessimistic\")) {\n executor.subject.getTaskKey(\"PessimisticAnswerTask\").copyTo(executor.selectedTask);\n}\nelse if (executor.inFields.get(\"mode\").equals(\"optimistic\")) {\n executor.subject.getTaskKey(\"OptimisticAnswerTask\").copyTo(executor.selectedTask);\n}\nelse if (executor.inFields.get(\"mode\").equals(\"dithering\")) {\n executor.subject.getTaskKey(\"DitheringAnswerTask\").copyTo(executor.selectedTask);\n}\nelse if (executor.inFields.get(\"mode\").equals(\"roundrobin\")) {\n executor.subject.getTaskKey(\"RoundRobinAnswerTask\").copyTo(executor.selectedTask);\n}\n\nexecutor.logger.info(\"Answer Selected Task:\" + executor.selectedTask);\n\ntrue;"
+ },
+ "stateFinalizerLogicMap": {
+ "entry": []
+ },
+ "defaultTask": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "taskReferences": {
+ "entry": [
+ {
+ "key": {
+ "name": "DitheringAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionMakerPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "OptimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionMakerPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "PessimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionMakerPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionMakerPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "RoundRobinAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionMakerPolicy"
+ },
+ "outputType": "DIRECT",
+ "output": {
+ "parentKeyName": "DecisionMakerPolicy",
+ "parentKeyVersion": "0.0.1",
+ "parentLocalName": "MakeDecisionState",
+ "localName": "DecisionFinalOutput"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "firstState": "MakeDecisionState"
+ }
+ }
+ ]
+ }
+ },
+ "tasks": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Tasks",
+ "version": "0.0.1"
+ },
+ "taskMap": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerInitTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "a0",
+ "value": {
+ "key": "a0",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a1",
+ "value": {
+ "key": "a1",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a2",
+ "value": {
+ "key": "a2",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a3",
+ "value": {
+ "key": "a3",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a4",
+ "value": {
+ "key": "a4",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a5",
+ "value": {
+ "key": "a5",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a6",
+ "value": {
+ "key": "a6",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "AnswerEvent",
+ "value": {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "a0",
+ "value": {
+ "key": "a0",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a1",
+ "value": {
+ "key": "a1",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a2",
+ "value": {
+ "key": "a2",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a3",
+ "value": {
+ "key": "a3",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a4",
+ "value": {
+ "key": "a4",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a5",
+ "value": {
+ "key": "a5",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a6",
+ "value": {
+ "key": "a6",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar answerAlbum = executor.getContextAlbum(\"AnswerAlbum\");\n\nanswerAlbum.put(\"a0\", executor.inFields.get(\"a0\"));\nanswerAlbum.put(\"a1\", executor.inFields.get(\"a1\"));\nanswerAlbum.put(\"a2\", executor.inFields.get(\"a2\"));\nanswerAlbum.put(\"a3\", executor.inFields.get(\"a3\"));\nanswerAlbum.put(\"a4\", executor.inFields.get(\"a4\"));\nanswerAlbum.put(\"a5\", executor.inFields.get(\"a5\"));\nanswerAlbum.put(\"a6\", executor.inFields.get(\"a6\"));\n\nvar lastAnswerAlbum = executor.getContextAlbum(\"LastAnswerAlbum\");\nlastAnswerAlbum.put(\"lastAnswer\", answerAlbum.size() - 1);\n\nexecutor.outFields.put(\"a0\", answerAlbum.get(\"a0\"));\nexecutor.outFields.put(\"a1\", answerAlbum.get(\"a1\"));\nexecutor.outFields.put(\"a2\", answerAlbum.get(\"a2\"));\nexecutor.outFields.put(\"a3\", answerAlbum.get(\"a3\"));\nexecutor.outFields.put(\"a4\", answerAlbum.get(\"a4\"));\nexecutor.outFields.put(\"a5\", answerAlbum.get(\"a5\"));\nexecutor.outFields.put(\"a6\", answerAlbum.get(\"a6\"));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "DitheringAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DitheringAnswerTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "DecisionEvent",
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar size = executor.getContextAlbum(\"AnswerAlbum\").size();\n\nvar selection = 2 + Math.floor(Math.random() * 3);\n\nvar selectionA = \"a\" + selection;\n\nexecutor.logger.info(size);\nexecutor.logger.info(selectionA);\n\nexecutor.outFields.put(\"decision\", executor.getContextAlbum(\"AnswerAlbum\").get(selectionA));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "OptimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "OptimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "DecisionEvent",
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar size = executor.getContextAlbum(\"AnswerAlbum\").size();\n\nvar selection = size - Math.floor(Math.random() * size / 2) - 1;\n\nvar selectionA = \"a\" + selection;\n\nexecutor.logger.info(size);\nexecutor.logger.info(selectionA);\n\nexecutor.outFields.put(\"decision\", executor.getContextAlbum(\"AnswerAlbum\").get(selectionA));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "PessimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "PessimisticAnswerTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "DecisionEvent",
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar size = executor.getContextAlbum(\"AnswerAlbum\").size();\n\nvar selection = Math.floor(Math.random() * size / 2);\n\nvar selectionA = \"a\" + selection;\n\nexecutor.logger.info(size);\nexecutor.logger.info(selectionA);\n\nexecutor.outFields.put(\"decision\", executor.getContextAlbum(\"AnswerAlbum\").get(selectionA));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "RandomAnswerTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "DecisionEvent",
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar size = executor.getContextAlbum(\"AnswerAlbum\").size();\n\nvar selection = Math.floor(Math.random() * size);\n\nvar selectionA = \"a\" + selection;\n\nexecutor.logger.info(size);\nexecutor.logger.info(selectionA);\n\nexecutor.outFields.put(\"decision\", executor.getContextAlbum(\"AnswerAlbum\").get(selectionA));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "RoundRobinAnswerTask",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "RoundRobinAnswerTask",
+ "version": "0.0.1"
+ },
+ "inputEvent": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ },
+ "outputEvents": {
+ "entry": [
+ {
+ "key": "DecisionEvent",
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ },
+ "taskParameters": {
+ "entry": []
+ },
+ "contextAlbumReference": [
+ {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ }
+ ],
+ "taskLogic": {
+ "key": "TaskLogic",
+ "logicFlavour": "JAVASCRIPT",
+ "logic": "/*\n * ============LICENSE_START=======================================================\n * Copyright (C) 2016-2018 Ericsson. All rights reserved.\n * Modifications Copyright (C) 2020 Nordix Foundation.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n * ============LICENSE_END=========================================================\n */\n\nexecutor.logger.info(executor.subject.id);\nexecutor.logger.info(executor.inFields);\n\nvar size = executor.getContextAlbum(\"AnswerAlbum\").size();\nvar lastAnswer = executor.getContextAlbum(\"LastAnswerAlbum\").get(\"lastAnswer\");\n\nexecutor.logger.info(size);\nexecutor.logger.info(lastAnswer);\n\nvar answer = ++lastAnswer;\nif (answer >= size) {\n answer = 0;\n}\n\nexecutor.getContextAlbum(\"LastAnswerAlbum\").put(\"lastAnswer\", answer)\n\nvar selectionA = \"a\" + answer;\n\nexecutor.logger.info(selectionA);\n\nexecutor.outFields.put(\"decision\", executor.getContextAlbum(\"AnswerAlbum\").get(selectionA));\n\nexecutor.logger.info(executor.outFields);\n\ntrue;"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "events": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Events",
+ "version": "0.0.1"
+ },
+ "eventMap": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "a0",
+ "value": {
+ "key": "a0",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a1",
+ "value": {
+ "key": "a1",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a2",
+ "value": {
+ "key": "a2",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a3",
+ "value": {
+ "key": "a3",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a4",
+ "value": {
+ "key": "a4",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a5",
+ "value": {
+ "key": "a5",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ },
+ {
+ "key": "a6",
+ "value": {
+ "key": "a6",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ },
+ {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "DecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "decision",
+ "value": {
+ "key": "decision",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ },
+ {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "MakeDecisionEvent",
+ "version": "0.0.1"
+ },
+ "nameSpace": "org.onap.policy.apex.domains.decisionmaker",
+ "source": "DCAE",
+ "target": "apex",
+ "parameter": {
+ "entry": [
+ {
+ "key": "mode",
+ "value": {
+ "key": "mode",
+ "fieldSchemaKey": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "optional": false
+ }
+ }
+ ]
+ },
+ "toscaPolicyState": ""
+ }
+ }
+ ]
+ }
+ },
+ "albums": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Albums",
+ "version": "0.0.1"
+ },
+ "albums": {
+ "entry": [
+ {
+ "key": {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "AnswerAlbum",
+ "version": "0.0.1"
+ },
+ "scope": "policy",
+ "isWritable": true,
+ "itemSchema": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ }
+ }
+ },
+ {
+ "key": {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "LastAnswerAlbum",
+ "version": "0.0.1"
+ },
+ "scope": "policy",
+ "isWritable": true,
+ "itemSchema": {
+ "name": "SimpleIntegerType",
+ "version": "0.0.1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "schemas": {
+ "key": {
+ "name": "DecisionMakerPolicyModel_Schemas",
+ "version": "0.0.1"
+ },
+ "schemas": {
+ "entry": [
+ {
+ "key": {
+ "name": "SimpleIntegerType",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "SimpleIntegerType",
+ "version": "0.0.1"
+ },
+ "schemaFlavour": "Java",
+ "schemaDefinition": "java.lang.Integer"
+ }
+ },
+ {
+ "key": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "value": {
+ "key": {
+ "name": "SimpleStringType",
+ "version": "0.0.1"
+ },
+ "schemaFlavour": "Java",
+ "schemaDefinition": "java.lang.String"
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml b/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml
new file mode 100644
index 000000000..f59d25b54
--- /dev/null
+++ b/models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml
@@ -0,0 +1,1336 @@
+---
+# Representation of list of metadataSet entities as node templates in tosca that can be persisted to the database independently.
+
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+node_types:
+ org.onap.nodetypes.policy.MetadataSet:
+ derived_from: tosca.nodetypes.Root
+ version: 1.0.0
+topology_template:
+ node_templates:
+ apexMetadata_grpc:
+ version: 1.2.1
+ type: org.onap.nodetypes.policy.MetadataSet
+ type_version: 1.0.0
+ description: Metadata set for GRPC
+ metadata:
+ policyModel:
+ key:
+ name: GrpcPolicyModel
+ version: 1.0.1
+ threshold: 3.14
+ state: active
+ apexMetadata_adaptive:
+ version: 2.3.1
+ type: org.onap.nodetypes.policy.MetadataSet
+ type_version: 1.0.0
+ description: Metadata set for an Adaptive Policy
+ metadata:
+ policyModel:
+ key:
+ name: AdaptivePolicyModel
+ version: 1.2.1
+ radius: 1.23
+ height: 2.13
+ length: 45
+ apexMetadata_decisionMaker:
+ version: 1.0.0
+ type: org.onap.nodetypes.policy.MetadataSet
+ type_version: 1.0.0
+ description: Metadata set for an Adaptive Policy
+ metadata:
+ policyModel:
+ key:
+ name: DecisionMakerPolicyModel
+ version: 1.0.0
+ keyInformation:
+ key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ keyInfoMap:
+ entry:
+ - key:
+ name: AnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerAlbum
+ version: 0.0.1
+ UUID: 4ea21a2c-5dc7-337f-ba13-f427a4ae79a1
+ description: Generated description for concept referred to by key
+ "AnswerAlbum:0.0.1"
+ - key:
+ name: AnswerEvent
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerEvent
+ version: 0.0.1
+ UUID: ce2233b8-bb89-3c5e-a18f-1d13089d2bb6
+ description: Generated description for concept referred to by key
+ "AnswerEvent:0.0.1"
+ - key:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ UUID: c8254064-b171-3ccb-85c0-29b5719ee8fc
+ description: Generated description for concept referred to by key
+ "AnswerInitPolicy:0.0.1"
+ - key:
+ name: AnswerInitTask
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerInitTask
+ version: 0.0.1
+ UUID: 28fb33d2-a4e0-3046-8302-7baf9a2056d1
+ description: Generated description for concept referred to by key
+ "AnswerInitTask:0.0.1"
+ - key:
+ name: DecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ UUID: 487acc75-b5a1-3285-90cf-98ecd6fb3500
+ description: Generated description for concept referred to by key
+ "DecisionEvent:0.0.1"
+ - key:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ UUID: 9e8dda9a-6f85-311d-842b-00b5b5578edd
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicy:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel
+ version: 0.0.1
+ UUID: d7789464-e4d1-382e-8481-fba53fa7b9a9
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Albums
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Albums
+ version: 0.0.1
+ UUID: e5dfbadd-5229-3ad9-996c-eda030ef5dc1
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_Albums:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Events
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Events
+ version: 0.0.1
+ UUID: b4248202-ff8e-3d45-8b3d-0ed0fd2eaed4
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_Events:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ UUID: 693b1b29-c4c6-34ba-98e1-bc1a7576f0f8
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_KeyInfo:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Policies
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Policies
+ version: 0.0.1
+ UUID: 2dee1e42-9caa-32b1-9298-784dcdcb9cae
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_Policies:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Schemas
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Schemas
+ version: 0.0.1
+ UUID: c256f102-2681-3f35-bbbd-1f4948587e15
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_Schemas:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Tasks
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Tasks
+ version: 0.0.1
+ UUID: 660cbdba-687d-3a05-ba26-69daf93a8158
+ description: Generated description for concept referred to by key
+ "DecisionMakerPolicyModel_Tasks:0.0.1"
+ - key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ UUID: da31cee8-2e84-39d2-9337-9ee3bf347c98
+ description: Generated description for concept referred to by key
+ "DitheringAnswerTask:0.0.1"
+ - key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ UUID: 21399145-3fbe-39a5-b863-8a59a8add4a8
+ description: Generated description for concept referred to by key
+ "LastAnswerAlbum:0.0.1"
+ - key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ UUID: 02ec632a-aeae-31fe-8f6d-656e1875749f
+ description: Generated description for concept referred to by key
+ "MakeDecisionEvent:0.0.1"
+ - key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ UUID: 818e6b9e-0109-31f5-a95c-17f6fb016027
+ description: Generated description for concept referred to by key
+ "OptimisticAnswerTask:0.0.1"
+ - key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ UUID: 8f4a707e-0d8b-3e09-b921-332f6f81f302
+ description: Generated description for concept referred to by key
+ "PessimisticAnswerTask:0.0.1"
+ - key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ UUID: bfb0af88-b454-3b08-911f-7ff2475350bf
+ description: Generated description for concept referred to by key
+ "RandomAnswerTask:0.0.1"
+ - key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ UUID: eac6fb59-8aca-3011-b7ba-69875f1db4b6
+ description: Generated description for concept referred to by key
+ "RoundRobinAnswerTask:0.0.1"
+ - key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ UUID: ab00a5b8-7edd-340f-8140-4d14f571edfb
+ description: Generated description for concept referred to by key
+ "SimpleIntegerType:0.0.1"
+ - key:
+ name: SimpleStringType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleStringType
+ version: 0.0.1
+ UUID: 8a4957cf-9493-3a76-8c22-a208e23259af
+ description: Generated description for concept referred to by key
+ "SimpleStringType:0.0.1"
+ policies:
+ key:
+ name: DecisionMakerPolicyModel_Policies
+ version: 0.0.1
+ policyMap:
+ entry:
+ - key:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ value:
+ policyKey:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ template: freestyle
+ state:
+ entry:
+ - key: AnswerInitState
+ value:
+ stateKey:
+ parentKeyName: AnswerInitPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: 'NULL'
+ localName: AnswerInitState
+ trigger:
+ name: AnswerEvent
+ version: 0.0.1
+ stateOutputs:
+ entry:
+ - key: AnswerInitOutput
+ value:
+ key:
+ parentKeyName: AnswerInitPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: AnswerInitState
+ localName: AnswerInitOutput
+ outgoingEvent:
+ name: AnswerEvent
+ version: 0.0.1
+ outgoingEventReference:
+ - name: AnswerEvent
+ version: 0.0.1
+ nextState:
+ parentKeyName: 'NULL'
+ parentKeyVersion: 0.0.0
+ parentLocalName: 'NULL'
+ localName: 'NULL'
+ contextAlbumReference: []
+ taskSelectionLogic:
+ key: 'NULL'
+ logicFlavour: UNDEFINED
+ logic: ''
+ stateFinalizerLogicMap:
+ entry: []
+ defaultTask:
+ name: AnswerInitTask
+ version: 0.0.1
+ taskReferences:
+ entry:
+ - key:
+ name: AnswerInitTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: AnswerInitPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: AnswerInitState
+ localName: AnswerInitPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: AnswerInitPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: AnswerInitState
+ localName: AnswerInitOutput
+ firstState: AnswerInitState
+ - key:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ value:
+ policyKey:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ template: freestyle
+ state:
+ entry:
+ - key: MakeDecisionState
+ value:
+ stateKey:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: 'NULL'
+ localName: MakeDecisionState
+ trigger:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ stateOutputs:
+ entry:
+ - key: DecisionFinalOutput
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ outgoingEvent:
+ name: DecisionEvent
+ version: 0.0.1
+ outgoingEventReference:
+ - name: DecisionEvent
+ version: 0.0.1
+ nextState:
+ parentKeyName: 'NULL'
+ parentKeyVersion: 0.0.0
+ parentLocalName: 'NULL'
+ localName: 'NULL'
+ contextAlbumReference: []
+ taskSelectionLogic:
+ key: TaskSelectionLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ if (executor.inFields.get("mode").equals("random")) {
+ executor.subject.getTaskKey("RandomAnswerTask").copyTo(executor.selectedTask);
+ }
+ else if (executor.inFields.get("mode").equals("pessimistic")) {
+ executor.subject.getTaskKey("PessimisticAnswerTask").copyTo(executor.selectedTask);
+ }
+ else if (executor.inFields.get("mode").equals("optimistic")) {
+ executor.subject.getTaskKey("OptimisticAnswerTask").copyTo(executor.selectedTask);
+ }
+ else if (executor.inFields.get("mode").equals("dithering")) {
+ executor.subject.getTaskKey("DitheringAnswerTask").copyTo(executor.selectedTask);
+ }
+ else if (executor.inFields.get("mode").equals("roundrobin")) {
+ executor.subject.getTaskKey("RoundRobinAnswerTask").copyTo(executor.selectedTask);
+ }
+
+ executor.logger.info("Answer Selected Task:" + executor.selectedTask);
+
+ true;
+ stateFinalizerLogicMap:
+ entry: []
+ defaultTask:
+ name: RandomAnswerTask
+ version: 0.0.1
+ taskReferences:
+ entry:
+ - key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionMakerPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ - key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionMakerPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ - key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionMakerPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ - key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionMakerPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ - key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionMakerPolicy
+ outputType: DIRECT
+ output:
+ parentKeyName: DecisionMakerPolicy
+ parentKeyVersion: 0.0.1
+ parentLocalName: MakeDecisionState
+ localName: DecisionFinalOutput
+ firstState: MakeDecisionState
+ tasks:
+ key:
+ name: DecisionMakerPolicyModel_Tasks
+ version: 0.0.1
+ taskMap:
+ entry:
+ - key:
+ name: AnswerInitTask
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerInitTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: AnswerEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: a0
+ value:
+ key: a0
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a1
+ value:
+ key: a1
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a2
+ value:
+ key: a2
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a3
+ value:
+ key: a3
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a4
+ value:
+ key: a4
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a5
+ value:
+ key: a5
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a6
+ value:
+ key: a6
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: AnswerEvent
+ value:
+ key:
+ name: AnswerEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: a0
+ value:
+ key: a0
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a1
+ value:
+ key: a1
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a2
+ value:
+ key: a2
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a3
+ value:
+ key: a3
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a4
+ value:
+ key: a4
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a5
+ value:
+ key: a5
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a6
+ value:
+ key: a6
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ - name: LastAnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var answerAlbum = executor.getContextAlbum("AnswerAlbum");
+
+ answerAlbum.put("a0", executor.inFields.get("a0"));
+ answerAlbum.put("a1", executor.inFields.get("a1"));
+ answerAlbum.put("a2", executor.inFields.get("a2"));
+ answerAlbum.put("a3", executor.inFields.get("a3"));
+ answerAlbum.put("a4", executor.inFields.get("a4"));
+ answerAlbum.put("a5", executor.inFields.get("a5"));
+ answerAlbum.put("a6", executor.inFields.get("a6"));
+
+ var lastAnswerAlbum = executor.getContextAlbum("LastAnswerAlbum");
+ lastAnswerAlbum.put("lastAnswer", answerAlbum.size() - 1);
+
+ executor.outFields.put("a0", answerAlbum.get("a0"));
+ executor.outFields.put("a1", answerAlbum.get("a1"));
+ executor.outFields.put("a2", answerAlbum.get("a2"));
+ executor.outFields.put("a3", answerAlbum.get("a3"));
+ executor.outFields.put("a4", answerAlbum.get("a4"));
+ executor.outFields.put("a5", answerAlbum.get("a5"));
+ executor.outFields.put("a6", answerAlbum.get("a6"));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ - key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: DecisionEvent
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var size = executor.getContextAlbum("AnswerAlbum").size();
+
+ var selection = 2 + Math.floor(Math.random() * 3);
+
+ var selectionA = "a" + selection;
+
+ executor.logger.info(size);
+ executor.logger.info(selectionA);
+
+ executor.outFields.put("decision", executor.getContextAlbum("AnswerAlbum").get(selectionA));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ - key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: DecisionEvent
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var size = executor.getContextAlbum("AnswerAlbum").size();
+
+ var selection = size - Math.floor(Math.random() * size / 2) - 1;
+
+ var selectionA = "a" + selection;
+
+ executor.logger.info(size);
+ executor.logger.info(selectionA);
+
+ executor.outFields.put("decision", executor.getContextAlbum("AnswerAlbum").get(selectionA));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ - key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: DecisionEvent
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var size = executor.getContextAlbum("AnswerAlbum").size();
+
+ var selection = Math.floor(Math.random() * size / 2);
+
+ var selectionA = "a" + selection;
+
+ executor.logger.info(size);
+ executor.logger.info(selectionA);
+
+ executor.outFields.put("decision", executor.getContextAlbum("AnswerAlbum").get(selectionA));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ - key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: DecisionEvent
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var size = executor.getContextAlbum("AnswerAlbum").size();
+
+ var selection = Math.floor(Math.random() * size);
+
+ var selectionA = "a" + selection;
+
+ executor.logger.info(size);
+ executor.logger.info(selectionA);
+
+ executor.outFields.put("decision", executor.getContextAlbum("AnswerAlbum").get(selectionA));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ - key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ inputEvent:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ outputEvents:
+ entry:
+ - key: DecisionEvent
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ taskParameters:
+ entry: []
+ contextAlbumReference:
+ - name: AnswerAlbum
+ version: 0.0.1
+ - name: LastAnswerAlbum
+ version: 0.0.1
+ taskLogic:
+ key: TaskLogic
+ logicFlavour: JAVASCRIPT
+ logic: |-
+ /*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2016-2018 Ericsson. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+ executor.logger.info(executor.subject.id);
+ executor.logger.info(executor.inFields);
+
+ var size = executor.getContextAlbum("AnswerAlbum").size();
+ var lastAnswer = executor.getContextAlbum("LastAnswerAlbum").get("lastAnswer");
+
+ executor.logger.info(size);
+ executor.logger.info(lastAnswer);
+
+ var answer = ++lastAnswer;
+ if (answer >= size) {
+ answer = 0;
+ }
+
+ executor.getContextAlbum("LastAnswerAlbum").put("lastAnswer", answer)
+
+ var selectionA = "a" + answer;
+
+ executor.logger.info(selectionA);
+
+ executor.outFields.put("decision", executor.getContextAlbum("AnswerAlbum").get(selectionA));
+
+ executor.logger.info(executor.outFields);
+
+ true;
+ events:
+ key:
+ name: DecisionMakerPolicyModel_Events
+ version: 0.0.1
+ eventMap:
+ entry:
+ - key:
+ name: AnswerEvent
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: a0
+ value:
+ key: a0
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a1
+ value:
+ key: a1
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a2
+ value:
+ key: a2
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a3
+ value:
+ key: a3
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a4
+ value:
+ key: a4
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a5
+ value:
+ key: a5
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ - key: a6
+ value:
+ key: a6
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ - key:
+ name: DecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: decision
+ value:
+ key: decision
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ - key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ nameSpace: org.onap.policy.apex.domains.decisionmaker
+ source: DCAE
+ target: apex
+ parameter:
+ entry:
+ - key: mode
+ value:
+ key: mode
+ fieldSchemaKey:
+ name: SimpleStringType
+ version: 0.0.1
+ optional: false
+ toscaPolicyState: ''
+ albums:
+ key:
+ name: DecisionMakerPolicyModel_Albums
+ version: 0.0.1
+ albums:
+ entry:
+ - key:
+ name: AnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerAlbum
+ version: 0.0.1
+ scope: policy
+ isWritable: true
+ itemSchema:
+ name: SimpleStringType
+ version: 0.0.1
+ - key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ scope: policy
+ isWritable: true
+ itemSchema:
+ name: SimpleIntegerType
+ version: 0.0.1
+ schemas:
+ key:
+ name: DecisionMakerPolicyModel_Schemas
+ version: 0.0.1
+ schemas:
+ entry:
+ - key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ schemaFlavour: Java
+ schemaDefinition: java.lang.Integer
+ - key:
+ name: SimpleStringType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleStringType
+ version: 0.0.1
+ schemaFlavour: Java
+ schemaDefinition: java.lang.String
diff --git a/models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml b/models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml
new file mode 100644
index 000000000..615402b11
--- /dev/null
+++ b/models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml
@@ -0,0 +1,130 @@
+---
+# Representation of apex decision maker policy with metadataSet reference in the metadata field.
+
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+topology_template:
+ policies:
+ - operational.apex.decisionMaker:
+ type: onap.policies.native.Apex
+ type_version: 1.0.0
+ name: operational.apex.decisionMaker
+ version: 1.0.0
+ metadata:
+ metadataSetName: apexMetadata_decisionMaker
+ metadataSetVersion: 1.0.0
+ properties:
+ engineServiceParameters:
+ name: MyApexEngine
+ version: 0.0.1
+ id: 45
+ instanceCount: 4
+ deploymentPort: 12561
+ engineParameters:
+ executorParameters:
+ JAVASCRIPT:
+ parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+ contextParameters:
+ parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+ schemaParameters:
+ Avro:
+ parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters
+ Java:
+ parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters
+ jsonAdapters:
+ Instant:
+ adaptedClass: java.time.Instant
+ adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter
+ taskParameters:
+ - key: ParameterKey1
+ value: ParameterValue1
+ - taskId: AAILookupTask:0.0.1
+ key: SomeKeyForThisTask
+ value: Value
+ eventInputParameters:
+ GuardRequestorConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTREQUESTOR
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+ parameters:
+ url: http://111.222.333.444:5555/pdp/api/getDecision
+ httpMethod: POST
+ restRequestTimeout: 2000
+ httpHeader: Authorization:aaaaaaaaa== ClientAuth:bbbbbbbbb=
+ eventProtocolParameters:
+ eventProtocol: JSON
+ eventName: GuardResponseEvent
+ eventNameFilter: GuardResponseEvent
+ requestorMode: true
+ requestorPeer: GuardRequestorProducer
+ requestorTimeout: 500
+ DCAEConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/unauthenticated.DCAE_CL_OUTPUT/APEX/1?timeout=60000
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ nameAlias: closedLoopControlName
+ versionAlias: version
+ sourceAlias: from
+ pojoField: VirtualControlLoopEvent
+ eventName: ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e
+ APPCConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/APPC-LCM-WRITE/APEX/1?timeout=60000
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ pojoField: APPCLCMResponseEvent
+ eventName: APPCRestartVNFResponseEvent
+ eventNameFilter: APPCRestartVNFResponseEvent
+ eventOutputParameters:
+ logProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: FILE
+ parameters:
+ fileName: "/tmp/VCPEEventsOut.json"
+ eventProtocolParameters:
+ eventProtocol: JSON
+ GuardRequestorProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTREQUESTOR
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+ eventProtocolParameters:
+ eventProtocol: JSON
+ eventNameFilter: GuardRequestEvent
+ requestorMode: true
+ requestorPeer: GuardRequestorConsumer
+ requestorTimeout: 500
+ APPCProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/APPC-LCM-READ
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ sourceAlias: from
+ pojoField: APPCLCMRequestEvent
+ eventNameFilter: APPCRestartVNFRequestEvent
+ PolicyLogProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/POLICY-CL-MGT
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ sourceAlias: from
+ pojoField: VirtualControlLoopNotification
+ eventNameFilter: ControlLoopLogEvent
diff --git a/models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml b/models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml
new file mode 100644
index 000000000..c257cdd3c
--- /dev/null
+++ b/models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml
@@ -0,0 +1,338 @@
+---
+# Representation of apex decision maker policy that will be passed on to the apex-pdp from PAP.
+# The metadataSet definition for the metadata reference is added under the metadata field of the policy by PAP.
+
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+topology_template:
+ policies:
+ - operational.apex.decisionMaker:
+ type: onap.policies.controlloop.operational.common.apex.decisionMaker
+ type_version: 1.0.0
+ derived_from: tosca.policies.Root
+ name: operational.apex.decisionMaker
+ version: 1.0.0
+ metadata:
+ policyModel:
+ key:
+ name: DecisionMakerPolicyModel
+ version: 0.0.1
+ keyInformation:
+ key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ keyInfoMap:
+ entry:
+ - key:
+ name: AnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerAlbum
+ version: 0.0.1
+ UUID: 4ea21a2c-5dc7-337f-ba13-f427a4ae79a1
+ description: Generated description for concept referred to by key "AnswerAlbum:0.0.1"
+ - key:
+ name: AnswerEvent
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerEvent
+ version: 0.0.1
+ UUID: ce2233b8-bb89-3c5e-a18f-1d13089d2bb6
+ description: Generated description for concept referred to by key "AnswerEvent:0.0.1"
+ - key:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerInitPolicy
+ version: 0.0.1
+ UUID: c8254064-b171-3ccb-85c0-29b5719ee8fc
+ description: Generated description for concept referred to by key "AnswerInitPolicy:0.0.1"
+ - key:
+ name: AnswerInitTask
+ version: 0.0.1
+ value:
+ key:
+ name: AnswerInitTask
+ version: 0.0.1
+ UUID: 28fb33d2-a4e0-3046-8302-7baf9a2056d1
+ description: Generated description for concept referred to by key "AnswerInitTask:0.0.1"
+ - key:
+ name: DecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionEvent
+ version: 0.0.1
+ UUID: 487acc75-b5a1-3285-90cf-98ecd6fb3500
+ description: Generated description for concept referred to by key "DecisionEvent:0.0.1"
+ - key:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicy
+ version: 0.0.1
+ UUID: 9e8dda9a-6f85-311d-842b-00b5b5578edd
+ description: Generated description for concept referred to by key "DecisionMakerPolicy:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel
+ version: 0.0.1
+ UUID: d7789464-e4d1-382e-8481-fba53fa7b9a9
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Albums
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Albums
+ version: 0.0.1
+ UUID: e5dfbadd-5229-3ad9-996c-eda030ef5dc1
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_Albums:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Events
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Events
+ version: 0.0.1
+ UUID: b4248202-ff8e-3d45-8b3d-0ed0fd2eaed4
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_Events:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_KeyInfo
+ version: 0.0.1
+ UUID: 693b1b29-c4c6-34ba-98e1-bc1a7576f0f8
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_KeyInfo:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Policies
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Policies
+ version: 0.0.1
+ UUID: 2dee1e42-9caa-32b1-9298-784dcdcb9cae
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_Policies:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Schemas
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Schemas
+ version: 0.0.1
+ UUID: c256f102-2681-3f35-bbbd-1f4948587e15
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_Schemas:0.0.1"
+ - key:
+ name: DecisionMakerPolicyModel_Tasks
+ version: 0.0.1
+ value:
+ key:
+ name: DecisionMakerPolicyModel_Tasks
+ version: 0.0.1
+ UUID: 660cbdba-687d-3a05-ba26-69daf93a8158
+ description: Generated description for concept referred to by key "DecisionMakerPolicyModel_Tasks:0.0.1"
+ - key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: DitheringAnswerTask
+ version: 0.0.1
+ UUID: da31cee8-2e84-39d2-9337-9ee3bf347c98
+ description: Generated description for concept referred to by key "DitheringAnswerTask:0.0.1"
+ - key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ value:
+ key:
+ name: LastAnswerAlbum
+ version: 0.0.1
+ UUID: 21399145-3fbe-39a5-b863-8a59a8add4a8
+ description: Generated description for concept referred to by key "LastAnswerAlbum:0.0.1"
+ - key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ value:
+ key:
+ name: MakeDecisionEvent
+ version: 0.0.1
+ UUID: 02ec632a-aeae-31fe-8f6d-656e1875749f
+ description: Generated description for concept referred to by key "MakeDecisionEvent:0.0.1"
+ - key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: OptimisticAnswerTask
+ version: 0.0.1
+ UUID: 818e6b9e-0109-31f5-a95c-17f6fb016027
+ description: Generated description for concept referred to by key "OptimisticAnswerTask:0.0.1"
+ - key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: PessimisticAnswerTask
+ version: 0.0.1
+ UUID: 8f4a707e-0d8b-3e09-b921-332f6f81f302
+ description: Generated description for concept referred to by key "PessimisticAnswerTask:0.0.1"
+ - key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RandomAnswerTask
+ version: 0.0.1
+ UUID: bfb0af88-b454-3b08-911f-7ff2475350bf
+ description: Generated description for concept referred to by key "RandomAnswerTask:0.0.1"
+ - key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ value:
+ key:
+ name: RoundRobinAnswerTask
+ version: 0.0.1
+ UUID: eac6fb59-8aca-3011-b7ba-69875f1db4b6
+ description: Generated description for concept referred to by key "RoundRobinAnswerTask:0.0.1"
+ - key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleIntegerType
+ version: 0.0.1
+ UUID: ab00a5b8-7edd-340f-8140-4d14f571edfb
+ description: Generated description for concept referred to by key "SimpleIntegerType:0.0.1"
+ - key:
+ name: SimpleStringType
+ version: 0.0.1
+ value:
+ key:
+ name: SimpleStringType
+ version: 0.0.1
+ UUID: 8a4957cf-9493-3a76-8c22-a208e23259af
+ description: Generated description for concept referred to by key "SimpleStringType:0.0.1"
+ properties:
+ engineServiceParameters:
+ name: MyApexEngine
+ version: 0.0.1
+ id: 45
+ instanceCount: 4
+ deploymentPort: 12561
+ engineParameters:
+ executorParameters:
+ JAVASCRIPT:
+ parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+ contextParameters:
+ parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+ schemaParameters:
+ Avro:
+ parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters
+ Java:
+ parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters
+ jsonAdapters:
+ Instant:
+ adaptedClass: java.time.Instant
+ adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter
+ taskParameters:
+ - key: ParameterKey1
+ value: ParameterValue1
+ - taskId: AAILookupTask:0.0.1
+ key: SomeKeyForThisTask
+ value: Value
+ eventInputParameters:
+ GuardRequestorConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTREQUESTOR
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+ parameters:
+ url: http://111.222.333.444:5555/pdp/api/getDecision
+ httpMethod: POST
+ restRequestTimeout: 2000
+ httpHeader: Authorization:aaaaaaaaa== ClientAuth:bbbbbbbbb=
+ eventProtocolParameters:
+ eventProtocol: JSON
+ eventName: GuardResponseEvent
+ eventNameFilter: GuardResponseEvent
+ requestorMode: true
+ requestorPeer: GuardRequestorProducer
+ requestorTimeout: 500
+ DCAEConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/unauthenticated.DCAE_CL_OUTPUT/APEX/1?timeout=60000
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ nameAlias: closedLoopControlName
+ versionAlias: version
+ sourceAlias: from
+ pojoField: VirtualControlLoopEvent
+ eventName: ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e
+ APPCConsumer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/APPC-LCM-WRITE/APEX/1?timeout=60000
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ pojoField: APPCLCMResponseEvent
+ eventName: APPCRestartVNFResponseEvent
+ eventNameFilter: APPCRestartVNFResponseEvent
+ eventOutputParameters:
+ logProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: FILE
+ parameters:
+ fileName: "/tmp/VCPEEventsOut.json"
+ eventProtocolParameters:
+ eventProtocol: JSON
+ GuardRequestorProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTREQUESTOR
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+ eventProtocolParameters:
+ eventProtocol: JSON
+ eventNameFilter: GuardRequestEvent
+ requestorMode: true
+ requestorPeer: GuardRequestorConsumer
+ requestorTimeout: 500
+ APPCProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/APPC-LCM-READ
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ sourceAlias: from
+ pojoField: APPCLCMRequestEvent
+ eventNameFilter: APPCRestartVNFRequestEvent
+ PolicyLogProducer:
+ carrierTechnologyParameters:
+ carrierTechnology: RESTCLIENT
+ parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+ parameters:
+ url: http://message-router:3904/events/POLICY-CL-MGT
+ eventProtocolParameters:
+ eventProtocol: JSON
+ parameters:
+ versionAlias: version
+ sourceAlias: from
+ pojoField: VirtualControlLoopNotification
+ eventNameFilter: ControlLoopLogEvent
diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java b/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java
index 85aab6ec4..5cc5fc96b 100644
--- a/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java
+++ b/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
* Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
@@ -25,8 +25,11 @@ package org.onap.policy.models.provider;
import java.time.Instant;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.pap.concepts.PolicyAudit;
import org.onap.policy.models.pap.persistence.provider.PolicyAuditProvider.AuditFilter;
import org.onap.policy.models.pdp.concepts.Pdp;
@@ -38,6 +41,8 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup;
import org.onap.policy.models.pdp.persistence.provider.PdpFilterParameters;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -254,6 +259,59 @@ public interface PolicyModelsProvider extends AutoCloseable {
public ToscaServiceTemplate deletePolicy(@NonNull final String name, @NonNull final String version)
throws PfModelException;
+
+ /**
+ * Create tosca node templates.
+ *
+ * @param serviceTemplate the definitions of the new node templates to be created.
+ * @return the tosca node templates that were created
+ * @throws PfModelException on errors creating tosca node templates
+ */
+ public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+ throws PfModelException;
+
+ /**
+ * Update tosca node templates.
+ *
+ * @param serviceTemplate with node templates to be updated.
+ * @return the service template with node templates that were updated
+ * @throws PfModelException on errors updating tosca node templates
+ */
+ public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+ throws PfModelRuntimeException, PfModelException;
+
+ /**
+ * Delete a tosca node template.
+ *
+ * @param name the name of the node template to delete.
+ * @param version the version of the node template to delete.
+ * @return the service template with node templates that was deleted
+ * @throws PfModelException on errors deleting a node template
+ */
+ public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @NonNull final String version)
+ throws PfModelException;
+
+
+ /**
+ * Get filtered node template metadataSet entities.
+ *
+ * @return the list of metadataSet found
+ * @throws PfModelException on errors getting node template metadataSet
+ */
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name,
+ final String version)
+ throws PfModelException;
+
+ /**
+ * Get filtered node template entities.
+ *
+ * @return the list of nodeTemplates found
+ * @throws PfModelException on errors getting node template
+ */
+ public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+ final String version)
+ throws PfModelException;
+
/**
* Get PDP groups.
*
diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java b/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java
index fa7658355..ffb470628 100644
--- a/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java
+++ b/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation.
+ * Copyright (C) 2021-2022 Nordix Foundation.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,8 +23,10 @@ package org.onap.policy.models.provider.impl;
import java.time.Instant;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
import javax.ws.rs.core.Response;
import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.dao.PfDao;
@@ -44,6 +46,8 @@ import org.onap.policy.models.provider.PolicyModelsProvider;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -194,6 +198,45 @@ public abstract class AbstractPolicyModelsProvider implements PolicyModelsProvid
}
@Override
+ public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+ assertInitialized();
+ return new AuthorativeToscaProvider().createToscaNodeTemplates(getPfDao(), serviceTemplate);
+ }
+
+ @Override
+ public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+ throws PfModelRuntimeException, PfModelException {
+ assertInitialized();
+ return new AuthorativeToscaProvider().updateToscaNodeTemplates(getPfDao(), serviceTemplate);
+ }
+
+ @Override
+ public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @NonNull final String version)
+ throws PfModelException {
+ assertInitialized();
+ return new AuthorativeToscaProvider().deleteToscaNodeTemplate(getPfDao(), name, version);
+ }
+
+ @Override
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name,
+ final String version)
+ throws PfModelException {
+ assertInitialized();
+ return new AuthorativeToscaProvider().getNodeTemplateMetadataSet(getPfDao(), name, version);
+ }
+
+ @Override
+ public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+ final String version)
+ throws PfModelException {
+ assertInitialized();
+ return new AuthorativeToscaProvider().getToscaNodeTemplate(getPfDao(), name, version);
+ }
+
+
+
+ @Override
public List<PdpGroup> getPdpGroups(final String name) throws PfModelException {
assertInitialized();
return new PdpProvider().getPdpGroups(getPfDao(), name);
diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
index 57c261cb5..561ef5daa 100644
--- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
+++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
* Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
* ================================================================================
@@ -32,6 +32,7 @@ import static org.junit.Assert.assertTrue;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -53,9 +54,12 @@ import org.onap.policy.models.provider.PolicyModelsProviderParameters;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
/**
@@ -567,6 +571,31 @@ public class DatabasePolicyModelsProviderTest {
databaseProvider.close();
}
+ @Test
+ public void testToscaNodeTemplateHandling() throws PfModelException {
+ databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
+
+ ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
+
+ assertEquals("1.0.1",
+ databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
+ .get("metadataSet1").getVersion());
+ assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
+
+ ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+ .get("metadataSet1");
+ nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
+ serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
+ assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
+ .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
+
+ assertThatThrownBy(() -> {
+ databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
+ }).hasMessage("node template invalidName:1.0.1 not found");
+
+ databaseProvider.close();
+ }
+
private List<PdpStatistics> makePdpStatisticsList() {
PdpStatistics pdpStatistics = new PdpStatistics();
pdpStatistics.setPdpInstanceId(NAME);
@@ -576,4 +605,21 @@ public class DatabasePolicyModelsProviderTest {
List<PdpStatistics> statisticsArrayList = List.of(pdpStatistics);
return statisticsArrayList;
}
+
+ private ToscaServiceTemplate makeNodeTemplate() {
+ ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+ serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
+ serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
+ serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
+ ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
+ nodeTemplate1.setName("metadataSet1");
+ nodeTemplate1.setVersion("1.0.1");
+ nodeTemplate1.setType("org.onap.policy.metadataSet");
+ nodeTemplate1.setTypeVersion("1.0.0");
+ nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
+
+ serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
+
+ return serviceTemplate;
+ }
}
diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java
index 6cb95ee54..410ecf26a 100644
--- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java
+++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
* Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
* ================================================================================
@@ -27,8 +27,10 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import javax.ws.rs.core.Response;
import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.pap.concepts.PolicyAudit;
@@ -43,6 +45,8 @@ import org.onap.policy.models.pdp.persistence.provider.PdpFilterParameters;
import org.onap.policy.models.provider.PolicyModelsProvider;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -135,6 +139,38 @@ public class DummyBadProviderImpl implements PolicyModelsProvider {
}
@Override
+ public ToscaServiceTemplate createToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+ return null;
+ }
+
+ @Override
+ public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate)
+ throws PfModelRuntimeException, PfModelException {
+ return null;
+ }
+
+ @Override
+ public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull String name, @NonNull String version)
+ throws PfModelException {
+ return null;
+ }
+
+ @Override
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name,
+ @NonNull String version)
+ throws PfModelException {
+ return null;
+ }
+
+ @Override
+ public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+ final String version)
+ throws PfModelException {
+ return null;
+ }
+
+ @Override
public List<PdpGroup> getPdpGroups(String name) throws PfModelException {
return Collections.emptyList();
}
diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java
index b9b34a24d..dcc436a05 100644
--- a/models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java
+++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
* Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
* ================================================================================
@@ -26,10 +26,12 @@ import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
import javax.ws.rs.core.Response;
import lombok.NonNull;
import org.onap.policy.common.utils.coder.StandardCoder;
import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.pap.concepts.PolicyAudit;
@@ -45,6 +47,8 @@ import org.onap.policy.models.provider.PolicyModelsProvider;
import org.onap.policy.models.provider.PolicyModelsProviderParameters;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -179,6 +183,38 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider {
}
@Override
+ public ToscaServiceTemplate createToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+ return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json");
+ }
+
+ @Override
+ public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate)
+ throws PfModelRuntimeException, PfModelException {
+ return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json");
+ }
+
+ @Override
+ public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull String name, @NonNull String version)
+ throws PfModelException {
+ return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json");
+ }
+
+ @Override
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name,
+ @NonNull String version)
+ throws PfModelException {
+ return new ArrayList<>();
+ }
+
+ @Override
+ public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+ final String version)
+ throws PfModelException {
+ return new ArrayList<>();
+ }
+
+ @Override
public List<PdpGroup> getPdpGroups(final String name) throws PfModelException {
return new ArrayList<>();
}
@@ -297,4 +333,27 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider {
return serviceTemplate;
}
+
+ /**
+ * Return a tosca node template dummy response.
+ *
+ * @param fileName the file name containing the dummy response
+ * @return the service template with the dummy response
+ */
+ protected ToscaServiceTemplate getDummyNodeTemplateResponse(final String fileName) {
+ var standardCoder = new StandardCoder();
+ ToscaServiceTemplate serviceTemplate;
+
+ try {
+ serviceTemplate =
+ standardCoder.decode(ResourceUtils.getResourceAsString(fileName), ToscaServiceTemplate.class);
+ if (serviceTemplate == null) {
+ throw new PfModelException(Response.Status.INTERNAL_SERVER_ERROR, "error reading specified file");
+ }
+ } catch (Exception exc) {
+ throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "error serializing object", exc);
+ }
+
+ return serviceTemplate;
+ }
}
diff --git a/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json
new file mode 100644
index 000000000..291ef47ac
--- /dev/null
+++ b/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json
@@ -0,0 +1,46 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+ "node_types": {
+ "org.onap.nodetypes.policy.MetadataSet": {
+ "derived_from": "tosca.nodetypes.Root",
+ "version": "1.0.0"
+ }
+ },
+ "topology_template": {
+ "node_templates": {
+ "apexMetadata_grpc": {
+ "version": "1.2.1",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Metadata set for GRPC",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "GrpcPolicyModel",
+ "version": "1.0.1"
+ }
+ },
+ "threshold": 3.14,
+ "state": "active"
+ }
+ },
+ "apexMetadata_adaptive": {
+ "version": "2.3.1",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Metadata set for an Adaptive Policy",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "AdaptivePolicyModel",
+ "version": "1.2.1"
+ }
+ },
+ "radius": 1.23,
+ "height": 2.13,
+ "length": 45
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json
index 27de380c2..27de380c2 100644
--- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json
+++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json
diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json
index 27de380c2..27de380c2 100644
--- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json
+++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json
diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json
index 27de380c2..27de380c2 100644
--- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json
+++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json
diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json
index 477d4477a..477d4477a 100644
--- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json
+++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java
index 919d187de..c339f721e 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP Policy Model
* ================================================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ public class ToscaEntity implements PfNameVersion {
@SerializedName("derived_from")
private String derivedFrom;
- private Map<String, String> metadata;
+ private Map<String, Object> metadata;
private String description;
/**
@@ -67,7 +67,7 @@ public class ToscaEntity implements PfNameVersion {
if (copyObject.metadata != null) {
metadata = new LinkedHashMap<>();
- for (final Entry<String, String> metadataEntry : copyObject.metadata.entrySet()) {
+ for (final Entry<String, Object> metadataEntry : copyObject.metadata.entrySet()) {
metadata.put(metadataEntry.getKey(), metadataEntry.getValue());
}
}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java
index 8171b7d78..2ec9ee2c8 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,6 +35,8 @@ import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.dao.PfDao;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -549,6 +551,125 @@ public class AuthorativeToscaProvider {
}
/**
+ * Create tosca node templates.
+ *
+ * @param dao the DAO to use to access the database
+ * @param toscaServiceTemplate the template with node templates entities to be created.
+ * @return the toscaServiceTemplate with node templates that were created
+ * @throws PfModelException on errors creating node templates
+ */
+ public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final PfDao dao,
+ @NonNull final ToscaServiceTemplate toscaServiceTemplate)
+ throws PfModelException {
+ LOGGER.debug("createToscaNodeTemplates ={}", toscaServiceTemplate);
+ ToscaServiceTemplate createdServiceTemplate;
+
+ synchronized (providerLockObject) {
+ createdServiceTemplate = new SimpleToscaProvider()
+ .createToscaNodeTemplates(dao, new JpaToscaServiceTemplate(toscaServiceTemplate)).toAuthorative();
+ }
+
+ LOGGER.debug("<-createToscaNodeTemplates: createdServiceTemplate={}", createdServiceTemplate);
+ return createdServiceTemplate;
+ }
+
+ /**
+ * Update tosca node templates.
+ *
+ * @param dao the DAO to use to access the database
+ * @param serviceTemplate the service template containing the definitions of the nodeTemplates to be updated.
+ * @return the TOSCA service template containing the nodeTemplates that were updated
+ * @throws PfModelRuntimeException on errors updating node templates
+ */
+ public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final PfDao dao,
+ @NonNull final ToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+ LOGGER.debug("->updateToscaNodeTemplates: serviceTemplate={}", serviceTemplate);
+ ToscaServiceTemplate updatedServiceTemplate;
+
+ synchronized (providerLockObject) {
+ updatedServiceTemplate = new SimpleToscaProvider()
+ .updateToscaNodeTemplates(dao, new JpaToscaServiceTemplate(serviceTemplate)).toAuthorative();
+ }
+
+ LOGGER.debug("<-updateToscaNodeTemplates: updatedServiceTemplate={}", updatedServiceTemplate);
+ return updatedServiceTemplate;
+ }
+
+
+ /**
+ * Delete a tosca node template.
+ *
+ * @param dao the DAO to use to access the database
+ * @param name the name of the node template to delete.
+ * @param version the version of the node template to delete.
+ * @return the TOSCA service template containing the node template that was deleted
+ * @throws PfModelException on errors deleting node template
+ */
+ public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final PfDao dao, @NonNull final String name,
+ @NonNull final String version) throws PfModelException {
+ LOGGER.debug("->deleteToscaNodeTemplate: name={}, version={}", name, version);
+ ToscaServiceTemplate deletedServiceTemplate;
+
+ synchronized (providerLockObject) {
+ deletedServiceTemplate =
+ new SimpleToscaProvider().deleteToscaNodeTemplate(dao, new PfConceptKey(name, version)).toAuthorative();
+ }
+ LOGGER.debug("<-deleteToscaNodeTemplate: name={}, version={}, deletedServiceTemplate={}", name, version,
+ deletedServiceTemplate);
+ return deletedServiceTemplate;
+ }
+
+ /**
+ * Get node template metadataSet.
+ *
+ * @param dao the DAO to use to access the database
+ * @param name the name of the metadataSet to get, null to get all metadataSets
+ * @param version the version of the metadataSet to get, null to get all versions of a metadataSets
+ * @return the metadataSets found
+ * @throws PfModelException on errors getting policy metadataSet
+ */
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSet(
+ @NonNull final PfDao dao, final String name, final String version)
+ throws PfModelException {
+ LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version);
+ List<Map<ToscaEntityKey, Map<String, Object>>> metadataSets;
+
+ synchronized (providerLockObject) {
+ metadataSets = new SimpleToscaProvider().getNodeTemplateMetadata(dao, name, version);
+ }
+ LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, metadataSets={}", name, version,
+ metadataSets);
+ return metadataSets;
+ }
+
+ /**
+ * Get tosca node templates.
+ *
+ * @param dao the DAO to use to access the database
+ * @param name the name of the node template to get, null to get all node templates
+ * @param version the version of the node template to get, null to get all versions of node template
+ * @return the node templates found
+ * @throws PfModelException on errors getting tosca node templates
+ */
+ public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(
+ @NonNull final PfDao dao, final String name, final String version)
+ throws PfModelException {
+ LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version);
+ List<Map<PfConceptKey, ToscaNodeTemplate>> nodeTemplates = new ArrayList<>();
+
+ synchronized (providerLockObject) {
+ new SimpleToscaProvider().getToscaNodeTemplates(dao, name, version)
+ .getConceptMap().forEach((key, value) -> nodeTemplates.add(Map.of(key, value.toAuthorative())));
+ }
+
+ LOGGER.debug("<-getNodeTemplate: name={}, version={}, nodeTemplates={}", name, version,
+ nodeTemplates);
+ return nodeTemplates;
+ }
+
+
+ /**
* Return the contents of a list of maps as a plain list.
*
* @param listOfMaps the list of maps
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java
index 2416bab69..84381fb50 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2020 Nordix Foundation.
+ * Copyright (C) 2019-2020,2022 Nordix Foundation.
* Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,7 @@ import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.EmbeddedId;
+import javax.persistence.Lob;
import javax.persistence.MappedSuperclass;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -66,6 +67,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
private PfConceptKey derivedFrom;
@ElementCollection
+ @Lob
private Map<@NotNull @NotBlank String, @NotNull @NotBlank String> metadata;
@Column
@@ -156,7 +158,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
description = toscaEntity.getDescription();
}
- metadata = PfUtils.mapMap(toscaEntity.getMetadata(), item -> item);
+ metadata = PfUtils.mapMap(toscaEntity.getMetadata(), Object::toString);
}
@Override
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
index 862108b15..e2f61c464 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2020 Nordix Foundation.
+ * Copyright (C) 2019-2020,2022 Nordix Foundation.
* Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,6 +24,8 @@ package org.onap.policy.models.tosca.simple.provider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import javax.ws.rs.core.Response;
import lombok.NonNull;
import org.apache.commons.collections4.CollectionUtils;
@@ -36,9 +38,15 @@ import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.dao.PfDao;
import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaEntityType;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType;
@@ -641,6 +649,195 @@ public class SimpleToscaProvider {
return deletedServiceTemplate;
}
+
+ /**
+ * Get metadata of tosca node templates.
+ *
+ * @param dao the DAO to use to access the database
+ * @param name the name of the nodeTemplate to get, set to null to get all node templates
+ * @param version the version of the metadataSet to get, set to null to get all versions
+ * @return the list of maps with node template key and metadata values found
+ * @throws PfModelException on errors getting metadataSets
+ */
+ public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadata(
+ @NonNull final PfDao dao, final String name, final String version)
+ throws PfModelException {
+ LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version);
+
+ List<Map<ToscaEntityKey, Map<String, Object>>> metadataSets = new ArrayList<>();
+
+ JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+ //Return empty list if no node templates present in db
+ if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+ return metadataSets;
+ }
+ var returnServiceTemplate = new JpaToscaServiceTemplate(dbServiceTemplate);
+ List<ToscaNodeTemplate> toscaNodeTemplates = new ArrayList<>();
+ returnServiceTemplate.getTopologyTemplate()
+ .getNodeTemplates().getConceptMap().forEach((key, value) -> toscaNodeTemplates.add(value
+ .toAuthorative()));
+
+ //Filter metadataSet for specific node template
+ if (name != null && version != null) {
+ var filterKey = new ToscaEntityKey(name, version);
+ toscaNodeTemplates.removeIf(entity -> !entity.getKey().equals(filterKey));
+ }
+ toscaNodeTemplates.forEach(e -> metadataSets.add(Map.of(e.getKey(), e.getMetadata())));
+ LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, metadataSets={}", name, version,
+ metadataSets);
+
+ return metadataSets;
+ }
+
+ /**
+ * Get tosca node templates.
+ *
+ * @param dao the DAO to use to access the database
+ * @param name the name of the node template to get, set to null to get all node templates
+ * @param version the version of the node template to get, set to null to get all versions
+ * @return the node templates with the specified key
+ * @throws PfModelException on errors getting node templates
+ */
+ public JpaToscaNodeTemplates getToscaNodeTemplates(@NonNull final PfDao dao, final String name,
+ final String version)
+ throws PfModelException {
+ LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version);
+
+ var nodeTemplates = new JpaToscaNodeTemplates();
+
+ JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+ //Return empty if no nodeTemplates present in db
+ if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+ return nodeTemplates;
+ }
+ var returnServiceTemplate = new JpaToscaServiceTemplate(dbServiceTemplate);
+ nodeTemplates = returnServiceTemplate.getTopologyTemplate().getNodeTemplates();
+
+ //Filter specific nodeTemplates
+ if (name != null && version != null) {
+ var filterKey = new PfConceptKey(name, version);
+ nodeTemplates.getConceptMap().entrySet().removeIf(entity -> !entity.getKey().equals(filterKey));
+ }
+ LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, nodeTemplates={}", name, version,
+ nodeTemplates);
+
+ return nodeTemplates;
+ }
+
+
+ /**
+ * Update tosca node template.
+ *
+ * @param dao the DAO to use to access the database
+ * @param serviceTemplate the service template containing the definitions of the node templates to be updated.
+ * @return the TOSCA service template containing the node templates that were updated
+ * @throws PfModelRuntimeException on errors updating node templates
+ */
+ public JpaToscaServiceTemplate updateToscaNodeTemplates(@NonNull final PfDao dao,
+ @NonNull final JpaToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+ LOGGER.debug("->updateToscaNodeTemplates: serviceTemplate={}", serviceTemplate);
+
+ ToscaUtils.assertNodeTemplatesExist(serviceTemplate);
+ for (JpaToscaNodeTemplate nodeTemplate : serviceTemplate.getTopologyTemplate().getNodeTemplates()
+ .getAll(null)) {
+
+ //verify if the node template is referenced in the metadata of created policies
+ assertNodeTemplateNotUsedInPolicy(dao, nodeTemplate.getName(), nodeTemplate.getVersion());
+ verifyNodeTypeInDbTemplate(dao, nodeTemplate);
+
+ dao.update(nodeTemplate);
+ }
+ // Return the service template with updated node templates
+ var updatedNodeTemplates = new JpaToscaNodeTemplates();
+ updatedNodeTemplates.setKey(serviceTemplate.getTopologyTemplate().getNodeTemplates().getKey());
+
+ for (PfConceptKey metadataSetKey : serviceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap()
+ .keySet()) {
+ updatedNodeTemplates.getConceptMap().put(metadataSetKey, dao.get(JpaToscaNodeTemplate.class,
+ metadataSetKey));
+ }
+ serviceTemplate.getTopologyTemplate().setNodeTemplates(updatedNodeTemplates);
+
+ LOGGER.debug("<-updatedToscaNodeTemplates: serviceTemplate={}", serviceTemplate);
+ return serviceTemplate;
+ }
+
+ /**
+ * Delete a tosca node template.
+ *
+ * @param dao the DAO to use to access the database
+ * @param nodeTemplateKey the node template key
+ * @return the TOSCA service template containing the node templates that were deleted
+ * @throws PfModelException on errors deleting node templates
+ */
+ public JpaToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final PfDao dao,
+ @NonNull final PfConceptKey nodeTemplateKey)
+ throws PfModelException {
+ LOGGER.debug("->deleteToscaNodeTemplate: key={}", nodeTemplateKey);
+
+ JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+ if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+ throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "no node templates found");
+ }
+ JpaToscaNodeTemplate nodeTemplate4Deletion = dbServiceTemplate.getTopologyTemplate().getNodeTemplates()
+ .get(nodeTemplateKey);
+ if (nodeTemplate4Deletion == null) {
+ throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "node template " + nodeTemplateKey.getId()
+ + NOT_FOUND);
+ }
+
+ //Verify if the node template is referenced in the metadata of created policies
+ assertNodeTemplateNotUsedInPolicy(dao, nodeTemplateKey.getName(), nodeTemplateKey.getVersion());
+
+ dbServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap().remove(nodeTemplateKey);
+ new SimpleToscaServiceTemplateProvider().write(dao, dbServiceTemplate);
+ dao.delete(nodeTemplate4Deletion);
+
+ var deletedServiceTemplate = new JpaToscaServiceTemplate();
+ deletedServiceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate());
+ deletedServiceTemplate.getTopologyTemplate().setNodeTemplates(new JpaToscaNodeTemplates());
+ deletedServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap()
+ .put(nodeTemplateKey, nodeTemplate4Deletion);
+
+ LOGGER.debug("<-deleteToscaNodeTemplate: key={}, serviceTemplate={}", nodeTemplateKey, deletedServiceTemplate);
+ return deletedServiceTemplate;
+ }
+
+ /**
+ * Write a node template to the database.
+ *
+ * @param dao the DAO to use to access the database
+ * @param serviceTemplate the service template to be written
+ * @return the service template created by this method
+ * @throws PfModelException on errors writing the metadataSets
+ */
+ public JpaToscaServiceTemplate createToscaNodeTemplates(@NonNull final PfDao dao,
+ @NonNull final JpaToscaServiceTemplate serviceTemplate)
+ throws PfModelException {
+
+ LOGGER.debug("->write: tosca nodeTemplates={}", serviceTemplate);
+
+ ToscaUtils.assertNodeTemplatesExist(serviceTemplate);
+
+ Optional<JpaToscaNodeTypes> nodeTypes = Optional.ofNullable(serviceTemplate.getNodeTypes());
+ for (JpaToscaNodeTemplate nodeTemplate : serviceTemplate.getTopologyTemplate().getNodeTemplates()
+ .getAll(null)) {
+
+ // verify node types in the db if mismatch/empty entities in the template
+ if (! (nodeTypes.isPresent() && nodeTypes.get().getKeys().contains(nodeTemplate.getType()))) {
+ verifyNodeTypeInDbTemplate(dao, nodeTemplate);
+ }
+ }
+ JpaToscaServiceTemplate writtenServiceTemplate = appendToServiceTemplate(dao, serviceTemplate);
+ LOGGER.debug("<-createdToscaNodeTemplates: writtenServiceTemplate={}", writtenServiceTemplate);
+
+ return serviceTemplate;
+ }
+
/**
* Verify the policy type for a policy exists.
*
@@ -670,6 +867,28 @@ public class SimpleToscaProvider {
}
/**
+ * Verify the node type for a toscaNodeTemplate metadataSet.
+ *
+ * @param dao the DAO to use to access toscaNodeTemplate types in the database
+ * @param toscaNodeTemplate the toscaNodeTemplate to check the toscaNodeTemplate type for
+ */
+ private void verifyNodeTypeInDbTemplate(final PfDao dao, final JpaToscaNodeTemplate toscaNodeTemplate) throws
+ PfModelException {
+ PfConceptKey nodeTypeKey = toscaNodeTemplate.getType();
+
+ JpaToscaNodeType nodeType = null;
+
+ nodeType = dao.get(JpaToscaNodeType.class, nodeTypeKey);
+
+ if (nodeType == null) {
+ String errorMessage =
+ "NODE_TYPE " + nodeTypeKey + " for toscaNodeTemplate " + toscaNodeTemplate.getId()
+ + " does not exist";
+ throw new PfModelException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+ }
+ }
+
+ /**
* Get the latest version of the policy type for the given policy type name.
*
* @param dao the DAO to use to access policy types in the database
@@ -699,4 +918,31 @@ public class SimpleToscaProvider {
return (JpaToscaPolicyType) filterdPolicyTypeList.get(0);
}
+
+ /**
+ * Assert that the node template is not referenced in any Tosca policy.
+ *
+ * @param name the name of node template
+ * @param version the version of node template
+ * @throws PfModelException if node template referenced in a policy
+ */
+ private void assertNodeTemplateNotUsedInPolicy(PfDao dao, String name, String version)
+ throws PfModelException {
+ JpaToscaServiceTemplate dbTemplate;
+ try {
+ //Retrieve all the policies from db, return if policies doesn't exist
+ dbTemplate = getPolicies(dao, null, null);
+ } catch (PfModelRuntimeException e) {
+ LOGGER.debug("Could not verify the node template reference in created policies ", e);
+ return;
+ }
+ for (JpaToscaPolicy policy : dbTemplate.getTopologyTemplate().getPolicies().getConceptMap().values()) {
+ if (policy.getMetadata().getOrDefault("metadataSetName", "").equals(name)
+ && policy.getMetadata().getOrDefault("metadataSetVersion", "").equals(version)) {
+ throw new PfModelException(Response.Status.NOT_ACCEPTABLE,
+ "Node template is in use, it is referenced in Tosca Policy " + policy.getName() + " version "
+ + policy.getVersion());
+ }
+ }
+ }
}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java
index 7f6fbb2f3..6f4b2993f 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation.
+ * Copyright (C) 2020,2022 Nordix Foundation.
* Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -67,6 +67,8 @@ public final class ToscaServiceTemplateUtils {
addFragmentEntitites(compositeTemplate.getDataTypes(), fragmentTemplate.getDataTypes(), result));
compositeTemplate.setPolicyTypes(
addFragmentEntitites(compositeTemplate.getPolicyTypes(), fragmentTemplate.getPolicyTypes(), result));
+ compositeTemplate.setNodeTypes(
+ addFragmentEntitites(compositeTemplate.getNodeTypes(), fragmentTemplate.getNodeTypes(), result));
if (originalTemplate.getTopologyTemplate() != null && fragmentTemplate.getTopologyTemplate() != null) {
if (originalTemplate.getTopologyTemplate()
@@ -74,6 +76,9 @@ public final class ToscaServiceTemplateUtils {
compositeTemplate.getTopologyTemplate()
.setPolicies(addFragmentEntitites(compositeTemplate.getTopologyTemplate().getPolicies(),
fragmentTemplate.getTopologyTemplate().getPolicies(), result));
+ compositeTemplate.getTopologyTemplate()
+ .setNodeTemplates(addFragmentEntitites(compositeTemplate.getTopologyTemplate().getNodeTemplates(),
+ fragmentTemplate.getTopologyTemplate().getNodeTemplates(), result));
} else {
Validated.addResult(result, "topology template",
originalTemplate.getTopologyTemplate().getKey(),
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java
index 5ec8247ac..be0d41d9b 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java
@@ -1,6 +1,6 @@
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
* Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -107,6 +107,15 @@ public final class ToscaUtils {
}
/**
+ * Assert that node templates have been specified correctly.
+ *
+ * @param serviceTemplate the service template containing node templates to be checked
+ */
+ public static void assertNodeTemplatesExist(final JpaToscaServiceTemplate serviceTemplate) {
+ assertExist(serviceTemplate, ToscaUtils::checkNodeTemplateExist);
+ }
+
+ /**
* Check that data types have been specified correctly.
*
* @param serviceTemplate the service template containing data types to be checked
@@ -135,6 +144,16 @@ public final class ToscaUtils {
}
/**
+ * Check that tosca node templates have been specified correctly.
+ *
+ * @param serviceTemplate the service template containing node templates to be checked
+ */
+ public static boolean doNodeTemplatesExist(final JpaToscaServiceTemplate serviceTemplate) {
+
+ return doExist(serviceTemplate, ToscaUtils::checkNodeTemplateExist);
+ }
+
+ /**
* Assert that something have been specified correctly.
*
* @param serviceTemplate the service template containing policy types to be checked
@@ -207,6 +226,20 @@ public final class ToscaUtils {
}
/**
+ * Check if node templates have been specified correctly.
+ */
+ public static String checkNodeTemplateExist(final JpaToscaServiceTemplate serviceTemplate) {
+ if (serviceTemplate.getTopologyTemplate().getNodeTemplates() == null) {
+ return "node templates not present on the service template";
+ }
+
+ if (serviceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap().isEmpty()) {
+ return "no parameters present on the node templates";
+ }
+ return null;
+ }
+
+ /**
* getLatestPolicyTypeVersion Find all the ancestors of an entity type.
*
* @param entityTypes the set of entity types that exist
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java
new file mode 100644
index 000000000..21559344f
--- /dev/null
+++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java
@@ -0,0 +1,315 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.dao.DaoParameters;
+import org.onap.policy.models.dao.PfDao;
+import org.onap.policy.models.dao.PfDaoFactory;
+import org.onap.policy.models.dao.impl.DefaultPfDao;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Test of the {@link AuthorativeToscaProvider} class.
+ */
+public class AuthorativeToscaProviderNodeTemplateTest {
+
+
+ private static final String NODE_TEMPLATES_JSON = "nodetemplates/nodetemplates.metadatasets.input.tosca.json";
+ private static final String UPDATED_METADATA_SET_JSON = "nodetemplates/TestUpdateMetadataSet.json";
+ private static final String CREATE_METADATA_SET_JSON = "nodetemplates/TestCreateMetadataSet.json";
+ private static final String POLICY_WITH_METADATA_SET_REF = "policies/apex.policy.decisionmaker.input.tosca.yaml";
+ private static final String APEX_POLICY_TYPE_YAML = "policytypes/onap.policies.native.Apex.yaml";
+ private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$";
+ private static ToscaServiceTemplate toscaServiceTemplate;
+ private static ToscaServiceTemplate updatedToscaServiceTemplate;
+ private static ToscaServiceTemplate createToscaNodeTemplate;
+ private PfDao pfDao;
+ private StandardCoder standardCoder;
+ private AuthorativeToscaProvider authorativeToscaProvider = new AuthorativeToscaProvider();
+ private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
+
+ /**
+ * Read policy metadataSet input json.
+ * @throws Exception Coder exception
+ */
+ @Before
+ public void fetchToscaNodeTemplatesJson() throws Exception {
+ standardCoder = new StandardCoder();
+ toscaServiceTemplate =
+ standardCoder.decode(ResourceUtils.getResourceAsString(NODE_TEMPLATES_JSON), ToscaServiceTemplate.class);
+ updatedToscaServiceTemplate =
+ standardCoder.decode(ResourceUtils.getResourceAsString(UPDATED_METADATA_SET_JSON),
+ ToscaServiceTemplate.class);
+ createToscaNodeTemplate = standardCoder.decode(ResourceUtils.getResourceAsString(
+ CREATE_METADATA_SET_JSON), ToscaServiceTemplate.class);
+ }
+
+ /**
+ * Set up DAO towards the database.
+ *
+ * @throws Exception on database errors
+ */
+ @Before
+ public void setupDao() throws Exception {
+ final DaoParameters daoParameters = new DaoParameters();
+ daoParameters.setPluginClass(DefaultPfDao.class.getName());
+
+ daoParameters.setPersistenceUnit("ToscaConceptTest");
+
+ Properties jdbcProperties = new Properties();
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
+
+ if (System.getProperty("USE-MARIADB") != null) {
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.mariadb.jdbc.Driver");
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:mariadb://localhost:3306/policy");
+ } else {
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
+ jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,
+ "jdbc:h2:mem:AuthorativeToscaProviderNodeTemplatesTest");
+ }
+
+ daoParameters.setJdbcProperties(jdbcProperties);
+
+ pfDao = new PfDaoFactory().createPfDao(daoParameters);
+ pfDao.init(daoParameters);
+ }
+
+ @After
+ public void teardown() {
+ pfDao.close();
+ }
+
+ @Test
+ public void testPolicyMetadataSetsGet() throws Exception {
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.getNodeTemplateMetadataSet(null, null, null);
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertNotNull(toscaServiceTemplate);
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+ List<Map<PfConceptKey, ToscaNodeTemplate>> gotPolicyMetadataSets1 = authorativeToscaProvider
+ .getToscaNodeTemplate(pfDao, null, null);
+ assertEquals(3, gotPolicyMetadataSets1.size());
+
+ //Fetch all metadataSet if id is null
+ List<Map<ToscaEntityKey, Map<String, Object>>> gotPolicyMetadataSets = authorativeToscaProvider
+ .getNodeTemplateMetadataSet(pfDao, null, null);
+ assertEquals(3, gotPolicyMetadataSets.size());
+
+ // Get filtered metadataSet
+ List<Map<ToscaEntityKey, Map<String, Object>>> filteredPolicyMetadataSet = authorativeToscaProvider
+ .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1");
+ assertEquals(1, filteredPolicyMetadataSet.size());
+
+ //Get invalid metadataSet
+ List<Map<ToscaEntityKey, Map<String, Object>>> filteredMetadataSetInvalid = authorativeToscaProvider
+ .getNodeTemplateMetadataSet(pfDao, "invalidname", "1.0.0");
+ assertThat(filteredMetadataSetInvalid).isEmpty();
+ }
+
+ @Test
+ public void testToscaNodeTemplatesGet() throws Exception {
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.getToscaNodeTemplate(null, null, null);
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertNotNull(toscaServiceTemplate);
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+
+ //Fetch all node templates if id is null
+ List<Map<PfConceptKey, ToscaNodeTemplate>> gotToscaNodeTemplates = authorativeToscaProvider
+ .getToscaNodeTemplate(pfDao, null, null);
+ assertEquals(3, gotToscaNodeTemplates.size());
+
+ // Get filtered node templates
+ List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplates = authorativeToscaProvider
+ .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
+ assertEquals(1, filteredNodeTemplates.size());
+
+ //Get invalid node template
+ List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplatesInvalid = authorativeToscaProvider
+ .getToscaNodeTemplate(pfDao, "invalidname", "1.0.0");
+ assertThat(filteredNodeTemplatesInvalid).isEmpty();
+ }
+
+ @Test
+ public void testToscaNodeTemplatesCreate() throws Exception {
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.createToscaNodeTemplates(null, null);
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.createToscaNodeTemplates(null, new ToscaServiceTemplate());
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, null);
+ }).hasMessageMatching("^toscaServiceTemplate is marked .*on.*ull but is null$");
+
+ ToscaServiceTemplate createdNodeTemplates =
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+ assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates()).hasSize(3);
+ assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+ .getMetadata()).containsKey("threshold");
+
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
+ assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(4);
+
+ //Create node template with invalid node type
+ createToscaNodeTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_adaptive")
+ .setType("invalid.type");
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
+ }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
+
+ }
+
+ @Test
+ public void testToscaNodeTemplateUpdate() throws Exception {
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.updateToscaNodeTemplates(null, null);
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.updateToscaNodeTemplates(null, new ToscaServiceTemplate());
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.updateToscaNodeTemplates(pfDao, null);
+ }).hasMessageMatching("^serviceTemplate is marked non-null but is null$");
+
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+ ToscaServiceTemplate updatedTemplate =
+ authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
+ assertEquals("Updated Metadata set for GRPC",
+ updatedTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+ .getDescription());
+
+ //Update nodeTemplate with invalid node type
+ updatedToscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+ .setTypeVersion("0.0.0");
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
+ }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
+ }
+
+ @Test
+ public void testToscaNodeTemplatetDelete() throws Exception {
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.deleteToscaNodeTemplate(null, null, null);
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.deleteToscaNodeTemplate(null, null, "0.0.1");
+ }).hasMessageMatching(DAO_IS_NULL);
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, null, null);
+ }).hasMessageMatching("^name is marked .*on.*ull but is null$");
+
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "name", null);
+ }).hasMessageMatching("^version is marked .*on.*ull but is null$");
+
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "dummyname", "1.0.1");
+ }).hasMessage("node template dummyname:1.0.1 not found");
+
+
+ ToscaServiceTemplate responseTemplate =
+ authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker",
+ "1.0.0");
+
+ assertTrue(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()
+ .containsKey("apexMetadata_decisionMaker"));
+ assertThat(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(1);
+
+ assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
+
+ }
+
+ @Test
+ public void testNodeTemplatesWithExistingPolicy() throws Exception {
+ String policyString = ResourceUtils.getResourceAsString(POLICY_WITH_METADATA_SET_REF);
+ ToscaServiceTemplate policyServiceTemplate =
+ yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class);
+
+ createPolicyTypes();
+ //Create policy with metadataSet reference in it
+ authorativeToscaProvider.createPolicies(pfDao, policyServiceTemplate);
+ assertThat(authorativeToscaProvider.getPolicyList(pfDao, null, null)).hasSize(1);
+ assertEquals("apexMetadata_decisionMaker", authorativeToscaProvider
+ .getPolicyList(pfDao, null, null).get(0).getMetadata().get("metadataSetName"));
+
+ //Create node templates
+ authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+
+ //delete node templates referenced in existing policy
+ assertThatThrownBy(() -> {
+ authorativeToscaProvider
+ .deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker", "1.0.0");
+ }).hasMessageEndingWith("Node template is in use, it is referenced in Tosca Policy "
+ + "operational.apex.decisionMaker version 1.0.0");
+
+ //delete unreferenced node template
+ authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
+ assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
+ }
+
+ private void createPolicyTypes() throws CoderException, PfModelException {
+ Object yamlObject =
+ new Yaml().load(ResourceUtils.getResourceAsString(APEX_POLICY_TYPE_YAML));
+ String yamlAsJsonString = new StandardCoder().encode(yamlObject);
+
+ ToscaServiceTemplate toscaServiceTemplatePolicyType =
+ standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
+
+ assertNotNull(toscaServiceTemplatePolicyType);
+ new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
+ }
+
+}
diff --git a/models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json b/models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json
new file mode 100644
index 000000000..8620d3ef0
--- /dev/null
+++ b/models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json
@@ -0,0 +1,31 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+ "node_types": {
+ "org.onap.nodetypes.policy.MetadataSet2": {
+ "derived_from": "tosca.nodetypes.Root",
+ "version": "1.0.1"
+ }
+ },
+ "topology_template": {
+ "node_templates": {
+ "apexMetadata_adaptive": {
+ "version": "2.3.3",
+ "type": "org.onap.nodetypes.policy.MetadataSet2",
+ "type_version": "1.0.1",
+ "description": "Metadata set for an Adaptive Policy",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "AdaptivePolicyModel",
+ "version": "1.2.2"
+ }
+ },
+ "radius": 1.23,
+ "height": 2.13,
+ "length": 46
+ }
+ }
+
+ }
+ }
+} \ No newline at end of file
diff --git a/models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json b/models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json
new file mode 100644
index 000000000..7fbad818c
--- /dev/null
+++ b/models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json
@@ -0,0 +1,23 @@
+{
+ "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+ "topology_template": {
+ "node_templates": {
+ "apexMetadata_grpc": {
+ "version": "1.2.1",
+ "type": "org.onap.nodetypes.policy.MetadataSet",
+ "type_version": "1.0.0",
+ "description": "Updated Metadata set for GRPC",
+ "metadata": {
+ "policyModel": {
+ "key": {
+ "name": "GrpcPolicyModel",
+ "version": "1.0.1"
+ }
+ },
+ "threshold": 3.15,
+ "state": "active"
+ }
+ }
+ }
+ }
+} \ No newline at end of file