f08cda12bfa001e030a97d16a2da14239537cad0
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 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.controlloop.runtime.supervision.comm;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24
25 import java.time.Instant;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.UUID;
30 import org.junit.jupiter.api.AfterAll;
31 import org.junit.jupiter.api.BeforeAll;
32 import org.junit.jupiter.api.Test;
33 import org.mockito.Mockito;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
35 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ClElementStatisticsProvider;
36 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
37 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
38 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantStatisticsProvider;
39 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
40 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregisterAck;
41 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
42 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegisterAck;
43 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdate;
44 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
45 import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
46 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
47 import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
48 import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
49 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
50 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
51 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
52 import org.onap.policy.common.endpoints.event.comm.TopicSink;
53 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
54 import org.onap.policy.common.utils.resources.ResourceUtils;
55 import org.onap.policy.models.base.PfModelException;
56 import org.onap.policy.models.provider.PolicyModelsProvider;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
59 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
60
61 class SupervisionMessagesTest extends CommonRestController {
62
63     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
64             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
65     private static final Object lockit = new Object();
66     private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
67     private static final String TOPIC = "my-topic";
68     private static final long interval = 1000;
69     private static SupervisionHandler supervisionHandler;
70     private static CommissioningProvider commissioningProvider;
71     private static ControlLoopProvider clProvider;
72     private static PolicyModelsProvider modelsProvider;
73     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
74
75     /**
76      * setup Db Provider Parameters.
77      *
78      * @throws PfModelException if an error occurs
79      */
80     @BeforeAll
81     public static void setupDbProviderParameters() throws PfModelException {
82         ClRuntimeParameterGroup controlLoopParameters = CommonTestData.geParameterGroup(0, "instantproviderdb");
83
84         modelsProvider =
85                 CommonTestData.getPolicyModelsProvider(controlLoopParameters.getDatabaseProviderParameters());
86         clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
87         var participantStatisticsProvider =
88                 new ParticipantStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters());
89         var clElementStatisticsProvider =
90                 new ClElementStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters());
91         commissioningProvider = new CommissioningProvider(modelsProvider, clProvider);
92         var monitoringProvider =
93                 new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider);
94         var participantProvider = new ParticipantProvider(controlLoopParameters.getDatabaseProviderParameters());
95         var controlLoopUpdatePublisher = Mockito.mock(ParticipantControlLoopUpdatePublisher.class);
96         var controlLoopStateChangePublisher = Mockito.mock(ParticipantControlLoopStateChangePublisher.class);
97         var participantRegisterAckPublisher = Mockito.mock(ParticipantRegisterAckPublisher.class);
98         var participantDeregisterAckPublisher = Mockito.mock(ParticipantDeregisterAckPublisher.class);
99         var participantUpdatePublisher = Mockito.mock(ParticipantUpdatePublisher.class);
100         supervisionHandler = new SupervisionHandler(clProvider, participantProvider, monitoringProvider,
101                         commissioningProvider, controlLoopUpdatePublisher, controlLoopStateChangePublisher,
102                         participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher);
103     }
104
105     @AfterAll
106     public static void closeDbProvider() throws PfModelException {
107         clProvider.close();
108         modelsProvider.close();
109     }
110
111     @Test
112     void testReceiveParticipantRegister() throws Exception {
113         final ParticipantRegister participantRegisterMsg = new ParticipantRegister();
114         participantRegisterMsg.setParticipantId(getParticipantId());
115         participantRegisterMsg.setTimestamp(Instant.now());
116         participantRegisterMsg.setParticipantType(getParticipantType());
117
118         synchronized (lockit) {
119             ParticipantRegisterListener participantRegisterListener =
120                     new ParticipantRegisterListener(supervisionHandler);
121             ToscaServiceTemplate serviceTemplate = yamlTranslator
122                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
123
124             List<ToscaNodeTemplate> listOfTemplates = commissioningProvider.getControlLoopDefinitions(null, null);
125             commissioningProvider.createControlLoopDefinitions(serviceTemplate);
126             participantRegisterListener.onTopicEvent(INFRA, TOPIC, null, participantRegisterMsg);
127         }
128     }
129
130     @Test
131     void testSendParticipantRegisterAck() throws Exception {
132         final ParticipantRegisterAck participantRegisterAckMsg = new ParticipantRegisterAck();
133         participantRegisterAckMsg.setMessage("ParticipantRegisterAck message");
134         participantRegisterAckMsg.setResponseTo(UUID.randomUUID());
135         participantRegisterAckMsg.setResult(true);
136
137         synchronized (lockit) {
138             ParticipantRegisterAckPublisher clRegisterAckPublisher = new ParticipantRegisterAckPublisher();
139             clRegisterAckPublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
140             clRegisterAckPublisher.send(participantRegisterAckMsg);
141         }
142     }
143
144     @Test
145     void testReceiveParticipantDeregister() throws Exception {
146         final ParticipantDeregister participantDeregisterMsg = new ParticipantDeregister();
147         participantDeregisterMsg.setParticipantId(getParticipantId());
148         participantDeregisterMsg.setTimestamp(Instant.now());
149         participantDeregisterMsg.setParticipantType(getParticipantType());
150
151         synchronized (lockit) {
152             ParticipantDeregisterListener participantDeregisterListener =
153                     new ParticipantDeregisterListener(supervisionHandler);
154             participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg);
155         }
156     }
157
158     @Test
159     void testSendParticipantDeregisterAck() throws Exception {
160         final ParticipantDeregisterAck participantDeregisterAckMsg = new ParticipantDeregisterAck();
161         participantDeregisterAckMsg.setMessage("ParticipantDeregisterAck message");
162         participantDeregisterAckMsg.setResponseTo(UUID.randomUUID());
163         participantDeregisterAckMsg.setResult(true);
164
165         synchronized (lockit) {
166             ParticipantDeregisterAckPublisher clDeregisterAckPublisher = new ParticipantDeregisterAckPublisher();
167             clDeregisterAckPublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
168             clDeregisterAckPublisher.send(participantDeregisterAckMsg);
169         }
170     }
171
172     @Test
173     void testSendParticipantUpdate() throws Exception {
174         final ParticipantUpdate participantUpdateMsg = new ParticipantUpdate();
175         participantUpdateMsg.setParticipantId(getParticipantId());
176         participantUpdateMsg.setTimestamp(Instant.now());
177         participantUpdateMsg.setParticipantType(getParticipantType());
178         participantUpdateMsg.setTimestamp(Instant.ofEpochMilli(3000));
179         participantUpdateMsg.setMessageId(UUID.randomUUID());
180
181         ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
182         toscaServiceTemplate.setName("serviceTemplate");
183         toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
184         toscaServiceTemplate.setDescription("Description of serviceTemplate");
185         toscaServiceTemplate.setVersion("1.2.3");
186
187         ControlLoopElementDefinition clDefinition = new ControlLoopElementDefinition();
188         clDefinition.setId(UUID.randomUUID());
189         clDefinition.setControlLoopElementToscaServiceTemplate(toscaServiceTemplate);
190         Map<String, String> commonPropertiesMap = Map.of("Prop1", "PropValue");
191         clDefinition.setCommonPropertiesMap(commonPropertiesMap);
192
193         Map<UUID, ControlLoopElementDefinition> controlLoopElementDefinitionMap =
194             Map.of(UUID.randomUUID(), clDefinition);
195
196         Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
197             participantDefinitionUpdateMap = Map.of(getParticipantId(), controlLoopElementDefinitionMap);
198         participantUpdateMsg.setParticipantDefinitionUpdateMap(participantDefinitionUpdateMap);
199
200         synchronized (lockit) {
201             ParticipantUpdatePublisher clUpdatePublisher = new ParticipantUpdatePublisher();
202             clUpdatePublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
203             clUpdatePublisher.send(participantUpdateMsg);
204         }
205     }
206
207     @Test
208     void testReceiveParticipantUpdateAckMessage() throws Exception {
209         final ParticipantUpdateAck participantUpdateAckMsg = new ParticipantUpdateAck();
210         participantUpdateAckMsg.setMessage("ParticipantUpdateAck message");
211         participantUpdateAckMsg.setResponseTo(UUID.randomUUID());
212         participantUpdateAckMsg.setResult(true);
213
214         synchronized (lockit) {
215             ParticipantUpdateAckListener participantUpdateAckListener =
216                     new ParticipantUpdateAckListener(supervisionHandler);
217             participantUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, participantUpdateAckMsg);
218         }
219     }
220
221     private ToscaConceptIdentifier getParticipantId() {
222         return new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0");
223     }
224
225     private ToscaConceptIdentifier getParticipantType() {
226         return new ToscaConceptIdentifier("org.onap.policy.controlloop.PolicyControlLoopParticipant", "2.3.1");
227     }
228 }