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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.controlloop.runtime.supervision.comm;
23 import static org.assertj.core.api.Assertions.assertThat;
25 import java.time.Instant;
26 import java.util.Collections;
27 import java.util.List;
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;
61 class SupervisionMessagesTest extends CommonRestController {
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();
76 * setup Db Provider Parameters.
78 * @throws PfModelException if an error occurs
81 public static void setupDbProviderParameters() throws PfModelException {
82 ClRuntimeParameterGroup controlLoopParameters = CommonTestData.geParameterGroup(0, "instantproviderdb");
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);
106 public static void closeDbProvider() throws PfModelException {
108 modelsProvider.close();
112 void testReceiveParticipantRegister() throws Exception {
113 final ParticipantRegister participantRegisterMsg = new ParticipantRegister();
114 participantRegisterMsg.setParticipantId(getParticipantId());
115 participantRegisterMsg.setTimestamp(Instant.now());
116 participantRegisterMsg.setParticipantType(getParticipantType());
118 synchronized (lockit) {
119 ParticipantRegisterListener participantRegisterListener =
120 new ParticipantRegisterListener(supervisionHandler);
121 ToscaServiceTemplate serviceTemplate = yamlTranslator
122 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
124 List<ToscaNodeTemplate> listOfTemplates = commissioningProvider.getControlLoopDefinitions(null, null);
125 commissioningProvider.createControlLoopDefinitions(serviceTemplate);
126 participantRegisterListener.onTopicEvent(INFRA, TOPIC, null, participantRegisterMsg);
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);
137 synchronized (lockit) {
138 ParticipantRegisterAckPublisher clRegisterAckPublisher = new ParticipantRegisterAckPublisher();
139 clRegisterAckPublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
140 clRegisterAckPublisher.send(participantRegisterAckMsg);
145 void testReceiveParticipantDeregister() throws Exception {
146 final ParticipantDeregister participantDeregisterMsg = new ParticipantDeregister();
147 participantDeregisterMsg.setParticipantId(getParticipantId());
148 participantDeregisterMsg.setTimestamp(Instant.now());
149 participantDeregisterMsg.setParticipantType(getParticipantType());
151 synchronized (lockit) {
152 ParticipantDeregisterListener participantDeregisterListener =
153 new ParticipantDeregisterListener(supervisionHandler);
154 participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg);
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);
165 synchronized (lockit) {
166 ParticipantDeregisterAckPublisher clDeregisterAckPublisher = new ParticipantDeregisterAckPublisher();
167 clDeregisterAckPublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
168 clDeregisterAckPublisher.send(participantDeregisterAckMsg);
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());
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");
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);
193 Map<UUID, ControlLoopElementDefinition> controlLoopElementDefinitionMap =
194 Map.of(UUID.randomUUID(), clDefinition);
196 Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
197 participantDefinitionUpdateMap = Map.of(getParticipantId(), controlLoopElementDefinitionMap);
198 participantUpdateMsg.setParticipantDefinitionUpdateMap(participantDefinitionUpdateMap);
200 synchronized (lockit) {
201 ParticipantUpdatePublisher clUpdatePublisher = new ParticipantUpdatePublisher();
202 clUpdatePublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class)));
203 clUpdatePublisher.send(participantUpdateMsg);
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);
214 synchronized (lockit) {
215 ParticipantUpdateAckListener participantUpdateAckListener =
216 new ParticipantUpdateAckListener(supervisionHandler);
217 participantUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, participantUpdateAckMsg);
221 private ToscaConceptIdentifier getParticipantId() {
222 return new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0");
225 private ToscaConceptIdentifier getParticipantType() {
226 return new ToscaConceptIdentifier("org.onap.policy.controlloop.PolicyControlLoopParticipant", "2.3.1");