2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2021-2022 Nordix Foundation.
 
   4  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
 
   5  * ================================================================================
 
   6  * Licensed under the Apache License, Version 2.0 (the "License");
 
   7  * you may not use this file except in compliance with the License.
 
   8  * You may obtain a copy of the License at
 
  10  *      http://www.apache.org/licenses/LICENSE-2.0
 
  12  * Unless required by applicable law or agreed to in writing, software
 
  13  * distributed under the License is distributed on an "AS IS" BASIS,
 
  14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  15  * See the License for the specific language governing permissions and
 
  16  * limitations under the License.
 
  18  * SPDX-License-Identifier: Apache-2.0
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.policy.clamp.acm.runtime.instantiation.rest;
 
  24 import static org.assertj.core.api.Assertions.assertThat;
 
  25 import static org.junit.jupiter.api.Assertions.assertEquals;
 
  26 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
  27 import static org.junit.jupiter.api.Assertions.assertNull;
 
  28 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
 
  30 import java.util.UUID;
 
  31 import javax.ws.rs.client.Entity;
 
  32 import javax.ws.rs.core.Response;
 
  33 import org.junit.jupiter.api.AfterEach;
 
  34 import org.junit.jupiter.api.BeforeAll;
 
  35 import org.junit.jupiter.api.BeforeEach;
 
  36 import org.junit.jupiter.api.Test;
 
  37 import org.junit.jupiter.api.extension.ExtendWith;
 
  38 import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
 
  39 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
 
  40 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
 
  41 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
 
  42 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
 
  43 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
 
  44 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
 
  45 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
 
  46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationUpdate;
 
  47 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
 
  48 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
 
  49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
 
  50 import org.onap.policy.models.base.PfModelException;
 
  51 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
  52 import org.springframework.beans.factory.annotation.Autowired;
 
  53 import org.springframework.boot.test.context.SpringBootTest;
 
  54 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 
  55 import org.springframework.boot.web.server.LocalServerPort;
 
  56 import org.springframework.test.context.ActiveProfiles;
 
  57 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
  60  * Class to perform unit test of {@link InstantiationController}}.
 
  63 @ExtendWith(SpringExtension.class)
 
  64 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 
  65 @ActiveProfiles("test")
 
  66 class InstantiationControllerTest extends CommonRestController {
 
  68     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
 
  70     private static final String AC_INSTANTIATION_UPDATE_JSON =
 
  71             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
 
  73     private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
 
  75     private static final String INSTANTIATION_ENDPOINT = "compositions/%s/instances";
 
  77     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
 
  78     private UUID compositionId = UUID.randomUUID();
 
  81     private AutomationCompositionRepository automationCompositionRepository;
 
  84     private AcDefinitionProvider acDefinitionProvider;
 
  87     private AutomationCompositionInstantiationProvider instantiationProvider;
 
  90     private ParticipantProvider participantProvider;
 
  93     private int randomServerPort;
 
  96     public static void setUpBeforeClass() {
 
  97         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
 
 101     public void populateDb() {
 
 106     public void setUpPort() {
 
 107         super.setHttpPrefix(randomServerPort);
 
 111     public void cleanDatabase() {
 
 115     private String getInstanceEndPoint() {
 
 116         return String.format(INSTANTIATION_ENDPOINT, compositionId.toString());
 
 119     private String getInstanceEndPoint(UUID instanceId) {
 
 120         return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId;
 
 125         super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}"));
 
 129     void testCreate_Unauthorized() {
 
 130         var automationComposition =
 
 131                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
 
 133         assertUnauthorizedPost(getInstanceEndPoint(), Entity.json(automationComposition));
 
 137     void testQuery_Unauthorized() {
 
 138         assertUnauthorizedGet(getInstanceEndPoint());
 
 142     void testUpdate_Unauthorized() {
 
 143         var automationComposition =
 
 144                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
 
 146         assertUnauthorizedPut(getInstanceEndPoint(), Entity.json(automationComposition));
 
 150     void testDelete_Unauthorized() {
 
 151         assertUnauthorizedDelete(getInstanceEndPoint());
 
 156         var automationCompositionFromRsc =
 
 157                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
 
 158         automationCompositionFromRsc.setCompositionId(compositionId);
 
 160         var invocationBuilder = super.sendRequest(getInstanceEndPoint());
 
 161         var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
 
 162         assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
 
 163         var instResponse = resp.readEntity(InstantiationResponse.class);
 
 164         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
 
 165         automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
 
 167         var automationCompositionFromDb =
 
 168                 instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId());
 
 170         assertNotNull(automationCompositionFromDb);
 
 171         assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
 
 176     void testCreateBadRequest() {
 
 177         var automationCompositionFromRsc = InstantiationUtils
 
 178                 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
 
 179         automationCompositionFromRsc.setCompositionId(compositionId);
 
 181         var invocationBuilder = super.sendRequest(getInstanceEndPoint());
 
 182         var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
 
 183         assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
 
 185         // testing Bad Request: AC already defined
 
 186         resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
 
 187         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
 
 188         var instResponse = resp.readEntity(InstantiationResponse.class);
 
 189         assertNotNull(instResponse.getErrorDetails());
 
 190         assertNull(instResponse.getAffectedAutomationComposition());
 
 194     void testQuery_NoResultWithThisName() {
 
 195         var invocationBuilder = super.sendRequest(getInstanceEndPoint() + "?name=noResultWithThisName");
 
 196         var rawresp = invocationBuilder.buildGet().invoke();
 
 197         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
 
 198         var resp = rawresp.readEntity(AutomationCompositions.class);
 
 199         assertThat(resp.getAutomationCompositionList()).isEmpty();
 
 204         var automationComposition =
 
 205                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
 
 206         automationComposition.setCompositionId(compositionId);
 
 208         instantiationProvider.createAutomationComposition(compositionId, automationComposition);
 
 210         var invocationBuilder =
 
 211                 super.sendRequest(getInstanceEndPoint() + "?name=" + automationComposition.getKey().getName());
 
 212         var rawresp = invocationBuilder.buildGet().invoke();
 
 213         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
 
 214         var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
 
 215         assertNotNull(automationCompositionsQuery);
 
 216         assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
 
 217         assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
 
 222         var automationCompositionCreate =
 
 223                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
 
 224         automationCompositionCreate.setCompositionId(compositionId);
 
 226         var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate);
 
 228         var automationComposition =
 
 229                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
 
 230         automationComposition.setCompositionId(compositionId);
 
 231         automationComposition.setInstanceId(response.getInstanceId());
 
 232         var instantiationUpdate = new InstantiationUpdate();
 
 233         instantiationUpdate.setElements(automationComposition.getElements());
 
 234         var invocationBuilder = super.sendRequest(getInstanceEndPoint(response.getInstanceId()));
 
 235         var resp = invocationBuilder.put(Entity.json(automationComposition));
 
 236         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
 
 238         var instResponse = resp.readEntity(InstantiationResponse.class);
 
 239         InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
 
 241         var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
 
 242                 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
 
 244         assertNotNull(automationCompositionsFromDb);
 
 245         assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
 
 246         assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
 
 251         var automationCompositionFromRsc =
 
 252                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
 
 253         automationCompositionFromRsc.setCompositionId(compositionId);
 
 256                 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
 
 258         var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId()));
 
 259         var resp = invocationBuilder.delete();
 
 260         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
 
 261         instResponse = resp.readEntity(InstantiationResponse.class);
 
 262         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
 
 264         var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
 
 265                 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
 
 266         assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
 
 270     void testDeleteNotFound() {
 
 271         var automationCompositionFromRsc =
 
 272                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
 
 273         automationCompositionFromRsc.setCompositionId(compositionId);
 
 275         instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
 
 277         var invocationBuilder = super.sendRequest(getInstanceEndPoint(UUID.randomUUID()));
 
 278         var resp = invocationBuilder.delete();
 
 279         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
 
 283     void testCommand_NotFound1() {
 
 284         var invocationBuilder = super.sendRequest(getInstanceEndPoint(UUID.randomUUID()));
 
 285         var resp = invocationBuilder.put(Entity.json(new InstantiationUpdate()));
 
 286         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
 
 290     void testCommand_NotFound2() {
 
 292                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
 
 293         acFromRsc.setCompositionId(compositionId);
 
 295         var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc);
 
 297         var command = new InstantiationUpdate();
 
 298         command.setInstantiationCommand(new InstantiationCommand());
 
 299         command.getInstantiationCommand().setOrderedState(null);
 
 301         var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId()));
 
 302         var resp = invocationBuilder.put(Entity.json(command));
 
 303         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
 
 307     void testCommand() throws PfModelException {
 
 308         var automationComposition =
 
 309                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
 
 310         automationComposition.setCompositionId(compositionId);
 
 311         var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition);
 
 313         var participants = CommonTestData.createParticipants();
 
 314         for (var participant : participants) {
 
 315             participantProvider.saveParticipant(participant);
 
 318         var instantiationUpdate = new InstantiationUpdate();
 
 319         var command = InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON);
 
 320         instantiationUpdate.setInstantiationCommand(command);
 
 322         var invocationBuilder = super.sendRequest(getInstanceEndPoint(instResponse.getInstanceId()));
 
 323         var resp = invocationBuilder.put(Entity.json(instantiationUpdate));
 
 324         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
 
 325         instResponse = resp.readEntity(InstantiationResponse.class);
 
 326         InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
 
 328         // check passive state on DB
 
 329         var toscaConceptIdentifier = instResponse.getAffectedAutomationComposition();
 
 330         var automationCompositionsGet = instantiationProvider
 
 331                 .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
 
 332         assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
 
 333         assertEquals(command.getOrderedState(),
 
 334                 automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
 
 337     private synchronized void deleteEntryInDB() {
 
 338         automationCompositionRepository.deleteAll();
 
 339         var list = acDefinitionProvider.findAcDefinition(compositionId);
 
 340         if (!list.isEmpty()) {
 
 341             acDefinitionProvider.deleteAcDefintion(compositionId);
 
 345     private synchronized void createEntryInDB() {
 
 347         var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate);
 
 348         compositionId = acmDefinition.getCompositionId();