Add policy metadataSet handling as node templates 09/127009/3
authorrameshiyer27 <ramesh.murugan.iyer@est.tech>
Mon, 7 Feb 2022 17:07:38 +0000 (17:07 +0000)
committerrameshiyer27 <ramesh.murugan.iyer@est.tech>
Thu, 10 Feb 2022 14:20:42 +0000 (14:20 +0000)
Each metadataSet is represented as a 'node_template' in Tosca
mapped to a specific node type.
Support added for db operations of node templates as
independent entities.

Detailed documentation available here :
https://wiki.onap.org/display/DW/Enable+Handling+of+Policy+Type+Metadata

Issue-ID: POLICY-3832
Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech>
Change-Id: I6c189142b1778ba858aae27cd92d4f136d950208

23 files changed:
models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.json [new file with mode: 0644]
models-examples/src/main/resources/nodetemplates/nodetemplates.metadatasets.input.tosca.yaml [new file with mode: 0644]
models-examples/src/main/resources/policies/apex.policy.decisionmaker.input.tosca.yaml [new file with mode: 0644]
models-examples/src/main/resources/policies/apex.policy.decisionmaker.paptopdp.input.tosca.yaml [new file with mode: 0644]
models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java
models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java [moved from models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java with 81% similarity]
models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json [new file with mode: 0644]
models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json [moved from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json with 100% similarity]
models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json [moved from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json with 100% similarity]
models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json [moved from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json with 100% similarity]
models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json [moved from models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json with 100% similarity]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaEntity.java
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaServiceTemplateUtils.java
models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java
models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderNodeTemplateTest.java [new file with mode: 0644]
models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json [new file with mode: 0644]
models-tosca/src/test/resources/nodetemplates/TestUpdateMetadataSet.json [new file with mode: 0644]

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 (file)
index 0000000..e91a7b5
--- /dev/null
@@ -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 (file)
index 0000000..f59d25b
--- /dev/null
@@ -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 (file)
index 0000000..615402b
--- /dev/null
@@ -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 (file)
index 0000000..c257cdd
--- /dev/null
@@ -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
index 85aab6e..5cc5fc9 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2021 Nordix Foundation.
+ *  Copyright (C) 2019-2022 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
@@ -25,8 +25,11 @@ package org.onap.policy.models.provider;
 import java.time.Instant;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PolicyAudit;
 import org.onap.policy.models.pap.persistence.provider.PolicyAuditProvider.AuditFilter;
 import org.onap.policy.models.pdp.concepts.Pdp;
