Allow semantic versioning in all templates in ACM 47/136647/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Wed, 22 Nov 2023 16:32:07 +0000 (16:32 +0000)
committerFrancesco Fiora <francesco.fiora@est.tech>
Fri, 24 Nov 2023 16:04:33 +0000 (16:04 +0000)
Issue-ID: POLICY-4886
Change-Id: I0c46397e86377e6f59f55121a60b8f2b5665a5d5
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
examples/src/main/resources/clamp/acm/test/tosca-versioning.yaml [new file with mode: 0755]
models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java
runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java
runtime-acm/src/test/resources/rest/acm/AutomationCompositionVersioning.yaml [new file with mode: 0755]

diff --git a/examples/src/main/resources/clamp/acm/test/tosca-versioning.yaml b/examples/src/main/resources/clamp/acm/test/tosca-versioning.yaml
new file mode 100755 (executable)
index 0000000..3e36062
--- /dev/null
@@ -0,0 +1,1119 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2023 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=========================================================
+tosca_definitions_version: tosca_simple_yaml_1_3
+name: tosca
+version: 1.0.0+1
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+
+  onap.datatypes.native.apex.EngineService:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        description: Specifies the engine name
+        required: false
+        default: "ApexEngineService"
+      version:
+        type: string
+        description: Specifies the engine version in double dotted format
+        required: false
+        default: "1.0.0"
+      id:
+        type: integer
+        description: Specifies the engine id
+        required: true
+      instance_count:
+        type: integer
+        description: Specifies the number of engine threads that should be run
+        required: true
+      deployment_port:
+        type: integer
+        description: Specifies the port to connect to for engine administration
+        required: false
+        default: 1
+      policy_model_file_name:
+        type: string
+        description: The name of the file from which to read the APEX policy model
+        required: false
+      policy_type_impl:
+        type: string
+        description: The policy type implementation from which to read the APEX policy model
+        required: false
+      periodic_event_period:
+        type: string
+        description: The time interval in milliseconds for the periodic scanning event, 0 means don't scan
+        required: false
+      engine:
+        type: onap.datatypes.native.apex.engineservice.Engine
+        description: The parameters for all engines in the APEX engine service
+        required: true
+  onap.datatypes.native.apex.EventHandler:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        description: Specifies the event handler name, if not specified this is set to the key name
+        required: false
+      carrier_technology:
+        type: onap.datatypes.native.apex.CarrierTechnology
+        description: Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka)
+        required: true
+      event_protocol:
+        type: onap.datatypes.native.apex.EventProtocol
+        description: Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO)
+        required: true
+      event_name:
+        type: string
+        description: Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent
+        required: false
+      event_name_filter:
+        type: string
+        description: Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through
+        required: false
+      synchronous_mode:
+        type: boolean
+        description: Specifies the event handler is syncronous (receive event and send response)
+        required: false
+        default: false
+      synchronous_peer:
+        type: string
+        description: The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode
+        required: false
+      synchronous_timeout:
+        type: integer
+        description: The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode
+        required: false
+      requestor_mode:
+        type: boolean
+        description: Specifies the event handler is in requestor mode (send event and wait for response mode)
+        required: false
+        default: false
+      requestor_peer:
+        type: string
+        description: The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode
+        required: false
+      requestor_timeout:
+        type: integer
+        description: The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode
+        required: false
+  onap.datatypes.native.apex.CarrierTechnology:
+    derived_from: tosca.datatypes.Root
+    properties:
+      label:
+        type: string
+        description: The label (name) of the carrier technology (such as REST, Kafka, WebSocket)
+        required: true
+      plugin_parameter_class_name:
+        type: string
+        description: The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class
+        required: false
+  onap.datatypes.native.apex.EventProtocol:
+    derived_from: tosca.datatypes.Root
+    properties:
+      label:
+        type: string
+        description: The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO)
+        required: true
+      event_protocol_plugin_class:
+        type: string
+        description: The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class
+        required: false
+  onap.datatypes.native.apex.Environment:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        description: The name of the environment variable
+        required: true
+      value:
+        type: string
+        description: The value of the environment variable
+        required: true
+  onap.datatypes.native.apex.engineservice.Engine:
+    derived_from: tosca.datatypes.Root
+    properties:
+      context:
+        type: onap.datatypes.native.apex.engineservice.engine.Context
+        description: The properties for handling context in APEX engines, defaults to using Java maps for context
+        required: false
+      executors:
+        type: map
+        description: The plugins for policy executors used in engines such as javascript, MVEL, Jython
+        required: true
+        entry_schema:
+          description: The plugin class path for this policy executor
+          type: string
+  onap.datatypes.native.apex.engineservice.engine.Context:
+    derived_from: tosca.datatypes.Root
+    properties:
+      distributor:
+        type: onap.datatypes.native.apex.Plugin
+        description: The plugin to be used for distributing context between APEX PDPs at runtime
+        required: false
+      schemas:
+        type: map
+        description: The plugins for context schemas available in APEX PDPs such as Java and Avro
+        required: false
+        entry_schema:
+          type: onap.datatypes.native.apex.Plugin
+      locking:
+        type: onap.datatypes.native.apex.Plugin
+        description: The plugin to be used for locking context in and between APEX PDPs at runtime
+        required: false
+      persistence:
+        type: onap.datatypes.native.apex.Plugin
+        description: The plugin to be used for persisting context for APEX PDPs at runtime
+        required: false
+  onap.datatypes.native.apex.Plugin:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        description: The name of the executor such as Javascript, Jython or MVEL
+        required: true
+      plugin_class_name:
+        type: string
+        description: The class path of the plugin class for this executor
+
+  org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest:
+    version: 1.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      restRequestId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+        description: The name and version of a REST request to be sent to a REST endpoint
+      httpMethod:
+        type: string
+        required: true
+        constraints:
+          - valid_values:
+              - POST
+              - PUT
+              - GET
+              - DELETE
+        description: The REST method to use
+      path:
+        type: string
+        required: true
+        description: The path of the REST request relative to the base URL
+      body:
+        type: string
+        required: false
+        description: The body of the REST request for PUT and POST requests
+      expectedResponse:
+        type: integer
+        required: true
+        constraints: []
+        description: THe expected HTTP status code for the REST request
+  org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity:
+    version: 1.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      configurationEntityId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+        description: The name and version of a Configuration Entity to be handled
+          by the HTTP Automation Composition Element
+      restSequence:
+        type: list
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest
+          type_version: 1.0.0
+        description: A sequence of REST commands to send to the REST endpoint
+
+policy_types:
+  onap.policies.Native:
+    derived_from: tosca.policies.Root
+    description: a base policy type for all native PDP policies
+    version: 1.0.0
+    name: onap.policies.Native
+  onap.policies.native.Apex:
+    derived_from: onap.policies.Native
+    description: a policy type for native apex policies
+    version: 1.0.0
+    name: onap.policies.native.Apex
+    properties:
+      engine_service:
+        type: onap.datatypes.native.apex.EngineService
+        description: APEX Engine Service Parameters
+      inputs:
+        type: map
+        description: Inputs for handling events coming into the APEX engine
+        entry_schema:
+          type: onap.datatypes.native.apex.EventHandler
+      outputs:
+        type: map
+        description: Outputs for handling events going out of the APEX engine
+        entry_schema:
+          type: onap.datatypes.native.apex.EventHandler
+      environment:
+        type: list
+        description: Envioronmental parameters for the APEX engine
+        entry_schema:
+          type: onap.datatypes.native.apex.Environment
+
+node_types:
+  org.onap.policy.clamp.acm.Participant:
+    version: 1.0.1-1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+  org.onap.policy.clamp.acm.AutomationCompositionElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+        metadata:
+          common: true
+        description: Specifies the organization that provides the automation composition element
+      startPhase:
+        type: integer
+        required: false
+        constraints:
+          - greater_or_equal: 0
+        metadata:
+          common: true
+        description: A value indicating the start phase in which this automation composition element will be started, the
+          first start phase is zero. Automation Composition Elements are started in their start_phase order and stopped
+          in reverse start phase order. Automation Composition Elements with the same start phase are started and
+          stopped simultaneously
+      uninitializedToPassiveTimeout:
+        type: integer
+        required: false
+        constraints:
+          - greater_or_equal: 0
+        default: 60
+        metadata:
+          common: true
+        description: The maximum time in seconds to wait for a state chage from uninitialized to passive
+      passiveToRunningTimeout:
+        type: integer
+        required: false
+        constraints:
+          - greater_or_equal: 0
+        default: 60
+        metadata:
+          common: true
+        description: The maximum time in seconds to wait for a state chage from passive to running
+      runningToPassiveTimeout:
+        type: integer
+        required: false
+        constraints:
+          - greater_or_equal: 0
+        default: 60
+        metadata:
+          common: true
+        description: The maximum time in seconds to wait for a state chage from running to passive
+      passiveToUninitializedTimeout:
+        type: integer
+        required: false
+        constraints:
+          - greater_or_equal: 0
+        default: 60
+        metadata:
+          common: true
+        description: The maximum time in seconds to wait for a state chage from passive to uninitialized
+  org.onap.policy.clamp.acm.AutomationComposition:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+        metadata:
+          common: true
+        description: Specifies the organization that provides the automation composition element
+      elements:
+        type: list
+        required: true
+        metadata:
+          common: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+        description: Specifies a list of automation composition element definitions that make up this automation composition definition
+  org.onap.policy.clamp.acm.PolicyAutomationCompositionElement:
+    version: 1.0.0
+    derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+      policy_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: false
+  org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement:
+    version: 1.0.0
+    derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement
+    properties:
+      chart:
+        type: string
+        required: true
+      configs:
+        type: list
+        required: false
+      requirements:
+        type: string
+        required: false
+      templates:
+        type: list
+        required: false
+        entry_schema:
+      values:
+        type: string
+        required: true
+  org.onap.policy.clamp.acm.HttpAutomationCompositionElement:
+    version: 1.0.0
+    derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement
+    properties:
+      baseUrl:
+        type: string
+        required: true
+        description: The base URL to be prepended to each path, identifies the host for the REST endpoints.
+      httpHeaders:
+        type: map
+        required: false
+        entry_schema:
+          type: string
+        description: HTTP headers to send on REST requests
+      configurationEntities:
+        type: map
+        required: true
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity
+          type_version: 1.0.0
+        description: The connfiguration entities the Automation Composition Element is managing and their associated REST requests
+
+topology_template:
+  inputs:
+    acm_element_policy:
+      type: onap.datatypes.ToscaConceptIdentifier
+      description: The ID of the operational policy to use
+      default:
+        name: onap.policies.native.apex.ac.element
+        version: 1.0.0
+  node_templates:
+    org.onap.policy.clamp.acm.PolicyParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.acm.Participant
+      type_version: 1.0.1-1
+      description: Participant for Policy microservices
+      properties:
+        provider: ONAP
+    onap.policy.clamp.ac.element.Policy_AutomationCompositionElement:
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        startPhase: 0
+
+    org.onap.k8s.acm.K8SAutomationCompositionParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.acm.Participant
+      type_version: 1.0.1-1
+      description: Participant for K8S
+      properties:
+        provider: ONAP
+    onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement:
+      # Chart from any chart repository configured on helm client.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the K8S microservice for AC Element Starter
+      properties:
+        provider: ONAP
+        startPhase: 0
+        uninitializedToPassiveTimeout: 300
+        podStatusCheckInterval: 30
+    onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement:
+      # Chart from any chart repository configured on helm client.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the K8S microservice for AC Element Bridge
+      properties:
+        provider: ONAP
+        startPhase: 0
+        uninitializedToPassiveTimeout: 300
+        podStatusCheckInterval: 30
+    onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement:
+      # Chart from any chart repository configured on helm client.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the K8S microservice for AC Element Sink
+      properties:
+        provider: ONAP
+        startPhase: 0
+        uninitializedToPassiveTimeout: 300
+        podStatusCheckInterval: 30
+
+    org.onap.policy.clamp.acm.HttpParticipant:
+      version: 2.3.4-1
+      type: org.onap.policy.clamp.acm.Participant
+      type_version: 1.0.1-1
+      description: Participant for Http requests
+      properties:
+        provider: ONAP
+    onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement:
+      # Http config for AC Element Starter.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the http requests of AC Element Starter microservice
+      properties:
+        provider: ONAP
+        uninitializedToPassiveTimeout: 300
+        startPhase: 1
+    onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement:
+      # Http config for AC Element Bridge.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the http requests of AC Element Bridge microservice
+      properties:
+        provider: ONAP
+        uninitializedToPassiveTimeout: 300
+        startPhase: 1
+    onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement:
+      # Http config for AC Element Sink.
+      version: 1.2.3+build1
+      type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement
+      type_version: 1.0.0
+      description: Automation composition element for the http requests of AC Element Sink microservice
+      properties:
+        provider: ONAP
+        uninitializedToPassiveTimeout: 300
+        startPhase: 1
+
+    onap.policy.clamp.ac.element.AutomationCompositionDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.acm.AutomationComposition
+      type_version: 1.0.1
+      description: Automation composition for Demo
+      properties:
+        provider: ONAP
+        elements:
+          - name: onap.policy.clamp.ac.element.Policy_AutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement
+            version: 1.2.3+build1
+          - name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement
+            version: 1.2.3+build1
+
+  policies:
+    - onap.policies.native.apex.ac.element:
+        type: onap.policies.native.Apex
+        type_version: 1.0.0
+        properties:
+          engineServiceParameters:
+            name: MyApexEngine
+            version: 0.0.1
+            id: 45
+            instanceCount: 2
+            deploymentPort: 12561
+            engineParameters:
+              executorParameters:
+                JAVASCRIPT:
+                  parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+              contextParameters:
+                parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+                schemaParameters:
+                  Json:
+                    parameterClassName: org.onap.policy.apex.plugins.context.schema.json.JsonSchemaHelperParameters
+            policy_type_impl:
+              policies:
+                key:
+                  name: APEXacElementPolicy_Policies
+                  version: 0.0.1
+                policyMap:
+                  entry:
+                    - key:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      value:
+                        policyKey:
+                          name: ReceiveEventPolicy
+                          version: 0.0.1
+                        template: Freestyle
+                        state:
+                          entry:
+                            - key: DecideForwardingState
+                              value:
+                                stateKey:
+                                  parentKeyName: ReceiveEventPolicy
+                                  parentKeyVersion: 0.0.1
+                                  parentLocalName: 'NULL'
+                                  localName: DecideForwardingState
+                                trigger:
+                                  name: AcElementEvent
+                                  version: 0.0.1
+                                stateOutputs:
+                                  entry:
+                                    - key: CreateForwardPayload
+                                      value:
+                                        key:
+                                          parentKeyName: ReceiveEventPolicy
+                                          parentKeyVersion: 0.0.1
+                                          parentLocalName: DecideForwardingState
+                                          localName: CreateForwardPayload
+                                        outgoingEvent:
+                                          name: DmaapResponseStatusEvent
+                                          version: 0.0.1
+                                        outgoingEventReference:
+                                          - name: DmaapResponseStatusEvent
+                                            version: 0.0.1
+                                        nextState:
+                                          parentKeyName: 'NULL'
+                                          parentKeyVersion: 0.0.0
+                                          parentLocalName: 'NULL'
+                                          localName: 'NULL'
+                                contextAlbumReference: []
+                                taskSelectionLogic:
+                                  key:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                                  logicFlavour: UNDEFINED
+                                  logic: ''
+                                stateFinalizerLogicMap:
+                                  entry: []
+                                defaultTask:
+                                  name: ForwardPayloadTask
+                                  version: 0.0.1
+                                taskReferences:
+                                  entry:
+                                    - key:
+                                        name: ForwardPayloadTask
+                                        version: 0.0.1
+                                      value:
+                                        key:
+                                          parentKeyName: ReceiveEventPolicy
+                                          parentKeyVersion: 0.0.1
+                                          parentLocalName: DecideForwardingState
+                                          localName: ReceiveEventPolicy
+                                        outputType: DIRECT
+                                        output:
+                                          parentKeyName: ReceiveEventPolicy
+                                          parentKeyVersion: 0.0.1
+                                          parentLocalName: DecideForwardingState
+                                          localName: CreateForwardPayload
+                        firstState: DecideForwardingState
+              tasks:
+                key:
+                  name: APEXacElementPolicy_Tasks
+                  version: 0.0.1
+                taskMap:
+                  entry:
+                    - key:
+                        name: ForwardPayloadTask
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ForwardPayloadTask
+                          version: 0.0.1
+                        inputEvent:
+                          key:
+                            name: AcElementEvent
+                            version: 0.0.1
+                          nameSpace: org.onap.policy.apex.ac.element
+                          source: Dmaap
+                          target: APEX
+                          parameter:
+                            entry:
+                              - key: DmaapResponseEvent
+                                value:
+                                  key:
+                                    parentKeyName: AcElementEvent
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: DmaapResponseEvent
+                                  fieldSchemaKey:
+                                    name: ACEventType
+                                    version: 0.0.1
+                                  optional: false
+                          toscaPolicyState: ENTRY
+                        outputEvents:
+                          entry:
+                            - key: DmaapResponseStatusEvent
+                              value:
+                                key:
+                                  name: DmaapResponseStatusEvent
+                                  version: 0.0.1
+                                nameSpace: org.onap.policy.apex.ac.element
+                                source: APEX
+                                target: Dmaap
+                                parameter:
+                                  entry:
+                                    - key: DmaapResponseStatusEvent
+                                      value:
+                                        key:
+                                          parentKeyName: DmaapResponseStatusEvent
+                                          parentKeyVersion: 0.0.1
+                                          parentLocalName: 'NULL'
+                                          localName: DmaapResponseStatusEvent
+                                        fieldSchemaKey:
+                                          name: ACEventType
+                                          version: 0.0.1
+                                        optional: false
+                                toscaPolicyState: ''
+                        taskParameters:
+                          entry: []
+                        contextAlbumReference:
+                          - name: ACElementAlbum
+                            version: 0.0.1
+                        taskLogic:
+                          key:
+                            parentKeyName: ForwardPayloadTask
+                            parentKeyVersion: 0.0.1
+                            parentLocalName: 'NULL'
+                            localName: TaskLogic
+                          logicFlavour: JAVASCRIPT
+                          logic: "/*\n * ============LICENSE_START=======================================================\n\
+                        \ *  Copyright (C) 2022 Nordix. All rights reserved.\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 msgResponse = executor.inFields.get('DmaapResponseEvent');\n\
+                        executor.logger.info('Task in progress with mesages: ' + msgResponse);\n\
+                        \nvar elementId = msgResponse.get('elementId').get('name');\n\
+                        \nif (msgResponse.get('messageType') == 'STATUS' &&\n    (elementId\
+                        \ == 'onap.policy.clamp.ac.startertobridge'\n    || elementId\
+                        \ == 'onap.policy.clamp.ac.bridgetosink')) {\n\n    var receiverId\
+                        \ = '';\n    if (elementId == 'onap.policy.clamp.ac.startertobridge')\
+                        \ {\n        receiverId = 'onap.policy.clamp.ac.bridge';\n\
+                        \    } else {\n        receiverId = 'onap.policy.clamp.ac.sink';\n\
+                        \    }\n\n    var elementIdResponse = new java.util.HashMap();\n\
+                        \    elementIdResponse.put('name', receiverId);\n    elementIdResponse.put('version',\
+                        \ msgResponse.get('elementId').get('version'));\n\n    var\
+                        \ dmaapResponse = new java.util.HashMap();\n    dmaapResponse.put('elementId',\
+                        \ elementIdResponse);\n\n    var message = msgResponse.get('message')\
+                        \ + ' trace added from policy';\n    dmaapResponse.put('message',\
+                        \ message);\n    dmaapResponse.put('messageType', 'STATUS');\n\
+                        \    dmaapResponse.put('messageId', msgResponse.get('messageId'));\n\
+                        \    dmaapResponse.put('timestamp', msgResponse.get('timestamp'));\n\
+                        \n    executor.logger.info('Sending forwarding Event to Ac\
+                        \ element: ' + dmaapResponse);\n\n    executor.outFields.put('DmaapResponseStatusEvent',\
+                        \ dmaapResponse);\n}\n\ntrue;"
+              events:
+                key:
+                  name: APEXacElementPolicy_Events
+                  version: 0.0.1
+                eventMap:
+                  entry:
+                    - key:
+                        name: AcElementEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: AcElementEvent
+                          version: 0.0.1
+                        nameSpace: org.onap.policy.apex.ac.element
+                        source: Dmaap
+                        target: APEX
+                        parameter:
+                          entry:
+                            - key: DmaapResponseEvent
+                              value:
+                                key:
+                                  parentKeyName: AcElementEvent
+                                  parentKeyVersion: 0.0.1
+                                  parentLocalName: 'NULL'
+                                  localName: DmaapResponseEvent
+                                fieldSchemaKey:
+                                  name: ACEventType
+                                  version: 0.0.1
+                                optional: false
+                        toscaPolicyState: ENTRY
+                    - key:
+                        name: DmaapResponseStatusEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: DmaapResponseStatusEvent
+                          version: 0.0.1
+                        nameSpace: org.onap.policy.apex.ac.element
+                        source: APEX
+                        target: Dmaap
+                        parameter:
+                          entry:
+                            - key: DmaapResponseStatusEvent
+                              value:
+                                key:
+                                  parentKeyName: DmaapResponseStatusEvent
+                                  parentKeyVersion: 0.0.1
+                                  parentLocalName: 'NULL'
+                                  localName: DmaapResponseStatusEvent
+                                fieldSchemaKey:
+                                  name: ACEventType
+                                  version: 0.0.1
+                                optional: false
+                        toscaPolicyState: ''
+                    - key:
+                        name: LogEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: LogEvent
+                          version: 0.0.1
+                        nameSpace: org.onap.policy.apex.ac.element
+                        source: APEX
+                        target: file
+                        parameter:
+                          entry:
+                            - key: final_status
+                              value:
+                                key:
+                                  parentKeyName: LogEvent
+                                  parentKeyVersion: 0.0.1
+                                  parentLocalName: 'NULL'
+                                  localName: final_status
+                                fieldSchemaKey:
+                                  name: SimpleStringType
+                                  version: 0.0.1
+                                optional: false
+                            - key: message
+                              value:
+                                key:
+                                  parentKeyName: LogEvent
+                                  parentKeyVersion: 0.0.1
+                                  parentLocalName: 'NULL'
+                                  localName: message
+                                fieldSchemaKey:
+                                  name: SimpleStringType
+                                  version: 0.0.1
+                                optional: false
+                        toscaPolicyState: ''
+              albums:
+                key:
+                  name: APEXacElementPolicy_Albums
+                  version: 0.0.1
+                albums:
+                  entry:
+                    - key:
+                        name: ACElementAlbum
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ACElementAlbum
+                          version: 0.0.1
+                        scope: policy
+                        isWritable: true
+                        itemSchema:
+                          name: ACEventType
+                          version: 0.0.1
+              schemas:
+                key:
+                  name: APEXacElementPolicy_Schemas
+                  version: 0.0.1
+                schemas:
+                  entry:
+                    - key:
+                        name: ACEventType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ACEventType
+                          version: 0.0.1
+                        schemaFlavour: Json
+                        schemaDefinition: "{\n    \"$schema\": \"http://json-schema.org/draft-04/schema#\"\
+                      ,\n    \"type\": \"object\",\n    \"properties\": {\n      \
+                      \  \"elementId\": {\n            \"type\": \"object\",\n   \
+                      \         \"properties\": {\n                \"name\": {\n \
+                      \                   \"type\": \"string\"\n                },\n\
+                      \                \"version\": {\n                    \"type\"\
+                      : \"string\"\n                }\n            },\n          \
+                      \  \"required\": [\n                \"name\",\n            \
+                      \    \"version\"\n            ]\n        },\n        \"message\"\
+                      : {\n            \"type\": \"string\"\n        },\n        \"\
+                      messageType\": {\n            \"type\": \"string\"\n       \
+                      \ }\n    },\n    \"required\": [\n        \"elementId\",\n \
+                      \       \"message\",\n        \"messageType\"\n    ]\n}"
+                    - key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: SimpleIntType
+                          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
+                    - key:
+                        name: UUIDType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: UUIDType
+                          version: 0.0.1
+                        schemaFlavour: Java
+                        schemaDefinition: java.util.UUID
+              key:
+                name: APEXacElementPolicy
+                version: 0.0.1
+              keyInformation:
+                key:
+                  name: APEXacElementPolicy_KeyInfo
+                  version: 0.0.1
+                keyInfoMap:
+                  entry:
+                    - key:
+                        name: ACElementAlbum
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ACElementAlbum
+                          version: 0.0.1
+                        UUID: 7cddfab8-6d3f-3f7f-8ac3-e2eb5979c900
+                        description: Generated description for concept referred to by
+                          key "ACElementAlbum:0.0.1"
+                    - key:
+                        name: ACEventType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ACEventType
+                          version: 0.0.1
+                        UUID: dab78794-b666-3929-a75b-70d634b04fe5
+                        description: Generated description for concept referred to by
+                          key "ACEventType:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy
+                          version: 0.0.1
+                        UUID: da478611-7d77-3c46-b4be-be968769ba4e
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_Albums
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_Albums
+                          version: 0.0.1
+                        UUID: fa8dc15e-8c8d-3de3-a0f8-585b76511175
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_Albums:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_Events
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_Events
+                          version: 0.0.1
+                        UUID: 8508cd65-8dd2-342d-a5c6-1570810dbe2b
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_Events:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_KeyInfo
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_KeyInfo
+                          version: 0.0.1
+                        UUID: 09e6927d-c5ac-3779-919f-9333994eed22
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_KeyInfo:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_Policies
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_Policies
+                          version: 0.0.1
+                        UUID: cade3c9a-1600-3642-a6f4-315612187f46
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_Policies:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_Schemas
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_Schemas
+                          version: 0.0.1
+                        UUID: 5bb4a8e9-35fa-37db-9a49-48ef036a7ba9
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_Schemas:0.0.1"
+                    - key:
+                        name: APEXacElementPolicy_Tasks
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: APEXacElementPolicy_Tasks
+                          version: 0.0.1
+                        UUID: 2527eeec-0d1f-3094-ad3f-212622b12836
+                        description: Generated description for concept referred to by
+                          key "APEXacElementPolicy_Tasks:0.0.1"
+                    - key:
+                        name: AcElementEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: AcElementEvent
+                          version: 0.0.1
+                        UUID: 32c013e2-2740-3986-a626-cbdf665b63e9
+                        description: Generated description for concept referred to by
+                          key "AcElementEvent:0.0.1"
+                    - key:
+                        name: DmaapResponseStatusEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: DmaapResponseStatusEvent
+                          version: 0.0.1
+                        UUID: 2715cb6c-2778-3461-8b69-871e79f95935
+                        description: Generated description for concept referred to by
+                          key "DmaapResponseStatusEvent:0.0.1"
+                    - key:
+                        name: ForwardPayloadTask
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ForwardPayloadTask
+                          version: 0.0.1
+                        UUID: 51defa03-1ecf-3314-bf34-2a652bce57fa
+                        description: Generated description for concept referred to by
+                          key "ForwardPayloadTask:0.0.1"
+                    - key:
+                        name: LogEvent
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: LogEvent
+                          version: 0.0.1
+                        UUID: c540f048-96af-35e3-a36e-e9c29377cba7
+                        description: Generated description for concept referred to by
+                          key "LogEvent:0.0.1"
+                    - key:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: ReceiveEventPolicy
+                          version: 0.0.1
+                        UUID: 568b7345-9de1-36d3-b6a3-9b857e6809a1
+                        description: Generated description for concept referred to by
+                          key "ReceiveEventPolicy:0.0.1"
+                    - key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: SimpleIntType
+                          version: 0.0.1
+                        UUID: 153791fd-ae0a-36a7-88a5-309a7936415d
+                        description: Generated description for concept referred to by
+                          key "SimpleIntType: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"
+                    - key:
+                        name: UUIDType
+                        version: 0.0.1
+                      value:
+                        key:
+                          name: UUIDType
+                          version: 0.0.1
+                        UUID: 6a8cc68e-dfc8-3403-9c6d-071c886b319c
+                        description: Generated description for concept referred to by
+                          key "UUIDType:0.0.1"
+          eventInputParameters:
+            DmaapConsumer:
+              carrierTechnologyParameters:
+                carrierTechnology: RESTCLIENT
+                parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+                parameters:
+                  url: http://message-router:3904/events/AC_ELEMENT_MSG/APEX/1?timeout=30000
+              eventProtocolParameters:
+                eventProtocol: JSON
+                parameters:
+                  pojoField: DmaapResponseEvent
+              eventName: AcElementEvent
+              eventNameFilter: AcElementEvent
+          eventOutputParameters:
+            logOutputter:
+              carrierTechnologyParameters:
+                carrierTechnology: FILE
+                parameters:
+                  fileName: outputevents.log
+              eventProtocolParameters:
+                eventProtocol: JSON
+            DmaapReplyProducer:
+              carrierTechnologyParameters:
+                carrierTechnology: RESTCLIENT
+                parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+                parameters:
+                  url: http://message-router:3904/events/POLICY_UPDATE_MSG
+              eventProtocolParameters:
+                eventProtocol: JSON
+                parameters:
+                  pojoField: DmaapResponseStatusEvent
+              eventNameFilter: (LogEvent|DmaapResponseStatusEvent)
+        name: onap.policies.native.apex.ac.element
+        version: 1.0.0+1
index 4069d7b..28689e2 100755 (executable)
@@ -46,8 +46,10 @@ import org.onap.policy.clamp.models.acm.document.base.ToscaServiceTemplateValida
 import org.onap.policy.clamp.models.acm.document.concepts.DocToscaServiceTemplate;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Pattern;
 import org.onap.policy.common.parameters.annotations.Valid;
 import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfKey;
 import org.onap.policy.models.base.Validated;
 
 /**
@@ -67,10 +69,12 @@ public class JpaAutomationCompositionDefinition extends Validated
 
     @Column
     @NotNull
+    @Pattern(regexp = PfKey.NAME_REGEXP)
     private String name;
 
     @Column
     @NotNull
+    @Pattern(regexp = PfKey.VERSION_REGEXP)
     private String version;
 
     @Column
index 6c54172..ed8badf 100755 (executable)
@@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
+import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_VERSIONING;
 
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Response;
@@ -46,6 +47,7 @@ import org.onap.policy.clamp.models.acm.messages.rest.commissioning.Commissionin
 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.PrimeOrder;
 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
+import org.onap.policy.models.base.PfKey;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
@@ -128,14 +130,11 @@ class CommissioningControllerTest extends CommonRestController {
         x.setVersion("1.0.wrong");
         serviceTemplateCreate.getToscaTopologyTemplate().getNodeTemplates().put(x.getName(), x);
 
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
-        var resp = invocationBuilder.post(Entity.json(serviceTemplateCreate));
-
-        assertThat(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).isEqualTo(resp.getStatus());
-        var commissioningResponse = resp.readEntity(CommissioningResponse.class);
+        var commissioningResponse = createServiceTemplate(serviceTemplateCreate, Response.Status.INTERNAL_SERVER_ERROR);
         assertThat(commissioningResponse.getErrorDetails())
             .isEqualTo("java.lang.IllegalArgumentException Internal Server Error parameter "
-                + "\"version\": value \"1.0.wrong\", does not match regular expression \"^(\\d+.){2}\\d+$\"");
+                + "\"version\": value \"1.0.wrong\", does not match regular expression \""
+                + PfKey.VERSION_REGEXP + "\"");
         assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).isNull();
     }
 
@@ -143,11 +142,7 @@ class CommissioningControllerTest extends CommonRestController {
     void testCreate() {
         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
         serviceTemplateCreate.setName("Create");
-
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
-        var resp = invocationBuilder.post(Entity.json(serviceTemplateCreate));
-        assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
-        var commissioningResponse = resp.readEntity(CommissioningResponse.class);
+        var commissioningResponse = createServiceTemplate(serviceTemplateCreate, Response.Status.CREATED);
         assertNotNull(commissioningResponse);
         assertNull(commissioningResponse.getErrorDetails());
         // Response should return the number of node templates present in the service template
@@ -158,6 +153,29 @@ class CommissioningControllerTest extends CommonRestController {
         }
     }
 
+    @Test
+    void testVersioning() {
+        var serviceTemplateCreate = InstantiationUtils.getToscaServiceTemplate(TOSCA_VERSIONING);
+        var commissioningResponse = createServiceTemplate(serviceTemplateCreate, Response.Status.CREATED);
+        assertNotNull(commissioningResponse);
+        assertNull(commissioningResponse.getErrorDetails());
+        // Response should return the number of node templates present in the service template
+        assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).hasSize(11);
+        for (var nodeTemplateName : serviceTemplateCreate.getToscaTopologyTemplate().getNodeTemplates().keySet()) {
+            assertTrue(commissioningResponse.getAffectedAutomationCompositionDefinitions().stream()
+                .anyMatch(ac -> ac.getName().equals(nodeTemplateName)));
+        }
+    }
+
+    private CommissioningResponse createServiceTemplate(ToscaServiceTemplate serviceTemplateCreate,
+        Response.Status statusExpected) {
+        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
+        try (var resp = invocationBuilder.post(Entity.json(serviceTemplateCreate))) {
+            assertEquals(statusExpected.getStatusCode(), resp.getStatus());
+            return resp.readEntity(CommissioningResponse.class);
+        }
+    }
+
     @Test
     void testUpdate() {
         var toscaDataType = new ToscaDataType();
@@ -173,10 +191,8 @@ class CommissioningControllerTest extends CommonRestController {
         var serviceTemplateUpdate = new ToscaServiceTemplate(serviceTemplate);
         serviceTemplateUpdate.getDataTypes().put(toscaDataType.getName(), toscaDataType);
         serviceTemplateUpdate.setMetadata(Map.of("compositionId", compositionId));
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
-        var resp = invocationBuilder.post(Entity.json(serviceTemplateUpdate));
-        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
-        var commissioningResponse = resp.readEntity(CommissioningResponse.class);
+
+        var commissioningResponse = createServiceTemplate(serviceTemplateUpdate, Response.Status.OK);
         assertNotNull(commissioningResponse);
         assertNull(commissioningResponse.getErrorDetails());
         // Response should return the number of node templates present in the service template
@@ -186,13 +202,18 @@ class CommissioningControllerTest extends CommonRestController {
                     .anyMatch(ac -> ac.getName().equals(nodeTemplateName)));
         }
 
-        invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
-        resp = invocationBuilder.buildGet().invoke();
-        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
-        var entity = resp.readEntity(AutomationCompositionDefinition.class);
+        var entity = getServiceTemplate(COMMISSIONING_ENDPOINT + "/" + compositionId, Response.Status.OK);
         assertThat(entity.getServiceTemplate().getDataTypes()).containsKey(toscaDataType.getName());
     }
 
+    private AutomationCompositionDefinition getServiceTemplate(String url, Response.Status statusExpected) {
+        var invocationBuilder = super.sendRequest(url);
+        try (var resp = invocationBuilder.buildGet().invoke()) {
+            assertEquals(statusExpected.getStatusCode(), resp.getStatus());
+            return resp.readEntity(AutomationCompositionDefinition.class);
+        }
+    }
+
     @Test
     void testQuery_NoResultWithThisName() {
         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName");
@@ -216,21 +237,20 @@ class CommissioningControllerTest extends CommonRestController {
     @Test
     void testDeleteBadRequest() {
         createEntryInDB("DeleteBadRequest");
+        deleteServiceTemplate(COMMISSIONING_ENDPOINT + "/" + UUID.randomUUID(), Response.Status.NOT_FOUND);
+    }
 
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + UUID.randomUUID());
-        // Call delete with no info
-        var resp = invocationBuilder.delete();
-        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
+    private void deleteServiceTemplate(String url, Response.Status statusExpected) {
+        var invocationBuilder = super.sendRequest(url);
+        try (var resp = invocationBuilder.delete()) {
+            assertEquals(statusExpected.getStatusCode(), resp.getStatus());
+        }
     }
 
     @Test
     void testDelete() {
         var compositionId = createEntryInDB("forDelete");
-
-        var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
-        // Call delete with no info
-        var resp = invocationBuilder.delete();
-        assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
+        deleteServiceTemplate(COMMISSIONING_ENDPOINT + "/" + compositionId, Response.Status.OK);
 
         var templatesInDB = acDefinitionProvider.findAcDefinition(compositionId);
         assertThat(templatesInDB).isEmpty();
index 5347622..38c63fa 100644 (file)
@@ -63,6 +63,26 @@ public class InstantiationUtils {
         }
     }
 
+    /**
+     * Gets the AutomationComposition from Resource in yaml format.
+     *
+     * @param path path of the resource
+     * @param suffix suffix to add to all names in AutomationCompositions
+     * @return the AutomationComposition from Resource
+     */
+    public static AutomationComposition getAutomationCompositionFromYaml(final String path, final String suffix) {
+        try {
+            var automationComposition = YAML_TRANSLATOR.decode(new File(path), AutomationComposition.class);
+
+            // add suffix to name
+            automationComposition.setName(automationComposition.getName() + suffix);
+            return automationComposition;
+        } catch (CoderException e) {
+            fail("Cannot read or decode " + path);
+            return null;
+        }
+    }
+
     /**
      * Assert that Instantiation Response contains proper AutomationCompositions.
      *
index 1e5aa6c..cd1a385 100755 (executable)
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
+import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_VERSIONING;
 
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Response;
@@ -66,6 +67,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
 class InstantiationControllerTest extends CommonRestController {
 
     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
+    private static final String AC_VERSIONING_YAML = "src/test/resources/rest/acm/AutomationCompositionVersioning.yaml";
 
     private static final String AC_INSTANTIATION_UPDATE_JSON =
             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
@@ -144,10 +146,8 @@ class InstantiationControllerTest extends CommonRestController {
                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
         automationCompositionFromRsc.setCompositionId(compositionId);
 
-        var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
-        var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
-        assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
-        var instResponse = resp.readEntity(InstantiationResponse.class);
+        var instResponse = createAutomationComposition(compositionId, automationCompositionFromRsc,
+            Response.Status.CREATED);
         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
         automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
         automationCompositionFromRsc.getElements().values()
@@ -160,6 +160,15 @@ class InstantiationControllerTest extends CommonRestController {
         assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
     }
 
+    private InstantiationResponse createAutomationComposition(UUID compositionId,
+        AutomationComposition automationComposition, Response.Status statusExpected) {
+        var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
+        try (var resp = invocationBuilder.post(Entity.json(automationComposition))) {
+            assertEquals(statusExpected.getStatusCode(), resp.getStatus());
+            return resp.readEntity(InstantiationResponse.class);
+        }
+    }
+
     @Test
     void testCreateBadRequest() {
         var compositionId = createAcDefinitionInDB("CreateBadRequest");
@@ -167,18 +176,27 @@ class InstantiationControllerTest extends CommonRestController {
                 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
         automationCompositionFromRsc.setCompositionId(compositionId);
 
-        var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
-        var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
-        assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
+        createAutomationComposition(compositionId, automationCompositionFromRsc, Response.Status.CREATED);
 
         // testing Bad Request: AC already defined
-        resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
-        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
-        var instResponse = resp.readEntity(InstantiationResponse.class);
+        var instResponse = createAutomationComposition(compositionId, automationCompositionFromRsc,
+            Response.Status.BAD_REQUEST);
         assertNotNull(instResponse.getErrorDetails());
         assertNull(instResponse.getAffectedAutomationComposition());
     }
 
+    @Test
+    void testVersioning() {
+        var serviceTemplateVer = InstantiationUtils.getToscaServiceTemplate(TOSCA_VERSIONING);
+        var compositionId = createAcDefinitionInDB(serviceTemplateVer);
+        var automationCompositionFromRsc = InstantiationUtils
+            .getAutomationCompositionFromYaml(AC_VERSIONING_YAML, "Versioning");
+        automationCompositionFromRsc.setCompositionId(compositionId);
+        var instResponse =
+            createAutomationComposition(compositionId, automationCompositionFromRsc, Response.Status.CREATED);
+        InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
+    }
+
     @Test
     void testQuery_NoResultWithThisName() {
         var invocationBuilder =
@@ -339,7 +357,11 @@ class InstantiationControllerTest extends CommonRestController {
     private UUID createAcDefinitionInDB(String name) {
         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
         serviceTemplateCreate.setName(name);
-        var acmDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
+        return createAcDefinitionInDB(serviceTemplateCreate);
+    }
+
+    private UUID createAcDefinitionInDB(ToscaServiceTemplate serviceTemplateCreate) {
+        var acmDefinition = CommonTestData.createAcDefinition(serviceTemplateCreate, AcTypeState.PRIMED);
         acDefinitionProvider.updateAcDefinition(acmDefinition, NODE_TYPE);
         saveDummyParticipantInDb();
         return acmDefinition.getCompositionId();
index 54d3124..8329d05 100755 (executable)
@@ -46,6 +46,8 @@ public class CommonTestData {
     private static final Coder CODER = new StandardCoder();
     public static final String TOSCA_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase.yaml";
 
+    public static final String TOSCA_VERSIONING = "clamp/acm/test/tosca-versioning.yaml";
+
     public static final String TOSCA_COMP_NAME = "org.onap.policy.clamp.acm.AutomationComposition";
     public static final String TOSCA_ELEMENT_NAME = "org.onap.policy.clamp.acm.AutomationCompositionElement";
 
diff --git a/runtime-acm/src/test/resources/rest/acm/AutomationCompositionVersioning.yaml b/runtime-acm/src/test/resources/rest/acm/AutomationCompositionVersioning.yaml
new file mode 100755 (executable)
index 0000000..db93c26
--- /dev/null
@@ -0,0 +1,170 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2023 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=========================================================
+name: DemoInstance0
+version: 1.0.1+1
+compositionId: 709c62b3-8918-41b9-a747-d21eb79c6c40
+description: Demo automation composition instance 0
+elements:
+
+  709c62b3-8918-41b9-a747-d21eb79c6c20:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c20
+    definition:
+      name: onap.policy.clamp.ac.element.Policy_AutomationCompositionElement
+      version: 1.2.3+build1
+    description: Starter Automation Composition Element for the Demo
+    properties:
+      policy_type_id:
+        name: onap.policies.operational.pm-subscription-handler
+        version: 1.0.0
+      policy_id:
+        get_input: acm_element_policy
+
+  709c62b3-8918-41b9-a747-d21eb79c6c21:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c21
+    definition:
+      name: onap.policy.clamp.ac.element.K8S_StarterAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Starter Automation Composition Element for the Demo
+    properties:
+      chart:
+        chartId:
+          name: acelement
+          version: 0.1.0
+        namespace: default
+        releaseName: acm-starter
+        podName: acm-starter
+        repository:
+          repoName: chartmuseum
+          address: 'http://cluster-ip:8080'
+        overrideParams:
+          acelement.elementId.name: onap.policy.clamp.ac.starter
+          service.nodeport: 30800
+
+  709c62b3-8918-41b9-a747-d21eb79c6c22:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c22
+    definition:
+      name: onap.policy.clamp.ac.element.K8S_BridgeAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Bridge Automation Composition Element for the Demo
+    properties:
+      chart:
+        chartId:
+          name: acelement
+          version: 0.1.0
+        namespace: default
+        releaseName: acm-bridge
+        podName: acm-bridge
+        repository:
+          repoName: chartmuseum
+          address: 'http://cluster-ip:8080'
+        overrideParams:
+          acelement.elementId.name: onap.policy.clamp.ac.bridge
+          service.nodeport: 30801
+
+  709c62b3-8918-41b9-a747-d21eb79c6c23:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c23
+    definition:
+      name: onap.policy.clamp.ac.element.K8S_SinkAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Sink Automation Composition Element for the Demo
+    properties:
+      chart:
+        chartId:
+          name: acelement
+          version: 0.1.0
+        namespace: default
+        releaseName: acm-sink
+        podName: acm-sink
+        repository:
+          repoName: chartmuseum
+          address: 'http://cluster-ip:8080'
+        overrideParams:
+          acelement.elementId.name: onap.policy.clamp.ac.sink
+          service.nodeport: 30802
+
+  709c62b3-8918-41b9-a747-d21eb79c6c24:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c24
+    definition:
+      name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Starter Automation Composition Element for the Demo
+    properties:
+      baseUrl: http://cluster-ip:30800
+      httpHeaders:
+        Content-Type: application/json
+        Authorization: Basic YWNtVXNlcjp6YiFYenRHMzQ=
+      configurationEntities:
+        - configurationEntityId:
+            name: onap.policy.clamp.ac.starter
+            version: 1.0.0
+          restSequence:
+            - restRequestId:
+                name: request1
+                version: 1.0.1
+              httpMethod: POST
+              path: /onap/policy/clamp/acelement/v2/activate
+              body: '{ "receiverId": { "name": "onap.policy.clamp.ac.startertobridge", "version": "1.0.0" }, "timerMs": 20000, "elementType": "STARTER", "topicParameterGroup": { "server": "message-router:3904", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }'
+              expectedResponse: 201
+
+  709c62b3-8918-41b9-a747-d21eb79c6c25:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c25
+    definition:
+      name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Bridge Automation Composition Element for the Demo
+    properties:
+      baseUrl: http://cluster-ip:30801
+      httpHeaders:
+        Content-Type: application/json
+        Authorization: Basic YWNtVXNlcjp6YiFYenRHMzQ=
+      configurationEntities:
+        - configurationEntityId:
+            name: onap.policy.clamp.ac.bridge
+            version: 1.0.0
+          restSequence:
+            - restRequestId:
+                name: request2
+                version: 1.0.1
+              httpMethod: POST
+              path: /onap/policy/clamp/acelement/v2/activate
+              body: '{ "receiverId": { "name": "onap.policy.clamp.ac.bridgetosink", "version": "1.0.0" }, "timerMs": 20000, "elementType": "BRIDGE", "topicParameterGroup": { "server": "message-router:3904", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }'
+              expectedResponse: 201
+
+  709c62b3-8918-41b9-a747-d21eb79c6c26:
+    id: 709c62b3-8918-41b9-a747-d21eb79c6c26
+    definition:
+      name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement
+      version: 1.2.3+build1
+    description: Sink Automation Composition Element for the Demo
+    properties:
+      baseUrl: http://cluster-ip:30802
+      httpHeaders:
+        Content-Type: application/json
+        Authorization: Basic YWNtVXNlcjp6YiFYenRHMzQ=
+      configurationEntities:
+        - configurationEntityId:
+            name: onap.policy.clamp.ac.sink
+            version: 1.0.0
+          restSequence:
+            - restRequestId:
+                name: request3
+                version: 1.0.1
+              httpMethod: POST
+              path: /onap/policy/clamp/acelement/v2/activate
+              body: '{ "receiverId": { "name": "onap.policy.clamp.ac.sink", "version": "1.0.0" }, "timerMs": 20000, "elementType": "SINK", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }'
+              expectedResponse: 201