diff options
Diffstat (limited to 'runtime-acm/src')
18 files changed, 345 insertions, 386 deletions
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/config/SpringFoxConfig.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/config/SpringDocBean.java index 0918cea1c..df9a0bfa4 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/config/SpringFoxConfig.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/config/SpringDocBean.java @@ -20,26 +20,29 @@ package org.onap.policy.clamp.acm.runtime.config; -import org.onap.policy.clamp.acm.runtime.main.rest.CommissioningController; +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; @Configuration -public class SpringFoxConfig { +public class SpringDocBean { /** - * Docket Spring Fox Config. + * Bean to configure SpringDoc. * - * @return Docket + * @return the OpenAPI specification */ @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2).select() - .apis(RequestHandlerSelectors.basePackage(CommissioningController.class.getPackageName())) - .paths(PathSelectors.any()).build(); + public OpenAPI kubernetesParticipantOpenApi() { + return new OpenAPI() + .info(new Info().title("ACM Runtime") + .description("CLAMP Automation Composition Management Runtime API") + .license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0"))) + .externalDocs(new ExternalDocumentation() + .description("CLAMP Automation Composition Management Documentation") + .url("https://docs.onap.org/projects/onap-policy-parent/en/latest/clamp/clamp.html")); } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java index 29b337edd..03a2f4e25 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java @@ -43,6 +43,7 @@ import org.onap.policy.common.parameters.BeanValidationResult; import org.onap.policy.common.parameters.ObjectValidationResult; import org.onap.policy.common.parameters.ValidationStatus; import org.onap.policy.models.base.PfModelRuntimeException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -80,9 +81,10 @@ public class AutomationCompositionInstantiationProvider { if (!validationResult.isValid()) { throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationComposition = automationCompositionProvider.saveAutomationComposition(automationComposition); + automationComposition = automationCompositionProvider.createAutomationComposition(automationComposition); var response = new InstantiationResponse(); + response.setInstanceId(automationComposition.getInstanceId()); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; @@ -99,9 +101,10 @@ public class AutomationCompositionInstantiationProvider { if (!validationResult.isValid()) { throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult()); } - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); var response = new InstantiationResponse(); + response.setInstanceId(automationComposition.getInstanceId()); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; @@ -134,7 +137,8 @@ public class AutomationCompositionInstantiationProvider { * @return the result of the deletion */ public InstantiationResponse deleteAutomationComposition(String name, String version) { - var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(name, version); + var automationCompositionOpt = + automationCompositionProvider.findAutomationComposition(new ToscaConceptIdentifier(name, version)); if (automationCompositionOpt.isEmpty()) { throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "Automation composition not found"); } @@ -144,8 +148,10 @@ public class AutomationCompositionInstantiationProvider { "Automation composition state is still " + automationComposition.getState()); } var response = new InstantiationResponse(); - response.setAffectedAutomationComposition( - automationCompositionProvider.deleteAutomationComposition(name, version).getKey().asIdentifier()); + automationComposition = + automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId()); + response.setInstanceId(automationComposition.getInstanceId()); + response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; } @@ -199,7 +205,7 @@ public class AutomationCompositionInstantiationProvider { automationComposition.setCascadedOrderedState(command.getOrderedState()); supervisionHandler.triggerAutomationCompositionSupervision(automationComposition); - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); var response = new InstantiationResponse(); response.setAffectedAutomationComposition(command.getAutomationCompositionIdentifier()); diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java index 5a24db9af..4247a5b31 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/rest/CommissioningController.java @@ -20,26 +20,16 @@ package org.onap.policy.clamp.acm.runtime.main.rest; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.enums.ParameterIn; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.onap.policy.clamp.acm.runtime.commissioning.CommissioningProvider; +import org.onap.policy.clamp.acm.runtime.main.rest.gen.AutomationCompositionDefinitionApi; import org.onap.policy.clamp.acm.runtime.main.web.AbstractRestController; import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplates; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** @@ -59,20 +49,11 @@ public class CommissioningController extends AbstractRestController implements A * @return a response */ @Override - // @formatter:off - @PostMapping(value = "/commission", - consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}, - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - // @formatter:on - public ResponseEntity<CommissioningResponse> createCompositionDefinitions( - @Parameter( - description = "Entity Body of Automation Composition", - required = true) @RequestBody ToscaServiceTemplate body, - @RequestHeader(name = REQUEST_ID_NAME, required = false) @Parameter( - description = REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + public ResponseEntity<CommissioningResponse> createCompositionDefinitions(ToscaServiceTemplate body, + UUID requestId) { var response = provider.createAutomationCompositionDefinitions(body); - return ResponseEntity.created(createUri("/commission/" + response.getCompositionId())).body(response); + return ResponseEntity.created(createUri("/compositions/" + response.getCompositionId())).body(response); } /** @@ -83,18 +64,7 @@ public class CommissioningController extends AbstractRestController implements A * @return a response */ @Override - // @formatter:off - @DeleteMapping(value = "/commission/{compositionId}", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - // @formatter:on - public ResponseEntity<CommissioningResponse> deleteCompositionDefinition( - @Parameter( - in = ParameterIn.PATH, - description = "The UUID of the automation composition definition to delete", - required = true) @PathVariable("compositionId") UUID compositionId, - @RequestHeader(name = REQUEST_ID_NAME, required = false) @Parameter( - description = REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - + public ResponseEntity<CommissioningResponse> deleteCompositionDefinition(UUID compositionId, UUID requestId) { return ResponseEntity.ok().body(provider.deleteAutomationCompositionDefinition(compositionId)); } @@ -108,57 +78,19 @@ public class CommissioningController extends AbstractRestController implements A * @throws PfModelException on errors getting details of all or specific automation composition definitions */ @Override - // @formatter:off - @GetMapping(value = "/commission", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - // @formatter:on - public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions( - - @Parameter(description = "Automation composition definition name", required = false) @RequestParam( - value = "name", - required = false) String name, - @Parameter(description = "Automation composition definition version", required = false) @RequestParam( - value = "version", - required = false) String version, - @RequestHeader(name = REQUEST_ID_NAME, required = false) @Parameter( - description = REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - + public ResponseEntity<ToscaServiceTemplates> queryCompositionDefinitions(String name, String version, + UUID requestId) { return ResponseEntity.ok().body(provider.getAutomationCompositionDefinitions(name, version)); } - // @formatter:off @Override - @GetMapping(value = "/commission/{compositionId}", - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - // @formatter:on - public ResponseEntity<ToscaServiceTemplate> getCompositionDefinition( - @Parameter( - in = ParameterIn.PATH, - description = "The UUID of the automation composition definition to get", - required = true) @PathVariable("compositionId") UUID compositionId, - @RequestHeader(name = REQUEST_ID_NAME, required = false) @Parameter( - description = REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { - + public ResponseEntity<ToscaServiceTemplate> getCompositionDefinition(UUID compositionId, UUID requestId) { return ResponseEntity.ok().body(provider.getAutomationCompositionDefinitions(compositionId)); } - // @formatter:off @Override - @PutMapping(value = "/commission/{compositionId}", - consumes = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}, - produces = {MediaType.APPLICATION_JSON_VALUE, APPLICATION_YAML}) - // @formatter:on - public ResponseEntity<CommissioningResponse> updateCompositionDefinition( - @Parameter( - in = ParameterIn.PATH, - description = "The UUID of the automation composition definition to update", - required = true) @PathVariable("compositionId") UUID compositionId, - @Parameter( - in = ParameterIn.DEFAULT, - description = "Serialised instance of.", - required = true) @RequestBody ToscaServiceTemplate body, - @RequestHeader(name = REQUEST_ID_NAME, required = false) @Parameter( - description = REQUEST_ID_PARAM_DESCRIPTION) UUID requestId) { + public ResponseEntity<CommissioningResponse> updateCompositionDefinition(UUID compositionId, + ToscaServiceTemplate body, UUID requestId) { return ResponseEntity.ok().body(provider.updateCompositionDefinition(compositionId, body)); } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java index b5d7645da..de67360f8 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java @@ -235,7 +235,7 @@ public class SupervisionHandler { automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet()); updated |= setPrimed(automationComposition.get()); if (updated) { - automationCompositionProvider.saveAutomationComposition(automationComposition.get()); + automationCompositionProvider.updateAutomationComposition(automationComposition.get()); } } else { LOGGER.warn("AutomationComposition not found in database {}", diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java index e2f8b6777..129569b6b 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java @@ -242,7 +242,7 @@ public class SupervisionScanner { automationComposition.getState(), automationComposition.getOrderedState()); automationComposition.setState(automationComposition.getOrderedState().asState()); - automationCompositionProvider.saveAutomationComposition(automationComposition); + automationCompositionProvider.updateAutomationComposition(automationComposition); // Clear missed report counter on automation composition clearFaultAndCounter(automationComposition); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java index 85f21930e..792cb4a75 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProviderTest.java @@ -22,6 +22,7 @@ package org.onap.policy.clamp.acm.runtime.commissioning; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -31,11 +32,13 @@ import java.util.List; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; +import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; +import org.onap.policy.clamp.models.acm.concepts.Participant; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; -import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; class CommissioningProviderTest { @@ -46,7 +49,7 @@ class CommissioningProviderTest { * @throws Exception . */ @Test - void testGetAutomationCompositionDefinitions() throws Exception { + void testGetAutomationCompositionDefinitions() { var acProvider = mock(AutomationCompositionProvider.class); var participantProvider = mock(ParticipantProvider.class); var acDefinitionProvider = mock(AcDefinitionProvider.class); @@ -68,21 +71,27 @@ class CommissioningProviderTest { * @throws Exception . */ @Test - void testCreateAutomationCompositionDefinitions() throws Exception { + void testCreateAutomationCompositionDefinitions() { var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); + serviceTemplate.setName("Name"); + serviceTemplate.setVersion("1.0.0"); var acmDefinition = new AutomationCompositionDefinition(); acmDefinition.setCompositionId(UUID.randomUUID()); acmDefinition.setServiceTemplate(serviceTemplate); var acDefinitionProvider = mock(AcDefinitionProvider.class); when(acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate)).thenReturn(acmDefinition); - // Response should return the number of node templates present in the service template - var acProvider = mock(AutomationCompositionProvider.class); var participantProvider = mock(ParticipantProvider.class); - var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, participantProvider); - List<ToscaConceptIdentifier> affectedDefinitions = provider + when(participantProvider.getParticipants()).thenReturn(List.of(new Participant())); + var acProvider = mock(AutomationCompositionProvider.class); + var supervisionHandler = mock(SupervisionHandler.class); + var provider = + new CommissioningProvider(acDefinitionProvider, acProvider, supervisionHandler, participantProvider); + var affectedDefinitions = provider .createAutomationCompositionDefinitions(serviceTemplate).getAffectedAutomationCompositionDefinitions(); verify(acDefinitionProvider).createAutomationCompositionDefinition(serviceTemplate); + verify(supervisionHandler).handleSendCommissionMessage(serviceTemplate.getName(), serviceTemplate.getVersion()); + // Response should return the number of node templates present in the service template assertThat(affectedDefinitions).hasSize(7); } @@ -92,18 +101,54 @@ class CommissioningProviderTest { * */ @Test - void testGetToscaServiceTemplateList() throws Exception { + void testGetToscaServiceTemplateList() { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acProvider = mock(AutomationCompositionProvider.class); var participantProvider = mock(ParticipantProvider.class); var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, participantProvider); - ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); + var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); when(acDefinitionProvider.getServiceTemplateList(null, null)).thenReturn(List.of(serviceTemplate)); var returnedServiceTemplate = provider.getAutomationCompositionDefinitions(null, null); assertThat(returnedServiceTemplate).isNotNull(); assertThat(returnedServiceTemplate.getServiceTemplates()).isNotEmpty(); } + + @Test + void testDeletecDefinitionDabRequest() { + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var acProvider = mock(AutomationCompositionProvider.class); + var participantProvider = mock(ParticipantProvider.class); + + var compositionId = UUID.randomUUID(); + when(acProvider.getAcInstancesByCompositionId(compositionId)).thenReturn(List.of(new AutomationComposition())); + + var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, participantProvider); + + assertThatThrownBy(() -> provider.deleteAutomationCompositionDefinition(compositionId)) + .hasMessageMatching("Delete instances, to commission automation composition definitions"); + } + + @Test + void testDeleteAutomationCompositionDefinition() { + var participantProvider = mock(ParticipantProvider.class); + when(participantProvider.getParticipants()).thenReturn(List.of(new Participant())); + + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var compositionId = UUID.randomUUID(); + var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); + when(acDefinitionProvider.deleteAcDefintion(compositionId)).thenReturn(serviceTemplate); + + var acProvider = mock(AutomationCompositionProvider.class); + var supervisionHandler = mock(SupervisionHandler.class); + var provider = + new CommissioningProvider(acDefinitionProvider, acProvider, supervisionHandler, participantProvider); + + provider.deleteAutomationCompositionDefinition(compositionId); + + verify(supervisionHandler).handleSendDeCommissionMessage(); + verify(acDefinitionProvider).deleteAcDefintion(compositionId); + } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java index 8066df434..d1c26e002 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/commissioning/rest/CommissioningControllerTest.java @@ -60,7 +60,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; @Execution(ExecutionMode.SAME_THREAD) class CommissioningControllerTest extends CommonRestController { - private static final String COMMISSIONING_ENDPOINT = "commission"; + private static final String COMMISSIONING_ENDPOINT = "compositions"; private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); private UUID compositionId; diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java index 864179844..115adcb50 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java @@ -45,6 +45,7 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvide import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate; @@ -66,14 +67,13 @@ class AutomationCompositionInstantiationProviderTest { private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command"; private static final String AC_ELEMENT_NAME_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n" - + " \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n" - + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n" - + " \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\"" - + " INVALID, Not found\n"; - private static final String AC_DEFINITION_NOT_FOUND = - "\"AutomationComposition\" INVALID, item has status INVALID\n" - + " item \"ServiceTemplate\" value \"\" INVALID," - + " Commissioned automation composition definition not found\n"; + + " \"entry PMSHInstance0AcElementNotFound\" INVALID, item has status INVALID\n" + + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n" + + " \"entry org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement\"" + + " INVALID, Not found\n"; + private static final String AC_DEFINITION_NOT_FOUND = "\"AutomationComposition\" INVALID, item has status INVALID\n" + + " item \"ServiceTemplate\" value \"\" INVALID," + + " Commissioned automation composition definition not found\n"; private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); @@ -101,12 +101,13 @@ class AutomationCompositionInstantiationProviderTest { var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); automationCompositionCreate.setCompositionId(compositionId); - when(acProvider.saveAutomationComposition(automationCompositionCreate)).thenReturn(automationCompositionCreate); + when(acProvider.createAutomationComposition(automationCompositionCreate)) + .thenReturn(automationCompositionCreate); var instantiationResponse = instantiationProvider.createAutomationComposition(automationCompositionCreate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate); - verify(acProvider).saveAutomationComposition(automationCompositionCreate); + verify(acProvider).createAutomationComposition(automationCompositionCreate); when(acProvider.getAutomationCompositions(automationCompositionCreate.getName(), automationCompositionCreate.getVersion())).thenReturn(List.of(automationCompositionCreate)); @@ -123,14 +124,12 @@ class AutomationCompositionInstantiationProviderTest { instantiationResponse = instantiationProvider.updateAutomationComposition(automationCompositionUpdate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionUpdate); - verify(acProvider).saveAutomationComposition(automationCompositionUpdate); + verify(acProvider).updateAutomationComposition(automationCompositionUpdate); when(acProvider.findAutomationComposition(automationCompositionUpdate.getKey().asIdentifier())) .thenReturn(Optional.of(automationCompositionUpdate)); - when(acProvider.findAutomationComposition(automationCompositionUpdate.getName(), - automationCompositionUpdate.getVersion())).thenReturn(Optional.of(automationCompositionUpdate)); - when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getName(), - automationCompositionUpdate.getVersion())).thenReturn(automationCompositionUpdate); + when(acProvider.deleteAutomationComposition(automationCompositionUpdate.getInstanceId())) + .thenReturn(automationCompositionUpdate); var instantiationCommand = InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud"); @@ -146,8 +145,7 @@ class AutomationCompositionInstantiationProviderTest { instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getName(), automationCompositionCreate.getVersion()); - verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getName(), - automationCompositionCreate.getVersion()); + verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getInstanceId()); } @Test @@ -172,11 +170,13 @@ class AutomationCompositionInstantiationProviderTest { } } automationComposition.setState(AutomationCompositionState.UNINITIALISED); + automationComposition.setInstanceId(UUID.randomUUID()); - when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion())) - .thenReturn(Optional.of(automationComposition)); - when(acProvider.deleteAutomationComposition(automationComposition.getName(), - automationComposition.getVersion())).thenReturn(automationComposition); + when(acProvider.findAutomationComposition( + new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()))) + .thenReturn(Optional.of(automationComposition)); + when(acProvider.deleteAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); instantiationProvider.deleteAutomationComposition(automationComposition.getName(), automationComposition.getVersion()); @@ -193,8 +193,8 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, supervisionHandler, participantProvider, acDefinitionProvider); - when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion())) - .thenReturn(Optional.of(automationComposition)); + var key = new ToscaConceptIdentifier(automationComposition.getName(), automationComposition.getVersion()); + when(acProvider.findAutomationComposition(key)).thenReturn(Optional.of(automationComposition)); assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(), automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state)); @@ -209,9 +209,11 @@ class AutomationCompositionInstantiationProviderTest { var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates"); automationCompositionCreate.setCompositionId(compositionId); + automationCompositionCreate.setInstanceId(UUID.randomUUID()); var acProvider = mock(AutomationCompositionProvider.class); - when(acProvider.saveAutomationComposition(automationCompositionCreate)).thenReturn(automationCompositionCreate); + when(acProvider.createAutomationComposition(automationCompositionCreate)) + .thenReturn(automationCompositionCreate); var participantProvider = Mockito.mock(ParticipantProvider.class); var supervisionHandler = mock(SupervisionHandler.class); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java index d3777620b..9c364b2db 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java @@ -30,6 +30,7 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC import java.util.UUID; import javax.ws.rs.client.Entity; import javax.ws.rs.core.Response; +import org.junit.Ignore; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -113,8 +114,10 @@ class InstantiationControllerTest extends CommonRestController { deleteEntryInDB(); } + @Ignore @Test void testSwagger() { + // TODO: Reimplement using springdoc when Impelmentation endpoint is refactored super.testSwagger(INSTANTIATION_ENDPOINT); } @@ -163,6 +166,7 @@ class InstantiationControllerTest extends CommonRestController { assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); var instResponse = resp.readEntity(InstantiationResponse.class); InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc); + automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId()); var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions( automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion()); @@ -224,12 +228,13 @@ class InstantiationControllerTest extends CommonRestController { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update"); automationCompositionCreate.setCompositionId(compositionId); - instantiationProvider.createAutomationComposition(automationCompositionCreate); + var response = instantiationProvider.createAutomationComposition(automationCompositionCreate); var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update"); automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(response.getInstanceId()); var resp = invocationBuilder.put(Entity.json(automationComposition)); assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus()); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/rest/ActuatorControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/rest/ActuatorControllerTest.java index 6a2b102fc..c1f7362e1 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/rest/ActuatorControllerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/rest/ActuatorControllerTest.java @@ -44,6 +44,7 @@ class ActuatorControllerTest extends CommonRestController { private static final String HEALTH_ENDPOINT = "health"; private static final String METRICS_ENDPOINT = "metrics"; private static final String PROMETHEUS_ENDPOINT = "prometheus"; + private static final String SWAGGER_ENDPOINT = "v3/api-docs"; @LocalServerPort private int randomServerPort; @@ -69,6 +70,11 @@ class ActuatorControllerTest extends CommonRestController { } @Test + void testGetSwagger_Unauthorized() { + assertUnauthorizedActGet(SWAGGER_ENDPOINT); + } + + @Test void testGetHealth() { Invocation.Builder invocationBuilder = super.sendActRequest(HEALTH_ENDPOINT); Response rawresp = invocationBuilder.buildGet().invoke(); @@ -88,4 +94,11 @@ class ActuatorControllerTest extends CommonRestController { Response rawresp = invocationBuilder.buildGet().invoke(); assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); } + + @Test + void testGetSwagger() { + Invocation.Builder invocationBuilder = super.sendActRequest(SWAGGER_ENDPOINT); + Response rawresp = invocationBuilder.buildGet().invoke(); + assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus()); + } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java index e01f76bb8..3a707cd52 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java @@ -131,6 +131,50 @@ class SupervisionHandlerTest { } @Test + void testAcTransitioning() { + var handler = createSupervisionHandlerForTrigger(); + var automationComposition = + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); + automationComposition.setOrderedState(AutomationCompositionOrderedState.UNINITIALISED); + automationComposition.setState(AutomationCompositionState.PASSIVE2UNINITIALISED); + + assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition)) + .hasMessageMatching("Automation composition is already in state " + + "PASSIVE2UNINITIALISED and transitioning to state UNINITIALISED"); + + automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE); + automationComposition.setState(AutomationCompositionState.UNINITIALISED2PASSIVE); + assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition)) + .hasMessageMatching("Automation composition is already in state " + + "UNINITIALISED2PASSIVE and transitioning to state PASSIVE"); + + automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING); + automationComposition.setState(AutomationCompositionState.PASSIVE2RUNNING); + assertThatThrownBy(() -> handler.triggerAutomationCompositionSupervision(automationComposition)) + .hasMessageMatching("Automation composition is already in state " + + "PASSIVE2RUNNING and transitioning to state RUNNING"); + } + + @Test + void testAcRunningToPassive() throws AutomationCompositionException { + var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), + mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), + mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), + automationCompositionStateChangePublisher, mock(ParticipantUpdatePublisher.class), + AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + + var automationComposition = + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); + automationComposition.setOrderedState(AutomationCompositionOrderedState.PASSIVE); + automationComposition.setState(AutomationCompositionState.RUNNING); + + handler.triggerAutomationCompositionSupervision(automationComposition); + + verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(1)); + } + + @Test void testAcRunningToRunning() { var handler = createSupervisionHandlerForTrigger(); @@ -158,12 +202,32 @@ class SupervisionHandlerTest { } @Test + void testAcPassiveToRunning() throws AutomationCompositionException { + var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), + mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), + mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), + automationCompositionStateChangePublisher, mock(ParticipantUpdatePublisher.class), + AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + + var automationComposition = + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); + automationComposition.setOrderedState(AutomationCompositionOrderedState.RUNNING); + automationComposition.setState(AutomationCompositionState.PASSIVE); + + handler.triggerAutomationCompositionSupervision(automationComposition); + + verify(automationCompositionStateChangePublisher).send(any(AutomationComposition.class), eq(0)); + } + + @Test void testHandleAutomationCompositionStateChangeAckMessage() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); var automationCompositionAckMessage = new AutomationCompositionAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK); automationCompositionAckMessage.setAutomationCompositionResultMap(Map.of()); @@ -171,7 +235,7 @@ class SupervisionHandlerTest { handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -185,12 +249,13 @@ class SupervisionHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -211,8 +276,9 @@ class SupervisionHandlerTest { var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, mock(ParticipantRegisterAckPublisher.class), participantDeregisterAckPublisher, - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleParticipantMessage(participantDeregisterMessage); @@ -235,8 +301,9 @@ class SupervisionHandlerTest { var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleParticipantMessage(participantRegisterMessage); @@ -262,8 +329,9 @@ class SupervisionHandlerTest { participantUpdateAckMessage.setState(ParticipantState.PASSIVE); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleParticipantMessage(participantUpdateAckMessage); @@ -281,8 +349,9 @@ class SupervisionHandlerTest { var participantProvider = mock(ParticipantProvider.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleParticipantMessage(participantStatusMessage); verify(participantProvider).saveParticipant(any()); @@ -291,11 +360,11 @@ class SupervisionHandlerTest { @Test void testHandleSendCommissionMessage() throws PfModelException { var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class); - var handler = - createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class), - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), participantUpdatePublisher, - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), + mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), + mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), + mock(AutomationCompositionStateChangePublisher.class), participantUpdatePublisher, + AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); handler.handleSendCommissionMessage(participantId.getName(), participantId.getVersion()); verify(participantUpdatePublisher).sendComissioningBroadcast(participantId.getName(), @@ -305,11 +374,11 @@ class SupervisionHandlerTest { @Test void testHandleSendDeCommissionMessage() throws PfModelException { var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class); - var handler = - createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class), - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), participantUpdatePublisher, - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), + mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), + mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), + mock(AutomationCompositionStateChangePublisher.class), participantUpdatePublisher, + AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); handler.handleSendDeCommissionMessage(); verify(participantUpdatePublisher).sendDecomisioning(); @@ -319,6 +388,7 @@ class SupervisionHandlerTest { ParticipantProvider participantProvider, ParticipantRegisterAckPublisher participantRegisterAckPublisher, ParticipantDeregisterAckPublisher participantDeregisterAckPublisher, AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher, + AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher, ParticipantUpdatePublisher participantUpdatePublisher, AutomationCompositionOrderedState orderedState, AutomationCompositionState state) { var automationComposition = @@ -327,18 +397,17 @@ class SupervisionHandlerTest { automationComposition.setOrderedState(orderedState); automationComposition.setState(state); when(automationCompositionProvider.findAutomationComposition(identifier)) - .thenReturn(Optional.of(automationComposition)); + .thenReturn(Optional.of(automationComposition)); var acDefinitionProvider = Mockito.mock(AcDefinitionProvider.class); when(acDefinitionProvider.getServiceTemplateList(any(), any())).thenReturn(List .of(Objects.requireNonNull(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)))); - - var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId())) + .thenReturn(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); return new SupervisionHandler(automationCompositionProvider, participantProvider, acDefinitionProvider, automationCompositionUpdatePublisher, automationCompositionStateChangePublisher, participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher); - } private SupervisionHandler createSupervisionHandlerForTrigger() { @@ -346,7 +415,6 @@ class SupervisionHandlerTest { mock(AcDefinitionProvider.class), mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), mock(ParticipantUpdatePublisher.class)); - } private SupervisionHandler createSupervisionHandlerForTrigger( diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java index 03a0ec59e..1455e9246 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java @@ -96,7 +96,7 @@ class SupervisionScannerTest { participantStatusReqPublisher, participantUpdatePublisher, acRuntimeParameterGroup); supervisionScanner.run(false); - verify(automationCompositionProvider, times(0)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -120,7 +120,7 @@ class SupervisionScannerTest { participantStatusReqPublisher, participantUpdatePublisher, acRuntimeParameterGroup); supervisionScanner.run(false); - verify(automationCompositionProvider, times(1)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(1)).updateAutomationComposition(any(AutomationComposition.class)); } @Test @@ -148,7 +148,7 @@ class SupervisionScannerTest { supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier()); supervisionScanner.run(true); - verify(automationCompositionProvider, times(0)).saveAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class)); } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java index 11a060029..2cfe7eb3c 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java @@ -21,123 +21,87 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; -import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import java.time.Instant; import java.util.Collections; import java.util.List; import java.util.UUID; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; -import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionAck; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregisterAck; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegisterAck; +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.clamp.models.acm.persistence.provider.AcDefinitionProvider; -import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; -import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; import org.onap.policy.common.endpoints.event.comm.TopicSink; -import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; -class SupervisionMessagesTest extends CommonRestController { +class SupervisionMessagesTest { private static final String NOT_ACTIVE = "Not Active!"; - private static final Object lockit = new Object(); private static final CommInfrastructure INFRA = CommInfrastructure.NOOP; private static final String TOPIC = "my-topic"; - private static SupervisionHandler supervisionHandler; - - /** - * setup Db Provider Parameters. - * - * @throws PfModelException if an error occurs - */ - @BeforeAll - public static void setupDbProviderParameters() throws PfModelException { - var acProvider = mock(AutomationCompositionProvider.class); - var participantProvider = mock(ParticipantProvider.class); - var acDefinitionProvider = Mockito.mock(AcDefinitionProvider.class); - var automationCompositionUpdatePublisher = Mockito.mock(AutomationCompositionUpdatePublisher.class); - var automationCompositionStateChangePublisher = Mockito.mock(AutomationCompositionStateChangePublisher.class); - var participantRegisterAckPublisher = Mockito.mock(ParticipantRegisterAckPublisher.class); - var participantDeregisterAckPublisher = Mockito.mock(ParticipantDeregisterAckPublisher.class); - var participantUpdatePublisher = Mockito.mock(ParticipantUpdatePublisher.class); - supervisionHandler = new SupervisionHandler(acProvider, participantProvider, - acDefinitionProvider, automationCompositionUpdatePublisher, automationCompositionStateChangePublisher, - participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher); - } - - @Test - void testSendParticipantRegisterAck() throws Exception { - final ParticipantRegisterAck participantRegisterAckMsg = new ParticipantRegisterAck(); - participantRegisterAckMsg.setMessage("ParticipantRegisterAck message"); - participantRegisterAckMsg.setResponseTo(UUID.randomUUID()); - participantRegisterAckMsg.setResult(true); - - synchronized (lockit) { - ParticipantRegisterAckPublisher acRegisterAckPublisher = new ParticipantRegisterAckPublisher(); - acRegisterAckPublisher.active(List.of(Mockito.mock(TopicSink.class))); - assertThatCode(() -> acRegisterAckPublisher.send(participantRegisterAckMsg)).doesNotThrowAnyException(); - } - } - - @Test - void testReceiveParticipantDeregister() throws Exception { - final ParticipantDeregister participantDeregisterMsg = new ParticipantDeregister(); - participantDeregisterMsg.setParticipantId(getParticipantId()); - participantDeregisterMsg.setTimestamp(Instant.now()); - participantDeregisterMsg.setParticipantType(getParticipantType()); - - synchronized (lockit) { - ParticipantDeregisterListener participantDeregisterListener = - new ParticipantDeregisterListener(supervisionHandler); - assertThatCode( - () -> participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg)) - .doesNotThrowAnyException(); - } - } - - @Test - void testSendParticipantDeregisterAck() throws Exception { - final ParticipantDeregisterAck participantDeregisterAckMsg = new ParticipantDeregisterAck(); - participantDeregisterAckMsg.setMessage("ParticipantDeregisterAck message"); - participantDeregisterAckMsg.setResponseTo(UUID.randomUUID()); - participantDeregisterAckMsg.setResult(true); - - synchronized (lockit) { - ParticipantDeregisterAckPublisher acDeregisterAckPublisher = new ParticipantDeregisterAckPublisher(); - acDeregisterAckPublisher.active(Collections.singletonList(Mockito.mock(TopicSink.class))); - assertThatCode(() -> acDeregisterAckPublisher.send(participantDeregisterAckMsg)).doesNotThrowAnyException(); - } - } - - @Test - void testReceiveParticipantUpdateAckMessage() throws Exception { - final ParticipantUpdateAck participantUpdateAckMsg = new ParticipantUpdateAck(); - participantUpdateAckMsg.setMessage("ParticipantUpdateAck message"); - participantUpdateAckMsg.setResponseTo(UUID.randomUUID()); - participantUpdateAckMsg.setResult(true); - participantUpdateAckMsg.setParticipantId(getParticipantId()); - participantUpdateAckMsg.setParticipantType(getParticipantType()); - - synchronized (lockit) { - ParticipantUpdateAckListener participantUpdateAckListener = - new ParticipantUpdateAckListener(supervisionHandler); - assertThatCode(() -> participantUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, participantUpdateAckMsg)) - .doesNotThrowAnyException(); - } + + @Test + void testSendParticipantRegisterAck() { + var acRegisterAckPublisher = new ParticipantRegisterAckPublisher(); + var topicSink = mock(TopicSink.class); + acRegisterAckPublisher.active(List.of(topicSink)); + acRegisterAckPublisher.send(new ParticipantRegisterAck()); + verify(topicSink).send(anyString()); + acRegisterAckPublisher.stop(); + } + + @Test + void testSendParticipantRegisterAckNoActive() { + var acRegisterAckPublisher = new ParticipantRegisterAckPublisher(); + assertThatThrownBy(() -> acRegisterAckPublisher.send(new ParticipantRegisterAck())) + .hasMessageMatching(NOT_ACTIVE); + } + + @Test + void testReceiveParticipantDeregister() { + final var participantDeregisterMsg = new ParticipantDeregister(); + var supervisionHandler = mock(SupervisionHandler.class); + var participantDeregisterListener = new ParticipantDeregisterListener(supervisionHandler); + participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg); + verify(supervisionHandler).handleParticipantMessage(participantDeregisterMsg); + } + + @Test + void testSendParticipantDeregisterAck() { + var acDeregisterAckPublisher = new ParticipantDeregisterAckPublisher(); + var topicSink = mock(TopicSink.class); + acDeregisterAckPublisher.active(Collections.singletonList(topicSink)); + acDeregisterAckPublisher.send(new ParticipantDeregisterAck()); + verify(topicSink).send(anyString()); + acDeregisterAckPublisher.stop(); + } + + void testSendParticipantDeregisterAckNoActive() { + var acDeregisterAckPublisher = new ParticipantDeregisterAckPublisher(); + assertThatThrownBy(() -> acDeregisterAckPublisher.send(new ParticipantDeregisterAck())) + .hasMessageMatching(NOT_ACTIVE); + } + + @Test + void testReceiveParticipantUpdateAckMessage() { + final var participantUpdateAckMsg = new ParticipantUpdateAck(); + var supervisionHandler = mock(SupervisionHandler.class); + var participantUpdateAckListener = new ParticipantUpdateAckListener(supervisionHandler); + participantUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, participantUpdateAckMsg); + verify(supervisionHandler).handleParticipantMessage(participantUpdateAckMsg); } @Test @@ -146,6 +110,14 @@ class SupervisionMessagesTest extends CommonRestController { assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0)).hasMessage(NOT_ACTIVE); } + private AutomationComposition getAutomationComposition() { + var automationComposition = new AutomationComposition(); + automationComposition.setName("NAME"); + automationComposition.setVersion("0.0.1"); + automationComposition.setState(AutomationCompositionState.UNINITIALISED); + return automationComposition; + } + @Test void testSendAutomationCompositionStateChangePublisher() { var publisher = new AutomationCompositionStateChangePublisher(); @@ -153,6 +125,7 @@ class SupervisionMessagesTest extends CommonRestController { publisher.active(List.of(topicSink)); publisher.send(getAutomationComposition(), 0); verify(topicSink).send(anyString()); + publisher.stop(); } @Test @@ -191,6 +164,14 @@ class SupervisionMessagesTest extends CommonRestController { verify(topicSink).send(anyString()); } + private ToscaConceptIdentifier getParticipantId() { + return new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0"); + } + + private ToscaConceptIdentifier getParticipantType() { + return new ToscaConceptIdentifier("org.onap.policy.acm.PolicyAutomationCompositionParticipant", "2.3.1"); + } + @Test void testParticipantDeregisterAckPublisher() { var publisher = new ParticipantDeregisterAckPublisher(); @@ -200,19 +181,42 @@ class SupervisionMessagesTest extends CommonRestController { verify(topicSink).send(anyString()); } - private AutomationComposition getAutomationComposition() { - var automationComposition = new AutomationComposition(); - automationComposition.setName("NAME"); - automationComposition.setVersion("0.0.1"); - automationComposition.setState(AutomationCompositionState.UNINITIALISED); - return automationComposition; + @Test + void testParticipantRegisterListener() { + final var participantRegister = new ParticipantRegister(); + var supervisionHandler = mock(SupervisionHandler.class); + var participantRegisterListener = new ParticipantRegisterListener(supervisionHandler); + participantRegisterListener.onTopicEvent(INFRA, TOPIC, null, participantRegister); + verify(supervisionHandler).handleParticipantMessage(participantRegister); } - private ToscaConceptIdentifier getParticipantId() { - return new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0"); + @Test + void testParticipantStatusListener() { + final var participantStatus = new ParticipantStatus(); + var supervisionHandler = mock(SupervisionHandler.class); + var participantStatusListener = new ParticipantStatusListener(supervisionHandler); + participantStatusListener.onTopicEvent(INFRA, TOPIC, null, participantStatus); + verify(supervisionHandler).handleParticipantMessage(participantStatus); } - private ToscaConceptIdentifier getParticipantType() { - return new ToscaConceptIdentifier("org.onap.policy.acm.PolicyAutomationCompositionParticipant", "2.3.1"); + @Test + void testAutomationCompositionUpdateAckListener() { + final var automationCompositionAck = + new AutomationCompositionAck(ParticipantMessageType.AUTOMATION_COMPOSITION_UPDATE); + var supervisionHandler = mock(SupervisionHandler.class); + var acUpdateAckListener = new AutomationCompositionUpdateAckListener(supervisionHandler); + acUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck); + verify(supervisionHandler).handleAutomationCompositionUpdateAckMessage(automationCompositionAck); + } + + @Test + void testAutomationCompositionStateChangeAckListener() { + final var automationCompositionAck = + new AutomationCompositionAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATE_CHANGE); + var supervisionHandler = mock(SupervisionHandler.class); + var acStateChangeAckListener = new AutomationCompositionStateChangeAckListener(supervisionHandler); + acStateChangeAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck); + verify(supervisionHandler).handleAutomationCompositionStateChangeAckMessage(automationCompositionAck); } + } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/rest/CommonRestController.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/rest/CommonRestController.java index eb2abd06d..788fdfbcf 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/rest/CommonRestController.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/util/rest/CommonRestController.java @@ -54,7 +54,7 @@ public class CommonRestController { * @param endpoint the endpoint of interest */ protected void testSwagger(final String endpoint) { - final Invocation.Builder invocationBuilder = sendActRequest("v2/api-docs"); + final Invocation.Builder invocationBuilder = sendActRequest("v3/api-docs"); final String resp = invocationBuilder.get(String.class); assertThat(resp).contains(endpoint); diff --git a/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics.json b/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics.json deleted file mode 100644 index c63c3ea1d..000000000 --- a/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "acElementStatistics":[ - { - "participantId":{ - "name":"name1", - "version":"1.001" - }, - "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", - "timeStamp": "2021-01-10T13:45:00.000Z", - "state": "UNINITIALISED", - "acElementUptime":250 - }, - { - "participantId":{ - "name":"name1", - "version":"1.001" - }, - "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", - "timeStamp": "2021-01-10T15:45:00.000Z", - "state": "UNINITIALISED", - "acElementUptime":450 - }, - { - "participantId":{ - "name":"name2", - "version":"1.001" - }, - "id": "709c62b3-8918-41b9-a747-d21eb79c6c21", - "timeStamp": "2021-01-10T14:25:00.000Z", - "state": "UNINITIALISED", - "acElementUptime":330 - }, - { - "participantId":{ - "name":"name2", - "version":"1.001" - }, - "id": "709c62b3-8918-41b9-a747-d21eb79c6c21", - "timeStamp": "2021-01-10T16:35:00.000Z", - "state": "UNINITIALISED", - "acElementUptime":650 - } - ] -}
\ No newline at end of file diff --git a/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics_Invalid.json b/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics_Invalid.json deleted file mode 100644 index 59af47828..000000000 --- a/runtime-acm/src/test/resources/rest/monitoring/TestAcElementStatistics_Invalid.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "acElementStatisticsList":[ - { - "participantId":{ - "name":"name1", - "version":"1.001" - }, - "id": "709c62b3-8918-41b9-a747-d21eb79c6c20", - "state": "UNINITIALISED", - "acElementUptime":250 - } - ] -}
\ No newline at end of file diff --git a/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics.json b/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics.json deleted file mode 100644 index acd88e24b..000000000 --- a/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "statisticsList":[ - { - "participantId":{ - "name":"name1", - "version":"1.001" - }, - "timeStamp": "2021-01-10T13:45:00.000Z", - "state": "PASSIVE", - "healthStatus": "HEALTHY", - "eventCount":250, - "lastExecutionTime":100, - "averageExecutionTime":90, - "upTime":1000, - "lastStart":3000 - }, - { - "participantId":{ - "name":"name1", - "version":"1.001" - }, - "timeStamp": "2021-01-10T15:45:00.000Z", - "state": "PASSIVE", - "healthStatus": "HEALTHY", - "eventCount":262, - "lastExecutionTime":100, - "averageExecutionTime":90, - "upTime":2000, - "lastStart":3000 - }, - { - "participantId":{ - "name":"name2", - "version":"1.001" - }, - "timeStamp": "2021-01-27T14:25:00.000Z", - "state": "PASSIVE", - "healthStatus": "HEALTHY", - "eventCount":245, - "lastExecutionTime":1020, - "averageExecutionTime":85, - "upTime":1050, - "lastStart":3100 - } - ] -}
\ No newline at end of file diff --git a/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json b/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json deleted file mode 100644 index 7281822f0..000000000 --- a/runtime-acm/src/test/resources/rest/monitoring/TestParticipantStatistics_Invalid.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "participantStatisticsList":[ - { - "participantId":{ - "name":"name3", - "version":"1.001" - }, - "state": "PASSIVE", - "eventCount":250, - "lastExecutionTime":100, - "averageExecutionTime":90, - "upTime":1000, - "lastStart":3000 - } - ] -}
\ No newline at end of file |