2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
20 package org.onap.so.cnfm.lcm.bpmn.flows.tasks;
22 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
23 import static com.github.tomakehurst.wiremock.client.WireMock.get;
24 import static com.github.tomakehurst.wiremock.client.WireMock.notFound;
25 import static com.github.tomakehurst.wiremock.client.WireMock.ok;
26 import static com.github.tomakehurst.wiremock.client.WireMock.okJson;
27 import static com.github.tomakehurst.wiremock.client.WireMock.put;
28 import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
29 import static org.junit.Assert.assertEquals;
30 import static org.junit.Assert.assertFalse;
31 import static org.junit.Assert.assertNotNull;
32 import static org.junit.Assert.assertTrue;
33 import static org.onap.aaiclient.client.aai.AAIVersion.V19;
34 import static org.onap.so.cnfm.lcm.model.utils.AdditionalParamsConstants.CLOUD_OWNER_PARAM_KEY;
35 import static org.onap.so.cnfm.lcm.model.utils.AdditionalParamsConstants.CLOUD_REGION_PARAM_KEY;
36 import static org.onap.so.cnfm.lcm.model.utils.AdditionalParamsConstants.SERVICE_INSTANCE_ID_PARAM_KEY;
37 import static org.onap.so.cnfm.lcm.model.utils.AdditionalParamsConstants.SERVICE_INSTANCE_NAME_PARAM_KEY;
38 import static org.onap.so.cnfm.lcm.model.utils.AdditionalParamsConstants.TENANT_ID_PARAM_KEY;
39 import static org.springframework.http.HttpHeaders.ACCEPT;
40 import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE;
42 import java.io.IOException;
43 import java.nio.file.Files;
44 import java.nio.file.Path;
46 import java.util.Optional;
47 import java.util.UUID;
48 import org.camunda.bpm.engine.history.HistoricProcessInstance;
49 import org.camunda.bpm.engine.history.HistoricVariableInstance;
50 import org.junit.After;
51 import org.junit.Before;
52 import org.junit.Test;
53 import org.onap.aaiclient.client.aai.entities.Results;
54 import org.onap.aaiclient.client.graphinventory.entities.Resource;
55 import org.onap.so.cnfm.lcm.bpmn.flows.BaseTest;
56 import org.onap.so.cnfm.lcm.bpmn.flows.service.JobExecutorService;
57 import org.onap.so.cnfm.lcm.database.beans.Job;
58 import org.onap.so.cnfm.lcm.database.beans.JobStatusEnum;
59 import org.onap.so.cnfm.lcm.model.AsInstance;
60 import org.onap.so.cnfm.lcm.model.AsInstance.InstantiationStateEnum;
61 import org.onap.so.cnfm.lcm.model.CreateAsRequest;
62 import org.springframework.beans.factory.annotation.Autowired;
63 import com.fasterxml.jackson.core.JsonProcessingException;
64 import com.fasterxml.jackson.databind.ObjectMapper;
67 * @author Waqas Ikram (waqas.ikram@est.tech)
70 public class CreateAsTaskTest extends BaseTest {
71 private static final String SRC_TEST_DIR = "src/test/resources";
72 private static final String TENAT_ID = UUID.randomUUID().toString();
73 private static final String CLOUD_OWNER = "CloudOwner";
74 private static final String CLOUD_REGION = "CloudRegion";
75 private static final String ASD_ID = UUID.randomUUID().toString();
76 private static final String AS_NAME = "CreateAsService-" + ASD_ID;
77 private static final String SDC_GET_RESOURCE_URL = "/sdc/v1/catalog/resources/" + ASD_ID + "/toscaModel";
78 private static final String RESOURCE_ASD_PACKAGE_CSAR_PATH =
79 SRC_TEST_DIR + "/resource-Generatedasdpackage-csar.csar";
82 private JobExecutorService objUnderTest;
85 public void before() {
86 wireMockServer.resetAll();
91 wireMockServer.resetAll();
95 public void testCreateAsWorkflow_SuccessfullCase() throws InterruptedException, IOException {
97 wireMockServer.stubFor(get(SDC_GET_RESOURCE_URL)
98 .willReturn(aResponse().withBody(getFileContent(getAbsolutePath(RESOURCE_ASD_PACKAGE_CSAR_PATH)))
99 .withHeader(ACCEPT, APPLICATION_OCTET_STREAM_VALUE)));
101 final CreateAsRequest createAsRequest = getCreateAsRequest();
105 final AsInstance nsResponse = objUnderTest.runCreateAsJob(createAsRequest);
106 assertNotNull(nsResponse);
107 assertNotNull(nsResponse.getAsInstanceid());
109 final Optional<Job> optional = getJobByResourceId(createAsRequest.getAsdId());
110 assertTrue(optional.isPresent());
111 final Job job = optional.get();
113 assertTrue(waitForProcessInstanceToFinish(job.getProcessInstanceId()));
115 final HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(job.getProcessInstanceId());
116 assertNotNull(historicProcessInstance);
118 assertEquals(HistoricProcessInstance.STATE_COMPLETED, historicProcessInstance.getState());
119 assertTrue(databaseServiceProvider.isAsInstExists(createAsRequest.getAsInstanceName()));
121 final Job actualJob = optional.get();
122 assertEquals(JobStatusEnum.FINISHED, actualJob.getStatus());
124 assertEquals(AS_NAME, nsResponse.getAsInstanceName());
125 assertEquals(InstantiationStateEnum.NOT_INSTANTIATED, nsResponse.getInstantiationState());
127 final HistoricVariableInstance doesNsPackageExistsVar =
128 getVariable(job.getProcessInstanceId(), "doesAsPackageExists");
129 assertNotNull(doesNsPackageExistsVar);
130 assertTrue((boolean) doesNsPackageExistsVar.getValue());
132 final HistoricVariableInstance doesNsInstanceExistsVar =
133 getVariable(job.getProcessInstanceId(), "doesAsInstanceExists");
134 assertNotNull(doesNsInstanceExistsVar);
135 assertFalse((boolean) doesNsInstanceExistsVar.getValue());
139 private CreateAsRequest getCreateAsRequest() {
140 return getCreateAsRequest(ASD_ID, AS_NAME);
143 private CreateAsRequest getCreateAsRequest(final String asdId, final String asName) {
144 final Map<String, Object> additionalParams = Map.of(SERVICE_INSTANCE_ID_PARAM_KEY, SERVICE_INSTANCE_ID,
145 SERVICE_INSTANCE_NAME_PARAM_KEY, SERVICE_INSTANCE_NAME, CLOUD_OWNER_PARAM_KEY, CLOUD_OWNER,
146 CLOUD_REGION_PARAM_KEY, CLOUD_REGION, TENANT_ID_PARAM_KEY, TENAT_ID);
148 return new CreateAsRequest().asdId(asdId).asInstanceName(asName).additionalParams(additionalParams);
151 private void mockAAIEndpoints() throws JsonProcessingException {
152 final String modelEndpoint = "/aai/" + V19 + "/network/generic-vnfs/generic-vnf/" + UUID_REGEX;
154 wireMockServer.stubFor(
155 get(urlMatching(modelEndpoint + "\\?resultIndex=0&resultSize=1&format=count")).willReturn(notFound()));
157 wireMockServer.stubFor(put(urlMatching(modelEndpoint)).willReturn(ok()));
158 wireMockServer.stubFor(put(urlMatching(modelEndpoint + "/relationship-list/relationship")).willReturn(ok()));
160 wireMockServer.stubFor(get(urlMatching(modelEndpoint)).willReturn(ok())
161 .willReturn(okJson("{\"orchestration-status\": \"Created\"}")));
163 wireMockServer.stubFor(get(urlMatching("/aai/" + V19 + "/nodes/service-instances/service-instance/.*"))
164 .willReturn(okJson(getResourceResultsResponseAsJson(SERVICE_INSTANCE_ID))));
166 wireMockServer.stubFor(put(urlMatching("/aai/" + V19 + "/cloud-infrastructure/cloud-regions/cloud-region/"
167 + CLOUD_OWNER + "/" + CLOUD_REGION + "/tenants/tenant/" + TENAT_ID + "/relationship-list/relationship"))
172 private String getResourceResultsResponseAsJson(final String nsdId) throws JsonProcessingException {
173 final Resource resource = new Resource();
174 resource.setResourceType("service-instance");
175 resource.setResourceLink("/aai/" + V19 + "/business/customers/customer/GLOBAL_CUSTOMER_ID"
176 + "/service-subscriptions/service-subscription/NetworkService/service-instances/service-instance/"
178 final Results<Resource> results = new Results<>();
179 results.getResult().add(resource);
180 return new ObjectMapper().writeValueAsString(results);
183 private Path getAbsolutePath(final String path) {
184 final File file = new File(path);
185 return file.toPath();
188 private byte[] getFileContent(final Path path) throws IOException {
189 return Files.readAllBytes(path);