summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xexamples/src/main/resources/clamp/acm/test/tosca-versioning.yaml1119
-rwxr-xr-xmodels/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java4
-rwxr-xr-xruntime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java76
-rw-r--r--runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java20
-rwxr-xr-xruntime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java44
-rwxr-xr-xruntime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java2
-rwxr-xr-xruntime-acm/src/test/resources/rest/acm/AutomationCompositionVersioning.yaml170
7 files changed, 1396 insertions, 39 deletions
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
index 000000000..3e36062e9
--- /dev/null
+++ b/examples/src/main/resources/clamp/acm/test/tosca-versioning.yaml
@@ -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
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java
index 4069d7bb1..28689e2fd 100755
--- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java
+++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionDefinition.java
@@ -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
diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java
index 6c5417286..ed8badf8b 100755
--- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java
+++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java
@@ -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
@@ -159,6 +154,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();
toscaDataType.setName("org.onap.datatypes.policy.clamp.Configuration");
@@ -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();
diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java
index 534762299..38c63fa9b 100644
--- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java
+++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/InstantiationUtils.java
@@ -64,6 +64,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.
*
* @param response InstantiationResponse
diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java
index 1e5aa6c89..cd1a3856a 100755
--- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java
+++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java
@@ -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,19 +176,28 @@ 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 =
super.sendRequest(getInstanceEndPoint(UUID.randomUUID()) + "?name=noResultWithThisName");
@@ -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();
diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java
index 54d312477..8329d050b 100755
--- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java
+++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/CommonTestData.java
@@ -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
index 000000000..db93c261c
--- /dev/null
+++ b/runtime-acm/src/test/resources/rest/acm/AutomationCompositionVersioning.yaml
@@ -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