identify macro services without instantiation type in BE by feature flag
[vid.git] / vid-automation / src / test / java / org / onap / vid / api / SdcApiTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.vid.api;
22
23 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
24 import static net.javacrumbs.jsonunit.JsonMatchers.jsonPartEquals;
25 import static net.javacrumbs.jsonunit.JsonMatchers.jsonStringEquals;
26 import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
27 import static org.hamcrest.CoreMatchers.equalTo;
28 import static org.hamcrest.MatcherAssert.assertThat;
29 import static org.hamcrest.core.Is.is;
30 import static org.hamcrest.core.IsNot.not;
31 import static org.onap.simulator.presetGenerator.presets.BasePresets.BaseSDCPreset.SDC_ROOT_PATH;
32 import static org.testng.Assert.assertEquals;
33 import static org.testng.Assert.assertFalse;
34 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND;
35 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET;
36 import static vid.automation.test.services.SimulatorApi.registerExpectation;
37 import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets;
38 import static vid.automation.test.utils.ReadFile.loadResourceAsString;
39
40 import com.fasterxml.jackson.databind.JsonNode;
41 import com.google.common.collect.ImmutableList;
42 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
43 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet;
44 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet;
45 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet;
46 import org.onap.vid.more.LoggerFormatTest;
47 import org.springframework.http.HttpStatus;
48 import org.springframework.http.ResponseEntity;
49 import org.testng.annotations.BeforeClass;
50 import org.testng.annotations.BeforeMethod;
51 import org.testng.annotations.Test;
52 import vid.automation.test.infra.FeatureTogglingTest;
53 import vid.automation.test.infra.Features;
54 import vid.automation.test.infra.ModelInfo;
55
56 public class SdcApiTest extends BaseApiTest {
57
58     private static final String SDC_GET_SERVICE_MODEL = "/rest/models/services/";
59
60
61     private static final String A_LA_CARTE_INSTANTIATION_TYPE_UUID = "4d71990b-d8ad-4510-ac61-496288d9078e";
62     private static final String A_LA_CARTE_INSTANTIATION_TYPE_INVARIANT_UUID = "d27e42cf-087e-4d31-88ac-6c4b7585f800";
63     private static final String A_LA_CARTE_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeAlacarte_invariantUUIDMacro.zip";
64     private static final String A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/aLaCarteInstantiationTypeResponse.json";
65
66
67     private static final String MACRO_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeMacro_invariantUUIDAlacarte.zip";
68     private static final String MACRO_INSTANTIATION_TYPE_UUID = "4d71990b-d8ad-4510-ac61-496288d9078e";
69     private static final String MACRO_INSTANTIATION_TYPE_INVARIANT_UUID = "a8dcd72d-d44d-44f2-aa85-53aa9ca99cba";
70     private static final String MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/macroInstantiationTypeResponse.json";
71
72
73     private static final String EMPTY_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeEmpty_invariantUUIDAlacarte.zip";
74     private static final String EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/emptyInstantiationTypeResponse.json";
75
76     private static final String BOTH_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeBoth_invariantUUIDAlacarte.zip";
77
78
79     private static final String MIN_MAX_INITIAL_UUID = "43f13072-fe50-496b-b673-7af075d10143";
80     private static final String MIN_MAX_INITIAL_INVARIANT_UUID = "35fb95d8-d1f0-4e46-99ac-e01b423e8e3f";
81     private static final String MIN_MAX_INITIAL_FILE_PATH = "min_max_initial_vfModule_csar_v4.0.zip";
82
83     private static final String MIN_MAX_INITIAL_UUID_OLD_CSAR = "245562de-3984-49ef-a708-6c9d7cfcabd1";
84     private static final String MIN_MAX_INITIAL_INVARIANT_UUID_OLD_CSAR = "24216d6-71d0-41c8-ac81-0c5acfee514a";
85     private static final String MIN_MAX_INITIAL_FILE_PATH_OLD_CSAR = "service-VflorenceRvpmsFeAic3011217Svc-csar.csar.zip";
86
87     private static final String GROUPING_SERVICE_ROLE_FILE_PATH = "csar15782222_instantiationTypeAlacarte_VnfGrouping.zip";
88     private static final String GROUPING_SERVICE_ROLE_UUID = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
89     private static final String GROUPING_SERVICE_ROLE_INVARIANT_UUID = "7ee41ce4-4827-44b0-a48e-2707a59905d2";
90     private static final String GROUPING_SERVICE_ROLE_EXPECTED_RESPONSE = "VnfGroup/groupingServiceRoleResponse.json";
91
92     @BeforeClass
93     public void login() {
94         super.login();
95     }
96
97     @BeforeMethod
98     public void invalidateTheCache(){
99         if(Features.FLAG_SERVICE_MODEL_CACHE.isActive()) {
100             restTemplate.postForObject(uri + "/rest/models/reset", "", Object.class);
101         }
102     }
103
104     @Test
105     public void getServiceModelALaCarteInstantiation() {
106         registerToSimulatorWithPresets(A_LA_CARTE_INSTANTIATION_TYPE_UUID, A_LA_CARTE_INSTANTIATION_TYPE_INVARIANT_UUID, A_LA_CARTE_INSTANTIATION_TYPE_FILE_PATH);
107         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + A_LA_CARTE_INSTANTIATION_TYPE_UUID), String.class);
108         assertEquals(response.getStatusCode(), HttpStatus.OK);
109         String aLaCarteInstantiationTypeExpectedResponse = loadResourceAsString(A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE);
110         assertThat(response.getBody(), jsonEquals(aLaCarteInstantiationTypeExpectedResponse)
111             .when(IGNORING_ARRAY_ORDER)
112             .whenIgnoringPaths("service.vidNotions.instantiationUI"));
113     }
114
115
116     @Test
117     public void getServiceModelMacroInstantiation() {
118         registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, MACRO_INSTANTIATION_TYPE_FILE_PATH);
119         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class);
120         assertEquals(response.getStatusCode(), HttpStatus.OK);
121         String macroInstantiationTypeExpectedResponse = loadResourceAsString(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE);
122         assertThat(response.getBody(), jsonEquals(macroInstantiationTypeExpectedResponse)
123             .when(IGNORING_ARRAY_ORDER)
124             .whenIgnoringPaths("service.vidNotions.viewEditUI"));
125     }
126
127
128     @Test
129     public void getServiceModelWithoutInstantiationType(){
130         registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, EMPTY_INSTANTIATION_TYPE_FILE_PATH);
131         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class);
132         assertEquals(response.getStatusCode(), HttpStatus.OK);
133         String emptyInstantiationTypeExpectedResponse = loadResourceAsString(EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE);
134
135         final String body = response.getBody();
136
137         assertThat(body, jsonEquals(emptyInstantiationTypeExpectedResponse)
138             .when(IGNORING_ARRAY_ORDER)
139             .whenIgnoringPaths("service.vidNotions.instantiationUI", "service.vidNotions.instantiationType"));
140
141         assertThat(body, jsonPartEquals("service.vidNotions.instantiationType",
142             Features.FLAG_2002_IDENTIFY_INVARIANT_MACRO_UUID_BY_BACKEND.isActive()
143                 ? "ALaCarte" : "ClientConfig"));
144     }
145
146     @Test
147     public void getServiceModelBothInstantiationType(){
148         registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, BOTH_INSTANTIATION_TYPE_FILE_PATH);
149         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class);
150         assertEquals(response.getStatusCode(), HttpStatus.OK);
151         String macroInstantiationTypeExpectedResponse = loadResourceAsString(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE);
152         assertThat(response.getBody(), jsonEquals(macroInstantiationTypeExpectedResponse)
153             .when(IGNORING_ARRAY_ORDER)
154             .whenIgnoringPaths("service.vidNotions.viewEditUI"));
155     }
156
157     @Test
158     public void getServiceModelWithGroupsAndCheckMinMaxInitialParams(){
159         registerToSimulatorWithPresets(MIN_MAX_INITIAL_UUID, MIN_MAX_INITIAL_INVARIANT_UUID, MIN_MAX_INITIAL_FILE_PATH);
160         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MIN_MAX_INITIAL_UUID), String.class);
161         assertEquals(response.getStatusCode(), HttpStatus.OK);
162         String minMaxInitialExpectedResponse = loadResourceAsString("sdcApiTest/minMaxInitialExpectedResponse.json");
163         assertThat(response.getBody(), jsonEquals(minMaxInitialExpectedResponse)
164             .when(IGNORING_ARRAY_ORDER)
165             .whenIgnoringPaths("service.vidNotions.instantiationUI", "service.vidNotions.instantiationType"));
166     }
167
168     @Test
169     public void getServiceModelWithGroupsAndCheckMinMaxInitialParamsOldCsar(){
170         registerToSimulatorWithPresets(MIN_MAX_INITIAL_UUID_OLD_CSAR, MIN_MAX_INITIAL_INVARIANT_UUID_OLD_CSAR, MIN_MAX_INITIAL_FILE_PATH_OLD_CSAR);
171         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MIN_MAX_INITIAL_UUID_OLD_CSAR), String.class);
172         assertEquals(response.getStatusCode(), HttpStatus.OK);
173         String minMaxInitialExpectedResponseOldCsar = loadResourceAsString("sdcApiTest/minMaxInitialExpectedResponseOldCsar.json");
174         assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(minMaxInitialExpectedResponseOldCsar)));
175     }
176
177     @Test
178     @FeatureTogglingTest(Features.FLAG_1902_VNF_GROUPING)
179     public void getServiceModelWithServiceRoleGrouping() throws Exception {
180         registerToSimulatorWithPresets(GROUPING_SERVICE_ROLE_UUID, GROUPING_SERVICE_ROLE_INVARIANT_UUID, GROUPING_SERVICE_ROLE_FILE_PATH);
181         ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + GROUPING_SERVICE_ROLE_UUID), String.class);
182         assertEquals(response.getStatusCode(), HttpStatus.OK);
183         String groupingServiceRoleExpectedResponse = loadResourceAsString(GROUPING_SERVICE_ROLE_EXPECTED_RESPONSE);
184         assertThat(response.getBody(), jsonEquals(groupingServiceRoleExpectedResponse)
185             .when(IGNORING_ARRAY_ORDER)
186             .whenIgnoringPaths("service.vidNotions.instantiationUI"));
187
188         //assert that instantiationUI is not legacy
189         JsonNode instantiationUI = objectMapper.readValue(response.getBody(), JsonNode.class).get("service").get("vidNotions").get("instantiationUI");
190         assertThat(instantiationUI.asText(), not(equalTo("legacy")));
191     }
192
193     private void registerToSimulatorWithPresets(String uuid, String invariantUuid, String pathPath){
194         ImmutableList<BasePreset> presets = ImmutableList.of(
195                 new PresetSDCGetServiceToscaModelGet(uuid, pathPath),
196                 new PresetSDCGetServiceMetadataGet(uuid,invariantUuid, pathPath));
197         registerExpectationFromPresets(presets, CLEAR_THEN_SET);
198     }
199
200     @Test
201     public void withModelFromE2eWithToscaParserButNewFlow_requestModels_expectVnfRelatedVfModulesNotNull() {
202
203         /*
204         We had a problem that this exact model vnfs returned with no vfModules and
205         volumeGroups, because a 'isNewFlow' value in org.onap.vid.asdc.parser.ToscaParserImpl
206         was always false because a coding error.
207          */
208         registerExpectation("get_sdc_catalog_services_VflorenceRvpmsFeAic3011217Svc.json", CLEAR_THEN_SET);
209         registerExpectation("create_new_instance/aai_get_full_subscribers.json", APPEND);
210
211         final JsonNode response = restTemplate.getForObject(uri + "/rest/models/services/" + "245562de-3984-49ef-a708-6c9d7cfcabd1", JsonNode.class);
212
213         // using json-pointers instead of path, because vnf name has
214         // dots and spaces
215         final String myVnf = "vFLORENCEvProbe_FE_AIC3-11.2.1_VF 1";
216         final String base = "/vnfs/" + myVnf;
217
218         assertFalse(response.at(base).isMissingNode(),
219                 "test relies on '" + myVnf + "' to be in model; got: " + response);
220
221         assertThat("vfModules under '" + myVnf + "' must not be empty; got: " + response,
222                 response.at(base + "/vfModules").size(), is(not(0)));
223
224         assertThat("volumeGroups under '" + myVnf + "' must not be empty; got: " + response,
225                 response.at(base + "/volumeGroups").size(), is(not(0)));
226
227     }
228
229     @Test
230     public void whenCallSdc_thenRequestRecordedInMetricsLog() {
231
232         ModelInfo modelInfo = ModelInfo.transportWithPnfsService;
233         String internalPath = SDC_GET_SERVICE_MODEL + modelInfo.modelVersionId;
234         registerExpectationFromPresets(ImmutableList.of(
235             new PresetSDCGetServiceToscaModelGet(modelInfo),
236             new PresetSDCGetServiceMetadataGet(modelInfo),
237             new PresetAAIGetSubscribersGet() //for read logs permissions
238         ), CLEAR_THEN_SET);
239
240         ResponseEntity<String> response = restTemplate.getForEntity(
241             buildUri(internalPath), String.class);
242
243         final String requestId = response.getHeaders().getFirst("X-ECOMP-RequestID-echo");
244
245         LoggerFormatTest.assertHeadersAndMetricLogs(restTemplate, uri, requestId, SDC_ROOT_PATH, 2);
246         LoggerFormatTest.verifyExistenceOfIncomingReqsInAuditLogs(restTemplate, uri, requestId, internalPath);
247     }
248
249 }