diff options
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 |