diff options
53 files changed, 4158 insertions, 633 deletions
diff --git a/examples/src/main/resources/clamp/acm/test/participant-a1pms.yaml b/examples/src/main/resources/clamp/acm/test/participant-a1pms.yaml index 9e3f20c34..88cca1658 100755 --- a/examples/src/main/resources/clamp/acm/test/participant-a1pms.yaml +++ b/examples/src/main/resources/clamp/acm/test/participant-a1pms.yaml @@ -97,7 +97,7 @@ node_types: type: list required: true entry_schema: - type: org.onap.datatypes.policy.clamp.acm.a1pmsAutomationCompositionElement.A1PolicyServiceEntity + type: org.onap.datatypes.policy.clamp.acm.a1PmsAutomationCompositionElement.A1PolicyServiceEntity type_version: 1.0.0 description: The configuration entities of A1 policy services topology_template: @@ -137,7 +137,7 @@ topology_template: org.onap.domain.sample.A1PMSAutomationCompositionDefinition: version: 1.2.3 type: org.onap.policy.clamp.acm.AutomationComposition - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition for A1PMS request properties: provider: ONAP diff --git a/examples/src/main/resources/clamp/acm/test/participant-http.yaml b/examples/src/main/resources/clamp/acm/test/participant-http.yaml index 1e458c22b..4020162ef 100644 --- a/examples/src/main/resources/clamp/acm/test/participant-http.yaml +++ b/examples/src/main/resources/clamp/acm/test/participant-http.yaml @@ -211,7 +211,7 @@ topology_template: org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition: version: 1.2.3 type: org.onap.policy.clamp.acm.AutomationComposition - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition for HTTP request properties: provider: ONAP diff --git a/examples/src/main/resources/clamp/acm/test/participant-kubernetes-helm.yaml b/examples/src/main/resources/clamp/acm/test/participant-kubernetes-helm.yaml index cd1a3e84c..8d066498f 100644 --- a/examples/src/main/resources/clamp/acm/test/participant-kubernetes-helm.yaml +++ b/examples/src/main/resources/clamp/acm/test/participant-kubernetes-helm.yaml @@ -101,7 +101,7 @@ topology_template: # Chart from any chart repository configured on helm client. version: 1.2.3 type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the K8S microservice for Hello World properties: provider: ONAP @@ -123,7 +123,7 @@ topology_template: # Chart from local file system version: 1.2.3 type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the K8S microservice for PMSH properties: provider: ONAP @@ -146,7 +146,7 @@ topology_template: # Chart installation without passing repository name version: 1.2.3 type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the K8S microservice for local chart properties: provider: ONAP @@ -166,7 +166,7 @@ topology_template: org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition: version: 1.2.3 type: org.onap.policy.clamp.acm.AutomationComposition - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition for Hello World properties: provider: ONAP diff --git a/examples/src/main/resources/clamp/acm/test/pm_simple_ac_tosca.yaml b/examples/src/main/resources/clamp/acm/test/pm_simple_ac_tosca.yaml index 6d41d9f3a..fedae594b 100644 --- a/examples/src/main/resources/clamp/acm/test/pm_simple_ac_tosca.yaml +++ b/examples/src/main/resources/clamp/acm/test/pm_simple_ac_tosca.yaml @@ -98,7 +98,7 @@ topology_template: org.onap.domain.pmsh.PMSH_DCAEMicroservice: version: 1.2.3 type: org.onap.policy.clamp.acm.DCAEMicroserviceAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the DCAE microservice for Performance Management Subscription Handling properties: provider: Ericsson @@ -111,7 +111,7 @@ topology_template: org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement: version: 1.2.3 type: org.onap.policy.clamp.acm.PolicyTypeAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the monitoring policy for Performance Management Subscription Handling properties: provider: Ericsson @@ -124,7 +124,7 @@ topology_template: org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement: version: 1.2.3 type: org.onap.policy.clamp.acm.PolicyTypeAutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for the operational policy for Performance Management Subscription Handling properties: provider: Ericsson @@ -137,7 +137,7 @@ topology_template: org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement: version: 1.2.3 type: org.onap.policy.clamp.acm.AutomationCompositionElement - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition element for CDS for Performance Management Subscription Handling properties: provider: Ericsson @@ -150,7 +150,7 @@ topology_template: org.onap.domain.pmsh.PMSHAutomationCompositionDefinition: version: 1.2.3 type: org.onap.policy.clamp.acm.AutomationComposition - type_version: 1.0.0 + type_version: 1.0.1 description: Automation composition for Performance Management Subscription Handling properties: provider: Ericsson diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositionElement.java b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositionElement.java index 7033abac2..e5c85dd10 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositionElement.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationCompositionElement.java @@ -31,7 +31,6 @@ import lombok.ToString; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfUtils; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; -import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; /** @@ -65,7 +64,7 @@ public class AutomationCompositionElement { // A map indexed by the property name. Each map entry is the serialized value of the property, // which can be deserialized into an instance of the type of the property. - private Map<String, ToscaProperty> propertiesMap = new LinkedHashMap<>(); + private Map<String, Object> properties = new LinkedHashMap<>(); /** * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy. @@ -81,6 +80,6 @@ public class AutomationCompositionElement { this.orderedState = otherElement.orderedState; this.toscaServiceTemplateFragment = otherElement.toscaServiceTemplateFragment; this.description = otherElement.description; - this.propertiesMap = PfUtils.mapMap(otherElement.propertiesMap, UnaryOperator.identity()); + this.properties = PfUtils.mapMap(otherElement.properties, UnaryOperator.identity()); } } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java index ac5444650..48fc8ba7c 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommand.java @@ -22,13 +22,9 @@ package org.onap.policy.clamp.models.acm.messages.rest.instantiation; import lombok.Data; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @Data public class InstantiationCommand { // The state to which the automation compositions are to be set private AutomationCompositionOrderedState orderedState; - - // The automation composition on which the command is to be issued - private ToscaConceptIdentifier automationCompositionIdentifier; } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationUpdate.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationUpdate.java new file mode 100644 index 000000000..7aab59436 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationUpdate.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.models.acm.messages.rest.instantiation; + +import java.util.Map; +import java.util.UUID; +import lombok.Data; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement; + +@Data +public class InstantiationUpdate { + + private InstantiationCommand instantiationCommand; + + private Map<UUID, AutomationCompositionElement> elements; +} diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElement.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElement.java index 08d8ee06b..d8e4237b7 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElement.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElement.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. + * Copyright (C) 2021-2022 Nordix Foundation. * ================================================================================ * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ @@ -22,14 +22,19 @@ package org.onap.policy.clamp.models.acm.persistence.concepts; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.function.UnaryOperator; import javax.persistence.AttributeOverride; import javax.persistence.Column; +import javax.persistence.Convert; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.Lob; import javax.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; @@ -39,11 +44,13 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.common.parameters.annotations.NotNull; +import org.onap.policy.common.parameters.annotations.Valid; import org.onap.policy.models.base.PfAuthorative; import org.onap.policy.models.base.PfConcept; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfKey; import org.onap.policy.models.base.PfReferenceKey; +import org.onap.policy.models.base.PfUtils; import org.onap.policy.models.base.validation.annotations.VerifyKey; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @@ -95,6 +102,12 @@ public class JpaAutomationCompositionElement extends PfConcept implements PfAuth @Column private String description; + @Lob + @NotNull + @Valid + @Convert(converter = StringToMapConverter.class) + private Map<String, Object> properties; + /** * The Default Constructor creates a {@link JpaAutomationCompositionElement} object with a null key. */ @@ -141,6 +154,7 @@ public class JpaAutomationCompositionElement extends PfConcept implements PfAuth this.state = copyConcept.state; this.orderedState = copyConcept.orderedState; this.description = copyConcept.description; + this.properties = (copyConcept.properties != null ? new LinkedHashMap<>(copyConcept.properties) : null); } /** @@ -163,6 +177,7 @@ public class JpaAutomationCompositionElement extends PfConcept implements PfAuth element.setState(state); element.setOrderedState(orderedState != null ? orderedState : state.asOrderedState()); element.setDescription(description); + element.setProperties(PfUtils.mapMap(properties, UnaryOperator.identity())); return element; } @@ -180,6 +195,7 @@ public class JpaAutomationCompositionElement extends PfConcept implements PfAuth this.state = element.getState(); this.orderedState = element.getOrderedState(); this.description = element.getDescription(); + properties = PfUtils.mapMap(element.getProperties(), UnaryOperator.identity()); } @Override diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/StringToMapConverter.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/StringToMapConverter.java new file mode 100644 index 000000000..5dccd0862 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/StringToMapConverter.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.models.acm.persistence.concepts; + +import java.util.HashMap; +import java.util.Map; +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import javax.ws.rs.core.Response; +import org.onap.policy.common.utils.coder.Coder; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.models.base.PfModelRuntimeException; + +@Converter(autoApply = true) +public class StringToMapConverter implements AttributeConverter<Map<String, Object>, String> { + + private static final Coder coder = new StandardCoder(); + + @Override + public String convertToDatabaseColumn(Map<String, Object> map) { + try { + return map == null ? null : coder.encode(map); + } catch (CoderException e) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e); + } + } + + @Override + public Map<String, Object> convertToEntityAttribute(String dbData) { + if (dbData == null) { + return new HashMap<>(); + } + try { + return coder.decode(dbData, Map.class); + } catch (CoderException e) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e); + } + } +} diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionUpdateTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionUpdateTest.java index 1d56bc9ee..a2417df6b 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionUpdateTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/AutomationCompositionUpdateTest.java @@ -35,6 +35,7 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedSta import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.concepts.ParticipantUpdates; import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty; @@ -46,15 +47,15 @@ class AutomationCompositionUpdateTest { void testCopyConstructor() throws CoderException { assertThatThrownBy(() -> new AutomationCompositionUpdate(null)).isInstanceOf(NullPointerException.class); - AutomationCompositionUpdate orig = new AutomationCompositionUpdate(); + var orig = new AutomationCompositionUpdate(); // verify with all values - ToscaConceptIdentifier id = new ToscaConceptIdentifier("id", "1.2.3"); + var id = new ToscaConceptIdentifier("id", "1.2.3"); orig.setAutomationCompositionId(id); orig.setParticipantId(null); orig.setMessageId(UUID.randomUUID()); orig.setTimestamp(Instant.ofEpochMilli(3000)); - AutomationCompositionElement acElement = new AutomationCompositionElement(); + var acElement = new AutomationCompositionElement(); acElement.setId(UUID.randomUUID()); acElement.setDefinition(id); acElement.setDescription("Description"); @@ -63,18 +64,20 @@ class AutomationCompositionUpdateTest { acElement.setParticipantId(id); acElement.setParticipantType(id); - ToscaProperty property = new ToscaProperty(); + var property = new ToscaProperty(); property.setName("test"); property.setType("testType"); - Map<String, ToscaProperty> propertiesMap = Map.of("Prop1", property); - acElement.setPropertiesMap(propertiesMap); + var standardCoder = new StandardCoder(); + var json = standardCoder.encode(property); + var propertiesMap = Map.of("Prop1", (Object) json); + acElement.setProperties(propertiesMap); - ParticipantUpdates participantUpdates = new ParticipantUpdates(); + var participantUpdates = new ParticipantUpdates(); participantUpdates.setParticipantId(id); participantUpdates.setAutomationCompositionElementList(List.of(acElement)); orig.setParticipantUpdatesList(List.of(participantUpdates)); - AutomationCompositionUpdate other = new AutomationCompositionUpdate(orig); + var other = new AutomationCompositionUpdate(orig); assertEquals(removeVariableFields(orig.toString()), removeVariableFields(other.toString())); assertSerializable(orig, AutomationCompositionUpdate.class); diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java index 1aa67f425..a87f7e042 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationCommandTest.java @@ -27,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class InstantiationCommandTest { @Test @@ -43,7 +42,6 @@ class InstantiationCommandTest { var ic1 = new InstantiationCommand(); - ic1.setAutomationCompositionIdentifier(new ToscaConceptIdentifier()); ic1.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED); assertThat(ic1.toString()).contains("InstantiationCommand("); diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElementTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElementTest.java index 7103f7f7a..d38aaf735 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElementTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionElementTest.java @@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; +import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement; @@ -299,6 +300,7 @@ class JpaAutomationCompositionElementTest { testJpaAutomationCompositionElement.fromAuthorative(testAce); testJpaAutomationCompositionElement.setKey(PfReferenceKey.getNullKey()); testJpaAutomationCompositionElement.fromAuthorative(testAce); + testJpaAutomationCompositionElement.setProperties(Map.of("key", "{}")); return testJpaAutomationCompositionElement; } @@ -308,6 +310,7 @@ class JpaAutomationCompositionElementTest { automationCompositionElement.setId(UUID.fromString("a95757ba-b34a-4049-a2a8-46773abcbe5e")); automationCompositionElement.setDefinition(new ToscaConceptIdentifier("aceDef", "0.0.1")); automationCompositionElement.setParticipantType(new ToscaConceptIdentifier("participantType", "0.0.1")); + automationCompositionElement.setProperties(Map.of("key", "{}")); return automationCompositionElement; } diff --git a/models/src/test/resources/META-INF/persistence.xml b/models/src/test/resources/META-INF/persistence.xml index 1e1d89309..6f9cb61eb 100644 --- a/models/src/test/resources/META-INF/persistence.xml +++ b/models/src/test/resources/META-INF/persistence.xml @@ -29,6 +29,7 @@ <class>org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionDefinition</class> <class>org.onap.policy.clamp.models.acm.persistence.concepts.StringToServiceTemplateConverter</class> <class>org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationCompositionElement</class> + <class>org.onap.policy.clamp.models.acm.persistence.concepts.StringToMapConverter</class> <class>org.onap.policy.clamp.models.acm.persistence.concepts.JpaParticipant</class> <properties> diff --git a/models/src/test/resources/json/AutomationCompositionElementNoOrderedState.json b/models/src/test/resources/json/AutomationCompositionElementNoOrderedState.json index 872499abf..934535a05 100644 --- a/models/src/test/resources/json/AutomationCompositionElementNoOrderedState.json +++ b/models/src/test/resources/json/AutomationCompositionElementNoOrderedState.json @@ -9,5 +9,6 @@ "version": "0.0.1" }, "state": "UNINITIALISED", - "orderedState": null + "orderedState": null, + "properties":{"key":"{}"} } diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java index 451215515..cb5b572a5 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java @@ -22,7 +22,6 @@ package org.onap.policy.clamp.acm.participant.intermediary.handler; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -48,7 +47,6 @@ import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMe import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; -import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -441,21 +439,4 @@ public class AutomationCompositionHandler { automationCompositions.setAutomationCompositionList(new ArrayList<>(automationCompositionMap.values())); return automationCompositions; } - - /** - * Get properties of a automation composition element. - * - * @param id the automation composition element id - * @return the instance properties - */ - public Map<String, ToscaProperty> getAcElementInstanceProperties(UUID id) { - Map<String, ToscaProperty> propertiesMap = new HashMap<>(); - for (var automationComposition : automationCompositionMap.values()) { - var element = automationComposition.getElements().get(id); - if (element != null) { - propertiesMap.putAll(element.getPropertiesMap()); - } - } - return propertiesMap; - } } diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java index 06b4256a7..95f16d3e2 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java @@ -135,7 +135,6 @@ class AutomationCompositionHandlerTest { assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions)); updateMsg.setStartPhase(1); assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions)); - assertThat(ach.getAcElementInstanceProperties(uuid)).isEmpty(); ach.getAutomationCompositionMap().clear(); updateMsg.setStartPhase(0); diff --git a/runtime-acm/pom.xml b/runtime-acm/pom.xml index c16bd15ab..903d527aa 100644 --- a/runtime-acm/pom.xml +++ b/runtime-acm/pom.xml @@ -79,7 +79,8 @@ InstancePropertiesResponse=org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstancePropertiesResponse, CommissioningResponse=org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse, InstantiationCommand=org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand, - InstantiationResponse=org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse + InstantiationResponse=org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse, + InstantiationUpdate=org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate </importMappings> <configOptions> <sourceFolder>src/gen/java</sourceFolder> diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java index 19d4afe11..66a67a304 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java @@ -94,10 +94,6 @@ public class CommissioningProvider { */ public CommissioningResponse createAutomationCompositionDefinitions(ToscaServiceTemplate serviceTemplate) { - if (verifyIfDefinitionExists()) { - throw new PfModelRuntimeException(Status.BAD_REQUEST, - "Delete instances, to commission automation composition definitions"); - } var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate); serviceTemplate = acmDefinition.getServiceTemplate(); var participantList = participantProvider.getParticipants(); @@ -191,13 +187,4 @@ public class CommissioningProvider { private boolean verifyIfInstanceExists(UUID compositionId) { return !acProvider.getAcInstancesByCompositionId(compositionId).isEmpty(); } - - /** - * Validates to see if there is any instance saved. - * - * @return true if exists instance - */ - private boolean verifyIfDefinitionExists() { - return !acDefinitionProvider.getAllAcDefinitions().isEmpty(); - } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java index 03a2f4e25..374c94f5d 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java @@ -22,6 +22,7 @@ package org.onap.policy.clamp.acm.runtime.instantiation; import java.util.List; +import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; import javax.ws.rs.core.Response; @@ -29,12 +30,14 @@ import javax.ws.rs.core.Response.Status; import lombok.AllArgsConstructor; import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; +import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeException; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; import org.onap.policy.clamp.models.acm.concepts.Participant; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; @@ -43,7 +46,6 @@ import org.onap.policy.common.parameters.BeanValidationResult; import org.onap.policy.common.parameters.ObjectValidationResult; import org.onap.policy.common.parameters.ValidationStatus; import org.onap.policy.models.base.PfModelRuntimeException; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,6 +57,7 @@ import org.springframework.transaction.annotation.Transactional; @AllArgsConstructor public class AutomationCompositionInstantiationProvider { private static final String AUTOMATION_COMPOSITION_NODE_ELEMENT_TYPE = "AutomationCompositionElement"; + private static final String DO_NOT_MATCH = " do not match with "; private final AutomationCompositionProvider automationCompositionProvider; private final SupervisionHandler supervisionHandler; @@ -65,11 +68,16 @@ public class AutomationCompositionInstantiationProvider { /** * Create automation composition. * + * @param compositionId The UUID of the automation composition definition * @param automationComposition the automation composition * @return the result of the instantiation operation */ - public InstantiationResponse createAutomationComposition(AutomationComposition automationComposition) { - + public InstantiationResponse createAutomationComposition(UUID compositionId, + AutomationComposition automationComposition) { + if (!compositionId.equals(automationComposition.getCompositionId())) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + automationComposition.getCompositionId() + DO_NOT_MATCH + compositionId); + } var checkAutomationCompositionOpt = automationCompositionProvider.findAutomationComposition(automationComposition.getKey().asIdentifier()); if (checkAutomationCompositionOpt.isPresent()) { @@ -93,20 +101,34 @@ public class AutomationCompositionInstantiationProvider { /** * Update automation composition. * - * @param automationComposition the automation composition - * @return the result of the instantiation operation + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance + * @param instanceUpdate the automation composition + * @return the result of the update */ - public InstantiationResponse updateAutomationComposition(AutomationComposition automationComposition) { - var validationResult = validateAutomationComposition(automationComposition); - if (!validationResult.isValid()) { - throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); + public InstantiationResponse updateAutomationComposition(UUID compositionId, UUID instanceId, + InstantiationUpdate instanceUpdate) { + var automationComposition = automationCompositionProvider.getAutomationComposition(instanceId); + if (!compositionId.equals(automationComposition.getCompositionId())) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + automationComposition.getCompositionId() + DO_NOT_MATCH + compositionId); + } + if (instanceUpdate.getElements() != null) { + automationComposition.setElements(instanceUpdate.getElements()); + var validationResult = validateAutomationComposition(automationComposition); + if (!validationResult.isValid()) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); + } + automationComposition = automationCompositionProvider.updateAutomationComposition(automationComposition); + } + + if (instanceUpdate.getInstantiationCommand() != null) { + issueAutomationCompositionCommand(automationComposition, instanceUpdate.getInstantiationCommand()); } - automationCompositionProvider.updateAutomationComposition(automationComposition); var response = new InstantiationResponse(); - response.setInstanceId(automationComposition.getInstanceId()); + response.setInstanceId(instanceId); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); - return response; } @@ -130,19 +152,35 @@ public class AutomationCompositionInstantiationProvider { } /** + * Get Automation Composition. + * + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance + * @return the Automation Composition + */ + @Transactional(readOnly = true) + public AutomationComposition getAutomationComposition(UUID compositionId, UUID instanceId) { + var automationComposition = automationCompositionProvider.getAutomationComposition(instanceId); + if (!automationComposition.getCompositionId().equals(compositionId)) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + "Composition Id " + compositionId + DO_NOT_MATCH + automationComposition.getCompositionId()); + } + return automationComposition; + } + + /** * Delete the automation composition with the given name and version. * - * @param name the name of the automation composition to delete - * @param version the version of the automation composition to delete + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance * @return the result of the deletion */ - public InstantiationResponse deleteAutomationComposition(String name, String version) { - var automationCompositionOpt = - automationCompositionProvider.findAutomationComposition(new ToscaConceptIdentifier(name, version)); - if (automationCompositionOpt.isEmpty()) { - throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "Automation composition not found"); + public InstantiationResponse deleteAutomationComposition(UUID compositionId, UUID instanceId) { + var automationComposition = automationCompositionProvider.getAutomationComposition(instanceId); + if (!compositionId.equals(automationComposition.getCompositionId())) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + automationComposition.getCompositionId() + DO_NOT_MATCH + compositionId); } - var automationComposition = automationCompositionOpt.get(); if (!AutomationCompositionState.UNINITIALISED.equals(automationComposition.getState())) { throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, "Automation composition state is still " + automationComposition.getState()); @@ -174,42 +212,33 @@ public class AutomationCompositionInstantiationProvider { /** * Issue a command to automation compositions, setting their ordered state. * + * @param automationComposition the AutomationComposition * @param command the command to issue to automation compositions - * @return the result of the initiation command - * @throws AutomationCompositionException on ordered state invalid */ - public InstantiationResponse issueAutomationCompositionCommand(InstantiationCommand command) - throws AutomationCompositionException { + public void issueAutomationCompositionCommand(AutomationComposition automationComposition, + InstantiationCommand command) { if (command.getOrderedState() == null) { - throw new AutomationCompositionException(Status.BAD_REQUEST, + throw new AutomationCompositionRuntimeException(Status.BAD_REQUEST, "ordered state invalid or not specified on command"); } var participants = participantProvider.getParticipants(); if (participants.isEmpty()) { - throw new AutomationCompositionException(Status.BAD_REQUEST, "No participants registered"); - } - var automationCompositionOpt = - automationCompositionProvider.findAutomationComposition(command.getAutomationCompositionIdentifier()); - if (automationCompositionOpt.isEmpty()) { - throw new AutomationCompositionException(Response.Status.BAD_REQUEST, - "AutomationComposition with id " + command.getAutomationCompositionIdentifier() + " not found"); + throw new AutomationCompositionRuntimeException(Status.BAD_REQUEST, "No participants registered"); } - - var automationComposition = automationCompositionOpt.get(); var validationResult = validateIssueAutomationComposition(automationComposition, participants); if (!validationResult.isValid()) { - throw new AutomationCompositionException(Response.Status.BAD_REQUEST, validationResult.getResult()); + throw new AutomationCompositionRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } automationComposition.setCascadedOrderedState(command.getOrderedState()); - supervisionHandler.triggerAutomationCompositionSupervision(automationComposition); + try { + supervisionHandler.triggerAutomationCompositionSupervision(automationComposition); + } catch (AutomationCompositionException e) { + throw new AutomationCompositionRuntimeException(Response.Status.BAD_REQUEST, e.getMessage()); + } automationCompositionProvider.updateAutomationComposition(automationComposition); - var response = new InstantiationResponse(); - response.setAffectedAutomationComposition(command.getAutomationCompositionIdentifier()); - - return response; } private BeanValidationResult validateIssueAutomationComposition(AutomationComposition automationComposition, diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java index d575a690e..e828843a6 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/InstantiationController.java @@ -21,32 +21,16 @@ package org.onap.policy.clamp.acm.runtime.main.rest; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.Extension; -import io.swagger.annotations.ExtensionProperty; -import io.swagger.annotations.ResponseHeader; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider; +import org.onap.policy.clamp.acm.runtime.main.rest.gen.AutomationCompositionInstanceApi; import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController; -import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; -import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; -import org.springframework.http.MediaType; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** @@ -54,129 +38,55 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequiredArgsConstructor -public class InstantiationController extends AbstractRestController { - - private static final String TAGS = "Clamp Automation Composition Instantiation API"; +public class InstantiationController extends AbstractRestController implements AutomationCompositionInstanceApi { // The Automation Composition provider for instantiation requests private final AutomationCompositionInstantiationProvider provider; /** - * Creates a automation composition. + * Creates an automation composition. * - * @param requestId request ID used in ONAP logging + * @param compositionId The UUID of the automation composition definition * @param automationComposition the automation composition + * @param requestId request ID used in ONAP logging * @return a response */ - // @formatter:off - @PostMapping(value = "/instantiation", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}, - consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - @ApiOperation( - value = "Commissions automation composition definitions", - notes = "Commissions automation composition definitions, returning the automation composition IDs", - response = InstantiationResponse.class, - tags = {TAGS}, - authorizations = @Authorization(value = AUTHORIZATION_TYPE), - responseHeaders = { - @ResponseHeader( - name = VERSION_MINOR_NAME, - description = VERSION_MINOR_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_PATCH_NAME, - description = VERSION_PATCH_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_LATEST_NAME, - description = VERSION_LATEST_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = REQUEST_ID_NAME, - description = REQUEST_ID_HDR_DESCRIPTION, - response = UUID.class) - }, - extensions = { - @Extension - ( - name = EXTENSION_NAME, - properties = { - @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), - @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) - } - ) - } - ) - @ApiResponses( - value = { - @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), - @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), - @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) - } - ) - // @formatter:on - public ResponseEntity<InstantiationResponse> createCompositionInstance( - @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam( - value = "Entity Body of automation composition", - required = true) @RequestBody AutomationComposition automationComposition) { + @Override + public ResponseEntity<InstantiationResponse> createCompositionInstance(UUID compositionId, + AutomationComposition automationComposition, UUID requestId) { + + var response = provider.createAutomationComposition(compositionId, automationComposition); + return ResponseEntity + .created(createUri("/compositions/" + compositionId + "/instances/" + response.getInstanceId())) + .body(response); + } - return ResponseEntity.ok().body(provider.createAutomationComposition(automationComposition)); + /** + * Gets an automation composition. + * + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance + * @param requestId request ID used in ONAP logging + * @return the automation composition instance + */ + @Override + public ResponseEntity<AutomationComposition> getCompositionInstance(UUID compositionId, UUID instanceId, + UUID requestId) { + return ResponseEntity.ok().body(provider.getAutomationComposition(compositionId, instanceId)); } /** * Queries details of all automation compositions. * - * @param requestId request ID used in ONAP logging + * @param compositionId The UUID of the automation composition definition * @param name the name of the automation composition to get, null for all automation compositions * @param version the version of the automation composition to get, null for all automation compositions + * @param requestId request ID used in ONAP logging * @return the automation compositions */ - // @formatter:off - @GetMapping(value = "/instantiation", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - @ApiOperation(value = "Query details of the requested automation compositions", - notes = "Queries details of the requested automation compositions, returning all composition details", - response = AutomationCompositions.class, - tags = {TAGS}, - authorizations = @Authorization(value = AUTHORIZATION_TYPE), - responseHeaders = { - @ResponseHeader( - name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION, - response = String.class), - @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION, - response = String.class), - @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION, - response = String.class), - @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION, - response = UUID.class)}, - extensions = { - @Extension - ( - name = EXTENSION_NAME, - properties = { - @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), - @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) - } - ) - } - ) - @ApiResponses( - value = { - @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), - @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), - @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) - } - ) - // @formatter:on - public ResponseEntity<AutomationCompositions> queryCompositionInstances( - @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Automation composition definition name", required = false) @RequestParam( - value = "name", - required = false) String name, - @ApiParam(value = "Automation composition definition version", required = false) @RequestParam( - value = "version", - required = false) String version) { + @Override + public ResponseEntity<AutomationCompositions> queryCompositionInstances(UUID compositionId, String name, + String version, UUID requestId) { return ResponseEntity.ok().body(provider.getAutomationCompositions(name, version)); } @@ -184,182 +94,32 @@ public class InstantiationController extends AbstractRestController { /** * Updates a automation composition. * + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance + * @param instanceUpdate the automation composition to update * @param requestId request ID used in ONAP logging - * @param automationComposition the automation composition * @return a response */ - // @formatter:off - @PutMapping(value = "/instantiation", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}, - consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - @ApiOperation( - value = "Updates automation composition definitions", - notes = "Updates automation composition definitions, returning the updated composition definition IDs", - response = InstantiationResponse.class, - tags = {TAGS}, - authorizations = @Authorization(value = AUTHORIZATION_TYPE), - responseHeaders = { - @ResponseHeader( - name = VERSION_MINOR_NAME, - description = VERSION_MINOR_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_PATCH_NAME, - description = VERSION_PATCH_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_LATEST_NAME, - description = VERSION_LATEST_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = REQUEST_ID_NAME, - description = REQUEST_ID_HDR_DESCRIPTION, - response = UUID.class) - }, - extensions = { - @Extension - ( - name = EXTENSION_NAME, - properties = { - @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), - @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) - } - ) - } - ) - @ApiResponses( - value = { - @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), - @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), - @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) - } - ) - // @formatter:on - public ResponseEntity<InstantiationResponse> updateCompositionInstance( - @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam( - value = "Entity Body of Automation Composition", - required = true) @RequestBody AutomationComposition automationComposition) { + @Override + public ResponseEntity<InstantiationResponse> updateCompositionInstance(UUID compositionId, UUID instanceId, + InstantiationUpdate instanceUpdate, UUID requestId) { - return ResponseEntity.ok().body(provider.updateAutomationComposition(automationComposition)); + return ResponseEntity.ok() + .body(provider.updateAutomationComposition(compositionId, instanceId, instanceUpdate)); } /** * Deletes a automation composition definition. * + * @param compositionId The UUID of the automation composition definition + * @param instanceId The UUID of the automation composition instance * @param requestId request ID used in ONAP logging - * @param name the name of the automation composition to delete - * @param version the version of the automation composition to delete * @return a response */ - // @formatter:off - @DeleteMapping(value = "/instantiation", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - @ApiOperation(value = "Delete a automation composition", - notes = "Deletes a automation composition, returning optional error details", - response = InstantiationResponse.class, - tags = {TAGS}, - authorizations = @Authorization(value = AUTHORIZATION_TYPE), - responseHeaders = { - @ResponseHeader( - name = VERSION_MINOR_NAME, - description = VERSION_MINOR_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_PATCH_NAME, - description = VERSION_PATCH_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = VERSION_LATEST_NAME, - description = VERSION_LATEST_DESCRIPTION, - response = String.class), - @ResponseHeader( - name = REQUEST_ID_NAME, - description = REQUEST_ID_HDR_DESCRIPTION, - response = UUID.class)}, - extensions = { - @Extension - ( - name = EXTENSION_NAME, - properties = { - @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), - @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) - } - ) - } - ) - @ApiResponses( - value = { - @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), - @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), - @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) - } - ) - // @formatter:on - - public ResponseEntity<InstantiationResponse> deleteCompositionInstance( - @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam(value = "Automation composition definition name", required = true) @RequestParam("name") String name, - @ApiParam(value = "Automation composition definition version") @RequestParam( - value = "version", - required = true) String version) { - - return ResponseEntity.ok().body(provider.deleteAutomationComposition(name, version)); - } - - /** - * Issues automation composition commands to automation compositions. - * - * @param requestId request ID used in ONAP logging - * @param command the command to issue to automation compositions - * @return the automation composition definitions - * @throws AutomationCompositionException on errors issuing a command - */ - // @formatter:off - @PutMapping(value = "/instantiation/command", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}, - consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - @ApiOperation(value = "Issue a command to the requested automation compositions", - notes = "Issues a command to an automation composition, ordering a state change on the composition", - response = InstantiationResponse.class, - tags = {TAGS}, - authorizations = @Authorization(value = AUTHORIZATION_TYPE), - responseHeaders = { - @ResponseHeader( - name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION, - response = String.class), - @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION, - response = String.class), - @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION, - response = String.class), - @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION, - response = UUID.class)}, - extensions = { - @Extension - ( - name = EXTENSION_NAME, - properties = { - @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION), - @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE) - } - ) - } - ) - @ApiResponses( - value = { - @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE), - @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE), - @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE) - } - ) - // @formatter:on - public ResponseEntity<InstantiationResponse> issueAutomationCompositionCommand( - @RequestHeader(name = REQUEST_ID_NAME, required = false) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId, - @ApiParam( - value = "Entity Body of automation composition command", - required = true) @RequestBody InstantiationCommand command) - throws AutomationCompositionException { + @Override + public ResponseEntity<InstantiationResponse> deleteCompositionInstance(UUID compositionId, UUID instanceId, + UUID requestId) { - return ResponseEntity.accepted().body(provider.issueAutomationCompositionCommand(command)); + return ResponseEntity.ok().body(provider.deleteAutomationComposition(compositionId, instanceId)); } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/AbstractRestController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/AbstractRestController.java index 61522dd66..736f258ee 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/AbstractRestController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/AbstractRestController.java @@ -20,13 +20,6 @@ package org.onap.policy.clamp.acm.runtime.main.web; -import io.swagger.annotations.Api; -import io.swagger.annotations.BasicAuthDefinition; -import io.swagger.annotations.Info; -import io.swagger.annotations.SecurityDefinition; -import io.swagger.annotations.SwaggerDefinition; -import io.swagger.annotations.Tag; -import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import javax.ws.rs.core.MediaType; @@ -37,57 +30,11 @@ import org.springframework.web.bind.annotation.RequestMapping; /** * Common superclass to provide REST endpoints for the participant simulator. */ -// @formatter:off @RequestMapping(value = "/v2", produces = {MediaType.APPLICATION_JSON, AbstractRestController.APPLICATION_YAML}) -@Api(value = "Automation Composition Commissioning API") -@SwaggerDefinition( - info = @Info(description = - "Automation Composition Service", version = "v1.0", - title = "Automation Composition"), - consumes = {MediaType.APPLICATION_JSON, AbstractRestController.APPLICATION_YAML}, - produces = {MediaType.APPLICATION_JSON, AbstractRestController.APPLICATION_YAML}, - schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS}, - tags = {@Tag(name = "automationcomposition", description = "Automation Composition Service")}, - securityDefinition = @SecurityDefinition(basicAuthDefinitions = {@BasicAuthDefinition(key = "basicAuth")})) -// @formatter:on public abstract class AbstractRestController { public static final String APPLICATION_YAML = "application/yaml"; - public static final String EXTENSION_NAME = "interface info"; - - public static final String API_VERSION_NAME = "api-version"; - public static final String API_VERSION = "1.0.0"; - - public static final String LAST_MOD_NAME = "last-mod-release"; - public static final String LAST_MOD_RELEASE = "Istanbul"; - - public static final String VERSION_MINOR_NAME = "X-MinorVersion"; - public static final String VERSION_MINOR_DESCRIPTION = - "Used to request or communicate a MINOR version back from the client" - + " to the server, and from the server back to the client"; - - public static final String VERSION_PATCH_NAME = "X-PatchVersion"; - public static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a response for" - + " troubleshooting purposes only, and will not be provided by" + " the client on request"; - - public static final String VERSION_LATEST_NAME = "X-LatestVersion"; - public static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version"; - - public static final String REQUEST_ID_NAME = "X-ONAP-RequestID"; - public static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose"; - public static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction"; - - public static final String AUTHORIZATION_TYPE = "basicAuth"; - - public static final int AUTHENTICATION_ERROR_CODE = HttpURLConnection.HTTP_UNAUTHORIZED; - public static final int AUTHORIZATION_ERROR_CODE = HttpURLConnection.HTTP_FORBIDDEN; - public static final int SERVER_ERROR_CODE = HttpURLConnection.HTTP_INTERNAL_ERROR; - - public static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error"; - public static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error"; - public static final String SERVER_ERROR_MESSAGE = "Internal Server Error"; - /** * Constructor. */ diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/GlobalControllerExceptionHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/GlobalControllerExceptionHandler.java index fef358bb1..96d3bb2a7 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/GlobalControllerExceptionHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/web/GlobalControllerExceptionHandler.java @@ -20,7 +20,7 @@ package org.onap.policy.clamp.acm.runtime.main.web; -import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; +import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeException; import org.onap.policy.clamp.models.acm.messages.rest.SimpleResponse; import org.onap.policy.clamp.models.acm.rest.RestUtils; import org.onap.policy.models.base.PfModelException; @@ -33,13 +33,13 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; public class GlobalControllerExceptionHandler { /** - * Handle AutomationCompositionException. + * Handle AutomationCompositionRuntimeException. * - * @param ex AutomationCompositionException + * @param ex AutomationCompositionRuntimeException * @return ResponseEntity */ - @ExceptionHandler(AutomationCompositionException.class) - public ResponseEntity<SimpleResponse> handleBadRequest(AutomationCompositionException ex) { + @ExceptionHandler(AutomationCompositionRuntimeException.class) + public ResponseEntity<SimpleResponse> handleBadRequest(AutomationCompositionRuntimeException ex) { return RestUtils.toSimpleResponse(ex); } diff --git a/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.json b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.json new file mode 100644 index 000000000..20602f730 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.json @@ -0,0 +1,25 @@ +{ + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "affectedAutomationCompositionDefinitions": [ + { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.AutomationCompositionDefinition", + "version": "1.2.3" + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.yaml new file mode 100644 index 000000000..893205dca --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionDefinitionResponse.yaml @@ -0,0 +1,12 @@ +compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f +affectedAutomationCompositionDefinitions: +- name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 +- name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.AutomationCompositionDefinition + version: 1.2.3 diff --git a/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.json b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.json new file mode 100644 index 000000000..b662bc6b6 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.json @@ -0,0 +1,6 @@ +{ + "affectedAutomationComposition": { + "name": "InstanceHttp", + "version": "1.0.1" + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.yaml new file mode 100644 index 000000000..1fbca51ac --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/deleteCompositionInstanceResponse.yaml @@ -0,0 +1,3 @@ +affectedAutomationComposition: + name: InstanceHttp + version: 1.0.1 diff --git a/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.json b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.json new file mode 100644 index 000000000..bef6791a3 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.json @@ -0,0 +1,491 @@ +{ + "service_templates": [ + { + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "properties": { + "name": { + "name": "name", + "type": "string", + "type_version": "0.0.0", + "required": true + }, + "version": { + "name": "version", + "type": "string", + "type_version": "0.0.0", + "required": true + } + }, + "name": "onap.datatypes.ToscaConceptIdentifier", + "version": "0.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest": { + "properties": { + "restRequestId": { + "name": "restRequestId", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The name and version of a REST request to be sent to a REST endpoint", + "required": true + }, + "httpMethod": { + "name": "httpMethod", + "type": "string", + "type_version": "0.0.0", + "description": "The REST method to use", + "required": true, + "constraints": [ + { + "valid_values": [ + "POST", + "PUT", + "GET", + "DELETE" + ] + } + ] + }, + "path": { + "name": "path", + "type": "string", + "type_version": "0.0.0", + "description": "The path of the REST request relative to the base URL", + "required": true + }, + "body": { + "name": "body", + "type": "string", + "type_version": "0.0.0", + "description": "The body of the REST request for PUT and POST requests", + "required": false + }, + "expectedResponse": { + "name": "expectedResponse", + "type": "integer", + "type_version": "0.0.0", + "description": "THe expected HTTP status code for the REST request", + "required": true, + "constraints": [] + } + }, + "name": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity": { + "properties": { + "configurationEntityId": { + "name": "configurationEntityId", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The name and version of a Configuration Entity to be handled by the HTTP Automation Composition Element", + "required": true + }, + "restSequence": { + "name": "restSequence", + "type": "list", + "type_version": "0.0.0", + "description": "A sequence of REST commands to send to the REST endpoint", + "required": false, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "type_version": "1.0.0" + } + } + }, + "name": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "required": false + } + }, + "name": "org.onap.policy.clamp.acm.Participant", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.AutomationCompositionElement": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "description": "Specifies the organization that provides the automation composition element", + "required": false, + "metadata": { + "common": "true" + } + }, + "participant_id": { + "name": "participant_id", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "required": true, + "metadata": { + "common": "true" + } + }, + "participantType": { + "name": "participantType", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The identity of the participant type that hosts this type of Automation Composition Element", + "required": true, + "metadata": { + "common": "true" + } + }, + "startPhase": { + "name": "startPhase", + "type": "integer", + "type_version": "0.0.0", + "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", + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "uninitializedToPassiveTimeout": { + "name": "uninitializedToPassiveTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from uninitialized to passive", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "passiveToRunningTimeout": { + "name": "passiveToRunningTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from passive to running", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "runningToPassiveTimeout": { + "name": "runningToPassiveTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from running to passive", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "passiveToUninitializedTimeout": { + "name": "passiveToUninitializedTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from passive to uninitialized", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + } + }, + "name": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.AutomationComposition": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "description": "Specifies the organization that provides the automation composition element", + "required": false, + "metadata": { + "common": "true" + } + }, + "elements": { + "name": "elements", + "type": "list", + "type_version": "0.0.0", + "description": "Specifies a list of automation composition element definitions that make up this automation composition definition", + "required": true, + "entry_schema": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0" + }, + "metadata": { + "common": "true" + } + } + }, + "name": "org.onap.policy.clamp.acm.AutomationComposition", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.HttpAutomationCompositionElement": { + "properties": { + "baseUrl": { + "name": "baseUrl", + "type": "string", + "type_version": "0.0.0", + "description": "The base URL to be prepended to each path, identifies the host for the REST endpoints.", + "required": true + }, + "httpHeaders": { + "name": "httpHeaders", + "type": "map", + "type_version": "0.0.0", + "description": "HTTP headers to send on REST requests", + "required": false, + "entry_schema": { + "type": "string", + "type_version": "0.0.0" + } + }, + "configurationEntities": { + "name": "configurationEntities", + "type": "map", + "type_version": "0.0.0", + "description": "The connfiguration entities the Automation Composition Element is managing and their associated REST requests", + "required": true, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "type_version": "1.0.0" + } + } + }, + "name": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "version": "1.0.1", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "metadata": {} + } + }, + "topology_template": { + "node_templates": { + "org.onap.policy.clamp.acm.HttpParticipant": { + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP" + }, + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4", + "metadata": {}, + "description": "Participant for Http requests" + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-starter:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"STARTER\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Starter microservice" + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-bridge:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"BRIDGE\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Bridge microservice" + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-sink:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"SINK\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Sink microservice" + }, + "onap.policy.clamp.ac.element.AutomationCompositionDefinition": { + "type": "org.onap.policy.clamp.acm.AutomationComposition", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + }, + "name": "onap.policy.clamp.ac.element.AutomationCompositionDefinition", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition for Demp" + } + } + }, + "name": "tosca", + "version": "1.0.0", + "metadata": {} + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.yaml b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.yaml new file mode 100644 index 000000000..001e07d0d --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getAllCompositionDefinitions.yaml @@ -0,0 +1,393 @@ +service_templates: +- tosca_definitions_version: tosca_simple_yaml_1_3 + data_types: + onap.datatypes.ToscaConceptIdentifier: + properties: + name: + name: name + type: string + type_version: 0.0.0 + required: true + version: + name: version + type: string + type_version: 0.0.0 + required: true + name: onap.datatypes.ToscaConceptIdentifier + version: 0.0.0 + derived_from: tosca.datatypes.Root + metadata: {} + org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest: + properties: + restRequestId: + name: restRequestId + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The name and version of a REST request to be sent to a REST + endpoint + required: true + httpMethod: + name: httpMethod + type: string + type_version: 0.0.0 + description: The REST method to use + required: true + constraints: + - valid_values: + - POST + - PUT + - GET + - DELETE + path: + name: path + type: string + type_version: 0.0.0 + description: The path of the REST request relative to the base URL + required: true + body: + name: body + type: string + type_version: 0.0.0 + description: The body of the REST request for PUT and POST requests + required: false + expectedResponse: + name: expectedResponse + type: integer + type_version: 0.0.0 + description: THe expected HTTP status code for the REST request + required: true + constraints: [] + name: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest + version: 1.0.0 + derived_from: tosca.datatypes.Root + metadata: {} + org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity: + properties: + configurationEntityId: + name: configurationEntityId + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The name and version of a Configuration Entity to be handled + by the HTTP Automation Composition Element + required: true + restSequence: + name: restSequence + type: list + type_version: 0.0.0 + description: A sequence of REST commands to send to the REST endpoint + required: false + entry_schema: + type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest + type_version: 1.0.0 + name: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity + version: 1.0.0 + derived_from: tosca.datatypes.Root + metadata: {} + node_types: + org.onap.policy.clamp.acm.Participant: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + required: false + name: org.onap.policy.clamp.acm.Participant + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.AutomationCompositionElement: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + description: Specifies the organization that provides the automation composition + element + required: false + metadata: + common: 'true' + participant_id: + name: participant_id + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + required: true + metadata: + common: 'true' + participantType: + name: participantType + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The identity of the participant type that hosts this type of + Automation Composition Element + required: true + metadata: + common: 'true' + startPhase: + name: startPhase + type: integer + type_version: 0.0.0 + 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 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + uninitializedToPassiveTimeout: + name: uninitializedToPassiveTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from + uninitialized to passive + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + passiveToRunningTimeout: + name: passiveToRunningTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from + passive to running + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + runningToPassiveTimeout: + name: runningToPassiveTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from + running to passive + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + passiveToUninitializedTimeout: + name: passiveToUninitializedTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from + passive to uninitialized + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + name: org.onap.policy.clamp.acm.AutomationCompositionElement + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.AutomationComposition: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + description: Specifies the organization that provides the automation composition + element + required: false + metadata: + common: 'true' + elements: + name: elements + type: list + type_version: 0.0.0 + description: Specifies a list of automation composition element definitions + that make up this automation composition definition + required: true + entry_schema: + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + metadata: + common: 'true' + name: org.onap.policy.clamp.acm.AutomationComposition + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.HttpAutomationCompositionElement: + properties: + baseUrl: + name: baseUrl + type: string + type_version: 0.0.0 + description: The base URL to be prepended to each path, identifies the host + for the REST endpoints. + required: true + httpHeaders: + name: httpHeaders + type: map + type_version: 0.0.0 + description: HTTP headers to send on REST requests + required: false + entry_schema: + type: string + type_version: 0.0.0 + configurationEntities: + name: configurationEntities + type: map + type_version: 0.0.0 + description: The connfiguration entities the Automation Composition Element + is managing and their associated REST requests + required: true + entry_schema: + type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity + type_version: 1.0.0 + name: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + version: 1.0.1 + derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement + metadata: {} + topology_template: + node_templates: + org.onap.policy.clamp.acm.HttpParticipant: + type: org.onap.policy.clamp.acm.Participant + type_version: 1.0.1 + properties: + provider: ONAP + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + metadata: {} + description: Participant for Http requests + onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-starter:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "STARTER", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Starter microservice + onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-bridge:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "BRIDGE", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Bridge microservice + onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-sink:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "SINK", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Sink microservice + onap.policy.clamp.ac.element.AutomationCompositionDefinition: + type: org.onap.policy.clamp.acm.AutomationComposition + type_version: 1.0.1 + properties: + provider: ONAP + elements: + - name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + name: onap.policy.clamp.ac.element.AutomationCompositionDefinition + version: 1.2.3 + metadata: {} + description: Automation composition for Demp + name: tosca + version: 1.0.0 + metadata: {} diff --git a/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.json b/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.json new file mode 100644 index 000000000..55b99b28c --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.json @@ -0,0 +1,72 @@ +{ + "automationCompositionList": [ + { + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c23": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c23", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Sink Automation Composition Element for the Demo", + "propertiesMap": {} + }, + "709c62b3-8918-41b9-a747-d21eb79c6c25": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c25", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Bridge Automation Composition Element for the Demo", + "propertiesMap": {} + }, + "709c62b3-8918-41b9-a747-d21eb79c6c24": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c24", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Starter Automation Composition Element for the Demo", + "propertiesMap": {} + } + }, + "primed": false, + "name": "InstanceHttp", + "version": "1.0.1", + "description": "Demo automation composition instance Http" + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.yaml new file mode 100644 index 000000000..3fa6506ea --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getCompositionInstancesResponse.yaml @@ -0,0 +1,54 @@ +automationCompositionList: +- compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f + state: UNINITIALISED + orderedState: UNINITIALISED + elements: + 709c62b3-8918-41b9-a747-d21eb79c6c23: + id: 709c62b3-8918-41b9-a747-d21eb79c6c23 + definition: + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Sink Automation Composition Element for the Demo + propertiesMap: {} + 709c62b3-8918-41b9-a747-d21eb79c6c25: + id: 709c62b3-8918-41b9-a747-d21eb79c6c25 + definition: + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Bridge Automation Composition Element for the Demo + propertiesMap: {} + 709c62b3-8918-41b9-a747-d21eb79c6c24: + id: 709c62b3-8918-41b9-a747-d21eb79c6c24 + definition: + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + participantId: + name: HttpParticipant0 + version: 1.0.0 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Starter Automation Composition Element for the Demo + propertiesMap: {} + primed: false + name: InstanceHttp + version: 1.0.1 + description: Demo automation composition instance Http diff --git a/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.json b/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.json new file mode 100644 index 000000000..37ea18974 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.json @@ -0,0 +1,487 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "properties": { + "name": { + "name": "name", + "type": "string", + "type_version": "0.0.0", + "required": true + }, + "version": { + "name": "version", + "type": "string", + "type_version": "0.0.0", + "required": true + } + }, + "name": "onap.datatypes.ToscaConceptIdentifier", + "version": "0.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest": { + "properties": { + "restRequestId": { + "name": "restRequestId", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The name and version of a REST request to be sent to a REST endpoint", + "required": true + }, + "httpMethod": { + "name": "httpMethod", + "type": "string", + "type_version": "0.0.0", + "description": "The REST method to use", + "required": true, + "constraints": [ + { + "valid_values": [ + "POST", + "PUT", + "GET", + "DELETE" + ] + } + ] + }, + "path": { + "name": "path", + "type": "string", + "type_version": "0.0.0", + "description": "The path of the REST request relative to the base URL", + "required": true + }, + "body": { + "name": "body", + "type": "string", + "type_version": "0.0.0", + "description": "The body of the REST request for PUT and POST requests", + "required": false + }, + "expectedResponse": { + "name": "expectedResponse", + "type": "integer", + "type_version": "0.0.0", + "description": "THe expected HTTP status code for the REST request", + "required": true, + "constraints": [] + } + }, + "name": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + }, + "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity": { + "properties": { + "configurationEntityId": { + "name": "configurationEntityId", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The name and version of a Configuration Entity to be handled by the HTTP Automation Composition Element", + "required": true + }, + "restSequence": { + "name": "restSequence", + "type": "list", + "type_version": "0.0.0", + "description": "A sequence of REST commands to send to the REST endpoint", + "required": false, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest", + "type_version": "1.0.0" + } + } + }, + "name": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "version": "1.0.0", + "derived_from": "tosca.datatypes.Root", + "metadata": {} + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "required": false + } + }, + "name": "org.onap.policy.clamp.acm.Participant", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.AutomationCompositionElement": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "description": "Specifies the organization that provides the automation composition element", + "required": false, + "metadata": { + "common": "true" + } + }, + "participant_id": { + "name": "participant_id", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "required": true, + "metadata": { + "common": "true" + } + }, + "participantType": { + "name": "participantType", + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0", + "description": "The identity of the participant type that hosts this type of Automation Composition Element", + "required": true, + "metadata": { + "common": "true" + } + }, + "startPhase": { + "name": "startPhase", + "type": "integer", + "type_version": "0.0.0", + "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", + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "uninitializedToPassiveTimeout": { + "name": "uninitializedToPassiveTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from uninitialized to passive", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "passiveToRunningTimeout": { + "name": "passiveToRunningTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from passive to running", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "runningToPassiveTimeout": { + "name": "runningToPassiveTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from running to passive", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + }, + "passiveToUninitializedTimeout": { + "name": "passiveToUninitializedTimeout", + "type": "integer", + "type_version": "0.0.0", + "description": "The maximum time in seconds to wait for a state chage from passive to uninitialized", + "default": 60.0, + "required": false, + "constraints": [ + { + "greater_or_equal": "0" + } + ], + "metadata": { + "common": "true" + } + } + }, + "name": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.AutomationComposition": { + "properties": { + "provider": { + "name": "provider", + "type": "string", + "type_version": "0.0.0", + "description": "Specifies the organization that provides the automation composition element", + "required": false, + "metadata": { + "common": "true" + } + }, + "elements": { + "name": "elements", + "type": "list", + "type_version": "0.0.0", + "description": "Specifies a list of automation composition element definitions that make up this automation composition definition", + "required": true, + "entry_schema": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "type_version": "0.0.0" + }, + "metadata": { + "common": "true" + } + } + }, + "name": "org.onap.policy.clamp.acm.AutomationComposition", + "version": "1.0.1", + "derived_from": "tosca.nodetypes.Root", + "metadata": {} + }, + "org.onap.policy.clamp.acm.HttpAutomationCompositionElement": { + "properties": { + "baseUrl": { + "name": "baseUrl", + "type": "string", + "type_version": "0.0.0", + "description": "The base URL to be prepended to each path, identifies the host for the REST endpoints.", + "required": true + }, + "httpHeaders": { + "name": "httpHeaders", + "type": "map", + "type_version": "0.0.0", + "description": "HTTP headers to send on REST requests", + "required": false, + "entry_schema": { + "type": "string", + "type_version": "0.0.0" + } + }, + "configurationEntities": { + "name": "configurationEntities", + "type": "map", + "type_version": "0.0.0", + "description": "The connfiguration entities the Automation Composition Element is managing and their associated REST requests", + "required": true, + "entry_schema": { + "type": "org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity", + "type_version": "1.0.0" + } + } + }, + "name": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "version": "1.0.1", + "derived_from": "org.onap.policy.clamp.acm.AutomationCompositionElement", + "metadata": {} + } + }, + "topology_template": { + "node_templates": { + "org.onap.policy.clamp.acm.HttpParticipant": { + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP" + }, + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4", + "metadata": {}, + "description": "Participant for Http requests" + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-starter:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"STARTER\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Starter microservice" + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-bridge:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"BRIDGE\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Bridge microservice" + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-sink:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"SINK\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + }, + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition element for the http requests of AC Element Sink microservice" + }, + "onap.policy.clamp.ac.element.AutomationCompositionDefinition": { + "type": "org.onap.policy.clamp.acm.AutomationComposition", + "type_version": "1.0.1", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + }, + "name": "onap.policy.clamp.ac.element.AutomationCompositionDefinition", + "version": "1.2.3", + "metadata": {}, + "description": "Automation composition for Demp" + } + } + }, + "name": "tosca", + "version": "1.0.0", + "metadata": {} +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.yaml b/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.yaml new file mode 100644 index 000000000..5e2c61144 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/getSingleCompositionDefinition.yaml @@ -0,0 +1,391 @@ +tosca_definitions_version: tosca_simple_yaml_1_3 +data_types: + onap.datatypes.ToscaConceptIdentifier: + properties: + name: + name: name + type: string + type_version: 0.0.0 + required: true + version: + name: version + type: string + type_version: 0.0.0 + required: true + name: onap.datatypes.ToscaConceptIdentifier + version: 0.0.0 + derived_from: tosca.datatypes.Root + metadata: {} + org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest: + properties: + restRequestId: + name: restRequestId + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The name and version of a REST request to be sent to a REST endpoint + required: true + httpMethod: + name: httpMethod + type: string + type_version: 0.0.0 + description: The REST method to use + required: true + constraints: + - valid_values: + - POST + - PUT + - GET + - DELETE + path: + name: path + type: string + type_version: 0.0.0 + description: The path of the REST request relative to the base URL + required: true + body: + name: body + type: string + type_version: 0.0.0 + description: The body of the REST request for PUT and POST requests + required: false + expectedResponse: + name: expectedResponse + type: integer + type_version: 0.0.0 + description: THe expected HTTP status code for the REST request + required: true + constraints: [] + name: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest + version: 1.0.0 + derived_from: tosca.datatypes.Root + metadata: {} + org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity: + properties: + configurationEntityId: + name: configurationEntityId + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The name and version of a Configuration Entity to be handled + by the HTTP Automation Composition Element + required: true + restSequence: + name: restSequence + type: list + type_version: 0.0.0 + description: A sequence of REST commands to send to the REST endpoint + required: false + entry_schema: + type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest + type_version: 1.0.0 + name: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity + version: 1.0.0 + derived_from: tosca.datatypes.Root + metadata: {} +node_types: + org.onap.policy.clamp.acm.Participant: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + required: false + name: org.onap.policy.clamp.acm.Participant + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.AutomationCompositionElement: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + description: Specifies the organization that provides the automation composition + element + required: false + metadata: + common: 'true' + participant_id: + name: participant_id + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + required: true + metadata: + common: 'true' + participantType: + name: participantType + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + description: The identity of the participant type that hosts this type of + Automation Composition Element + required: true + metadata: + common: 'true' + startPhase: + name: startPhase + type: integer + type_version: 0.0.0 + 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 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + uninitializedToPassiveTimeout: + name: uninitializedToPassiveTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from uninitialized + to passive + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + passiveToRunningTimeout: + name: passiveToRunningTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from passive + to running + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + runningToPassiveTimeout: + name: runningToPassiveTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from running + to passive + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + passiveToUninitializedTimeout: + name: passiveToUninitializedTimeout + type: integer + type_version: 0.0.0 + description: The maximum time in seconds to wait for a state chage from passive + to uninitialized + default: 60.0 + required: false + constraints: + - greater_or_equal: '0' + metadata: + common: 'true' + name: org.onap.policy.clamp.acm.AutomationCompositionElement + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.AutomationComposition: + properties: + provider: + name: provider + type: string + type_version: 0.0.0 + description: Specifies the organization that provides the automation composition + element + required: false + metadata: + common: 'true' + elements: + name: elements + type: list + type_version: 0.0.0 + description: Specifies a list of automation composition element definitions + that make up this automation composition definition + required: true + entry_schema: + type: onap.datatypes.ToscaConceptIdentifier + type_version: 0.0.0 + metadata: + common: 'true' + name: org.onap.policy.clamp.acm.AutomationComposition + version: 1.0.1 + derived_from: tosca.nodetypes.Root + metadata: {} + org.onap.policy.clamp.acm.HttpAutomationCompositionElement: + properties: + baseUrl: + name: baseUrl + type: string + type_version: 0.0.0 + description: The base URL to be prepended to each path, identifies the host + for the REST endpoints. + required: true + httpHeaders: + name: httpHeaders + type: map + type_version: 0.0.0 + description: HTTP headers to send on REST requests + required: false + entry_schema: + type: string + type_version: 0.0.0 + configurationEntities: + name: configurationEntities + type: map + type_version: 0.0.0 + description: The connfiguration entities the Automation Composition Element + is managing and their associated REST requests + required: true + entry_schema: + type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity + type_version: 1.0.0 + name: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + version: 1.0.1 + derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement + metadata: {} +topology_template: + node_templates: + org.onap.policy.clamp.acm.HttpParticipant: + type: org.onap.policy.clamp.acm.Participant + type_version: 1.0.1 + properties: + provider: ONAP + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + metadata: {} + description: Participant for Http requests + onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-starter:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "STARTER", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Starter microservice + onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-bridge:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "BRIDGE", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Bridge microservice + onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement: + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-sink:8084 + httpHeaders: + Content-Type: application/json + Authorization: Basic cnVudGltZVVzZXI6emIhWHp0RzM0 + 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": 4000, "elementType": "SINK", "topicParameterGroup": + { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", + "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": + "dmaap" } }' + expectedResponse: 201 + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + metadata: {} + description: Automation composition element for the http requests of AC Element + Sink microservice + onap.policy.clamp.ac.element.AutomationCompositionDefinition: + type: org.onap.policy.clamp.acm.AutomationComposition + type_version: 1.0.1 + properties: + provider: ONAP + elements: + - name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + name: onap.policy.clamp.ac.element.AutomationCompositionDefinition + version: 1.2.3 + metadata: {} + description: Automation composition for Demp +name: tosca +version: 1.0.0 +metadata: {} diff --git a/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.json b/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.json new file mode 100644 index 000000000..20602f730 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.json @@ -0,0 +1,25 @@ +{ + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "affectedAutomationCompositionDefinitions": [ + { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.AutomationCompositionDefinition", + "version": "1.2.3" + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.yaml new file mode 100644 index 000000000..893205dca --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCommissionCompositionDefinitionsResponse.yaml @@ -0,0 +1,12 @@ +compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f +affectedAutomationCompositionDefinitions: +- name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 +- name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.AutomationCompositionDefinition + version: 1.2.3 diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.json b/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.json new file mode 100644 index 000000000..61314cf6c --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.json @@ -0,0 +1,410 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "required": true + }, + "version": { + "type": "string", + "required": true + } + } + }, + "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" + } + } + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "version": "1.0.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" + }, + "participant_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "metadata": { + "common": true + } + }, + "participantType": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "metadata": { + "common": true + }, + "description": "The identity of the participant type that hosts this type of 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.HttpAutomationCompositionElement": { + "version": "1.0.1", + "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": { + "node_templates": { + "org.onap.policy.clamp.acm.HttpParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.1", + "description": "Participant for Http requests", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "description": "Automation composition element for the http requests of AC Element Starter microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-starter:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"STARTER\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "description": "Automation composition element for the http requests of AC Element Bridge microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-bridge:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"BRIDGE\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.1", + "description": "Automation composition element for the http requests of AC Element Sink microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-sink:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "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\": 4000, \"elementType\": \"SINK\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "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 Demp", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + } + } + } + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.yaml b/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.yaml new file mode 100644 index 000000000..c60209836 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionDefinitions.yaml @@ -0,0 +1,312 @@ +# ============LICENSE_START======================================================= +# Copyright (C) 2022 Nordix Foundation. +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END========================================================= +tosca_definitions_version: tosca_simple_yaml_1_3 +data_types: + onap.datatypes.ToscaConceptIdentifier: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + required: true + version: + type: string + required: true + + 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 + +node_types: + org.onap.policy.clamp.acm.Participant: + version: 1.0.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 + participant_id: + type: onap.datatypes.ToscaConceptIdentifier + required: true + metadata: + common: true + participantType: + type: onap.datatypes.ToscaConceptIdentifier + required: true + metadata: + common: true + description: The identity of the participant type that hosts this type of 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.HttpAutomationCompositionElement: + version: 1.0.1 + 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: + node_templates: + org.onap.policy.clamp.acm.HttpParticipant: + version: 2.3.4 + type: org.onap.policy.clamp.acm.Participant + type_version: 1.0.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 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + description: Automation composition element for the http requests of AC Element Starter microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-starter:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + 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": 4000, "elementType": "STARTER", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement: + # Http config for AC Element Bridge. + version: 1.2.3 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + description: Automation composition element for the http requests of AC Element Bridge microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-bridge:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + 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": 4000, "elementType": "BRIDGE", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement: + # Http config for AC Element Sink. + version: 1.2.3 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.1 + description: Automation composition element for the http requests of AC Element Sink microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-sink:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + 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": 4000, "elementType": "SINK", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + + 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 Demp + properties: + provider: ONAP + elements: + - name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.json b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.json new file mode 100644 index 000000000..d2886038f --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.json @@ -0,0 +1,64 @@ +{ + "name": "InstanceHttp", + "version": "1.0.1", + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Demo automation composition instance Http", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c24": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c24", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Starter Automation Composition Element for the Demo" + }, + "709c62b3-8918-41b9-a747-d21eb79c6c25": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c25", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Bridge Automation Composition Element for the Demo" + }, + "709c62b3-8918-41b9-a747-d21eb79c6c23": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c23", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Sink Automation Composition Element for the Demo" + } + } +} diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.yaml b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.yaml new file mode 100644 index 000000000..96111aa35 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstance.yaml @@ -0,0 +1,49 @@ +name: InstanceHttp +version: 1.0.1 +compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f +state: UNINITIALISED +orderedState: UNINITIALISED +description: Demo automation composition instance Http +elements: + 709c62b3-8918-41b9-a747-d21eb79c6c24: + id: 709c62b3-8918-41b9-a747-d21eb79c6c24 + definition: + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Starter Automation Composition Element for the Demo + 709c62b3-8918-41b9-a747-d21eb79c6c25: + id: 709c62b3-8918-41b9-a747-d21eb79c6c25 + definition: + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Bridge Automation Composition Element for the Demo + 709c62b3-8918-41b9-a747-d21eb79c6c23: + id: 709c62b3-8918-41b9-a747-d21eb79c6c23 + definition: + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Sink Automation Composition Element for the Demo diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.json b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.json new file mode 100644 index 000000000..b662bc6b6 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.json @@ -0,0 +1,6 @@ +{ + "affectedAutomationComposition": { + "name": "InstanceHttp", + "version": "1.0.1" + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.yaml new file mode 100644 index 000000000..1fbca51ac --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/postCompositionInstancesResponse.yaml @@ -0,0 +1,3 @@ +affectedAutomationComposition: + name: InstanceHttp + version: 1.0.1 diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.json b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.json new file mode 100644 index 000000000..78b81d628 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.json @@ -0,0 +1,410 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_3", + "data_types": { + "onap.datatypes.ToscaConceptIdentifier": { + "derived_from": "tosca.datatypes.Root", + "properties": { + "name": { + "type": "string", + "required": true + }, + "version": { + "type": "string", + "required": true + } + } + }, + "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" + } + } + } + }, + "node_types": { + "org.onap.policy.clamp.acm.Participant": { + "version": "1.0.2", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false + } + } + }, + "org.onap.policy.clamp.acm.AutomationCompositionElement": { + "version": "1.0.2", + "derived_from": "tosca.nodetypes.Root", + "properties": { + "provider": { + "type": "string", + "required": false, + "metadata": { + "common": true + }, + "description": "Specifies the organization that provides the automation composition element" + }, + "participant_id": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "metadata": { + "common": true + } + }, + "participantType": { + "type": "onap.datatypes.ToscaConceptIdentifier", + "required": true, + "metadata": { + "common": true + }, + "description": "The identity of the participant type that hosts this type of 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.2", + "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.HttpAutomationCompositionElement": { + "version": "1.0.2", + "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": { + "node_templates": { + "org.onap.policy.clamp.acm.HttpParticipant": { + "version": "2.3.4", + "type": "org.onap.policy.clamp.acm.Participant", + "type_version": "1.0.2", + "description": "Participant for Http requests", + "properties": { + "provider": "ONAP" + } + }, + "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.2", + "description": "Automation composition element for the http requests of AC Element Starter microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-starter:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "configurationEntities": [ + { + "configurationEntityId": { + "name": "onap.policy.clamp.ac.starter", + "version": "1.0.0" + }, + "restSequence": [ + { + "restRequestId": { + "name": "request1", + "version": "1.0.2" + }, + "httpMethod": "POST", + "path": "/onap/policy/clamp/acelement/v2/activate", + "body": "{ \"receiverId\": { \"name\": \"onap.policy.clamp.ac.startertobridge\", \"version\": \"1.0.0\" }, \"timerMs\": 4000, \"elementType\": \"STARTER\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.2", + "description": "Automation composition element for the http requests of AC Element Bridge microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-bridge:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "configurationEntities": [ + { + "configurationEntityId": { + "name": "onap.policy.clamp.ac.bridge", + "version": "1.0.0" + }, + "restSequence": [ + { + "restRequestId": { + "name": "request2", + "version": "1.0.2" + }, + "httpMethod": "POST", + "path": "/onap/policy/clamp/acelement/v2/activate", + "body": "{ \"receiverId\": { \"name\": \"onap.policy.clamp.ac.bridgetosink\", \"version\": \"1.0.0\" }, \"timerMs\": 4000, \"elementType\": \"BRIDGE\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.HttpAutomationCompositionElement", + "type_version": "1.0.2", + "description": "Automation composition element for the http requests of AC Element Sink microservice", + "properties": { + "provider": "ONAP", + "participant_id": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "uninitializedToPassiveTimeout": 180, + "startPhase": 0, + "baseUrl": "http://acelement-sink:8084", + "httpHeaders": { + "Content-Type": "application/json", + "Authorization": "Basic cnVudGltZVVzZXI6emIhWHp0RzM0" + }, + "configurationEntities": [ + { + "configurationEntityId": { + "name": "onap.policy.clamp.ac.sink", + "version": "1.0.0" + }, + "restSequence": [ + { + "restRequestId": { + "name": "request3", + "version": "1.0.2" + }, + "httpMethod": "POST", + "path": "/onap/policy/clamp/acelement/v2/activate", + "body": "{ \"receiverId\": { \"name\": \"onap.policy.clamp.ac.sink\", \"version\": \"1.0.0\" }, \"timerMs\": 4000, \"elementType\": \"SINK\", \"topicParameterGroup\": { \"server\": \"message-router\", \"listenerTopic\": \"POLICY_UPDATE_MSG\", \"publisherTopic\": \"AC_ELEMENT_MSG\", \"fetchTimeout\": 15000, \"topicCommInfrastructure\": \"dmaap\" } }", + "expectedResponse": 201 + } + ] + } + ] + } + }, + "onap.policy.clamp.ac.element.AutomationCompositionDefinition": { + "version": "1.2.3", + "type": "org.onap.policy.clamp.acm.AutomationComposition", + "type_version": "1.0.2", + "description": "Automation composition for Demp", + "properties": { + "provider": "ONAP", + "elements": [ + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + } + ] + } + } + } + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.yaml b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.yaml new file mode 100644 index 000000000..cacadce4f --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdate.yaml @@ -0,0 +1,312 @@ +# ============LICENSE_START======================================================= +# Copyright (C) 2022 Nordix Foundation. +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END========================================================= +tosca_definitions_version: tosca_simple_yaml_1_3 +data_types: + onap.datatypes.ToscaConceptIdentifier: + derived_from: tosca.datatypes.Root + properties: + name: + type: string + required: true + version: + type: string + required: true + + 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 + +node_types: + org.onap.policy.clamp.acm.Participant: + version: 1.0.2 + derived_from: tosca.nodetypes.Root + properties: + provider: + type: string + required: false + org.onap.policy.clamp.acm.AutomationCompositionElement: + version: 1.0.2 + derived_from: tosca.nodetypes.Root + properties: + provider: + type: string + required: false + metadata: + common: true + description: Specifies the organization that provides the automation composition element + participant_id: + type: onap.datatypes.ToscaConceptIdentifier + required: true + metadata: + common: true + participantType: + type: onap.datatypes.ToscaConceptIdentifier + required: true + metadata: + common: true + description: The identity of the participant type that hosts this type of 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.2 + 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.HttpAutomationCompositionElement: + version: 1.0.2 + 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: + node_templates: + org.onap.policy.clamp.acm.HttpParticipant: + version: 2.3.4 + type: org.onap.policy.clamp.acm.Participant + type_version: 1.0.2 + 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 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.2 + description: Automation composition element for the http requests of AC Element Starter microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-starter:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + configurationEntities: + - configurationEntityId: + name: onap.policy.clamp.ac.starter + version: 1.0.0 + restSequence: + - restRequestId: + name: request1 + version: 1.0.2 + httpMethod: POST + path: /onap/policy/clamp/acelement/v2/activate + body: '{ "receiverId": { "name": "onap.policy.clamp.ac.startertobridge", "version": "1.0.0" }, "timerMs": 4000, "elementType": "STARTER", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement: + # Http config for AC Element Bridge. + version: 1.2.3 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.2 + description: Automation composition element for the http requests of AC Element Bridge microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-bridge:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + configurationEntities: + - configurationEntityId: + name: onap.policy.clamp.ac.bridge + version: 1.0.0 + restSequence: + - restRequestId: + name: request2 + version: 1.0.2 + httpMethod: POST + path: /onap/policy/clamp/acelement/v2/activate + body: '{ "receiverId": { "name": "onap.policy.clamp.ac.bridgetosink", "version": "1.0.0" }, "timerMs": 4000, "elementType": "BRIDGE", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement: + # Http config for AC Element Sink. + version: 1.2.3 + type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement + type_version: 1.0.2 + description: Automation composition element for the http requests of AC Element Sink microservice + properties: + provider: ONAP + participant_id: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + uninitializedToPassiveTimeout: 180 + startPhase: 0 + baseUrl: http://acelement-sink:8084 + httpHeaders: + Content-Type: application/json + Authorization: 'Basic cnVudGltZVVzZXI6emIhWHp0RzM0' + configurationEntities: + - configurationEntityId: + name: onap.policy.clamp.ac.sink + version: 1.0.0 + restSequence: + - restRequestId: + name: request3 + version: 1.0.2 + httpMethod: POST + path: /onap/policy/clamp/acelement/v2/activate + body: '{ "receiverId": { "name": "onap.policy.clamp.ac.sink", "version": "1.0.0" }, "timerMs": 4000, "elementType": "SINK", "topicParameterGroup": { "server": "message-router", "listenerTopic": "POLICY_UPDATE_MSG", "publisherTopic": "AC_ELEMENT_MSG", "fetchTimeout": 15000, "topicCommInfrastructure": "dmaap" } }' + expectedResponse: 201 + + onap.policy.clamp.ac.element.AutomationCompositionDefinition: + version: 1.2.3 + type: org.onap.policy.clamp.acm.AutomationComposition + type_version: 1.0.2 + description: Automation composition for Demp + properties: + provider: ONAP + elements: + - name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + - name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.json b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.json new file mode 100644 index 000000000..20602f730 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.json @@ -0,0 +1,25 @@ +{ + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "affectedAutomationCompositionDefinitions": [ + { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + { + "name": "onap.policy.clamp.ac.element.AutomationCompositionDefinition", + "version": "1.2.3" + } + ] +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.yaml new file mode 100644 index 000000000..893205dca --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionDefinitionUpdateResponse.yaml @@ -0,0 +1,12 @@ +compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f +affectedAutomationCompositionDefinitions: +- name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 +- name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 +- name: onap.policy.clamp.ac.element.AutomationCompositionDefinition + version: 1.2.3 diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.json b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.json new file mode 100644 index 000000000..2b3d96896 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.json @@ -0,0 +1,64 @@ +{ + "name": "InstanceHttp", + "version": "1.0.1", + "compositionId": "562ed027-2689-481a-b3a5-e284b1fbc33f", + "state": "UNINITIALISED", + "orderedState": "PASSIVE", + "description": "Demo automation composition instance Http", + "elements": { + "709c62b3-8918-41b9-a747-d21eb79c6c24": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c24", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Starter Automation Composition Element for the Demo" + }, + "709c62b3-8918-41b9-a747-d21eb79c6c25": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c25", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Bridge Automation Composition Element for the Demo" + }, + "709c62b3-8918-41b9-a747-d21eb79c6c23": { + "id": "709c62b3-8918-41b9-a747-d21eb79c6c23", + "definition": { + "name": "onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement", + "version": "1.2.3" + }, + "participantId": { + "name": "HttpParticipant0", + "version": "1.0.0" + }, + "participantType": { + "name": "org.onap.policy.clamp.acm.HttpParticipant", + "version": "2.3.4" + }, + "state": "UNINITIALISED", + "orderedState": "UNINITIALISED", + "description": "Sink Automation Composition Element for the Demo" + } + } +} diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.yaml b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.yaml new file mode 100644 index 000000000..3628c6340 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.yaml @@ -0,0 +1,49 @@ +name: InstanceHttp +version: 1.0.1 +compositionId: 562ed027-2689-481a-b3a5-e284b1fbc33f +state: UNINITIALISED +orderedState: PASSIVE +description: Demo automation composition instance Http +elements: + 709c62b3-8918-41b9-a747-d21eb79c6c24: + id: 709c62b3-8918-41b9-a747-d21eb79c6c24 + definition: + name: onap.policy.clamp.ac.element.Http_StarterAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Starter Automation Composition Element for the Demo + 709c62b3-8918-41b9-a747-d21eb79c6c25: + id: 709c62b3-8918-41b9-a747-d21eb79c6c25 + definition: + name: onap.policy.clamp.ac.element.Http_BridgeAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Bridge Automation Composition Element for the Demo + 709c62b3-8918-41b9-a747-d21eb79c6c23: + id: 709c62b3-8918-41b9-a747-d21eb79c6c23 + definition: + name: onap.policy.clamp.ac.element.Http_SinkAutomationCompositionElement + version: 1.2.3 + participantId: + name: HttpParticipant0 + version: 1.0.0 + participantType: + name: org.onap.policy.clamp.acm.HttpParticipant + version: 2.3.4 + state: UNINITIALISED + orderedState: UNINITIALISED + description: Sink Automation Composition Element for the Demo diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.json b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.json new file mode 100644 index 000000000..b662bc6b6 --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.json @@ -0,0 +1,6 @@ +{ + "affectedAutomationComposition": { + "name": "InstanceHttp", + "version": "1.0.1" + } +}
\ No newline at end of file diff --git a/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.yaml b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.yaml new file mode 100644 index 000000000..1fbca51ac --- /dev/null +++ b/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdateResponse.yaml @@ -0,0 +1,3 @@ +affectedAutomationComposition: + name: InstanceHttp + version: 1.0.1 diff --git a/runtime-acm/src/main/resources/openapi/openapi.yaml b/runtime-acm/src/main/resources/openapi/openapi.yaml index de7b26ead..65d2c6b08 100644 --- a/runtime-acm/src/main/resources/openapi/openapi.yaml +++ b/runtime-acm/src/main/resources/openapi/openapi.yaml @@ -968,14 +968,12 @@ paths: content: application/json: schema: - title: InstantiationUpdate - type: object + $ref: '#/components/schemas/InstantiationUpdate' example: externalValue: 'https://raw.githubusercontent.com/onap/policy-clamp/master/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.json' application/yaml: schema: - title: InstantiationUpdate - type: object + $ref: '#/components/schemas/InstantiationUpdate' example: externalValue: 'https://raw.githubusercontent.com/onap/policy-clamp/master/runtime-acm/src/main/resources/openapi/examples/putCompositionInstanceUpdate.yaml' required: true @@ -1228,6 +1226,9 @@ components: CommissioningResponse: title: CommissioningResponse type: object + InstantiationUpdate: + title: InstantiationUpdate + type: object InstantiationResponse: title: InstantiationResponse type: object 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 d1c26e002..d99bf2df6 100644 --- 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 @@ -31,15 +31,11 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC import java.util.HashMap; import java.util.UUID; import javax.ws.rs.client.Entity; -import javax.ws.rs.client.Invocation; import javax.ws.rs.core.Response; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.parallel.Execution; -import org.junit.jupiter.api.parallel.ExecutionMode; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController; import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse; @@ -57,12 +53,10 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @ActiveProfiles("test") -@Execution(ExecutionMode.SAME_THREAD) class CommissioningControllerTest extends CommonRestController { private static final String COMMISSIONING_ENDPOINT = "compositions"; private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); - private UUID compositionId; @Autowired private AcDefinitionProvider acDefinitionProvider; @@ -83,11 +77,6 @@ class CommissioningControllerTest extends CommonRestController { super.setHttpPrefix(randomServerPort); } - @AfterEach - public void cleanDatabase() throws Exception { - deleteEntryInDB(); - } - @Test void testSwagger() { super.testSwagger(COMMISSIONING_ENDPOINT); @@ -110,27 +99,29 @@ class CommissioningControllerTest extends CommonRestController { @Test void testCreateBadRequest() { - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); - Response resp = invocationBuilder.post(Entity.json("NotToscaServiceTempalte")); + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); + var resp = invocationBuilder.post(Entity.json("NotToscaServiceTempalte")); assertThat(Response.Status.BAD_REQUEST.getStatusCode()).isEqualTo(resp.getStatus()); - CommissioningResponse commissioningResponse = resp.readEntity(CommissioningResponse.class); + var commissioningResponse = resp.readEntity(CommissioningResponse.class); assertThat(commissioningResponse.getErrorDetails()).isNotNull(); assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).isNull(); } @Test void testCreate() { - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); - Response resp = invocationBuilder.post(Entity.json(serviceTemplate)); + 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()); - CommissioningResponse commissioningResponse = resp.readEntity(CommissioningResponse.class); - compositionId = commissioningResponse.getCompositionId(); + var commissioningResponse = resp.readEntity(CommissioningResponse.class); assertNotNull(commissioningResponse); assertNull(commissioningResponse.getErrorDetails()); // Response should return the number of node templates present in the service template assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).hasSize(7); - for (String nodeTemplateName : serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().keySet()) { + for (var nodeTemplateName : serviceTemplateCreate.getToscaTopologyTemplate().getNodeTemplates().keySet()) { assertTrue(commissioningResponse.getAffectedAutomationCompositionDefinitions().stream() .anyMatch(ac -> ac.getName().equals(nodeTemplateName))); } @@ -138,12 +129,6 @@ class CommissioningControllerTest extends CommonRestController { @Test void testUpdate() { - var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); - var resp = invocationBuilder.post(Entity.json(serviceTemplate)); - assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus()); - var commissioningResponse = resp.readEntity(CommissioningResponse.class); - compositionId = commissioningResponse.getCompositionId(); - var toscaDataType = new ToscaDataType(); toscaDataType.setName("org.onap.datatypes.policy.clamp.Configuration"); toscaDataType.setDerivedFrom("tosca.datatypes.Root"); @@ -153,17 +138,18 @@ class CommissioningControllerTest extends CommonRestController { toscaProperty.setType("onap.datatypes.ToscaConceptIdentifier"); toscaDataType.getProperties().put(toscaProperty.getName(), toscaProperty); + var compositionId = createEntryInDB("forUpdate"); var serviceTemplateUpdate = new ToscaServiceTemplate(serviceTemplate); serviceTemplateUpdate.getDataTypes().put(toscaDataType.getName(), toscaDataType); - invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId); - resp = invocationBuilder.put(Entity.json(serviceTemplateUpdate)); + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId); + var resp = invocationBuilder.put(Entity.json(serviceTemplateUpdate)); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); - commissioningResponse = resp.readEntity(CommissioningResponse.class); + var commissioningResponse = resp.readEntity(CommissioningResponse.class); assertNotNull(commissioningResponse); assertNull(commissioningResponse.getErrorDetails()); // Response should return the number of node templates present in the service template assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).hasSize(7); - for (String nodeTemplateName : serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().keySet()) { + for (var nodeTemplateName : serviceTemplateUpdate.getToscaTopologyTemplate().getNodeTemplates().keySet()) { assertTrue(commissioningResponse.getAffectedAutomationCompositionDefinitions().stream() .anyMatch(ac -> ac.getName().equals(nodeTemplateName))); } @@ -176,61 +162,52 @@ class CommissioningControllerTest extends CommonRestController { } @Test - void testQuery_NoResultWithThisName() throws Exception { - createEntryInDB(); - - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName"); - Response rawresp = invocationBuilder.buildGet().invoke(); + void testQuery_NoResultWithThisName() { + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName"); + var rawresp = invocationBuilder.buildGet().invoke(); assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); var entityList = rawresp.readEntity(ToscaServiceTemplate.class); assertThat(entityList.getNodeTypes()).isNull(); } @Test - void testQuery() throws Exception { - createEntryInDB(); + void testQuery() { + createEntryInDB("forQuery"); - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); - Response rawresp = invocationBuilder.buildGet().invoke(); + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT); + var rawresp = invocationBuilder.buildGet().invoke(); assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); var entityList = rawresp.readEntity(ToscaServiceTemplate.class); assertNotNull(entityList); } @Test - void testDeleteBadRequest() throws Exception { - createEntryInDB(); + void testDeleteBadRequest() { + createEntryInDB("DeleteBadRequest"); - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + UUID.randomUUID()); + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + UUID.randomUUID()); // Call delete with no info - Response resp = invocationBuilder.delete(); + var resp = invocationBuilder.delete(); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus()); } @Test - void testDelete() throws Exception { - createEntryInDB(); + void testDelete() { + var compositionId = createEntryInDB("forDelete"); - Invocation.Builder invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId); + var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId); // Call delete with no info - Response resp = invocationBuilder.delete(); + var resp = invocationBuilder.delete(); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); - var templatesInDB = acDefinitionProvider.getAllAcDefinitions(); + var templatesInDB = acDefinitionProvider.findAcDefinition(compositionId); assertThat(templatesInDB).isEmpty(); } - private synchronized void createEntryInDB() throws Exception { - deleteEntryInDB(); - var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate); - compositionId = acmDefinition.getCompositionId(); - } - - // Delete entries from the DB after relevant tests - private synchronized void deleteEntryInDB() throws Exception { - var list = acDefinitionProvider.getAllAcDefinitions(); - if (!list.isEmpty()) { - acDefinitionProvider.deleteAcDefintion(compositionId); - } + private UUID createEntryInDB(String name) { + var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate); + serviceTemplateCreate.setName(name); + var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplateCreate); + return acmDefinition.getCompositionId(); } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java index 115adcb50..0657c7e0c 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java @@ -37,15 +37,14 @@ import org.mockito.Mockito; import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; import org.onap.policy.clamp.acm.runtime.util.CommonTestData; import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; -import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeException; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate; @@ -62,7 +61,6 @@ class AutomationCompositionInstantiationProviderTest { "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json"; private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON = "src/test/resources/rest/acm/AutomationCompositionNotFound.json"; - private static final String AUTOMATION_COMPOSITION_NOT_FOUND = "Automation composition not found"; private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s"; private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command"; private static final String AC_ELEMENT_NAME_NOT_FOUND = @@ -74,6 +72,7 @@ class AutomationCompositionInstantiationProviderTest { private static final String AC_DEFINITION_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n" + " item \"ServiceTemplate\" value \"\" INVALID," + " Commissioned automation composition definition not found\n"; + private static final String DO_NOT_MATCH = " do not match with "; private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); @@ -104,7 +103,8 @@ class AutomationCompositionInstantiationProviderTest { when(acProvider.createAutomationComposition(automationCompositionCreate)) .thenReturn(automationCompositionCreate); - var instantiationResponse = instantiationProvider.createAutomationComposition(automationCompositionCreate); + var instantiationResponse = instantiationProvider.createAutomationComposition( + automationCompositionCreate.getCompositionId(), automationCompositionCreate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate); verify(acProvider).createAutomationComposition(automationCompositionCreate); @@ -117,33 +117,41 @@ class AutomationCompositionInstantiationProviderTest { assertThat(automationCompositionCreate) .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0)); + var instanceUpdate = new InstantiationUpdate(); var automationCompositionUpdate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); automationCompositionUpdate.setCompositionId(compositionId); + instanceUpdate.setElements(automationCompositionUpdate.getElements()); + when(acProvider.getAutomationComposition(automationCompositionUpdate.getInstanceId())) + .thenReturn(automationCompositionUpdate); + when(acProvider.updateAutomationComposition(automationCompositionUpdate)) + .thenReturn(automationCompositionUpdate); - instantiationResponse = instantiationProvider.updateAutomationComposition(automationCompositionUpdate); + instantiationResponse = + instantiationProvider.updateAutomationComposition(automationCompositionUpdate.getCompositionId(), + automationCompositionUpdate.getInstanceId(), instanceUpdate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate); verify(acProvider).updateAutomationComposition(automationCompositionUpdate); - when(acProvider.findAutomationComposition(automationCompositionUpdate.getKey().asIdentifier())) - .thenReturn(Optional.of(automationCompositionUpdate)); - when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId())) - .thenReturn(automationCompositionUpdate); - + var instanceUpdateCommand = new InstantiationUpdate(); var instantiationCommand = - InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud"); - instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand); - InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand); + InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON); + instanceUpdateCommand.setInstantiationCommand(instantiationCommand); + instantiationResponse = + instantiationProvider.updateAutomationComposition(automationCompositionUpdate.getCompositionId(), + automationCompositionUpdate.getInstanceId(), instanceUpdateCommand); + InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate); verify(supervisionHandler).triggerAutomationCompositionSupervision(automationCompositionUpdate); // in order to delete a automationComposition the state must be UNINITIALISED automationCompositionCreate.setState(AutomationCompositionState.UNINITIALISED); - instantiationProvider.updateAutomationComposition(automationCompositionCreate); - instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getName(), - automationCompositionCreate.getVersion()); + when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId())) + .thenReturn(automationCompositionUpdate); + instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(), + automationCompositionCreate.getInstanceId()); verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getInstanceId()); } @@ -161,8 +169,14 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(), - automationComposition.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND); + when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); + + var wrongCompositionId = UUID.randomUUID(); + var instanceId = automationComposition.getInstanceId(); + var compositionId = automationComposition.getCompositionId(); + assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(wrongCompositionId, instanceId)) + .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId); for (var state : AutomationCompositionState.values()) { if (!AutomationCompositionState.UNINITIALISED.equals(state)) { @@ -170,16 +184,9 @@ class AutomationCompositionInstantiationProviderTest { } } automationComposition.setState(AutomationCompositionState.UNINITIALISED); - automationComposition.setInstanceId(UUID.randomUUID()); - - when(acProvider.findAutomationComposition( - new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()))) - .thenReturn(Optional.of(automationComposition)); - when(acProvider.deleteAutomationComposition(automationComposition.getInstanceId())) - .thenReturn(automationComposition); + when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition); - instantiationProvider.deleteAutomationComposition(automationComposition.getName(), - automationComposition.getVersion()); + instantiationProvider.deleteAutomationComposition(compositionId, instanceId); } private void assertThatDeleteThrownBy(AutomationComposition automationComposition, @@ -193,11 +200,13 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - var key = new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()); - when(acProvider.findAutomationComposition(key)).thenReturn(Optional.of(automationComposition)); + when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); - assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(), - automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state)); + var compositionId = automationComposition.getCompositionId(); + var instanceId = automationComposition.getInstanceId(); + assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(compositionId, instanceId)) + .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state)); } @Test @@ -221,14 +230,16 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - var instantiationResponse = instantiationProvider.createAutomationComposition(automationCompositionCreate); + var instantiationResponse = instantiationProvider.createAutomationComposition( + automationCompositionCreate.getCompositionId(), automationCompositionCreate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate); when(acProvider.findAutomationComposition(automationCompositionCreate.getKey().asIdentifier())) .thenReturn(Optional.of(automationCompositionCreate)); - assertThatThrownBy(() -> instantiationProvider.createAutomationComposition(automationCompositionCreate)) - .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined"); + assertThatThrownBy( + () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate)) + .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined"); } @Test @@ -246,41 +257,70 @@ class AutomationCompositionInstantiationProviderTest { var provider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - assertThatThrownBy(() -> provider.createAutomationComposition(automationComposition)) + assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition)) .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND); - assertThatThrownBy(() -> provider.updateAutomationComposition(automationComposition)) + when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); + var instanceUpdate = new InstantiationUpdate(); + instanceUpdate.setElements(automationComposition.getElements()); + + var instanceId = automationComposition.getInstanceId(); + assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, instanceId, instanceUpdate)) .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND); } @Test - void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception { + void testCreateAutomationCompositions_CommissionedAcNotFound() { var automationComposition = InstantiationUtils .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound"); var participantProvider = Mockito.mock(ParticipantProvider.class); var acProvider = mock(AutomationCompositionProvider.class); + when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); var supervisionHandler = mock(SupervisionHandler.class); var acDefinitionProvider = mock(AcDefinitionProvider.class); var provider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - assertThatThrownBy(() -> provider.createAutomationComposition(automationComposition)) + var compositionId = automationComposition.getCompositionId(); + assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition)) .hasMessageMatching(AC_DEFINITION_NOT_FOUND); - assertThatThrownBy(() -> provider.updateAutomationComposition(automationComposition)) + var instanceUpdate = new InstantiationUpdate(); + instanceUpdate.setElements(automationComposition.getElements()); + var instanceId = automationComposition.getInstanceId(); + assertThatThrownBy(() -> provider.updateAutomationComposition(compositionId, instanceId, instanceUpdate)) .hasMessageMatching(AC_DEFINITION_NOT_FOUND); + + var wrongCompositionId = UUID.randomUUID(); + assertThatThrownBy(() -> provider.createAutomationComposition(wrongCompositionId, automationComposition)) + .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId); + + assertThatThrownBy(() -> provider.updateAutomationComposition(wrongCompositionId, instanceId, instanceUpdate)) + .hasMessageMatching(compositionId + DO_NOT_MATCH + wrongCompositionId); } @Test - void testIssueAutomationCompositionCommand_OrderedStateInvalid() throws AutomationCompositionRuntimeException { + void testIssueAutomationCompositionCommand_OrderedStateInvalid() { var participantProvider = Mockito.mock(ParticipantProvider.class); var acProvider = mock(AutomationCompositionProvider.class); var supervisionHandler = mock(SupervisionHandler.class); var acDefinitionProvider = mock(AcDefinitionProvider.class); var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - assertThatThrownBy(() -> instantiationProvider.issueAutomationCompositionCommand(new InstantiationCommand())) - .hasMessageMatching(ORDERED_STATE_INVALID); + var instanceUpdate = new InstantiationUpdate(); + instanceUpdate.setInstantiationCommand(new InstantiationCommand()); + var automationComposition = InstantiationUtils + .getAutomationCompositionFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound"); + when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); + + var compositionId = automationComposition.getCompositionId(); + var instanceId = automationComposition.getInstanceId(); + assertThatThrownBy( + () -> instantiationProvider.updateAutomationComposition(compositionId, instanceId, instanceUpdate)) + .hasMessageMatching(ORDERED_STATE_INVALID); } } 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 8b0ccd74e..a5ffacc6a 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 @@ -33,6 +33,7 @@ import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.coder.StandardYamlCoder; import org.onap.policy.common.utils.resources.ResourceUtils; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; /** @@ -67,17 +68,11 @@ public class InstantiationUtils { * Gets InstantiationCommand from Resource. * * @param path path of the resource - * @param suffix suffix to add to all names in AutomationCompositions * @return the InstantiationCommand */ - public static InstantiationCommand getInstantiationCommandFromResource(final String path, final String suffix) { + public static InstantiationCommand getInstantiationCommandFromResource(final String path) { try { - var instantiationCommand = CODER.decode(new File(path), InstantiationCommand.class); - - // add suffix to the name - var id = instantiationCommand.getAutomationCompositionIdentifier(); - id.setName(id.getName() + suffix); - return instantiationCommand; + return CODER.decode(new File(path), InstantiationCommand.class); } catch (CoderException e) { fail("Cannot read or decode " + path); return null; @@ -88,11 +83,12 @@ public class InstantiationUtils { * Assert that Instantiation Response contains proper AutomationCompositions. * * @param response InstantiationResponse - * @param command InstantiationCommand + * @param affectedAutomationComposition ToscaConceptIdentifier */ - public static void assertInstantiationResponse(InstantiationResponse response, InstantiationCommand command) { + public static void assertInstantiationResponse(InstantiationResponse response, + ToscaConceptIdentifier affectedAutomationComposition) { assertThat(response).isNotNull(); - assertEquals(response.getAffectedAutomationComposition(), command.getAutomationCompositionIdentifier()); + assertEquals(response.getAffectedAutomationComposition(), affectedAutomationComposition); } /** 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 9c364b2db..b93d214cb 100644 --- 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 @@ -30,7 +30,6 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC import java.util.UUID; import javax.ws.rs.client.Entity; import javax.ws.rs.core.Response; -import org.junit.Ignore; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -44,6 +43,7 @@ import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; +import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository; @@ -65,19 +65,17 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; @ActiveProfiles("test") class InstantiationControllerTest extends CommonRestController { - private static final String AC_INSTANTIATION_CREATE_JSON = - "src/test/resources/rest/acm/AutomationComposition.json"; + private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json"; private static final String AC_INSTANTIATION_UPDATE_JSON = "src/test/resources/rest/acm/AutomationCompositionUpdate.json"; private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json"; - private static final String INSTANTIATION_ENDPOINT = "instantiation"; - private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command"; + private static final String INSTANTIATION_ENDPOINT = "compositions/%s/instances"; private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); - private UUID compositionId; + private UUID compositionId = UUID.randomUUID(); @Autowired private AutomationCompositionRepository automationCompositionRepository; @@ -100,7 +98,7 @@ class InstantiationControllerTest extends CommonRestController { } @BeforeEach - public void populateDb() throws Exception { + public void populateDb() { createEntryInDB(); } @@ -110,15 +108,21 @@ class InstantiationControllerTest extends CommonRestController { } @AfterEach - public void cleanDatabase() throws Exception { + public void cleanDatabase() { deleteEntryInDB(); } - @Ignore + private String getInstanceEndPoint() { + return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()); + } + + private String getInstanceEndPoint(UUID instanceId) { + return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId; + } + @Test void testSwagger() { - // TODO: Reimplement using springdoc when Impelmentation endpoint is refactored - super.testSwagger(INSTANTIATION_ENDPOINT); + super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}")); } @Test @@ -126,33 +130,25 @@ class InstantiationControllerTest extends CommonRestController { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized"); - assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationComposition)); + assertUnauthorizedPost(getInstanceEndPoint(), Entity.json(automationComposition)); } @Test void testQuery_Unauthorized() { - assertUnauthorizedGet(INSTANTIATION_ENDPOINT); + assertUnauthorizedGet(getInstanceEndPoint()); } @Test - void testUpdate_Unauthorized() throws Exception { + void testUpdate_Unauthorized() { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized"); - assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationComposition)); + assertUnauthorizedPut(getInstanceEndPoint(), Entity.json(automationComposition)); } @Test void testDelete_Unauthorized() { - assertUnauthorizedDelete(INSTANTIATION_ENDPOINT); - } - - @Test - void testCommand_Unauthorized() { - var instantiationCommand = InstantiationUtils - .getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized"); - - assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand)); + assertUnauthorizedDelete(getInstanceEndPoint()); } @Test @@ -161,19 +157,18 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create"); automationCompositionFromRsc.setCompositionId(compositionId); - var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT); + var invocationBuilder = super.sendRequest(getInstanceEndPoint()); var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc)); - assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); + assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus()); var instResponse = resp.readEntity(InstantiationResponse.class); InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc); automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId()); - var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions( - automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion()); + var automationCompositionFromDb = + instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId()); - assertNotNull(automationCompositionsFromDb); - assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1); - assertEquals(automationCompositionFromRsc, automationCompositionsFromDb.getAutomationCompositionList().get(0)); + assertNotNull(automationCompositionFromDb); + assertEquals(automationCompositionFromRsc, automationCompositionFromDb); } @@ -183,9 +178,9 @@ class InstantiationControllerTest extends CommonRestController { .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest"); automationCompositionFromRsc.setCompositionId(compositionId); - var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT); + var invocationBuilder = super.sendRequest(getInstanceEndPoint()); var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc)); - assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); + assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus()); // testing Bad Request: AC already defined resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc)); @@ -197,7 +192,7 @@ class InstantiationControllerTest extends CommonRestController { @Test void testQuery_NoResultWithThisName() { - var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName"); + var invocationBuilder = super.sendRequest(getInstanceEndPoint() + "?name=noResultWithThisName"); var rawresp = invocationBuilder.buildGet().invoke(); assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); var resp = rawresp.readEntity(AutomationCompositions.class); @@ -210,10 +205,10 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query"); automationComposition.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationComposition); + instantiationProvider.createAutomationComposition(compositionId, automationComposition); var invocationBuilder = - super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationComposition.getKey().getName()); + super.sendRequest(getInstanceEndPoint() + "?name=" + automationComposition.getKey().getName()); var rawresp = invocationBuilder.buildGet().invoke(); assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class); @@ -228,13 +223,15 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update"); automationCompositionCreate.setCompositionId(compositionId); - var response = instantiationProvider.createAutomationComposition(automationCompositionCreate); + var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate); - var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update"); automationComposition.setCompositionId(compositionId); automationComposition.setInstanceId(response.getInstanceId()); + var instantiationUpdate = new InstantiationUpdate(); + instantiationUpdate.setElements(automationComposition.getElements()); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(response.getInstanceId())); var resp = invocationBuilder.put(Entity.json(automationComposition)); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); @@ -255,14 +252,13 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete"); automationCompositionFromRsc.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationCompositionFromRsc); + var instResponse = + instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc); - var invocationBuilder = - super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName() - + "&version=" + automationCompositionFromRsc.getKey().getVersion()); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId())); var resp = invocationBuilder.delete(); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); - var instResponse = resp.readEntity(InstantiationResponse.class); + instResponse = resp.readEntity(InstantiationResponse.class); InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc); var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions( @@ -271,33 +267,38 @@ class InstantiationControllerTest extends CommonRestController { } @Test - void testDeleteBadRequest() { + void testDeleteNotFound() { var automationCompositionFromRsc = - InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest"); + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound"); automationCompositionFromRsc.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationCompositionFromRsc); + instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc); - var invocationBuilder = - super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName()); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(UUID.randomUUID())); var resp = invocationBuilder.delete(); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus()); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus()); } @Test void testCommand_NotFound1() { - var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT); - var resp = invocationBuilder.put(Entity.json(new InstantiationCommand())); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus()); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(UUID.randomUUID())); + var resp = invocationBuilder.put(Entity.json(new InstantiationUpdate())); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus()); } @Test void testCommand_NotFound2() { - var command = - InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command"); - command.setOrderedState(null); + var acFromRsc = + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound"); + acFromRsc.setCompositionId(compositionId); + + var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc); + + var command = new InstantiationUpdate(); + command.setInstantiationCommand(new InstantiationCommand()); + command.getInstantiationCommand().setOrderedState(null); - var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId())); var resp = invocationBuilder.put(Entity.json(command)); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus()); } @@ -307,24 +308,25 @@ class InstantiationControllerTest extends CommonRestController { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command"); automationComposition.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationComposition); + var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition); var participants = CommonTestData.createParticipants(); for (var participant : participants) { participantProvider.saveParticipant(participant); } - var command = - InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command"); + var instantiationUpdate = new InstantiationUpdate(); + var command = InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON); + instantiationUpdate.setInstantiationCommand(command); - var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT); - var resp = invocationBuilder.put(Entity.json(command)); - assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus()); - InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class); - InstantiationUtils.assertInstantiationResponse(instResponse, command); + var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId())); + var resp = invocationBuilder.put(Entity.json(instantiationUpdate)); + assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); + instResponse = resp.readEntity(InstantiationResponse.class); + InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition); // check passive state on DB - var toscaConceptIdentifier = command.getAutomationCompositionIdentifier(); + var toscaConceptIdentifier = instResponse.getAffectedAutomationComposition(); var automationCompositionsGet = instantiationProvider .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion()); assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1); @@ -332,15 +334,15 @@ class InstantiationControllerTest extends CommonRestController { automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState()); } - private synchronized void deleteEntryInDB() throws Exception { + private synchronized void deleteEntryInDB() { automationCompositionRepository.deleteAll(); - var list = acDefinitionProvider.getAllAcDefinitions(); + var list = acDefinitionProvider.findAcDefinition(compositionId); if (!list.isEmpty()) { acDefinitionProvider.deleteAcDefintion(compositionId); } } - private synchronized void createEntryInDB() throws Exception { + private synchronized void createEntryInDB() { deleteEntryInDB(); var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate); compositionId = acmDefinition.getCompositionId(); |