c36e11dbc7b81f280c88a2f9b00e834dd82ff4a5
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2024 Nordix Foundation.
4   * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.acm.participant.intermediary.api.impl;
22
23 import static org.mockito.Mockito.clearInvocations;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.verify;
26
27 import java.util.Map;
28 import java.util.UUID;
29 import org.junit.jupiter.api.Test;
30 import org.mockito.Answers;
31 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
32 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
33 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
34 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
35 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
36 import org.onap.policy.clamp.models.acm.concepts.DeployState;
37 import org.onap.policy.clamp.models.acm.concepts.LockState;
38 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
41
42 class AcElementListenerV2Test {
43
44     @Test
45     void deployTest() throws PfModelException {
46         var acElementListenerV2 = mock(AcElementListenerV2.class, Answers.CALLS_REAL_METHODS);
47         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
48             Map.of(), Map.of());
49         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
50         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
51             DeployState.DEPLOYING, LockState.NONE);
52         verify(acElementListenerV2).deploy(compositionElement, instanceElement);
53     }
54
55     @Test
56     void undeployTest() throws PfModelException {
57         var acElementListenerV2 = mock(AcElementListenerV2.class, Answers.CALLS_REAL_METHODS);
58         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
59             Map.of(), Map.of());
60         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
61         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
62             DeployState.UNDEPLOYING, LockState.NONE);
63         verify(acElementListenerV2).undeploy(compositionElement, instanceElement);
64     }
65
66     @Test
67     void lockTest() throws PfModelException {
68         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
69         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
70         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
71             Map.of(), Map.of());
72         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
73         acElementListenerV2.lock(compositionElement, instanceElement);
74         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
75             instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
76     }
77
78     @Test
79     void deleteTest() throws PfModelException {
80         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
81         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
82         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
83             Map.of(), Map.of());
84         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
85         acElementListenerV2.delete(compositionElement, instanceElement);
86         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
87             instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
88     }
89
90     @Test
91     void updateTest() throws PfModelException {
92         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
93         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
94         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
95             Map.of(), Map.of());
96         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
97         acElementListenerV2.update(compositionElement, instanceElement, instanceElement);
98         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
99             instanceElement.elementId(), DeployState.DEPLOYED, null,
100             StateChangeResult.NO_ERROR, "Update not supported");
101     }
102
103     @Test
104     void unlockTest() throws PfModelException {
105         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
106         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
107         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
108             Map.of(), Map.of());
109         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
110         acElementListenerV2.unlock(compositionElement, instanceElement);
111         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
112             instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
113     }
114
115     @Test
116     void primeTest() throws PfModelException {
117         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
118         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
119         var compositionId = UUID.randomUUID();
120         var toscaConceptIdentifier = new ToscaConceptIdentifier();
121         var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of());
122         acElementListenerV2.prime(composition);
123         verify(intermediaryApi)
124             .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
125     }
126
127     @Test
128     void deprimeTest() throws PfModelException {
129         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
130         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
131         var compositionId = UUID.randomUUID();
132         var toscaConceptIdentifier = new ToscaConceptIdentifier();
133         var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of());
134         acElementListenerV2.deprime(composition);
135         verify(intermediaryApi)
136             .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed");
137     }
138
139     @Test
140     void handleRestartComposition() throws PfModelException {
141         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
142         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
143         var compositionId = UUID.randomUUID();
144         var toscaConceptIdentifier = new ToscaConceptIdentifier();
145         var composition = new CompositionDto(compositionId, Map.of(toscaConceptIdentifier, Map.of()), Map.of());
146
147         acElementListenerV2.handleRestartComposition(composition, AcTypeState.PRIMED);
148         verify(intermediaryApi)
149             .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Restarted");
150
151         clearInvocations(intermediaryApi);
152         acElementListenerV2.handleRestartComposition(composition, AcTypeState.PRIMING);
153         verify(intermediaryApi)
154             .updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
155
156         clearInvocations(intermediaryApi);
157         acElementListenerV2.handleRestartComposition(composition, AcTypeState.DEPRIMING);
158         verify(intermediaryApi)
159             .updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR, "Deprimed");
160     }
161
162     @Test
163     void handleRestartInstance() throws PfModelException {
164         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
165         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
166         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
167             Map.of(), Map.of());
168         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
169
170         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
171             DeployState.DEPLOYED, LockState.LOCKED);
172         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
173             instanceElement.elementId(), DeployState.DEPLOYED, LockState.LOCKED,
174             StateChangeResult.NO_ERROR, "Restarted");
175
176         clearInvocations(intermediaryApi);
177         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
178             DeployState.DEPLOYED, LockState.LOCKING);
179         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
180             instanceElement.elementId(), null, LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
181
182         clearInvocations(intermediaryApi);
183         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
184             DeployState.DEPLOYED, LockState.UNLOCKING);
185         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
186             instanceElement.elementId(), null, LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
187
188         clearInvocations(intermediaryApi);
189         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
190             DeployState.UPDATING, LockState.LOCKED);
191         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
192             instanceElement.elementId(), DeployState.DEPLOYED, null,
193             StateChangeResult.NO_ERROR, "Update not supported");
194
195         clearInvocations(intermediaryApi);
196         acElementListenerV2.handleRestartInstance(compositionElement, instanceElement,
197             DeployState.DELETING, LockState.NONE);
198         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
199             instanceElement.elementId(), DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
200     }
201
202     @Test
203     void migrateTest() throws PfModelException {
204         var intermediaryApi = mock(ParticipantIntermediaryApi.class);
205         var acElementListenerV2 = createAcElementListenerV2(intermediaryApi);
206         var compositionElement = new CompositionElementDto(UUID.randomUUID(), new ToscaConceptIdentifier(),
207             Map.of(), Map.of());
208         var instanceElement = new InstanceElementDto(UUID.randomUUID(), UUID.randomUUID(), null, Map.of(), Map.of());
209         acElementListenerV2.migrate(compositionElement, compositionElement, instanceElement, instanceElement);
210         verify(intermediaryApi).updateAutomationCompositionElementState(instanceElement.instanceId(),
211             instanceElement.elementId(), DeployState.DEPLOYED, null,
212             StateChangeResult.NO_ERROR, "Migrated");
213     }
214
215     private AcElementListenerV2 createAcElementListenerV2(ParticipantIntermediaryApi intermediaryApi) {
216         return new AcElementListenerV2(intermediaryApi) {
217             @Override
218             public void deploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
219                 throws PfModelException {
220             }
221
222             @Override
223             public void undeploy(CompositionElementDto compositionElement, InstanceElementDto instanceElement)
224                 throws PfModelException {
225             }
226         };
227     }
228 }