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