bd0afe95a6aa641ce6b58cb59c4c2d6a16348483
[so/adapters/so-cnf-adapter.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.so.cnfm.lcm.bpmn.flows.tasks;
21
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;
41 import java.io.File;
42 import java.io.IOException;
43 import java.nio.file.Files;
44 import java.nio.file.Path;
45 import java.util.Map;
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;
65
66 /**
67  * @author Waqas Ikram (waqas.ikram@est.tech)
68  *
69  */
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";
80
81     @Autowired
82     private JobExecutorService objUnderTest;
83
84     @Before
85     public void before() {
86         wireMockServer.resetAll();
87     }
88
89     @After
90     public void after() {
91         wireMockServer.resetAll();
92     }
93
94     @Test
95     public void testCreateAsWorkflow_SuccessfullCase() throws InterruptedException, IOException {
96
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)));
100
101         final CreateAsRequest createAsRequest = getCreateAsRequest();
102
103         mockAAIEndpoints();
104
105         final AsInstance nsResponse = objUnderTest.runCreateAsJob(createAsRequest);
106         assertNotNull(nsResponse);
107         assertNotNull(nsResponse.getAsInstanceid());
108
109         final Optional<Job> optional = getJobByResourceId(createAsRequest.getAsdId());
110         assertTrue(optional.isPresent());
111         final Job job = optional.get();
112
113         assertTrue(waitForProcessInstanceToFinish(job.getProcessInstanceId()));
114
115         final HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(job.getProcessInstanceId());
116         assertNotNull(historicProcessInstance);
117
118         assertEquals(HistoricProcessInstance.STATE_COMPLETED, historicProcessInstance.getState());
119         assertTrue(databaseServiceProvider.isAsInstExists(createAsRequest.getAsInstanceName()));
120
121         final Job actualJob = optional.get();
122         assertEquals(JobStatusEnum.FINISHED, actualJob.getStatus());
123
124         assertEquals(AS_NAME, nsResponse.getAsInstanceName());
125         assertEquals(InstantiationStateEnum.NOT_INSTANTIATED, nsResponse.getInstantiationState());
126
127         final HistoricVariableInstance doesNsPackageExistsVar =
128                 getVariable(job.getProcessInstanceId(), "doesAsPackageExists");
129         assertNotNull(doesNsPackageExistsVar);
130         assertTrue((boolean) doesNsPackageExistsVar.getValue());
131
132         final HistoricVariableInstance doesNsInstanceExistsVar =
133                 getVariable(job.getProcessInstanceId(), "doesAsInstanceExists");
134         assertNotNull(doesNsInstanceExistsVar);
135         assertFalse((boolean) doesNsInstanceExistsVar.getValue());
136
137     }
138
139     private CreateAsRequest getCreateAsRequest() {
140         return getCreateAsRequest(ASD_ID, AS_NAME);
141     }
142
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);
147
148         return new CreateAsRequest().asdId(asdId).asInstanceName(asName).additionalParams(additionalParams);
149     }
150
151     private void mockAAIEndpoints() throws JsonProcessingException {
152         final String modelEndpoint = "/aai/" + V19 + "/network/generic-vnfs/generic-vnf/" + UUID_REGEX;
153
154         wireMockServer.stubFor(
155                 get(urlMatching(modelEndpoint + "\\?resultIndex=0&resultSize=1&format=count")).willReturn(notFound()));
156
157         wireMockServer.stubFor(put(urlMatching(modelEndpoint)).willReturn(ok()));
158         wireMockServer.stubFor(put(urlMatching(modelEndpoint + "/relationship-list/relationship")).willReturn(ok()));
159
160         wireMockServer.stubFor(get(urlMatching(modelEndpoint)).willReturn(ok())
161                 .willReturn(okJson("{\"orchestration-status\": \"Created\"}")));
162
163         wireMockServer.stubFor(get(urlMatching("/aai/" + V19 + "/nodes/service-instances/service-instance/.*"))
164                 .willReturn(okJson(getResourceResultsResponseAsJson(SERVICE_INSTANCE_ID))));
165
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"))
168                         .willReturn(ok()));
169
170     }
171
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/"
177                 + nsdId);
178         final Results<Resource> results = new Results<>();
179         results.getResult().add(resource);
180         return new ObjectMapper().writeValueAsString(results);
181     }
182
183     private Path getAbsolutePath(final String path) {
184         final File file = new File(path);
185         return file.toPath();
186     }
187
188     private byte[] getFileContent(final Path path) throws IOException {
189         return Files.readAllBytes(path);
190     }
191 }