diff options
author | 2024-02-14 16:30:56 +0000 | |
---|---|---|
committer | 2024-02-15 15:29:53 +0000 | |
commit | e0a13196ebb34c84931df27ba00cd1778adbceb9 (patch) | |
tree | 64f1af69d7802ee41a08278ec1e84b21241c1fb5 /participant/participant-intermediary/src/test/java | |
parent | 665815fc5c91c3437a0b0459448994789464a391 (diff) |
Add old properties and new properties support
Add old/new properties support in migrate and update,
and add Java code backward compatibility.
Issue-ID: POLICY-4930
Change-Id: I640bc2a858969168b13fe6cdbb557ebf920bafd5
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
Diffstat (limited to 'participant/participant-intermediary/src/test/java')
8 files changed, 672 insertions, 111 deletions
diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV1Test.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV1Test.java new file mode 100755 index 000000000..a60e1b8cd --- /dev/null +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV1Test.java @@ -0,0 +1,239 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.acm.participant.intermediary.api.impl; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi; +import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy; +import org.onap.policy.clamp.models.acm.concepts.AcTypeState; +import org.onap.policy.clamp.models.acm.concepts.DeployState; +import org.onap.policy.clamp.models.acm.concepts.LockState; +import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; +import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +class AcElementListenerV1Test { + + @Test + void deployTest() throws PfModelException { + var acElementListenerV1 = mock(AcElementListenerV1.class, Answers.CALLS_REAL_METHODS); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.deploy(compositionElement, instanceElement); + verify(acElementListenerV1).deploy(any(), any(), any()); + + clearInvocations(acElementListenerV1); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYING, LockState.NONE); + verify(acElementListenerV1).deploy(any(), any(), any()); + } + + @Test + void undeployTest() throws PfModelException { + var acElementListenerV1 = mock(AcElementListenerV1.class, Answers.CALLS_REAL_METHODS); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.undeploy(compositionElement, instanceElement); + verify(acElementListenerV1).undeploy(instanceElement.instanceId(), instanceElement.elementId()); + + clearInvocations(acElementListenerV1); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.UNDEPLOYING, LockState.NONE); + verify(acElementListenerV1).undeploy(instanceElement.instanceId(), instanceElement.elementId()); + } + + @Test + void lockTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.lock(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked"); + } + + @Test + void deleteTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.delete(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted"); + } + + @Test + void updateTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.update(compositionElement, instanceElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Update not supported"); + } + + @Test + void unlockTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.unlock(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked"); + } + + @Test + void primeTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + acElementListenerV1.prime(composition); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed"); + } + + @Test + void deprimeTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + acElementListenerV1.deprime(composition); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed"); + } + + @Test + void handleRestartComposition() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + + acElementListenerV1.handleRestartComposition(composition, AcTypeState.PRIMED); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Restarted"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartComposition(composition, AcTypeState.PRIMING); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartComposition(composition, AcTypeState.DEPRIMING); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed"); + } + + @Test + void handleRestartInstance() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.LOCKED); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, LockState.LOCKED, + StateChangeResult.NO_ERROR, "Restarted"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.LOCKING); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.UNLOCKING); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.UPDATING, LockState.LOCKED); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Update not supported"); + + clearInvocations(intermediaryApi); + acElementListenerV1.handleRestartInstance(compositionElement, instanceElement, + DeployState.DELETING, LockState.NONE); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted"); + } + + @Test + void migrateTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV1 = createAcElementListenerV1(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV1.migrate(compositionElement, compositionElement, instanceElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Migrated"); + } + + private AcElementListenerV1 createAcElementListenerV1(ParticipantIntermediaryApi intermediaryApi) { + return new AcElementListenerV1(intermediaryApi) { + @Override + public void deploy(UUID instanceId, AcElementDeploy element, Map<String, Object> properties) + throws PfModelException { + + } + + @Override + public void undeploy(UUID instanceId, UUID elementId) throws PfModelException { + + } + }; + } +} diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV2Test.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV2Test.java new file mode 100755 index 000000000..c36e11dbc --- /dev/null +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AcElementListenerV2Test.java @@ -0,0 +1,228 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.acm.participant.intermediary.api.impl; + +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi; +import org.onap.policy.clamp.models.acm.concepts.AcTypeState; +import org.onap.policy.clamp.models.acm.concepts.DeployState; +import org.onap.policy.clamp.models.acm.concepts.LockState; +import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; +import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +class AcElementListenerV2Test { + + @Test + void deployTest() throws PfModelException { + var acElementListenerV2 = mock(AcElementListenerV2.class, Answers.CALLS_REAL_METHODS); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYING, LockState.NONE); + verify(acElementListenerV2).deploy(compositionElement, instanceElement); + } + + @Test + void undeployTest() throws PfModelException { + var acElementListenerV2 = mock(AcElementListenerV2.class, Answers.CALLS_REAL_METHODS); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.UNDEPLOYING, LockState.NONE); + verify(acElementListenerV2).undeploy(compositionElement, instanceElement); + } + + @Test + void lockTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.lock(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked"); + } + + @Test + void deleteTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.delete(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted"); + } + + @Test + void updateTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.update(compositionElement, instanceElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Update not supported"); + } + + @Test + void unlockTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.unlock(compositionElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked"); + } + + @Test + void primeTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + acElementListenerV2.prime(composition); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed"); + } + + @Test + void deprimeTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + acElementListenerV2.deprime(composition); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed"); + } + + @Test + void handleRestartComposition() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionId = UUID.randomUUID(); + var toscaConceptIdentifier = new ToscaConceptIdentifier(); + var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of()); + + acElementListenerV2.handleRestartComposition(composition, AcTypeState.PRIMED); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Restarted"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartComposition(composition, AcTypeState.PRIMING); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartComposition(composition, AcTypeState.DEPRIMING); + verify(intermediaryApi) + .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed"); + } + + @Test + void handleRestartInstance() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.LOCKED); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, LockState.LOCKED, + StateChangeResult.NO_ERROR, "Restarted"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.LOCKING); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.DEPLOYED, LockState.UNLOCKING); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.UPDATING, LockState.LOCKED); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Update not supported"); + + clearInvocations(intermediaryApi); + acElementListenerV2.handleRestartInstance(compositionElement, instanceElement, + DeployState.DELETING, LockState.NONE); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted"); + } + + @Test + void migrateTest() throws PfModelException { + var intermediaryApi = mock(ParticipantIntermediaryApi.class); + var acElementListenerV2 = createAcElementListenerV2(intermediaryApi); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of()); + acElementListenerV2.migrate(compositionElement, compositionElement, instanceElement, instanceElement); + verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(), + instanceElement.elementId(), DeployState.DEPLOYED, null, + StateChangeResult.NO_ERROR, "Migrated"); + } + + private AcElementListenerV2 createAcElementListenerV2(ParticipantIntermediaryApi intermediaryApi) { + return new AcElementListenerV2(intermediaryApi) { + @Override + public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { + } + + @Override + public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { + } + }; + } +} diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AutomationCompositionElementListenerTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AutomationCompositionElementListenerTest.java index 93809ab96..b01065d09 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AutomationCompositionElementListenerTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/AutomationCompositionElementListenerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation. + * Copyright (C) 2023-2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,17 +22,24 @@ package org.onap.policy.clamp.acm.participant.intermediary.api.impl; import static org.assertj.core.api.Assertions.assertThatCode; +import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto; import org.onap.policy.clamp.acm.participant.intermediary.handler.DummyAcElementListener; -import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class AutomationCompositionElementListenerTest { @Test - void defaultTest() throws PfModelException { + void defaultTest() { var listener = new DummyAcElementListener(); - assertThatCode(() -> listener.lock(UUID.randomUUID(), UUID.randomUUID())).doesNotThrowAnyException(); - assertThatCode(() -> listener.unlock(UUID.randomUUID(), UUID.randomUUID())).doesNotThrowAnyException(); + var compositionElementDto = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + Map.of(), Map.of()); + var instanceElementDto = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, + Map.of(), Map.of()); + assertThatCode(() -> listener.lock(compositionElementDto, instanceElementDto)).doesNotThrowAnyException(); + assertThatCode(() -> listener.unlock(compositionElementDto, instanceElementDto)).doesNotThrowAnyException(); } } diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java index 6a00d8cf6..661c009f6 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandlerTest.java @@ -28,11 +28,13 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto; import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher; import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData; import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy; @@ -48,6 +50,8 @@ import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCom import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @@ -79,8 +83,6 @@ class AutomationCompositionHandlerTest { @Test void handleAutomationCompositionStateChangeUndeployTest() { var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next(); - var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), - automationComposition.getInstanceId(), DeployOrder.UNDEPLOY, LockOrder.NONE); var cacheProvider = mock(CacheProvider.class); when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -89,6 +91,15 @@ class AutomationCompositionHandlerTest { var participantMessagePublisher = mock(ParticipantMessagePublisher.class); var listener = mock(ThreadHandler.class); var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); + for (var element : automationComposition.getElements().values()) { + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); + } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); + var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), + automationComposition.getInstanceId(), DeployOrder.UNDEPLOY, LockOrder.NONE); + ach.handleAutomationCompositionStateChange(automationCompositionStateChange); verify(listener, times(automationComposition.getElements().size())).undeploy(any(), any(), any()); for (var element : automationComposition.getElements().values()) { @@ -99,8 +110,6 @@ class AutomationCompositionHandlerTest { @Test void handleAutomationCompositionStateChangeLockTest() { var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next(); - var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), - automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.LOCK); var cacheProvider = mock(CacheProvider.class); when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -109,6 +118,14 @@ class AutomationCompositionHandlerTest { var participantMessagePublisher = mock(ParticipantMessagePublisher.class); var listener = mock(ThreadHandler.class); var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); + for (var element : automationComposition.getElements().values()) { + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); + } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); + var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), + automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.LOCK); ach.handleAutomationCompositionStateChange(automationCompositionStateChange); verify(listener, times(automationComposition.getElements().size())).lock(any(), any(), any()); for (var element : automationComposition.getElements().values()) { @@ -119,8 +136,6 @@ class AutomationCompositionHandlerTest { @Test void handleAutomationCompositionStateChangeUnlockTest() { var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next(); - var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), - automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.UNLOCK); var cacheProvider = mock(CacheProvider.class); when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -129,6 +144,14 @@ class AutomationCompositionHandlerTest { var participantMessagePublisher = mock(ParticipantMessagePublisher.class); var listener = mock(ThreadHandler.class); var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); + for (var element : automationComposition.getElements().values()) { + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); + } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); + var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), + automationComposition.getInstanceId(), DeployOrder.NONE, LockOrder.UNLOCK); ach.handleAutomationCompositionStateChange(automationCompositionStateChange); verify(listener, times(automationComposition.getElements().size())).unlock(any(), any(), any()); for (var element : automationComposition.getElements().values()) { @@ -139,8 +162,6 @@ class AutomationCompositionHandlerTest { @Test void handleAutomationCompositionStateChangeDeleteTest() { var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next(); - var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), - automationComposition.getInstanceId(), DeployOrder.DELETE, LockOrder.NONE); var cacheProvider = mock(CacheProvider.class); when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -149,6 +170,14 @@ class AutomationCompositionHandlerTest { var participantMessagePublisher = mock(ParticipantMessagePublisher.class); var listener = mock(ThreadHandler.class); var ach = new AutomationCompositionHandler(cacheProvider, participantMessagePublisher, listener); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); + for (var element : automationComposition.getElements().values()) { + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); + } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); + var automationCompositionStateChange = CommonTestData.getStateChange(CommonTestData.getParticipantId(), + automationComposition.getInstanceId(), DeployOrder.DELETE, LockOrder.NONE); ach.handleAutomationCompositionStateChange(automationCompositionStateChange); verify(listener, times(automationComposition.getElements().size())).delete(any(), any(), any()); for (var element : automationComposition.getElements().values()) { @@ -181,6 +210,12 @@ class AutomationCompositionHandlerTest { acElementDeploy.setId(automationComposition.getElements().values().iterator().next().getId()); participantDeploy.getAcElementList().add(acElementDeploy); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); + for (var element : automationComposition.getElements().values()) { + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); + } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); ach.handleAcPropertyUpdate(updateMsg); verify(listener).update(any(), any(), any(), any()); } @@ -205,54 +240,76 @@ class AutomationCompositionHandlerTest { deployMsg.setAutomationCompositionId(automationComposition.getInstanceId()); when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); for (var element : automationComposition.getElements().values()) { var acElementDeploy = new AcElementDeploy(); acElementDeploy.setProperties(Map.of()); acElementDeploy.setId(element.getId()); participantDeploy.getAcElementList().add(acElementDeploy); + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map)); + ach.handleAutomationCompositionDeploy(deployMsg); - verify(listener, times(automationComposition.getElements().size())).deploy(any(), any(), any(), any()); + verify(listener, times(automationComposition.getElements().size())).deploy(any(), any(), any()); } @Test void handleComposiotPrimeTest() { - var listener = mock(ThreadHandler.class); - var ach = new AutomationCompositionHandler(mock(CacheProvider.class), mock(ParticipantMessagePublisher.class), - listener); + var acElementDefinition = new AutomationCompositionElementDefinition(); + acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0")); + var toscaNodeTemplate = new ToscaNodeTemplate(); + toscaNodeTemplate.setProperties(Map.of()); + acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate); + var list = List.of(acElementDefinition); var compositionId = UUID.randomUUID(); - var list = List.of(new AutomationCompositionElementDefinition()); var messageId = UUID.randomUUID(); + var listener = mock(ThreadHandler.class); + var ach = new AutomationCompositionHandler(mock(CacheProvider.class), mock(ParticipantMessagePublisher.class), + listener); ach.prime(messageId, compositionId, list); - verify(listener).prime(messageId, compositionId, list); + verify(listener).prime(any(UUID.class), any(CompositionDto.class)); } @Test void handleComposiotDeprimeTest() { - var listener = mock(ThreadHandler.class); - var ach = new AutomationCompositionHandler(mock(CacheProvider.class), mock(ParticipantMessagePublisher.class), - listener); + var acElementDefinition = new AutomationCompositionElementDefinition(); + acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0")); + var toscaNodeTemplate = new ToscaNodeTemplate(); + toscaNodeTemplate.setProperties(Map.of()); + acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate); var compositionId = UUID.randomUUID(); + var listener = mock(ThreadHandler.class); + var cacheProvider = mock(CacheProvider.class); + var ach = new AutomationCompositionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), + listener); + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(compositionId, Map.of(new ToscaConceptIdentifier(), acElementDefinition))); var messageId = UUID.randomUUID(); ach.deprime(messageId, compositionId); - verify(listener).deprime(messageId, compositionId); + verify(listener).deprime(any(UUID.class), any(CompositionDto.class)); } @Test void restartedTest() { + var acElementDefinition = new AutomationCompositionElementDefinition(); + acElementDefinition.setAcElementDefinitionId(new ToscaConceptIdentifier("key", "1.0.0")); + var toscaNodeTemplate = new ToscaNodeTemplate(); + toscaNodeTemplate.setProperties(Map.of()); + acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate); + var list = List.of(acElementDefinition); + var state = AcTypeState.PRIMED; + var participantRestartAc = CommonTestData.createParticipantRestartAc(); + var automationCompositionList = List.of(participantRestartAc); var listener = mock(ThreadHandler.class); var cacheProvider = mock(CacheProvider.class); var ach = new AutomationCompositionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), listener); - var compositionId = UUID.randomUUID(); var messageId = UUID.randomUUID(); - var list = List.of(new AutomationCompositionElementDefinition()); - var state = AcTypeState.PRIMED; - var participantRestartAc = CommonTestData.createParticipantRestartAc(); - var automationCompositionList = List.of(participantRestartAc); ach.restarted(messageId, compositionId, list, state, automationCompositionList); verify(cacheProvider).initializeAutomationComposition(compositionId, participantRestartAc); - verify(listener).restarted(messageId, compositionId, list, state, automationCompositionList); + verify(listener).restarted(any(), any(), any(), any()); } @Test @@ -272,12 +329,18 @@ class AutomationCompositionHandlerTest { participantDeploy.setParticipantId(CommonTestData.getParticipantId()); when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId()); migrationMsg.getParticipantUpdatesList().add(participantDeploy); + Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>(); for (var element : automationComposition.getElements().values()) { var acElementDeploy = new AcElementDeploy(); acElementDeploy.setProperties(Map.of()); acElementDeploy.setId(element.getId()); + acElementDeploy.setDefinition(element.getDefinition()); participantDeploy.getAcElementList().add(acElementDeploy); + map.put(element.getDefinition(), new AutomationCompositionElementDefinition()); } + when(cacheProvider.getAcElementsDefinitions()) + .thenReturn(Map.of(automationComposition.getCompositionId(), map, + migrationMsg.getCompositionTargetId(), map)); ach.handleAutomationCompositionMigration(migrationMsg); verify(listener, times(automationComposition.getElements().size())).migrate(any(), any(), any(), any(), any()); diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/CacheProviderTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/CacheProviderTest.java index 33bd93fb2..d5fe5785b 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/CacheProviderTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/CacheProviderTest.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class CacheProviderTest { @@ -59,9 +60,10 @@ class CacheProviderTest { assertThatThrownBy(() -> cacheProvider.getAutomationComposition(null)).isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> cacheProvider.getCommonProperties(null, null)) + var definition = new ToscaConceptIdentifier(); + assertThatThrownBy(() -> cacheProvider.getCommonProperties(null, definition)) .isInstanceOf(NullPointerException.class); - assertThatThrownBy(() -> cacheProvider.getCommonProperties(instanceId, null)) + assertThatThrownBy(() -> cacheProvider.getCommonProperties(instanceId, (UUID) null)) .isInstanceOf(NullPointerException.class); assertThatThrownBy(() -> cacheProvider.removeAutomationComposition(null)) diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/DummyAcElementListener.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/DummyAcElementListener.java index e7b4b676d..24935c1c9 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/DummyAcElementListener.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/DummyAcElementListener.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation. + * Copyright (C) 2023-2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,68 +20,71 @@ package org.onap.policy.clamp.acm.participant.intermediary.handler; -import java.util.List; -import java.util.Map; -import java.util.UUID; import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener; -import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; -import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition; import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.concepts.LockState; import org.onap.policy.models.base.PfModelException; public class DummyAcElementListener implements AutomationCompositionElementListener { @Override - public void undeploy(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException { + public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { } @Override - public void deploy(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties) - throws PfModelException { + public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { } @Override - public void lock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException { + public void lock(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { + } @Override - public void unlock(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException { + public void unlock(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { + } @Override - public void delete(UUID automationCompositionId, UUID automationCompositionElementId) throws PfModelException { + public void delete(CompositionElementDto compositionElement, InstanceElementDto instanceElement) + throws PfModelException { } @Override - public void update(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties) + public void update(CompositionElementDto compositionElement, InstanceElementDto instanceElement, + InstanceElementDto instanceElementUpdated) throws PfModelException { } @Override - public void prime(UUID compositionId, List<AutomationCompositionElementDefinition> elementDefinitionList) - throws PfModelException { + public void prime(CompositionDto composition) throws PfModelException { } @Override - public void deprime(UUID compositionId) throws PfModelException { + public void deprime(CompositionDto composition) throws PfModelException { } @Override - public void handleRestartComposition(UUID compositionId, - List<AutomationCompositionElementDefinition> elementDefinitionList, AcTypeState state) - throws PfModelException { + public void handleRestartComposition(CompositionDto composition, AcTypeState state) throws PfModelException { } @Override - public void handleRestartInstance(UUID automationCompositionId, AcElementDeploy element, - Map<String, Object> properties, DeployState deployState, LockState lockState) throws PfModelException { + public void handleRestartInstance(CompositionElementDto compositionElement, InstanceElementDto instanceElement, + DeployState deployState, LockState lockState) throws PfModelException { } @Override - public void migrate(UUID instanceId, AcElementDeploy element, UUID compositionTargetId, - Map<String, Object> properties) throws PfModelException { + public void migrate(CompositionElementDto compositionElement, CompositionElementDto compositionElementTarget, + InstanceElementDto instanceElement, InstanceElementDto instanceElementMigrate) + throws PfModelException { } } diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandlerTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandlerTest.java index 8be19f749..4b58ae177 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandlerTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandlerTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher; import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition; import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition; import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType; import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeploy; @@ -234,6 +235,7 @@ class ParticipantHandlerTest { private ParticipantDefinition createParticipantDefinition() { var def = new ParticipantDefinition(); def.setParticipantId(CommonTestData.getParticipantId()); + def.setAutomationCompositionElementDefinitionList(List.of(new AutomationCompositionElementDefinition())); return def; } } diff --git a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandlerTest.java b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandlerTest.java index 2ac3c8df2..e4c34845e 100644 --- a/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandlerTest.java +++ b/participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandlerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation. + * Copyright (C) 2023-2024 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,16 +34,19 @@ import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto; +import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto; import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi; import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy; import org.onap.policy.clamp.models.acm.concepts.AcElementRestart; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; -import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition; import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.concepts.LockState; import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class ThreadHandlerTest { @@ -56,48 +59,57 @@ class ThreadHandlerTest { try (var threadHandler = new ThreadHandler(listener, intermediaryApi, mock(CacheProvider.class))) { var compositionId = UUID.randomUUID(); - var list = List.of(new AutomationCompositionElementDefinition()); var messageId = UUID.randomUUID(); - threadHandler.prime(messageId, compositionId, list); - verify(listener, timeout(TIMEOUT)).prime(compositionId, list); + var composition = new CompositionDto(compositionId, Map.of(), Map.of()); + threadHandler.prime(messageId, composition); + verify(listener, timeout(TIMEOUT)).prime(composition); clearInvocations(listener); - var element = new AcElementDeploy(); - var elementId = UUID.randomUUID(); - element.setId(elementId); Map<String, Object> properties = Map.of("key", "value"); - var instanceId = UUID.randomUUID(); - threadHandler.deploy(messageId, instanceId, element, properties); - verify(listener, timeout(TIMEOUT)).deploy(instanceId, element, properties); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + properties, properties); + var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), + null, properties, properties); + threadHandler.deploy(messageId, compositionElement, instanceElement); + verify(listener, timeout(TIMEOUT)).deploy(compositionElement, instanceElement); clearInvocations(listener); - threadHandler.update(messageId, instanceId, element, properties); - verify(listener, timeout(TIMEOUT)).update(instanceId, element, properties); + var element = new AcElementDeploy(); + var elementId = UUID.randomUUID(); + element.setId(elementId); + var instanceElementUpdated = new InstanceElementDto(instanceElement.instanceId(), + instanceElement.elementId(), null, properties, properties); + threadHandler.update(messageId, compositionElement, instanceElement, instanceElementUpdated); + verify(listener, timeout(TIMEOUT)).update(compositionElement, instanceElement, instanceElementUpdated); clearInvocations(listener); var compositionTargetId = UUID.randomUUID(); - threadHandler.migrate(messageId, instanceId, element, compositionTargetId, properties); - verify(listener, timeout(TIMEOUT)).migrate(instanceId, element, compositionTargetId, properties); + var compositionElementTarget = new CompositionElementDto(compositionTargetId, new ToscaConceptIdentifier(), + properties, properties); + threadHandler.migrate(messageId, compositionElement, compositionElementTarget, + instanceElement, instanceElementUpdated); + verify(listener, timeout(TIMEOUT)).migrate(compositionElement, compositionElementTarget, + instanceElement, instanceElementUpdated); clearInvocations(listener); - threadHandler.lock(messageId, instanceId, elementId); - verify(listener, timeout(TIMEOUT)).lock(instanceId, elementId); + threadHandler.lock(messageId, compositionElement, instanceElement); + verify(listener, timeout(TIMEOUT)).lock(compositionElement, instanceElement); clearInvocations(listener); - threadHandler.unlock(messageId, instanceId, elementId); - verify(listener, timeout(TIMEOUT)).unlock(instanceId, elementId); + threadHandler.unlock(messageId, compositionElement, instanceElement); + verify(listener, timeout(TIMEOUT)).unlock(compositionElement, instanceElement); clearInvocations(listener); - threadHandler.undeploy(messageId, instanceId, elementId); - verify(listener, timeout(TIMEOUT)).undeploy(instanceId, elementId); + threadHandler.undeploy(messageId, compositionElement, instanceElement); + verify(listener, timeout(TIMEOUT)).undeploy(compositionElement, instanceElement); clearInvocations(listener); - threadHandler.delete(messageId, instanceId, elementId); - verify(listener, timeout(TIMEOUT)).delete(instanceId, elementId); + threadHandler.delete(messageId, compositionElement, instanceElement); + verify(listener, timeout(TIMEOUT)).delete(compositionElement, instanceElement); clearInvocations(listener); - threadHandler.deprime(messageId, compositionId); - verify(listener, timeout(TIMEOUT)).deprime(compositionId); + threadHandler.deprime(messageId, composition); + verify(listener, timeout(TIMEOUT)).deprime(composition); } } @@ -108,75 +120,80 @@ class ThreadHandlerTest { try (var threadHandler = new ThreadHandler(listener, intermediaryApi, mock(CacheProvider.class))) { var compositionId = UUID.randomUUID(); - var list = List.of(new AutomationCompositionElementDefinition()); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).prime(compositionId, - list); + var composition = new CompositionDto(compositionId, Map.of(), Map.of()); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .prime(composition); var messageId = UUID.randomUUID(); - threadHandler.prime(messageId, compositionId, list); + threadHandler.prime(messageId, composition); verify(intermediaryApi, timeout(TIMEOUT)).updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.FAILED, "Composition Defintion prime failed"); clearInvocations(intermediaryApi); - var element = new AcElementDeploy(); - var elementId = UUID.randomUUID(); - element.setId(elementId); Map<String, Object> properties = Map.of("key", "value"); + var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(), + properties, properties); var instanceId = UUID.randomUUID(); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).deploy(instanceId, - element, properties); - threadHandler.deploy(messageId, instanceId, element, properties); + var elementId = UUID.randomUUID(); + var instanceElement = new InstanceElementDto(instanceId, elementId, null, properties, properties); + var element = new AcElementDeploy(); + element.setId(elementId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .deploy(compositionElement, instanceElement); + threadHandler.deploy(messageId, compositionElement, instanceElement); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Automation composition element deploy failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).update(instanceId, - element, properties); - threadHandler.update(messageId, instanceId, element, properties); + var instanceElementUpdated = new InstanceElementDto(instanceElement.instanceId(), + instanceElement.elementId(), null, properties, properties); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .update(compositionElement, instanceElement, instanceElementUpdated); + threadHandler.update(messageId, compositionElement, instanceElement, instanceElementUpdated); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Automation composition element update failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).lock(instanceId, - elementId); - threadHandler.lock(messageId, instanceId, elementId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .lock(compositionElement, instanceElement); + threadHandler.lock(messageId, compositionElement, instanceElement); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.UNLOCKED, StateChangeResult.FAILED, "Automation composition element lock failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).unlock(instanceId, - elementId); - threadHandler.unlock(messageId, instanceId, elementId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .unlock(compositionElement, instanceElement); + threadHandler.unlock(messageId, compositionElement, instanceElement); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, null, LockState.LOCKED, StateChangeResult.FAILED, "Automation composition element unlock failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).undeploy(instanceId, - elementId); - threadHandler.undeploy(messageId, instanceId, elementId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .undeploy(compositionElement, instanceElement); + threadHandler.undeploy(messageId, compositionElement, instanceElement); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Automation composition element undeploy failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).delete(instanceId, - elementId); - threadHandler.delete(messageId, instanceId, elementId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) + .delete(compositionElement, instanceElement); + threadHandler.delete(messageId, compositionElement, instanceElement); verify(intermediaryApi, timeout(TIMEOUT)).updateAutomationCompositionElementState(instanceId, elementId, DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Automation composition element delete failed"); clearInvocations(listener); - doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).deprime(compositionId); - threadHandler.deprime(messageId, compositionId); + doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener).deprime(composition); + threadHandler.deprime(messageId, composition); verify(intermediaryApi, timeout(TIMEOUT)).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED, "Composition Defintion deprime failed"); clearInvocations(listener); doThrow(new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error")).when(listener) - .handleRestartComposition(compositionId, List.of(), AcTypeState.PRIMING); - threadHandler.restarted(messageId, compositionId, List.of(), AcTypeState.PRIMING, List.of()); + .handleRestartComposition(composition, AcTypeState.PRIMING); + threadHandler.restarted(messageId, composition, AcTypeState.PRIMING, List.of()); verify(intermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.FAILED, "Composition Defintion deprime failed"); } @@ -193,9 +210,9 @@ class ThreadHandlerTest { var participantRestartAc = new ParticipantRestartAc(); participantRestartAc.setAutomationCompositionId(UUID.randomUUID()); participantRestartAc.getAcElementList().add(new AcElementRestart()); - threadHandler.restarted(messageId, compositionId, List.of(new AutomationCompositionElementDefinition()), - AcTypeState.PRIMED, List.of(participantRestartAc)); - verify(listener, timeout(TIMEOUT)).handleRestartInstance(any(), any(), any(), any(), any()); + var composition = new CompositionDto(compositionId, Map.of(), Map.of()); + threadHandler.restarted(messageId, composition, AcTypeState.PRIMED, List.of(participantRestartAc)); + verify(listener, timeout(TIMEOUT)).handleRestartInstance(any(), any(), any(), any()); } } } |