@@ -38,6 +41,8 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.persistence.provider.PdpFilterParameters;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -254,6 +259,59 @@ public interface PolicyModelsProvider extends AutoCloseable {
     public ToscaServiceTemplate deletePolicy(@NonNull final String name, @NonNull final String version)
             throws PfModelException;
 
+
+    /**
+     * Create tosca node templates.
+     *
+     * @param serviceTemplate the definitions of the new node templates to be created.
+     * @return the tosca node templates that were created
+     * @throws PfModelException on errors creating tosca node templates
+     */
+    public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+        throws PfModelException;
+
+    /**
+     * Update tosca node templates.
+     *
+     * @param serviceTemplate with node templates to be updated.
+     * @return the service template with node templates that were updated
+     * @throws PfModelException on errors updating tosca node templates
+     */
+    public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate)
+        throws PfModelRuntimeException, PfModelException;
+
+    /**
+     * Delete a tosca node template.
+     *
+     * @param name the name of the node template to delete.
+     * @param version the version of the node template to delete.
+     * @return the service template with node templates that was deleted
+     * @throws PfModelException on errors deleting a node template
+     */
+    public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @NonNull final String version)
+        throws PfModelException;
+
+
+    /**
+     * Get filtered node template metadataSet entities.
+     *
+     * @return the list of metadataSet found
+     * @throws PfModelException on errors getting node template metadataSet
+     */
+    public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name,
+                                                                                      final String version)
+        throws PfModelException;
+
+    /**
+     * Get filtered node template entities.
+     *
+     * @return the list of nodeTemplates found
+     * @throws PfModelException on errors getting node template
+     */
+    public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+                                                                           final String version)
+        throws PfModelException;
+
     /**
      * Get PDP groups.
      *
index fa76583..ffb4706 100644 (file)
@@ -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<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name,
+                                                                                      final String version)
+        throws PfModelException {
+        assertInitialized();
+        return new AuthorativeToscaProvider().getNodeTemplateMetadataSet(getPfDao(), name, version);
+    }
+
+    @Override
+    public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+                                                                           final String version)
+        throws PfModelException {
+        assertInitialized();
+        return new AuthorativeToscaProvider().getToscaNodeTemplate(getPfDao(), name, version);
+    }
+
+
+
     @Override
     public List<PdpGroup> getPdpGroups(final String name) throws PfModelException {
         assertInitialized();
index 57c261c..561ef5d 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2021 Nordix Foundation.
+ *  Copyright (C) 2019-2022 Nordix Foundation.
  *  Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
@@ -32,6 +32,7 @@ import static org.junit.Assert.assertTrue;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -53,9 +54,12 @@ import org.onap.policy.models.provider.PolicyModelsProviderParameters;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
 
 /**
@@ -567,6 +571,31 @@ public class DatabasePolicyModelsProviderTest {
         databaseProvider.close();
     }
 
+    @Test
+    public void testToscaNodeTemplateHandling() throws PfModelException {
+        databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
+
+        ToscaServiceTemplate serviceTemplate = makeNodeTemplate();
+
+        assertEquals("1.0.1",
+            databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates()
+                .get("metadataSet1").getVersion());
+        assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size());
+
+        ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()
+            .get("metadataSet1");
+        nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue"));
+        serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1));
+        assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate)
+            .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey"));
+
+        assertThatThrownBy(() -> {
+            databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1");
+        }).hasMessage("node template invalidName:1.0.1 not found");
+
+        databaseProvider.close();
+    }
+
     private List<PdpStatistics> makePdpStatisticsList() {
         PdpStatistics pdpStatistics = new PdpStatistics();
         pdpStatistics.setPdpInstanceId(NAME);
@@ -576,4 +605,21 @@ public class DatabasePolicyModelsProviderTest {
         List<PdpStatistics> statisticsArrayList = List.of(pdpStatistics);
         return statisticsArrayList;
     }
+
+    private ToscaServiceTemplate makeNodeTemplate() {
+        ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+        serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0");
+        serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
+        serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType()));
+        ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate();
+        nodeTemplate1.setName("metadataSet1");
+        nodeTemplate1.setVersion("1.0.1");
+        nodeTemplate1.setType("org.onap.policy.metadataSet");
+        nodeTemplate1.setTypeVersion("1.0.0");
+        nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue"));
+
+        serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1));
+
+        return serviceTemplate;
+    }
 }
index 6cb95ee..410ecf2 100644 (file)
@@ -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<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name,
+                                                                                      @NonNull String version)
+        throws PfModelException {
+        return null;
+    }
+
+    @Override
+    public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+                                                                           final String version)
+        throws PfModelException {
+        return null;
+    }
+
     @Override
     public List<PdpGroup> getPdpGroups(String name) throws PfModelException {
         return Collections.emptyList();
@@ -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<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name,
+                                                                                      @NonNull String version)
+        throws PfModelException {
+        return new ArrayList<>();
+    }
+
+    @Override
+    public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name,
+                                                                           final String version)
+        throws PfModelException {
+        return new ArrayList<>();
+    }
+
     @Override
     public List<PdpGroup> getPdpGroups(final String name) throws PfModelException {
         return new ArrayList<>();
@@ -297,4 +333,27 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider {
 
         return serviceTemplate;
     }
+
+    /**
+     * Return a tosca node template dummy response.
+     *
+     * @param fileName the file name containing the dummy response
+     * @return the service template with the dummy response
+     */
+    protected ToscaServiceTemplate getDummyNodeTemplateResponse(final String fileName) {
+        var standardCoder = new StandardCoder();
+        ToscaServiceTemplate serviceTemplate;
+
+        try {
+            serviceTemplate =
+                standardCoder.decode(ResourceUtils.getResourceAsString(fileName), ToscaServiceTemplate.class);
+            if (serviceTemplate == null) {
+                throw new PfModelException(Response.Status.INTERNAL_SERVER_ERROR, "error reading specified file");
+            }
+        } catch (Exception exc) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "error serializing object", exc);
+        }
+
+        return serviceTemplate;
+    }
 }
