From 45b653fc5a8d641452247eca5c80cf580609e9bf Mon Sep 17 00:00:00 2001 From: rameshiyer27 Date: Mon, 7 Feb 2022 17:07:38 +0000 Subject: [PATCH] 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 Change-Id: I6c189142b1778ba858aae27cd92d4f136d950208 --- .../nodetemplates.metadatasets.input.tosca.json | 1578 ++++++++++++++++++++ .../nodetemplates.metadatasets.input.tosca.yaml | 1336 +++++++++++++++++ .../apex.policy.decisionmaker.input.tosca.yaml | 130 ++ ....policy.decisionmaker.paptopdp.input.tosca.yaml | 338 +++++ .../models/provider/PolicyModelsProvider.java | 60 +- .../impl/AbstractPolicyModelsProvider.java | 45 +- .../impl/DatabasePolicyModelsProviderTest.java | 48 +- .../models/provider/impl/DummyBadProviderImpl.java | 38 +- .../impl/DummyPolicyModelsProviderImpl.java | 61 +- .../dummyimpl/DummyToscaNodeTemplateResponse.json | 46 + .../dummyimpl/DummyToscaPolicyDeleteResponse.json | 0 .../dummyimpl/DummyToscaPolicyGetResponse.json | 0 .../DummyToscaPolicyTypeDeleteResponse.json | 0 .../dummyimpl/DummyToscaPolicyTypeGetResponse.json | 0 .../tosca/authorative/concepts/ToscaEntity.java | 6 +- .../provider/AuthorativeToscaProvider.java | 123 +- .../tosca/simple/concepts/JpaToscaEntityType.java | 6 +- .../tosca/simple/provider/SimpleToscaProvider.java | 248 ++- .../tosca/utils/ToscaServiceTemplateUtils.java | 7 +- .../onap/policy/models/tosca/utils/ToscaUtils.java | 35 +- .../AuthorativeToscaProviderNodeTemplateTest.java | 315 ++++ .../nodetemplates/TestCreateMetadataSet.json | 31 + .../nodetemplates/TestUpdateMetadataSet.json | 23 + 23 files changed, 4460 insertions(+), 14 deletions(-) create mode 100644 models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json create mode 100644 models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml create mode 100644 models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml create mode 100644 models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml rename models-provider/src/{main => test}/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java (81%) create mode 100644 models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json rename models-provider/src/{main => test}/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json (100%) rename models-provider/src/{main => test}/resources/dummyimpl/DummyToscaPolicyGetResponse.json (100%) rename models-provider/src/{main => test}/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json (100%) rename models-provider/src/{main => test}/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json (100%) create mode 100644 models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java create mode 100644 models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json create mode 100644 models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json 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>> 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> 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; @@ -193,6 +197,45 @@ public abstract class AbstractPolicyModelsProvider implements PolicyModelsProvid return new AuthorativeToscaProvider().deletePolicy(getPfDao(), name, version); } + @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>> getNodeTemplateMetadataSets(final String name, + final String version) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().getNodeTemplateMetadataSet(getPfDao(), name, version); + } + + @Override + public List> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().getToscaNodeTemplate(getPfDao(), name, version); + } + + + @Override public List getPdpGroups(final String name) throws PfModelException { assertInitialized(); 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 makePdpStatisticsList() { PdpStatistics pdpStatistics = new PdpStatistics(); pdpStatistics.setPdpInstanceId(NAME); @@ -576,4 +605,21 @@ public class DatabasePolicyModelsProviderTest { List 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; @@ -134,6 +138,38 @@ public class DummyBadProviderImpl implements PolicyModelsProvider { return null; } + @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>> getNodeTemplateMetadataSets(@NonNull String name, + @NonNull String version) + throws PfModelException { + return null; + } + + @Override + public List> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + return null; + } + @Override public List 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 similarity index 81% rename from models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java rename to 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; @@ -178,6 +182,38 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider { return getDummyResponse("dummyimpl/DummyToscaPolicyDeleteResponse.json"); } + @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>> getNodeTemplateMetadataSets(@NonNull String name, + @NonNull String version) + throws PfModelException { + return new ArrayList<>(); + } + + @Override + public List> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + return new ArrayList<>(); + } + @Override public List 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 similarity index 100% rename from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json rename to 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 similarity index 100% rename from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json rename to 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 similarity index 100% rename from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json rename to 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 similarity index 100% rename from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json rename to 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 metadata; + private Map metadata; private String description; /** @@ -67,7 +67,7 @@ public class ToscaEntity implements PfNameVersion { if (copyObject.metadata != null) { metadata = new LinkedHashMap<>(); - for (final Entry metadataEntry : copyObject.metadata.entrySet()) { + for (final Entry 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; @@ -548,6 +550,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>> getNodeTemplateMetadataSet( + @NonNull final PfDao dao, final String name, final String version) + throws PfModelException { + LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version); + List>> 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> getToscaNodeTemplate( + @NonNull final PfDao dao, final String name, final String version) + throws PfModelException { + LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version); + List> 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. * 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 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 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>> getNodeTemplateMetadata( + @NonNull final PfDao dao, final String name, final String version) + throws PfModelException { + LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version); + + List>> 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 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 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. * @@ -669,6 +866,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. * @@ -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"); @@ -106,6 +106,15 @@ public final class ToscaUtils { assertExist(serviceTemplate, ToscaUtils::checkPoliciesExist); } + /** + * 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. * @@ -134,6 +143,16 @@ public final class ToscaUtils { return doExist(serviceTemplate, ToscaUtils::checkPoliciesExist); } + /** + * 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. * @@ -206,6 +225,20 @@ public final class ToscaUtils { return null; } + /** + * 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. * 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> gotPolicyMetadataSets1 = authorativeToscaProvider + .getToscaNodeTemplate(pfDao, null, null); + assertEquals(3, gotPolicyMetadataSets1.size()); + + //Fetch all metadataSet if id is null + List>> gotPolicyMetadataSets = authorativeToscaProvider + .getNodeTemplateMetadataSet(pfDao, null, null); + assertEquals(3, gotPolicyMetadataSets.size()); + + // Get filtered metadataSet + List>> filteredPolicyMetadataSet = authorativeToscaProvider + .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1"); + assertEquals(1, filteredPolicyMetadataSet.size()); + + //Get invalid metadataSet + List>> 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> gotToscaNodeTemplates = authorativeToscaProvider + .getToscaNodeTemplate(pfDao, null, null); + assertEquals(3, gotToscaNodeTemplates.size()); + + // Get filtered node templates + List> filteredNodeTemplates = authorativeToscaProvider + .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1"); + assertEquals(1, filteredNodeTemplates.size()); + + //Get invalid node template + List> 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 -- 2.16.6