/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation.
+ * Copyright (C) 2021-2022 Nordix Foundation.
* Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
package org.onap.policy.clamp.acm.runtime.supervision;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantUpdateAck;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
class SupervisionAspectTest {
+ private static final ToscaConceptIdentifier PARTICIPANT_ID =
+ new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0");
+
+ private static final ToscaConceptIdentifier PARTICIPANT_TYPE =
+ new ToscaConceptIdentifier("org.onap.policy.clamp.acm.PolicyParticipant", "1.0.0");
+
@Test
void testSchedule() throws Exception {
- var supervisionScanner = spy(mock(SupervisionScanner.class));
+ var supervisionScanner = mock(SupervisionScanner.class);
try (var supervisionAspect = new SupervisionAspect(supervisionScanner)) {
supervisionAspect.schedule();
verify(supervisionScanner, timeout(500)).run(true);
@Test
void testDoCheck() throws Exception {
- var supervisionScanner = spy(mock(SupervisionScanner.class));
+ var supervisionScanner = mock(SupervisionScanner.class);
try (var supervisionAspect = new SupervisionAspect(supervisionScanner)) {
supervisionAspect.doCheck();
supervisionAspect.doCheck();
@Test
void testHandleParticipantStatus() throws Exception {
- var supervisionScanner = spy(mock(SupervisionScanner.class));
var participantStatusMessage = new ParticipantStatus();
- var identifier = new ToscaConceptIdentifier("abc", "1.0.0");
- participantStatusMessage.setParticipantId(identifier);
+ participantStatusMessage.setParticipantId(PARTICIPANT_ID);
+ var supervisionScanner = mock(SupervisionScanner.class);
try (var supervisionAspect = new SupervisionAspect(supervisionScanner)) {
supervisionAspect.handleParticipantStatus(participantStatusMessage);
- verify(supervisionScanner, timeout(500)).handleParticipantStatus(identifier);
+ verify(supervisionScanner, timeout(500)).handleParticipantStatus(PARTICIPANT_ID);
+ }
+ }
+
+ @Test
+ void testHandleParticipantUpdateAck() throws Exception {
+ var updateAckMessage = new ParticipantUpdateAck();
+ updateAckMessage.setParticipantId(PARTICIPANT_ID);
+ updateAckMessage.setParticipantType(PARTICIPANT_TYPE);
+
+ var supervisionScanner = mock(SupervisionScanner.class);
+ try (var supervisionAspect = new SupervisionAspect(supervisionScanner)) {
+ supervisionAspect.handleParticipantUpdateAck(updateAckMessage);
+ verify(supervisionScanner, timeout(500))
+ .handleParticipantUpdateAck(new ImmutablePair<>(PARTICIPANT_ID, PARTICIPANT_TYPE));
+ }
+ }
+
+ @Test
+ void testHandleParticipantRegister() throws Exception {
+ var participantRegister = new ParticipantRegister();
+ participantRegister.setParticipantId(PARTICIPANT_ID);
+ participantRegister.setParticipantType(PARTICIPANT_TYPE);
+
+ var supervisionScanner = mock(SupervisionScanner.class);
+ try (var supervisionAspect = new SupervisionAspect(supervisionScanner)) {
+ supervisionAspect.handleParticipantRegister(participantRegister, true);
+ verify(supervisionScanner, timeout(500))
+ .handleParticipantRegister(new ImmutablePair<>(PARTICIPANT_ID, PARTICIPANT_TYPE));
}
}
}
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_ST_TEMPLATE_YAML;
+import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
import java.util.List;
import java.util.Map;
import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException;
import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
import org.onap.policy.clamp.models.acm.concepts.Participant;
import org.onap.policy.clamp.models.acm.concepts.ParticipantHealthStatus;
import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
@Test
void testTriggerAutomationCompositionSupervisionEmpty() throws PfModelException, CoderException {
- var handler =
- createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class),
- mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
- mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ var handler = createSupervisionHandler(AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(List.of()))
.hasMessageMatching("The list of automation compositions for supervision is empty");
var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), automationCompositionUpdatePublisher,
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.triggerAutomationCompositionSupervision(List.of(identifier));
}
@Test
- void testTriggerAutomationCompositionUninitialised() throws PfModelException, CoderException {
- var automationCompositionProvider = mock(AutomationCompositionProvider.class);
- var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class);
- var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
- mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
- mock(ParticipantDeregisterAckPublisher.class), automationCompositionUpdatePublisher,
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.UNINITIALISED);
+ void testAcUninitialisedToUninitialised() throws PfModelException, CoderException {
+ var handler = createSupervisionHandler(AutomationCompositionOrderedState.UNINITIALISED,
+ AutomationCompositionState.UNINITIALISED);
assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(List.of(identifier)))
.hasMessageMatching("Automation composition is already in state UNINITIALISED");
}
@Test
- void testTriggerAutomationCompositionRunning() throws PfModelException, CoderException {
+ void testAcUninitialisedToPassive() throws PfModelException, CoderException, AutomationCompositionException {
+
+ var automationCompositionsCreate =
+ InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
+
+ var automationComposition = automationCompositionsCreate.getAutomationCompositionList().get(0);
+ automationComposition.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED);
+ automationComposition.setState(AutomationCompositionState.PASSIVE);
+
var automationCompositionProvider = mock(AutomationCompositionProvider.class);
- var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class);
- var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
- mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
- mock(ParticipantDeregisterAckPublisher.class), automationCompositionUpdatePublisher,
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.RUNNING);
+ when(automationCompositionProvider.findAutomationComposition(identifier))
+ .thenReturn(Optional.of(automationComposition));
+ when(automationCompositionProvider.getAutomationComposition(identifier)).thenReturn(automationComposition);
+
+ var serviceTemplateProvider = Mockito.mock(ServiceTemplateProvider.class);
+ when(serviceTemplateProvider.getAllServiceTemplates())
+ .thenReturn(List.of(Objects.requireNonNull(InstantiationUtils.getToscaServiceTemplate(
+ TOSCA_SERVICE_TEMPLATE_YAML))));
+
+ var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
+
+ var handler = new SupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
+ mock(MonitoringProvider.class), serviceTemplateProvider, mock(AutomationCompositionUpdatePublisher.class),
+ automationCompositionStateChangePublisher, mock(ParticipantRegisterAckPublisher.class),
+ mock(ParticipantDeregisterAckPublisher.class), mock(ParticipantUpdatePublisher.class));
+
+ handler.triggerAutomationCompositionSupervision(List.of(identifier));
+
+ verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(0));
+ }
+
+ @Test
+ void testAcPassiveToPassive() throws PfModelException, CoderException {
+ var handler = createSupervisionHandler(AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.PASSIVE);
+
+ assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(List.of(identifier)))
+ .hasMessageMatching("Automation composition is already in state PASSIVE");
+ }
+
+ @Test
+ void testAcRunningToRunning() throws PfModelException, CoderException {
+ var handler = createSupervisionHandler(AutomationCompositionOrderedState.RUNNING,
+ AutomationCompositionState.RUNNING);
+
+ assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(List.of(identifier)))
+ .hasMessageMatching("Automation composition is already in state RUNNING");
+ }
+
+ @Test
+ void testAcRunningToUninitialised() throws PfModelException, CoderException {
+ var handler = createSupervisionHandler(AutomationCompositionOrderedState.RUNNING,
+ AutomationCompositionState.UNINITIALISED);
assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(List.of(identifier)))
.hasMessageMatching("Automation composition can't transition from state UNINITIALISED to state RUNNING");
var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
var automationCompositionAckMessage =
new AutomationCompositionAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK);
automationCompositionAckMessage.setAutomationCompositionResultMap(Map.of());
var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class),
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider,
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
participantDeregisterAckPublisher, mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleParticipantMessage(participantDeregisterMessage);
var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider,
mock(MonitoringProvider.class), participantRegisterAckPublisher,
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleParticipantMessage(participantRegisterMessage);
var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider,
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleParticipantMessage(participantUpdateAckMessage);
var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider,
monitoringProvider, mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE);
+ mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleParticipantMessage(participantStatusMessage);
verify(participantProvider).saveParticipant(any());
createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class),
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE);
+ participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleSendCommissionMessage(participantId.getName(), participantId.getVersion());
verify(participantUpdatePublisher).sendComissioningBroadcast(participantId.getName(),
createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class),
mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
- participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE);
+ participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE,
+ AutomationCompositionState.UNINITIALISED);
handler.handleSendDeCommissionMessage();
verify(participantUpdatePublisher).sendDecomisioning();
}
+ private SupervisionHandler createSupervisionHandler(AutomationCompositionOrderedState orderedState,
+ AutomationCompositionState state) throws PfModelException, CoderException {
+ return createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class),
+ mock(MonitoringProvider.class), mock(ParticipantRegisterAckPublisher.class),
+ mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class),
+ mock(ParticipantUpdatePublisher.class), orderedState, state);
+ }
+
private SupervisionHandler createSupervisionHandler(AutomationCompositionProvider automationCompositionProvider,
- ParticipantProvider participantProvider, MonitoringProvider monitoringProvider,
- ParticipantRegisterAckPublisher participantRegisterAckPublisher,
- ParticipantDeregisterAckPublisher participantDeregisterAckPublisher,
- AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher,
- ParticipantUpdatePublisher participantUpdatePublisher, AutomationCompositionOrderedState orderedState)
- throws PfModelException, CoderException {
+ ParticipantProvider participantProvider, MonitoringProvider monitoringProvider,
+ ParticipantRegisterAckPublisher participantRegisterAckPublisher,
+ ParticipantDeregisterAckPublisher participantDeregisterAckPublisher,
+ AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher,
+ ParticipantUpdatePublisher participantUpdatePublisher, AutomationCompositionOrderedState orderedState,
+ AutomationCompositionState state) throws PfModelException, CoderException {
var automationCompositionsCreate =
InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
var automationComposition = automationCompositionsCreate.getAutomationCompositionList().get(0);
automationComposition.setOrderedState(orderedState);
+ automationComposition.setState(state);
when(automationCompositionProvider.findAutomationComposition(identifier))
.thenReturn(Optional.of(automationComposition));
var serviceTemplateProvider = Mockito.mock(ServiceTemplateProvider.class);
when(serviceTemplateProvider.getServiceTemplateList(any(), any()))
.thenReturn(List.of(Objects.requireNonNull(InstantiationUtils.getToscaServiceTemplate(
- TOSCA_ST_TEMPLATE_YAML))));
+ TOSCA_SERVICE_TEMPLATE_YAML))));
+ when(serviceTemplateProvider.getAllServiceTemplates())
+ .thenReturn(List.of(Objects.requireNonNull(InstantiationUtils.getToscaServiceTemplate(
+ TOSCA_SERVICE_TEMPLATE_YAML))));
var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);