diff --git a/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json
new file mode 100644 (file)
index 0000000..291ef47
--- /dev/null
@@ -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
index 919d187..c339f72 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Model
  * ================================================================================
- * Copyright (C) 2019-2021 Nordix Foundation.
+ * Copyright (C) 2019-2022 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ public class ToscaEntity implements PfNameVersion {
     @SerializedName("derived_from")
     private String derivedFrom;
 
-    private Map<String, String> metadata;
+    private Map<String, Object> metadata;
     private String description;
 
     /**
@@ -67,7 +67,7 @@ public class ToscaEntity implements PfNameVersion {
 
         if (copyObject.metadata != null) {
             metadata = new LinkedHashMap<>();
-            for (final Entry<String, String> metadataEntry : copyObject.metadata.entrySet()) {
+            for (final Entry<String, Object> metadataEntry : copyObject.metadata.entrySet()) {
                 metadata.put(metadataEntry.getKey(), metadataEntry.getValue());
             }
         }
index 8171b7d..2ec9ee2 100644 (file)
@@ -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<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSet(
+        @NonNull final PfDao dao, final String name, final String version)
+        throws PfModelException {
+        LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version);
+        List<Map<ToscaEntityKey, Map<String, Object>>> metadataSets;
+
+        synchronized (providerLockObject) {
+            metadataSets = new SimpleToscaProvider().getNodeTemplateMetadata(dao, name, version);
+        }
+        LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, metadataSets={}", name, version,
+            metadataSets);
+        return metadataSets;
+    }
+
+    /**
+     * Get tosca node templates.
+     *
+     * @param dao the DAO to use to access the database
+     * @param name the name of the node template to get, null to get all node templates
+     * @param version the version of the node template to get, null to get all versions of node template
+     * @return the node templates found
+     * @throws PfModelException on errors getting tosca node templates
+     */
+    public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(
+        @NonNull final PfDao dao, final String name, final String version)
+        throws PfModelException {
+        LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version);
+        List<Map<PfConceptKey, ToscaNodeTemplate>> nodeTemplates = new ArrayList<>();
+
+        synchronized (providerLockObject) {
+            new SimpleToscaProvider().getToscaNodeTemplates(dao, name, version)
+                .getConceptMap().forEach((key, value) -> nodeTemplates.add(Map.of(key, value.toAuthorative())));
+        }
+
+        LOGGER.debug("<-getNodeTemplate: name={}, version={}, nodeTemplates={}", name, version,
+            nodeTemplates);
+        return nodeTemplates;
+    }
+
+
     /**
      * Return the contents of a list of maps as a plain list.
      *
index 2416bab..84381fb 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2020 Nordix Foundation.
+ *  Copyright (C) 2019-2020,2022 Nordix Foundation.
  *  Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,7 @@ import javax.persistence.AttributeOverride;
 import javax.persistence.Column;
 import javax.persistence.ElementCollection;
 import javax.persistence.EmbeddedId;
+import javax.persistence.Lob;
 import javax.persistence.MappedSuperclass;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -66,6 +67,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
     private PfConceptKey derivedFrom;
 
     @ElementCollection
+    @Lob
     private Map<@NotNull @NotBlank String, @NotNull @NotBlank String> metadata;
 
     @Column
@@ -156,7 +158,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
             description = toscaEntity.getDescription();
         }
 
-        metadata = PfUtils.mapMap(toscaEntity.getMetadata(), item -> item);
+        metadata = PfUtils.mapMap(toscaEntity.getMetadata(), Object::toString);
     }
 
     @Override
index 862108b..e2f61c4 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2020 Nordix Foundation.
+ *  Copyright (C) 2019-2020,2022 Nordix Foundation.
  *  Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,6 +24,8 @@ package org.onap.policy.models.tosca.simple.provider;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import javax.ws.rs.core.Response;
 import lombok.NonNull;
 import org.apache.commons.collections4.CollectionUtils;
@@ -36,9 +38,15 @@ import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.dao.PfDao;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaEntityType;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType;
@@ -641,6 +649,195 @@ public class SimpleToscaProvider {
         return deletedServiceTemplate;
     }
 
+
+    /**
+     * Get metadata of tosca node templates.
+     *
+     * @param dao the DAO to use to access the database
+     * @param name the name of the nodeTemplate to get, set to null to get all node templates
+     * @param version the version of the metadataSet to get, set to null to get all versions
+     * @return the list of maps with node template key and metadata values found
+     * @throws PfModelException on errors getting metadataSets
+     */
+    public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadata(
+        @NonNull final PfDao dao, final String name, final String version)
+        throws PfModelException {
+        LOGGER.debug("->getNodeTemplateMetadataSet: name={}, version={}", name, version);
+
+        List<Map<ToscaEntityKey, Map<String, Object>>> metadataSets = new ArrayList<>();
+
+        JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+        //Return empty list if no node templates present in db
+        if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+            return metadataSets;
+        }
+        var returnServiceTemplate = new JpaToscaServiceTemplate(dbServiceTemplate);
+        List<ToscaNodeTemplate> toscaNodeTemplates = new ArrayList<>();
+        returnServiceTemplate.getTopologyTemplate()
+            .getNodeTemplates().getConceptMap().forEach((key, value) -> toscaNodeTemplates.add(value
+            .toAuthorative()));
+
+        //Filter metadataSet for specific node template
+        if (name != null && version != null) {
+            var filterKey = new ToscaEntityKey(name, version);
+            toscaNodeTemplates.removeIf(entity -> !entity.getKey().equals(filterKey));
+        }
+        toscaNodeTemplates.forEach(e -> metadataSets.add(Map.of(e.getKey(), e.getMetadata())));
+        LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, metadataSets={}", name, version,
+            metadataSets);
+
+        return metadataSets;
+    }
+
+    /**
+     * Get tosca node templates.
+     *
+     * @param dao the DAO to use to access the database
+     * @param name the name of the node template to get, set to null to get all node templates
+     * @param version the version of the node template to get, set to null to get all versions
+     * @return the node templates with the specified key
+     * @throws PfModelException on errors getting node templates
+     */
+    public JpaToscaNodeTemplates getToscaNodeTemplates(@NonNull final PfDao dao, final String name,
+                                                       final String version)
+        throws PfModelException {
+        LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version);
+
+        var nodeTemplates = new JpaToscaNodeTemplates();
+
+        JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+        //Return empty if no nodeTemplates present in db
+        if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+            return nodeTemplates;
+        }
+        var returnServiceTemplate = new JpaToscaServiceTemplate(dbServiceTemplate);
+        nodeTemplates = returnServiceTemplate.getTopologyTemplate().getNodeTemplates();
+
+        //Filter specific nodeTemplates
+        if (name != null && version != null) {
+            var filterKey = new PfConceptKey(name, version);
+            nodeTemplates.getConceptMap().entrySet().removeIf(entity -> !entity.getKey().equals(filterKey));
+        }
+        LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, nodeTemplates={}", name, version,
+            nodeTemplates);
+
+        return nodeTemplates;
+    }
+
+
+    /**
+     * Update tosca node template.
+     *
+     * @param dao the DAO to use to access the database
+     * @param serviceTemplate the service template containing the definitions of the node templates to be updated.
+     * @return the TOSCA service template containing the node templates that were updated
+     * @throws PfModelRuntimeException on errors updating node templates
+     */
+    public JpaToscaServiceTemplate updateToscaNodeTemplates(@NonNull final PfDao dao,
+                                                            @NonNull final JpaToscaServiceTemplate serviceTemplate)
+        throws PfModelException {
+        LOGGER.debug("->updateToscaNodeTemplates: serviceTemplate={}", serviceTemplate);
+
+        ToscaUtils.assertNodeTemplatesExist(serviceTemplate);
+        for (JpaToscaNodeTemplate nodeTemplate : serviceTemplate.getTopologyTemplate().getNodeTemplates()
+            .getAll(null)) {
+
+            //verify if the node template is referenced in the metadata of created policies
+            assertNodeTemplateNotUsedInPolicy(dao, nodeTemplate.getName(), nodeTemplate.getVersion());
+            verifyNodeTypeInDbTemplate(dao, nodeTemplate);
+
+            dao.update(nodeTemplate);
+        }
+        // Return the service template with updated node templates
+        var updatedNodeTemplates = new JpaToscaNodeTemplates();
+        updatedNodeTemplates.setKey(serviceTemplate.getTopologyTemplate().getNodeTemplates().getKey());
+
+        for (PfConceptKey metadataSetKey : serviceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap()
+            .keySet()) {
+            updatedNodeTemplates.getConceptMap().put(metadataSetKey, dao.get(JpaToscaNodeTemplate.class,
+                metadataSetKey));
+        }
+        serviceTemplate.getTopologyTemplate().setNodeTemplates(updatedNodeTemplates);
+
+        LOGGER.debug("<-updatedToscaNodeTemplates: serviceTemplate={}", serviceTemplate);
+        return serviceTemplate;
+    }
+
+    /**
+     * Delete a tosca node template.
+     *
+     * @param dao the DAO to use to access the database
+     * @param nodeTemplateKey the node template key
+     * @return the TOSCA service template containing the node templates that were deleted
+     * @throws PfModelException on errors deleting node templates
+     */
+    public JpaToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final PfDao dao,
+                                                           @NonNull final PfConceptKey nodeTemplateKey)
+        throws PfModelException {
+        LOGGER.debug("->deleteToscaNodeTemplate: key={}", nodeTemplateKey);
+
+        JpaToscaServiceTemplate dbServiceTemplate = getServiceTemplate(dao);
+
+        if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) {
+            throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "no node templates found");
+        }
+        JpaToscaNodeTemplate nodeTemplate4Deletion = dbServiceTemplate.getTopologyTemplate().getNodeTemplates()
+            .get(nodeTemplateKey);
+        if (nodeTemplate4Deletion == null) {
+            throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "node template " + nodeTemplateKey.getId()
+                + NOT_FOUND);
+        }
+
+        //Verify if the node template is referenced in the metadata of created policies
+        assertNodeTemplateNotUsedInPolicy(dao, nodeTemplateKey.getName(), nodeTemplateKey.getVersion());
+
+        dbServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap().remove(nodeTemplateKey);
+        new SimpleToscaServiceTemplateProvider().write(dao, dbServiceTemplate);
+        dao.delete(nodeTemplate4Deletion);
+
+        var deletedServiceTemplate = new JpaToscaServiceTemplate();
+        deletedServiceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate());
+        deletedServiceTemplate.getTopologyTemplate().setNodeTemplates(new JpaToscaNodeTemplates());
+        deletedServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap()
+            .put(nodeTemplateKey, nodeTemplate4Deletion);
+
+        LOGGER.debug("<-deleteToscaNodeTemplate: key={}, serviceTemplate={}", nodeTemplateKey, deletedServiceTemplate);
+        return deletedServiceTemplate;
+    }
+
+    /**
+     * Write a node template to the database.
+     *
+     * @param dao the DAO to use to access the database
+     * @param serviceTemplate the service template to be written
+     * @return the service template created by this method
+     * @throws PfModelException on errors writing the metadataSets
+     */
+    public JpaToscaServiceTemplate createToscaNodeTemplates(@NonNull final PfDao dao,
+                                                            @NonNull final JpaToscaServiceTemplate serviceTemplate)
+        throws PfModelException {
+
+        LOGGER.debug("->write: tosca nodeTemplates={}", serviceTemplate);
+
+        ToscaUtils.assertNodeTemplatesExist(serviceTemplate);
+
+        Optional<JpaToscaNodeTypes> nodeTypes = Optional.ofNullable(serviceTemplate.getNodeTypes());
+        for (JpaToscaNodeTemplate nodeTemplate : serviceTemplate.getTopologyTemplate().getNodeTemplates()
+            .getAll(null)) {
+
+            // verify node types in the db if mismatch/empty entities in the template
+            if (! (nodeTypes.isPresent() && nodeTypes.get().getKeys().contains(nodeTemplate.getType()))) {
+                verifyNodeTypeInDbTemplate(dao, nodeTemplate);
+            }
+        }
+        JpaToscaServiceTemplate writtenServiceTemplate = appendToServiceTemplate(dao, serviceTemplate);
+        LOGGER.debug("<-createdToscaNodeTemplates: writtenServiceTemplate={}", writtenServiceTemplate);
+
+        return serviceTemplate;
+    }
+
     /**
      * Verify the policy type for a policy exists.
      *
@@ -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());
+            }
+        }
+    }
 }
index 7f6fbb2..6f4b299 100644 (file)
@@ -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(),
index 5ec8247..be0d41d 100644 (file)
@@ -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 (file)
index 0000000..2155934
--- /dev/null
@@ -0,0 +1,315 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.dao.DaoParameters;
+import org.onap.policy.models.dao.PfDao;
+import org.onap.policy.models.dao.PfDaoFactory;
+import org.onap.policy.models.dao.impl.DefaultPfDao;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Test of the {@link AuthorativeToscaProvider} class.
+ */
+public class AuthorativeToscaProviderNodeTemplateTest {
+
+
+    private static final String NODE_TEMPLATES_JSON = "nodetemplates/nodetemplates.metadatasets.input.tosca.json";
+    private static final String UPDATED_METADATA_SET_JSON = "nodetemplates/TestUpdateMetadataSet.json";
+    private static final String CREATE_METADATA_SET_JSON = "nodetemplates/TestCreateMetadataSet.json";
+    private static final String POLICY_WITH_METADATA_SET_REF = "policies/apex.policy.decisionmaker.input.tosca.yaml";
+    private static final String APEX_POLICY_TYPE_YAML = "policytypes/onap.policies.native.Apex.yaml";
+    private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$";
+    private static ToscaServiceTemplate toscaServiceTemplate;
+    private static ToscaServiceTemplate updatedToscaServiceTemplate;
+    private static ToscaServiceTemplate createToscaNodeTemplate;
+    private PfDao pfDao;
+    private StandardCoder standardCoder;
+    private AuthorativeToscaProvider authorativeToscaProvider = new AuthorativeToscaProvider();
+    private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
+
+    /**
+     * Read policy metadataSet input json.
+     * @throws Exception Coder exception
+     */
+    @Before
+    public void fetchToscaNodeTemplatesJson() throws Exception {
+        standardCoder = new StandardCoder();
+        toscaServiceTemplate =
+            standardCoder.decode(ResourceUtils.getResourceAsString(NODE_TEMPLATES_JSON), ToscaServiceTemplate.class);
+        updatedToscaServiceTemplate =
+            standardCoder.decode(ResourceUtils.getResourceAsString(UPDATED_METADATA_SET_JSON),
+                ToscaServiceTemplate.class);
+        createToscaNodeTemplate = standardCoder.decode(ResourceUtils.getResourceAsString(
+            CREATE_METADATA_SET_JSON), ToscaServiceTemplate.class);
+    }
+
+    /**
+     * Set up DAO towards the database.
+     *
+     * @throws Exception on database errors
+     */
+    @Before
+    public void setupDao() throws Exception {
+        final DaoParameters daoParameters = new DaoParameters();
+        daoParameters.setPluginClass(DefaultPfDao.class.getName());
+
+        daoParameters.setPersistenceUnit("ToscaConceptTest");
+
+        Properties jdbcProperties = new Properties();
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
+
+        if (System.getProperty("USE-MARIADB") != null) {
+            jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.mariadb.jdbc.Driver");
+            jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:mariadb://localhost:3306/policy");
+        } else {
+            jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
+            jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,
+                "jdbc:h2:mem:AuthorativeToscaProviderNodeTemplatesTest");
+        }
+
+        daoParameters.setJdbcProperties(jdbcProperties);
+
+        pfDao = new PfDaoFactory().createPfDao(daoParameters);
+        pfDao.init(daoParameters);
+    }
+
+    @After
+    public void teardown() {
+        pfDao.close();
+    }
+
+    @Test
+    public void testPolicyMetadataSetsGet() throws Exception {
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.getNodeTemplateMetadataSet(null, null, null);
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertNotNull(toscaServiceTemplate);
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+        List<Map<PfConceptKey, ToscaNodeTemplate>> gotPolicyMetadataSets1 = authorativeToscaProvider
+            .getToscaNodeTemplate(pfDao, null, null);
+        assertEquals(3, gotPolicyMetadataSets1.size());
+
+        //Fetch all metadataSet if id is null
+        List<Map<ToscaEntityKey, Map<String, Object>>> gotPolicyMetadataSets = authorativeToscaProvider
+            .getNodeTemplateMetadataSet(pfDao, null, null);
+        assertEquals(3, gotPolicyMetadataSets.size());
+
+        // Get filtered metadataSet
+        List<Map<ToscaEntityKey, Map<String, Object>>> filteredPolicyMetadataSet = authorativeToscaProvider
+            .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1");
+        assertEquals(1, filteredPolicyMetadataSet.size());
+
+        //Get invalid metadataSet
+        List<Map<ToscaEntityKey, Map<String, Object>>> filteredMetadataSetInvalid = authorativeToscaProvider
+            .getNodeTemplateMetadataSet(pfDao, "invalidname", "1.0.0");
+        assertThat(filteredMetadataSetInvalid).isEmpty();
+    }
+
+    @Test
+    public void testToscaNodeTemplatesGet() throws Exception {
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.getToscaNodeTemplate(null, null, null);
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertNotNull(toscaServiceTemplate);
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+
+        //Fetch all node templates if id is null
+        List<Map<PfConceptKey, ToscaNodeTemplate>> gotToscaNodeTemplates = authorativeToscaProvider
+            .getToscaNodeTemplate(pfDao, null, null);
+        assertEquals(3, gotToscaNodeTemplates.size());
+
+        // Get filtered node templates
+        List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplates = authorativeToscaProvider
+            .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
+        assertEquals(1, filteredNodeTemplates.size());
+
+        //Get invalid node template
+        List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplatesInvalid = authorativeToscaProvider
+            .getToscaNodeTemplate(pfDao, "invalidname", "1.0.0");
+        assertThat(filteredNodeTemplatesInvalid).isEmpty();
+    }
+
+    @Test
+    public void testToscaNodeTemplatesCreate() throws Exception {
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.createToscaNodeTemplates(null, null);
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.createToscaNodeTemplates(null, new ToscaServiceTemplate());
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.createToscaNodeTemplates(pfDao, null);
+        }).hasMessageMatching("^toscaServiceTemplate is marked .*on.*ull but is null$");
+
+        ToscaServiceTemplate createdNodeTemplates =
+            authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+        assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates()).hasSize(3);
+        assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+            .getMetadata()).containsKey("threshold");
+
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
+        assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(4);
+
+        //Create node template with invalid node type
+        createToscaNodeTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_adaptive")
+            .setType("invalid.type");
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
+        }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
+
+    }
+
+    @Test
+    public void testToscaNodeTemplateUpdate() throws Exception {
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.updateToscaNodeTemplates(null, null);
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.updateToscaNodeTemplates(null, new ToscaServiceTemplate());
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.updateToscaNodeTemplates(pfDao, null);
+        }).hasMessageMatching("^serviceTemplate is marked non-null but is null$");
+
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+        ToscaServiceTemplate updatedTemplate =
+            authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
+        assertEquals("Updated Metadata set for GRPC",
+            updatedTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+                .getDescription());
+
+        //Update nodeTemplate with invalid node type
+        updatedToscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
+            .setTypeVersion("0.0.0");
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
+        }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
+    }
+
+    @Test
+    public void testToscaNodeTemplatetDelete() throws Exception {
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.deleteToscaNodeTemplate(null, null, null);
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.deleteToscaNodeTemplate(null, null, "0.0.1");
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, null, null);
+        }).hasMessageMatching("^name is marked .*on.*ull but is null$");
+
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "name", null);
+        }).hasMessageMatching("^version is marked .*on.*ull but is null$");
+
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "dummyname", "1.0.1");
+        }).hasMessage("node template dummyname:1.0.1 not found");
+
+
+        ToscaServiceTemplate responseTemplate =
+            authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker",
+                "1.0.0");
+
+        assertTrue(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()
+            .containsKey("apexMetadata_decisionMaker"));
+        assertThat(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(1);
+
+        assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
+
+    }
+
+    @Test
+    public void testNodeTemplatesWithExistingPolicy() throws Exception {
+        String policyString = ResourceUtils.getResourceAsString(POLICY_WITH_METADATA_SET_REF);
+        ToscaServiceTemplate policyServiceTemplate =
+            yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class);
+
+        createPolicyTypes();
+        //Create policy with metadataSet reference in it
+        authorativeToscaProvider.createPolicies(pfDao, policyServiceTemplate);
+        assertThat(authorativeToscaProvider.getPolicyList(pfDao, null, null)).hasSize(1);
+        assertEquals("apexMetadata_decisionMaker", authorativeToscaProvider
+            .getPolicyList(pfDao, null, null).get(0).getMetadata().get("metadataSetName"));
+
+        //Create node templates
+        authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
+
+        //delete node templates referenced in existing policy
+        assertThatThrownBy(() -> {
+            authorativeToscaProvider
+                .deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker", "1.0.0");
+        }).hasMessageEndingWith("Node template is in use, it is referenced in Tosca Policy "
+            + "operational.apex.decisionMaker version 1.0.0");
+
+        //delete unreferenced node template
+        authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
+        assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
+    }
+
+    private void createPolicyTypes() throws CoderException, PfModelException {
+        Object yamlObject =
+            new Yaml().load(ResourceUtils.getResourceAsString(APEX_POLICY_TYPE_YAML));
+        String yamlAsJsonString = new StandardCoder().encode(yamlObject);
+
+        ToscaServiceTemplate toscaServiceTemplatePolicyType =
+            standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
+
+        assertNotNull(toscaServiceTemplatePolicyType);
+        new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
+    }
+
+}
diff --git a/models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json b/models-tosca/src/test/resources/nodetemplates/TestCreateMetadataSet.json
new file mode 100644 (file)
index 0000000..8620d3e
--- /dev/null
@@ -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 (file)
index 0000000..7fbad81
--- /dev/null
@@ -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