diff options
47 files changed, 4183 insertions, 177 deletions
diff --git a/examples/src/main/resources/clamp/acm/test/tosca-template-additional-properties.yaml b/examples/src/main/resources/clamp/acm/test/tosca-template-additional-properties.yaml new file mode 100644 index 000000000..55990b404 --- /dev/null +++ b/examples/src/main/resources/clamp/acm/test/tosca-template-additional-properties.yaml @@ -0,0 +1,226 @@ +# ============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 + derived_from: tosca.datatypes.Root + description: Definition for a entity in A&AI to perform a control loop operation + on + properties: + targetType: + type: string + description: Category for the target type + required: true + constraints: + - valid_values: + - VNF + - VM + - VFMODULE + - PNF + entityIds: + type: map + description: | + Map of values that identify the resource. If none are provided, it is assumed that the + entity that generated the ONSET event will be the target. + required: false + metadata: + clamp_possible_values: ClampExecution:CSAR_RESOURCES + entry_schema: + type: string + version: 1.0.0 + derived_from: tosca.datatypes.Root + properties: + configurationEntityId: + type: onap.datatypes.ToscaConceptIdentifier + required: true + description: The name and version of a Configuration Entity to be handled + by the HTTP Automation Composition Element + restSequence: + type: list + entry_schema: + type: org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest + type_version: 1.0.0 + description: A sequence of REST commands to send to the REST endpoint +policy_types: + onap.policies.controlloop.operational.common.Apex: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + name: onap.policies.controlloop.operational.common.Apex + description: Operational policies for Apex PDP + properties: + engineServiceParameters: + type: string + description: The engine parameters like name, instanceCount, policy implementation, + parameters etc. + required: true + eventInputParameters: + type: string + description: The event input parameters. + required: true + eventOutputParameters: + type: string + description: The event output parameters. + required: true + javaProperties: + type: string + description: Name/value pairs of properties to be set for APEX if needed. + required: false + +node_types: + org.onap.policy.clamp.acm.Participant: + version: 1.0.1 + derived_from: tosca.nodetypes.Root + properties: + provider: + type: string + required: false + 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: + inputs: + pmsh_operational_policy: + type: onap.datatypes.ToscaConceptIdentifier + description: The ID of the PMSH operational policy to use + default: + name: operational.apex.pmcontrol + version: 1.0.0 + node_templates: + org.onap.policy.clamp.acm.PolicyParticipant: + version: 2.3.1 + type: org.onap.policy.clamp.acm.Participant + type_version: 1.0.1 + description: Participant for DCAE microservices + properties: + provider: ONAP + requirements: + - + org.onap.policy.clamp.acm.Required: + type: org.onap + type_version: 1.0.1 + name: org.onap.policy.clamp.acm.Required + version: 1.0.0 + capability: Capable + node: node1 + occurrences: + - V1 + - V2 + capabilities: + org.onap.policy.clamp.acm.Capability: + type: org.onap + type_version: 1.0.1 + name: org.onap.policy.clamp.acm.Capability + version: 1.0.0 + attributes: + attribute: attribute0 + occurrences: + - V1 + - V2 +capability_types: + org.onap.policy.clamp.acm.capability.Type: + name: org.onap.policy.clamp.acm.capability.Type + version: 1.0.0 + metadata: + key0: value0 + description: Capability Type + properties: + prop1: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement2 + type: string + type_version: 1.0.0 + description: Test RelationshipType + deafault: 0 + key_schema: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement3 + type: string + type_version: 1.0.0 + description: Test Schema + constraints: + - valid_values: + - V1 + - V2 + entry_schema: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement4 + type: string + type_version: 1.0.0 + description: Test Schema + constraints: + - valid_values: + - V1 + - V2 +relationship_types: + org.onap.policy.clamp.acm.Relationship: + version: 1.0.0 + metadata: + key: value + key2: value2 + description: Hello + properties: + prop1: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement2 + type: string + type_version: 1.0.0 + description: Test RelationshipType + deafault: 0 + key_schema: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement3 + type: string + type_version: 1.0.0 + description: Test Schema + constraints: + - valid_values: + - V1 + - V2 + entry_schema: + name: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement4 + type: string + type_version: 1.0.0 + description: Test Schema + constraints: + - valid_values: + - V1 + - V2 + metadata: + clamp_possible_values: ClampExecution:CSAR_RESOURCES diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationComposition.java b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationComposition.java index c3245d27c..b19f54c3b 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationComposition.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AutomationComposition.java @@ -38,6 +38,9 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity; @EqualsAndHashCode(callSuper = true) public class AutomationComposition extends ToscaEntity implements Comparable<AutomationComposition> { @NonNull + private UUID instanceId; + + @NonNull private UUID compositionId; @NonNull @@ -58,6 +61,7 @@ public class AutomationComposition extends ToscaEntity implements Comparable<Aut */ public AutomationComposition(final AutomationComposition otherAutomationComposition) { super(otherAutomationComposition); + this.instanceId = otherAutomationComposition.instanceId; this.compositionId = otherAutomationComposition.compositionId; this.state = otherAutomationComposition.state; this.orderedState = otherAutomationComposition.orderedState; diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationResponse.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationResponse.java index 4ecb8ce32..534c909aa 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationResponse.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/InstantiationResponse.java @@ -20,6 +20,7 @@ package org.onap.policy.clamp.models.acm.messages.rest.instantiation; +import java.util.UUID; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -33,5 +34,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @Setter @ToString(callSuper = true) public class InstantiationResponse extends SimpleResponse { + private UUID instanceId; ToscaConceptIdentifier affectedAutomationComposition; } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationComposition.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationComposition.java index 8268e9066..b87bad4e0 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationComposition.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationComposition.java @@ -23,7 +23,6 @@ package org.onap.policy.clamp.models.acm.persistence.concepts; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.UUID; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -40,7 +39,6 @@ import lombok.EqualsAndHashCode; import lombok.NonNull; import org.apache.commons.lang3.ObjectUtils; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; -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; @@ -66,11 +64,16 @@ import org.onap.policy.models.base.validation.annotations.VerifyKey; public class JpaAutomationComposition extends PfConcept implements PfAuthorative<AutomationComposition> { private static final long serialVersionUID = -4725410933242154805L; + @Column + @NotNull + private String instanceId; + @EmbeddedId @VerifyKey @NotNull private PfConceptKey key; + @Column @NotNull private String compositionId; @@ -97,29 +100,23 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative * The Default Constructor creates a {@link JpaAutomationComposition} object with a null key. */ public JpaAutomationComposition() { - this(new PfConceptKey()); - } - - /** - * The Key Constructor creates a {@link JpaAutomationComposition} object with the given concept key. - * - * @param key the key - */ - public JpaAutomationComposition(@NonNull final PfConceptKey key) { - this(key, UUID.randomUUID().toString(), AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>()); + this(UUID.randomUUID().toString(), new PfConceptKey(), UUID.randomUUID().toString(), + AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>()); } /** * The Key Constructor creates a {@link JpaAutomationComposition} object with all mandatory fields. * + * @param instanceId The UUID of the automation composition instance * @param key the key * @param compositionId the TOSCA compositionId of the automation composition definition * @param state the state of the automation composition * @param elements the elements of the automation composition in participants */ - public JpaAutomationComposition(@NonNull final PfConceptKey key, @NonNull final String compositionId, - @NonNull final AutomationCompositionState state, + public JpaAutomationComposition(@NonNull final String instanceId, @NonNull final PfConceptKey key, + @NonNull final String compositionId, @NonNull final AutomationCompositionState state, @NonNull final Map<UUID, JpaAutomationCompositionElement> elements) { + this.instanceId = instanceId; this.key = key; this.compositionId = compositionId; this.state = state; @@ -133,6 +130,7 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative */ public JpaAutomationComposition(@NonNull final JpaAutomationComposition copyConcept) { super(copyConcept); + this.instanceId = copyConcept.instanceId; this.key = new PfConceptKey(copyConcept.key); this.compositionId = copyConcept.compositionId; this.state = copyConcept.state; @@ -156,6 +154,7 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative public AutomationComposition toAuthorative() { var automationComposition = new AutomationComposition(); + automationComposition.setInstanceId(UUID.fromString(instanceId)); automationComposition.setName(getKey().getName()); automationComposition.setVersion(getKey().getVersion()); automationComposition.setCompositionId(UUID.fromString(compositionId)); @@ -171,6 +170,7 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative @Override public void fromAuthorative(@NonNull final AutomationComposition automationComposition) { + this.instanceId = automationComposition.getInstanceId().toString(); if (this.key == null || this.getKey().isNullKey()) { this.setKey(new PfConceptKey(automationComposition.getName(), automationComposition.getVersion())); } @@ -182,7 +182,7 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative this.primed = automationComposition.getPrimed(); this.elements = new LinkedHashMap<>(automationComposition.getElements().size()); - for (Entry<UUID, AutomationCompositionElement> elementEntry : automationComposition.getElements().entrySet()) { + for (var elementEntry : automationComposition.getElements().entrySet()) { var jpaAutomationCompositionElement = new JpaAutomationCompositionElement(); jpaAutomationCompositionElement .setKey(new PfReferenceKey(getKey(), elementEntry.getValue().getId().toString())); @@ -193,9 +193,9 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative @Override public List<PfKey> getKeys() { - List<PfKey> keyList = getKey().getKeys(); + var keyList = getKey().getKeys(); - for (JpaAutomationCompositionElement element : elements.values()) { + for (var element : elements.values()) { keyList.addAll(element.getKeys()); } @@ -207,7 +207,7 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative key.clean(); description = (description == null ? null : description.trim()); - for (JpaAutomationCompositionElement element : elements.values()) { + for (var element : elements.values()) { element.clean(); } } @@ -224,8 +224,13 @@ public class JpaAutomationComposition extends PfConcept implements PfAuthorative return this.getClass().getName().compareTo(otherConcept.getClass().getName()); } - final JpaAutomationComposition other = (JpaAutomationComposition) otherConcept; - int result = key.compareTo(other.key); + final var other = (JpaAutomationComposition) otherConcept; + var result = ObjectUtils.compare(instanceId, other.instanceId); + if (result != 0) { + return result; + } + + result = key.compareTo(other.key); if (result != 0) { return result; } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java index 5024785f8..3d2813eb2 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java @@ -52,29 +52,31 @@ public class AutomationCompositionProvider { /** * Get automation composition. * - * @param automationCompositionId the ID of the automation composition to get + * @param instanceId the ID of the automation composition to get * @return the automation composition found */ @Transactional(readOnly = true) - public AutomationComposition getAutomationComposition(final ToscaConceptIdentifier automationCompositionId) { - try { - return automationCompositionRepository.getById(automationCompositionId.asConceptKey()).toAuthorative(); - } catch (EntityNotFoundException e) { - throw new PfModelRuntimeException(Status.NOT_FOUND, "AutomationComposition not found", e); + public AutomationComposition getAutomationComposition(final UUID instanceId) { + var result = automationCompositionRepository.findByInstanceId(instanceId.toString()); + if (result.isEmpty()) { + throw new PfModelRuntimeException(Status.NOT_FOUND, "AutomationComposition not found"); } + return result.get().toAuthorative(); } /** - * Find automation composition by automationCompositionId. + * Get automation composition. * - * @param name the name of the automation composition to get, null to get all automation compositions - * @param version the version of the automation composition to get, null to get all automation compositions + * @param automationCompositionId the ID of the automation composition to get * @return the automation composition found */ @Transactional(readOnly = true) - public Optional<AutomationComposition> findAutomationComposition(@NonNull final String name, - @NonNull final String version) { - return findAutomationComposition(new PfConceptKey(name, version)); + public AutomationComposition getAutomationComposition(final ToscaConceptIdentifier automationCompositionId) { + try { + return automationCompositionRepository.getById(automationCompositionId.asConceptKey()).toAuthorative(); + } catch (EntityNotFoundException e) { + throw new PfModelRuntimeException(Status.NOT_FOUND, "AutomationComposition not found", e); + } } /** @@ -94,12 +96,27 @@ public class AutomationCompositionProvider { } /** - * Save automation composition. + * Create automation composition. + * + * @param automationComposition the automation composition to create + * @return the create automation composition + */ + public AutomationComposition createAutomationComposition(final AutomationComposition automationComposition) { + automationComposition.setInstanceId(UUID.randomUUID()); + var result = automationCompositionRepository.save(ProviderUtils.getJpaAndValidate(automationComposition, + JpaAutomationComposition::new, "automation composition")); + + // Return the saved automation composition + return result.toAuthorative(); + } + + /** + * Update automation composition. * * @param automationComposition the automation composition to update * @return the updated automation composition */ - public AutomationComposition saveAutomationComposition(final AutomationComposition automationComposition) { + public AutomationComposition updateAutomationComposition(final AutomationComposition automationComposition) { var result = automationCompositionRepository.save(ProviderUtils.getJpaAndValidate(automationComposition, JpaAutomationComposition::new, "automation composition")); @@ -136,23 +153,18 @@ public class AutomationCompositionProvider { /** * Delete a automation composition. * - * @param name the name of the automation composition to delete - * @param version the version of the automation composition to delete + * @param instanceId the ID of the automation composition to get * @return the automation composition deleted */ - public AutomationComposition deleteAutomationComposition(@NonNull final String name, - @NonNull final String version) { - - var automationCompositionKey = new PfConceptKey(name, version); - var jpaDeleteAutomationComposition = automationCompositionRepository.findById(automationCompositionKey); - + public AutomationComposition deleteAutomationComposition(@NonNull final UUID instanceId) { + var jpaDeleteAutomationComposition = automationCompositionRepository.findByInstanceId(instanceId.toString()); if (jpaDeleteAutomationComposition.isEmpty()) { - String errorMessage = "delete of automation composition \"" + automationCompositionKey.getId() + var errorMessage = "delete of automation composition \"" + instanceId + "\" failed, automation composition does not exist"; throw new PfModelRuntimeException(Response.Status.NOT_FOUND, errorMessage); } - automationCompositionRepository.deleteById(automationCompositionKey); + automationCompositionRepository.deleteById(jpaDeleteAutomationComposition.get().getKey()); return jpaDeleteAutomationComposition.get().toAuthorative(); } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java index 273b99a63..aba752667 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/repository/AutomationCompositionRepository.java @@ -21,6 +21,7 @@ package org.onap.policy.clamp.models.acm.persistence.repository; import java.util.List; +import java.util.Optional; import org.onap.policy.clamp.models.acm.persistence.concepts.JpaAutomationComposition; import org.onap.policy.models.base.PfConceptKey; import org.springframework.data.jpa.repository.JpaRepository; @@ -28,7 +29,9 @@ import org.springframework.stereotype.Repository; @Repository public interface AutomationCompositionRepository - extends JpaRepository<JpaAutomationComposition, PfConceptKey>, FilterRepository { + extends JpaRepository<JpaAutomationComposition, PfConceptKey>, FilterRepository { + + Optional<JpaAutomationComposition> findByInstanceId(String instanceId); List<JpaAutomationComposition> findByCompositionId(String compositionId); } diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionTest.java index 733ba3807..f5a2149b4 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/concepts/JpaAutomationCompositionTest.java @@ -46,7 +46,8 @@ import org.onap.policy.models.base.PfConceptKey; */ class JpaAutomationCompositionTest { - private static final String NULL_KEY_ERROR = "key is marked .*ull but is null"; + private static final String NULL_KEY_ERROR = "instanceId is marked .*ull but is null"; + private static final UUID INSTANCE_ID = UUID.fromString("709c62b3-8918-41b9-a747-d21eb79c6c20"); private static final String COMPOSITION_ID = "709c62b3-8918-41b9-a747-e21eb79c6c41"; @Test @@ -56,74 +57,70 @@ class JpaAutomationCompositionTest { }).hasMessageMatching("copyConcept is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition((PfConceptKey) null); + new JpaAutomationComposition(null, null, null, null, null); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, null, null, null); + new JpaAutomationComposition(null, null, null, null, new LinkedHashMap<>()); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, null, null, new LinkedHashMap<>()); + new JpaAutomationComposition(null, null, null, AutomationCompositionState.UNINITIALISED, null); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, null, AutomationCompositionState.UNINITIALISED, null); - }).hasMessageMatching(NULL_KEY_ERROR); - - assertThatThrownBy(() -> { - new JpaAutomationComposition(null, null, AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>()); - }).hasMessageMatching(NULL_KEY_ERROR); - - assertThatThrownBy(() -> { - new JpaAutomationComposition(null, "key", null, null); + new JpaAutomationComposition(null, null, null, AutomationCompositionState.UNINITIALISED, + new LinkedHashMap<>()); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, "key", null, new LinkedHashMap<>()); + new JpaAutomationComposition(null, null, "key", null, new LinkedHashMap<>()); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, "key", AutomationCompositionState.UNINITIALISED, null); + new JpaAutomationComposition(null, null, "key", AutomationCompositionState.UNINITIALISED, null); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(null, "key", AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>()); + new JpaAutomationComposition(null, null, "key", AutomationCompositionState.UNINITIALISED, + new LinkedHashMap<>()); }).hasMessageMatching(NULL_KEY_ERROR); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), null, null, null); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), null, null, null); }).hasMessageMatching("compositionId is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), null, null, new LinkedHashMap<>()); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), null, null, new LinkedHashMap<>()); }).hasMessageMatching("compositionId is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), null, AutomationCompositionState.UNINITIALISED, null); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), null, + AutomationCompositionState.UNINITIALISED, null); }).hasMessageMatching("compositionId is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), null, AutomationCompositionState.UNINITIALISED, - new LinkedHashMap<>()); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), null, + AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>()); }).hasMessageMatching("compositionId is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), "key", null, null); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), "key", null, null); }).hasMessageMatching("state is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), "key", null, new LinkedHashMap<>()); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), "key", null, + new LinkedHashMap<>()); }).hasMessageMatching("state is marked .*ull but is null"); assertThatThrownBy(() -> { - new JpaAutomationComposition(new PfConceptKey(), "key", AutomationCompositionState.UNINITIALISED, null); + new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), "key", + AutomationCompositionState.UNINITIALISED, null); }).hasMessageMatching("elements is marked .*ull but is null"); assertNotNull(new JpaAutomationComposition()); - assertNotNull(new JpaAutomationComposition((new PfConceptKey()))); - assertNotNull(new JpaAutomationComposition(new PfConceptKey(), "key", AutomationCompositionState.UNINITIALISED, - new LinkedHashMap<>())); + assertNotNull(new JpaAutomationComposition(INSTANCE_ID.toString(), new PfConceptKey(), "key", + AutomationCompositionState.UNINITIALISED, new LinkedHashMap<>())); } @Test @@ -182,23 +179,24 @@ class JpaAutomationCompositionTest { new StandardCoder().decode(new File("src/test/resources/json/AutomationCompositionNoOrderedState.json"), AutomationComposition.class); + noOrderedStateAc.setInstanceId(INSTANCE_ID); var noOrderedStateJpaAc = new JpaAutomationComposition(noOrderedStateAc); assertNull(noOrderedStateJpaAc.getOrderedState()); noOrderedStateAc.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED); noOrderedStateJpaAc = new JpaAutomationComposition(noOrderedStateAc); assertEquals(testJpaAutomationComposition, noOrderedStateJpaAc); - var automationCompositionsWithElements = new StandardCoder().decode( - new File("src/test/resources/providers/TestAutomationCompositions.json"), AutomationCompositions.class); + var acWithElements = + new StandardCoder().decode(new File("src/test/resources/providers/TestAutomationCompositions.json"), + AutomationCompositions.class).getAutomationCompositionList().get(0); - var jpaAutomationCompositionWithElements = - new JpaAutomationComposition(automationCompositionsWithElements.getAutomationCompositionList().get(0)); + acWithElements.setInstanceId(INSTANCE_ID); + var jpaAutomationCompositionWithElements = new JpaAutomationComposition(acWithElements); assertEquals(4, jpaAutomationCompositionWithElements.getElements().size()); assertEquals(17, jpaAutomationCompositionWithElements.getKeys().size()); assertThatCode(jpaAutomationCompositionWithElements::clean).doesNotThrowAnyException(); - assertEquals(automationCompositionsWithElements.getAutomationCompositionList().get(0), - jpaAutomationCompositionWithElements.toAuthorative()); + assertEquals(acWithElements, jpaAutomationCompositionWithElements.toAuthorative()); } @Test @@ -282,6 +280,7 @@ class JpaAutomationCompositionTest { var ac2 = new JpaAutomationComposition(); ac2.setCompositionId(COMPOSITION_ID); + ac2.setInstanceId(ac0.getInstanceId()); assertEquals(ac2, ac0); } @@ -299,6 +298,7 @@ class JpaAutomationCompositionTest { private AutomationComposition createAutomationCompositionInstance() { var testAutomationComposition = new AutomationComposition(); testAutomationComposition.setName("automation-composition"); + testAutomationComposition.setInstanceId(INSTANCE_ID); testAutomationComposition.setVersion("0.0.1"); testAutomationComposition.setCompositionId(UUID.fromString(COMPOSITION_ID)); testAutomationComposition.setElements(new LinkedHashMap<>()); diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java index a2d6d69c2..50953d692 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AcDefinitionProviderTest.java @@ -22,6 +22,7 @@ package org.onap.policy.clamp.models.acm.persistence.provider; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -46,6 +47,8 @@ import org.springframework.data.domain.Example; class AcDefinitionProviderTest { private static final String TOSCA_SERVICE_TEMPLATE_YAML = "clamp/acm/pmsh/funtional-pmsh-usecase.yaml"; + private static final String TOSCA_SERVICE_TEMPLATE_YAML_PROP = + "clamp/acm/test/tosca-template-additional-properties.yaml"; private static final StandardYamlCoder YAML_TRANSLATOR = new StandardYamlCoder(); @@ -57,6 +60,24 @@ class AcDefinitionProviderTest { } @Test + void testDocCopyCompare() { + + var inputServiceTemplateProperties = getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML_PROP); + var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplateProperties); + var docServiceTemplateCopy = new DocToscaServiceTemplate(docServiceTemplate); + + assertTrue(docServiceTemplate.compareTo(docServiceTemplateCopy) < -1); + assertThat(docServiceTemplate.compareToWithoutEntities(docServiceTemplateCopy)).isZero(); + + var acmDefinition = getAcDefinition(docServiceTemplate); + var acmDefinitionCopy = getAcDefinition(docServiceTemplateCopy); + + assertThat(acmDefinition.getServiceTemplate().getName()).isEqualTo( + acmDefinitionCopy.getServiceTemplate().getName()); + + } + + @Test void testCreateServiceTemplate() { var docServiceTemplate = new DocToscaServiceTemplate(inputServiceTemplate); var acmDefinition = getAcDefinition(docServiceTemplate); diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java index 5b12eee17..d7d96e9bd 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProviderTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.when; import java.util.List; import java.util.Optional; +import java.util.UUID; import javax.persistence.EntityNotFoundException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -40,7 +41,6 @@ import org.onap.policy.clamp.models.acm.persistence.repository.AutomationComposi import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.resources.ResourceUtils; -import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class AutomationCompositionProviderTest { @@ -68,18 +68,32 @@ class AutomationCompositionProviderTest { } @Test - void testAutomationCompositionSave() { + void testAutomationCompositionCreate() { var automationCompositionRepository = mock(AutomationCompositionRepository.class); var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository); - assertThatThrownBy(() -> automationCompositionProvider.saveAutomationComposition(null)) + when(automationCompositionRepository.save(any(JpaAutomationComposition.class))) + .thenReturn(inputAutomationCompositionsJpa.get(0)); + var inputAc = inputAutomationCompositions.getAutomationCompositionList().get(0); + + var createdAutomationComposition = automationCompositionProvider.createAutomationComposition(inputAc); + inputAc.setInstanceId(createdAutomationComposition.getInstanceId()); + assertEquals(inputAc, createdAutomationComposition); + } + + @Test + void testAutomationCompositionUpdate() { + var automationCompositionRepository = mock(AutomationCompositionRepository.class); + var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository); + + assertThatThrownBy(() -> automationCompositionProvider.updateAutomationComposition(null)) .hasMessageMatching(OBJECT_IS_NULL); when(automationCompositionRepository.save(inputAutomationCompositionsJpa.get(0))) .thenReturn(inputAutomationCompositionsJpa.get(0)); var createdAutomationComposition = automationCompositionProvider - .saveAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0)); + .updateAutomationComposition(inputAutomationCompositions.getAutomationCompositionList().get(0)); assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), createdAutomationComposition); } @@ -121,31 +135,49 @@ class AutomationCompositionProviderTest { .getAutomationComposition(new ToscaConceptIdentifier(ID_NAME_NOT_EXTST, ID_VERSION))) .hasMessageMatching("AutomationComposition not found"); - ac = automationCompositionProvider.findAutomationComposition(ID_NAME, ID_VERSION) - .orElse(new AutomationComposition()); - assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(1), ac); - assertThat(automationCompositionProvider .findAutomationComposition(new ToscaConceptIdentifier(ID_NAME_NOT_EXTST, ID_VERSION))).isEmpty(); } @Test - void testDeleteAutomationComposition() { + void testGetAutomationComposition() { var automationCompositionRepository = mock(AutomationCompositionRepository.class); var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository); - assertThatThrownBy( - () -> automationCompositionProvider.deleteAutomationComposition(ID_NAME_NOT_EXTST, ID_VERSION)) - .hasMessageMatching(".*.failed, automation composition does not exist"); + var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0); + when(automationCompositionRepository.findByInstanceId(automationComposition.getInstanceId().toString())) + .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0))); + var ac = automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId()); + assertEquals(inputAutomationCompositions.getAutomationCompositionList().get(0), ac); + } + + @Test + void testGetAcInstancesByCompositionId() { + var automationCompositionRepository = mock(AutomationCompositionRepository.class); + var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository); var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0); - var name = automationComposition.getName(); - var version = automationComposition.getVersion(); + when(automationCompositionRepository.findByCompositionId(automationComposition.getCompositionId().toString())) + .thenReturn(inputAutomationCompositionsJpa); + var acList = + automationCompositionProvider.getAcInstancesByCompositionId(automationComposition.getCompositionId()); + assertEquals(inputAutomationCompositions.getAutomationCompositionList(), acList); + } - when(automationCompositionRepository.findById(new PfConceptKey(name, version))) + @Test + void testDeleteAutomationComposition() { + var automationCompositionRepository = mock(AutomationCompositionRepository.class); + var automationCompositionProvider = new AutomationCompositionProvider(automationCompositionRepository); + + assertThatThrownBy(() -> automationCompositionProvider.deleteAutomationComposition(UUID.randomUUID())) + .hasMessageMatching(".*.failed, automation composition does not exist"); + + var automationComposition = inputAutomationCompositions.getAutomationCompositionList().get(0); + when(automationCompositionRepository.findByInstanceId(automationComposition.getInstanceId().toString())) .thenReturn(Optional.of(inputAutomationCompositionsJpa.get(0))); - AutomationComposition deletedAc = automationCompositionProvider.deleteAutomationComposition(name, version); + var deletedAc = + automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId()); assertEquals(automationComposition, deletedAc); } } diff --git a/models/src/test/resources/providers/TestAutomationCompositions.json b/models/src/test/resources/providers/TestAutomationCompositions.json index 171ce07f6..286759988 100644 --- a/models/src/test/resources/providers/TestAutomationCompositions.json +++ b/models/src/test/resources/providers/TestAutomationCompositions.json @@ -2,6 +2,7 @@ "automationCompositionList": [ { "compositionId": "709c62b3-8918-41b9-a747-e21eb79c6c40", + "instanceId": "809c62b3-8918-41b9-a748-e21eb79c6c89", "state": "UNINITIALISED", "orderedState": "UNINITIALISED", "elements": { @@ -68,6 +69,7 @@ }, { "compositionId": "709c62b3-8918-41b9-a747-e21eb79c6c40", + "instanceId": "809c62b3-8918-41b9-a748-e21eb79c6c90", "state": "UNINITIALISED", "orderedState": "UNINITIALISED", "elements": { diff --git a/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClient.java b/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClient.java index f3f7d3427..a05dfbc5f 100644 --- a/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClient.java +++ b/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClient.java @@ -143,7 +143,7 @@ public class HelmClient { * @return string output * @throws ServiceException incase of error. */ - public static String executeCommand(ProcessBuilder processBuilder) throws ServiceException { + public String executeCommand(ProcessBuilder processBuilder) throws ServiceException { var commandStr = toString(processBuilder); try { diff --git a/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidator.java b/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidator.java index 67bdc0b40..89eb284eb 100644 --- a/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidator.java +++ b/participant/participant-impl/participant-impl-kubernetes/src/main/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidator.java @@ -46,6 +46,8 @@ public class PodStatusValidator implements Runnable { private ChartInfo chart; + private HelmClient client = new HelmClient(); + /** * Constructor for PodStatusValidator. * @param chart chartInfo @@ -76,7 +78,7 @@ public class PodStatusValidator implements Runnable { long endTime = System.currentTimeMillis() + (timeout * 1000L); while (!isVerified && System.currentTimeMillis() < endTime) { - var output = HelmClient.executeCommand(verifyPodStatusCommand(chart)); + var output = client.executeCommand(verifyPodStatusCommand(chart)); var podStatusMap = mapPodStatus(output); isVerified = !podStatusMap.isEmpty() && podStatusMap.values().stream().allMatch("Running"::equals); diff --git a/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClientTest.java b/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClientTest.java index f5826bf3b..19106a623 100644 --- a/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClientTest.java +++ b/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/HelmClientTest.java @@ -29,7 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; import java.io.File; @@ -42,8 +42,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.Mockito; import org.mockito.Spy; import org.onap.policy.clamp.acm.participant.kubernetes.exception.ServiceException; import org.onap.policy.clamp.acm.participant.kubernetes.models.ChartInfo; @@ -74,25 +72,20 @@ class HelmClientTest { @Mock HelmRepository repo; - private static MockedStatic<HelmClient> mockedClient; @BeforeAll static void init() throws CoderException { charts = CODER.decode(new File(CHART_INFO_YAML), ChartList.class).getCharts(); - //Mock static method for bash command execution - mockedClient = mockStatic(HelmClient.class); } @AfterAll public static void close() throws IOException { - mockedClient.close(); FileSystemUtils.deleteRecursively(Path.of("target/tmp")); } @Test - void test_installChart() { - mockedClient.when(() -> HelmClient.executeCommand(any())) - .thenReturn("success"); + void test_installChart() throws ServiceException { + doReturn("success").when(helmClient).executeCommand(any()); doReturn(new File("/target/tmp/override.yaml")).when(chartStore) .getOverrideFile(any()); var chartinfo = charts.get(0); @@ -101,29 +94,28 @@ class HelmClientTest { chartinfo.setNamespace(""); assertDoesNotThrow(() -> helmClient.installChart(chartinfo)); - mockedClient.when(() -> HelmClient.executeCommand(any())).thenReturn(""); + doReturn("").when(helmClient).executeCommand(any()); assertDoesNotThrow(() -> helmClient.installChart(chartinfo)); } @Test - void test_addRepository() { - mockedClient.when(() -> HelmClient.executeCommand(any())).thenReturn(""); + void test_addRepository() throws ServiceException { + doReturn("").when(helmClient).executeCommand(any()); when(repo.getRepoName()).thenReturn("RepoName"); when(repo.getAddress()).thenReturn("http://localhost:8080"); assertDoesNotThrow(() -> helmClient.addRepository(repo)); - mockedClient.when(() -> HelmClient.executeCommand(any())) - .thenReturn("failed"); + doReturn("failed").when(helmClient).executeCommand(any()); assertDoesNotThrow(() -> helmClient.addRepository(repo)); } @Test void test_findChartRepository() throws IOException, ServiceException { String tmpPath = "target/tmp/dummyChart/1.0/"; - mockedClient.when(() -> HelmClient.executeCommand(Mockito.any())) - .thenReturn("nginx-stable/nginx-ingress\t0.9.3\t1.11.3" - + " \tNGINX Ingress Controller"); + doReturn("nginx-stable/nginx-ingress\t0.9.3\t1.11.3" + + " \tNGINX Ingress Controller").when(helmClient).executeCommand(any()); + String configuredRepo = helmClient.findChartRepository(charts.get(1)); assertThat(configuredRepo).isEqualTo("nginx-stable"); @@ -143,8 +135,9 @@ class HelmClientTest { @Test void test_uninstallChart() throws ServiceException { + doReturn("success").when(helmClient).executeCommand(any()); helmClient.uninstallChart(charts.get(0)); - mockedClient.when(() -> HelmClient.executeCommand(any())).thenThrow(new ServiceException("error in execution")); + doThrow(ServiceException.class).when(helmClient).executeCommand(any()); assertThatThrownBy(() -> helmClient.uninstallChart(charts.get(0))) .isInstanceOf(ServiceException.class); @@ -152,8 +145,7 @@ class HelmClientTest { @Test void test_verifyConfiguredRepoForInvalidChart() throws IOException, ServiceException { - mockedClient.when(() -> HelmClient.executeCommand(Mockito.any())) - .thenReturn(""); + doReturn("").when(helmClient).executeCommand(any()); String configuredRepo = helmClient.verifyConfiguredRepo(charts.get(1)); assertNull(configuredRepo); } diff --git a/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidatorTest.java b/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidatorTest.java index 962744db7..6cec6056d 100644 --- a/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidatorTest.java +++ b/participant/participant-impl/participant-impl-kubernetes/src/test/java/org/onap/policy/clamp/acm/participant/kubernetes/helm/PodStatusValidatorTest.java @@ -25,17 +25,17 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.doReturn; import java.io.File; import java.util.List; import java.util.Map; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.MockedStatic; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.onap.policy.clamp.acm.participant.kubernetes.exception.ServiceException; import org.onap.policy.clamp.acm.participant.kubernetes.handler.AutomationCompositionElementHandler; import org.onap.policy.clamp.acm.participant.kubernetes.models.ChartInfo; @@ -54,12 +54,21 @@ class PodStatusValidatorTest { private static int STATUS_CHECK_INTERVAL = 1; private static List<ChartInfo> charts; - private static MockedStatic<HelmClient> mockedClient; + @InjectMocks + private PodStatusValidator podStatusValidator = new PodStatusValidator(charts.get(0), TIMEOUT, + STATUS_CHECK_INTERVAL); + + @InjectMocks + private PodStatusValidator podValidatorWithPodName = new PodStatusValidator(charts.get(2), TIMEOUT, + STATUS_CHECK_INTERVAL); + + + @Mock + private HelmClient client; @BeforeAll static void init() throws CoderException { charts = CODER.decode(new File(CHART_INFO_YAML), ChartList.class).getCharts(); - mockedClient = mockStatic(HelmClient.class); } @AfterEach @@ -67,17 +76,11 @@ class PodStatusValidatorTest { AutomationCompositionElementHandler.getPodStatusMap().clear(); } - @AfterAll - public static void close() { - mockedClient.close(); - } @Test - void test_RunningPodState() { + void test_RunningPodState() throws ServiceException { String runningPod = "NAME\tREADY\tSTATUS\tRESTARTS\tAGE\r\nHelloWorld-54777df9f8-qpzqr\t1/1\tRunning\t0\t9h"; - mockedClient.when(() -> HelmClient.executeCommand(any())) - .thenReturn(runningPod); - var podStatusValidator = new PodStatusValidator(charts.get(0), TIMEOUT, STATUS_CHECK_INTERVAL); + doReturn(runningPod).when(client).executeCommand(any()); assertDoesNotThrow(() -> podStatusValidator.run()); assertThat(AutomationCompositionElementHandler.getPodStatusMap()).hasSize(1); assertThat(AutomationCompositionElementHandler.getPodStatusMap()).containsKey(charts.get(0).getReleaseName()); @@ -86,11 +89,9 @@ class PodStatusValidatorTest { } @Test - void test_InvalidPodState() { + void test_InvalidPodState() throws ServiceException { String invalidPod = "NAME\tREADY\tSTATUS\tRESTARTS\tAGE\nhellofromdocker-54777df9f8-qpzqr\t1/1\tInit\t0\t9h"; - mockedClient.when(() -> HelmClient.executeCommand(any())) - .thenReturn(invalidPod); - var podStatusValidator = new PodStatusValidator(charts.get(1), TIMEOUT, STATUS_CHECK_INTERVAL); + doReturn(invalidPod).when(client).executeCommand(any()); assertThatThrownBy(() -> podStatusValidator.run()) .isInstanceOf(ServiceException.class).hasMessage("Error verifying the status of the pod. Exiting"); assertThat(AutomationCompositionElementHandler.getPodStatusMap()).isEmpty(); @@ -98,12 +99,10 @@ class PodStatusValidatorTest { // Use case scenario: Hard coded pod name @Test - void test_RunningPodStateWhitPodName() { + void test_RunningPodStateWithPodName() throws ServiceException { String runningPod = "NAME\tREADY\tSTATUS\tRESTARTS\tAGE\r\nhelloallworld-54777df9f8-qpzqr\t1/1\tRunning\t0\t9h"; - mockedClient.when(() -> HelmClient.executeCommand(any())) - .thenReturn(runningPod); - var podStatusValidator = new PodStatusValidator(charts.get(2), TIMEOUT, STATUS_CHECK_INTERVAL); - assertDoesNotThrow(() -> podStatusValidator.run()); + doReturn(runningPod).when(client).executeCommand(any()); + assertDoesNotThrow(() -> podValidatorWithPodName.run()); assertThat(AutomationCompositionElementHandler.getPodStatusMap()).hasSize(1); assertThat(AutomationCompositionElementHandler.getPodStatusMap()).containsKey(charts.get(2).getReleaseName()); assertThat(AutomationCompositionElementHandler.getPodStatusMap()) 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 29b337edd..03a2f4e25 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 @@ -43,6 +43,7 @@ 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; @@ -80,9 +81,10 @@ public class AutomationCompositionInstantiationProvider { if (!validationResult.isValid()) { throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationComposition = automationCompositionProvider.saveAutomationComposition(automationComposition); + automationComposition = automationCompositionProvider.createAutomationComposition(automationComposition); var response = new InstantiationResponse(); + response.setInstanceId(automationComposition.getInstanceId()); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; @@ -99,9 +101,10 @@ public class AutomationCompositionInstantiationProvider { if (!validationResult.isValid()) { throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); var response = new InstantiationResponse(); + response.setInstanceId(automationComposition.getInstanceId()); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; @@ -134,7 +137,8 @@ public class AutomationCompositionInstantiationProvider { * @return the result of the deletion */ public InstantiationResponse deleteAutomationComposition(String name, String version) { - var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(name, version); + var automationCompositionOpt = + automationCompositionProvider.findAutomationComposition(new ToscaConceptIdentifier(name, version)); if (automationCompositionOpt.isEmpty()) { throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "Automation composition not found"); } @@ -144,8 +148,10 @@ public class AutomationCompositionInstantiationProvider { "Automation composition state is still " + automationComposition.getState()); } var response = new InstantiationResponse(); - response.setAffectedAutomationComposition( - automationCompositionProvider.deleteAutomationComposition(name, version).getKey().asIdentifier()); + automationComposition = + automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId()); + response.setInstanceId(automationComposition.getInstanceId()); + response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; } @@ -199,7 +205,7 @@ public class AutomationCompositionInstantiationProvider { automationComposition.setCascadedOrderedState(command.getOrderedState()); supervisionHandler.triggerAutomationCompositionSupervision(automationComposition); - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); var response = new InstantiationResponse(); response.setAffectedAutomationComposition(command.getAutomationCompositionIdentifier()); diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java index b5d7645da..de67360f8 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java @@ -235,7 +235,7 @@ public class SupervisionHandler { automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet()); updated |= setPrimed(automationComposition.get()); if (updated) { - automationCompositionProvider.saveAutomationComposition(automationComposition.get()); + automationCompositionProvider.updateAutomationComposition(automationComposition.get()); } } else { LOGGER.warn("AutomationComposition not found in database {}", diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java index e2f8b6777..129569b6b 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java @@ -242,7 +242,7 @@ public class SupervisionScanner { automationComposition.getState(), automationComposition.getOrderedState()); automationComposition.setState(automationComposition.getOrderedState().asState()); - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); // Clear missed report counter on automation composition clearFaultAndCounter(automationComposition); 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/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 864179844..115adcb50 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 @@ -45,6 +45,7 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvide 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; @@ -66,14 +67,13 @@ class AutomationCompositionInstantiationProviderTest { private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command"; private static final String AC_ELEMENT_NAME_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n" - + " \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n" - + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n" - + " \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\"" - + " INVALID, Not found\n"; - 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"; + + " \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n" + + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n" + + " \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\"" + + " INVALID, Not found\n"; + 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 ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); @@ -101,12 +101,13 @@ class AutomationCompositionInstantiationProviderTest { var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); automationCompositionCreate.setCompositionId(compositionId); - when(acProvider.saveAutomationComposition(automationCompositionCreate)).thenReturn(automationCompositionCreate); + when(acProvider.createAutomationComposition(automationCompositionCreate)) + .thenReturn(automationCompositionCreate); var instantiationResponse = instantiationProvider.createAutomationComposition(automationCompositionCreate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate); - verify(acProvider).saveAutomationComposition(automationCompositionCreate); + verify(acProvider).createAutomationComposition(automationCompositionCreate); when(acProvider.getAutomationCompositions(automationCompositionCreate.getName(), automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate)); @@ -123,14 +124,12 @@ class AutomationCompositionInstantiationProviderTest { instantiationResponse = instantiationProvider.updateAutomationComposition(automationCompositionUpdate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate); - verify(acProvider).saveAutomationComposition(automationCompositionUpdate); + verify(acProvider).updateAutomationComposition(automationCompositionUpdate); when(acProvider.findAutomationComposition(automationCompositionUpdate.getKey().asIdentifier())) .thenReturn(Optional.of(automationCompositionUpdate)); - when(acProvider.findAutomationComposition(automationCompositionUpdate.getName(), - automationCompositionUpdate.getVersion())).thenReturn(Optional.of(automationCompositionUpdate)); - when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getName(), - automationCompositionUpdate.getVersion())).thenReturn(automationCompositionUpdate); + when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId())) + .thenReturn(automationCompositionUpdate); var instantiationCommand = InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud"); @@ -146,8 +145,7 @@ class AutomationCompositionInstantiationProviderTest { instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getName(), automationCompositionCreate.getVersion()); - verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getName(), - automationCompositionCreate.getVersion()); + verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getInstanceId()); } @Test @@ -172,11 +170,13 @@ class AutomationCompositionInstantiationProviderTest { } } automationComposition.setState(AutomationCompositionState.UNINITIALISED); + automationComposition.setInstanceId(UUID.randomUUID()); - when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion())) - .thenReturn(Optional.of(automationComposition)); - when(acProvider.deleteAutomationComposition(automationComposition.getName(), - automationComposition.getVersion())).thenReturn(automationComposition); + when(acProvider.findAutomationComposition( + new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()))) + .thenReturn(Optional.of(automationComposition)); + when(acProvider.deleteAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); instantiationProvider.deleteAutomationComposition(automationComposition.getName(), automationComposition.getVersion()); @@ -193,8 +193,8 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion())) - .thenReturn(Optional.of(automationComposition)); + var key = new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()); + when(acProvider.findAutomationComposition(key)).thenReturn(Optional.of(automationComposition)); assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(), automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state)); @@ -209,9 +209,11 @@ class AutomationCompositionInstantiationProviderTest { var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates"); automationCompositionCreate.setCompositionId(compositionId); + automationCompositionCreate.setInstanceId(UUID.randomUUID()); var acProvider = mock(AutomationCompositionProvider.class); - when(acProvider.saveAutomationComposition(automationCompositionCreate)).thenReturn(automationCompositionCreate); + when(acProvider.createAutomationComposition(automationCompositionCreate)) + .thenReturn(automationCompositionCreate); var participantProvider = Mockito.mock(ParticipantProvider.class); var supervisionHandler = mock(SupervisionHandler.class); 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 dd6e8f3fc..9c364b2db 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 @@ -166,6 +166,7 @@ class InstantiationControllerTest extends CommonRestController { assertEquals(Response.Status.OK.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()); @@ -227,12 +228,13 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update"); automationCompositionCreate.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationCompositionCreate); + var response = instantiationProvider.createAutomationComposition(automationCompositionCreate); var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update"); automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(response.getInstanceId()); var resp = invocationBuilder.put(Entity.json(automationComposition)); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java index cc915003d..3a707cd52 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java @@ -235,7 +235,7 @@ class SupervisionHandlerTest { handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -255,7 +255,7 @@ class SupervisionHandlerTest { handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } @Test diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java index 03a0ec59e..1455e9246 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java @@ -96,7 +96,7 @@ class SupervisionScannerTest { participantStatusReqPublisher, participantUpdatePublisher, acRuntimeParameterGroup); supervisionScanner.run(false); - verify(automationCompositionProvider, times(0)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -120,7 +120,7 @@ class SupervisionScannerTest { participantStatusReqPublisher, participantUpdatePublisher, acRuntimeParameterGroup); supervisionScanner.run(false); - verify(automationCompositionProvider, times(1)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(1)).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -148,7 +148,7 @@ class SupervisionScannerTest { supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier()); supervisionScanner.run(true); - verify(automationCompositionProvider, times(0)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class)); } |