Merge from ECOMP's repository
[vid.git] / vid-app-common / src / test / java / org / onap / vid / aai / util / ServiceInstanceStandardQueryTest.java
1 package org.onap.vid.aai.util;
2
3 import com.fasterxml.jackson.core.JsonProcessingException;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import com.google.common.collect.ImmutableList;
6 import org.apache.log4j.LogManager;
7 import org.apache.log4j.Logger;
8 import org.mockito.InjectMocks;
9 import org.mockito.Mock;
10 import org.mockito.MockitoAnnotations;
11 import org.onap.vid.aai.AaiClientInterface;
12 import org.onap.vid.aai.ExceptionWithRequestInfo;
13 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Network;
14 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.ServiceInstance;
15 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Vlan;
16 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Vnf;
17 import org.onap.vid.utils.Multival;
18 import org.springframework.http.HttpMethod;
19 import org.springframework.http.HttpStatus;
20 import org.springframework.web.client.HttpClientErrorException;
21 import org.testng.annotations.BeforeMethod;
22 import org.testng.annotations.Test;
23
24 import java.io.IOException;
25 import java.net.URI;
26 import java.util.List;
27 import java.util.stream.Collectors;
28
29 import static org.hamcrest.CoreMatchers.everyItem;
30 import static org.hamcrest.CoreMatchers.is;
31 import static org.hamcrest.MatcherAssert.assertThat;
32 import static org.hamcrest.Matchers.*;
33 import static org.mockito.Matchers.any;
34 import static org.mockito.Mockito.when;
35 import static org.onap.vid.utils.Unchecked.toURI;
36
37
38 public class ServiceInstanceStandardQueryTest {
39     private static final Logger logger = LogManager.getLogger(ServiceInstanceStandardQueryTest.class);
40     private static final ObjectMapper MAPPER = new ObjectMapper();
41     private final String serviceInstanceId = "9cdd1b2a-43a7-47bc-a88e-759ba2399f0b";
42     private final String vnfInstanceId_1 = "c015cc0f-0f37-4488-aabf-53795fd93cd3";
43     private final String vnfInstanceId_2 = "0846287b-65bf-45a6-88f6-6a1af4149fac";
44     private final String networkInstanceId_1 = "7989a6d2-ba10-4a5d-8f15-4520bc833090";
45     private final String networkInstanceId_2 = "82373aaa-c561-4e2b-96f1-7ef6f7f7b0e9";
46     private final String vlanTagInstanceId_1 = "701edbb2-37e4-4473-a2a6-405cb3ab2e37";
47     private final String vlanTagInstanceId_2 = "531571f4-e133-4780-8ba8-d79e63804084";
48     private final String vlanTagInstanceId_3 = "df674e8c-1773-4d39-a9e9-bddd2b339d0a";
49     private final String SERVICE_TYPE = "service";
50     private final String VNF_TYPE = "vnf";
51
52     @Mock
53     AaiClientInterface aaiClient;
54     @InjectMocks
55     private ServiceInstanceStandardQuery serviceInstanceStandardQuery;
56
57     @BeforeMethod
58     public void initMocks() {
59         MockitoAnnotations.initMocks(this);
60
61         when(aaiClient.typedAaiGet(any(URI.class), any(Class.class)))
62                 .thenAnswer(invocationOnMock -> {
63                     final URI uri = (URI) invocationOnMock.getArguments()[0];
64                     final String lastPart = uri.toString().replaceAll(".*/", "");
65                     switch (lastPart) {
66                         case serviceInstanceId:
67                             return getAaiObject(ServiceInstance.class);
68                         case vnfInstanceId_1:
69                         case vnfInstanceId_2:
70                             return getAaiObject(Vnf.class);
71                         case networkInstanceId_1:
72                         case networkInstanceId_2:
73                             return getAaiObject(Network.class);
74                         case vlanTagInstanceId_1:
75                         case vlanTagInstanceId_2:
76                         case vlanTagInstanceId_3:
77                             return getAaiObject(Vlan.class);
78                         default:
79                             throw new ExceptionWithRequestInfo(HttpMethod.GET, uri.toASCIIString(), getAaiObjectString(true), 404,
80                                     new HttpClientErrorException(HttpStatus.NOT_FOUND));
81                     }
82                 });
83     }
84
85     @Test
86     public void pathToObject_serviceInstanceUri_yieldsAaiObject() {
87         final ServiceInstance serviceInstance = serviceInstanceStandardQuery.objectByUri(ServiceInstance.class, toURI("/aai/v12/business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/vMOG/service-instances/service-instance/" + serviceInstanceId));
88         assertThat(serviceInstance.getServiceInstanceId(), is(serviceInstanceId));
89         assertThat(serviceInstance.getServiceInstanceName(), is("Network_repl_vMOG_rk"));
90     }
91
92     @Test
93     public void pathToObject_networkUri_yieldsAaiObject() {
94         final Network network = serviceInstanceStandardQuery.objectByUri(Network.class, toURI("/aai/v12/network/l3-networks/l3-network/" + networkInstanceId_1 + ""));
95         assertThat(network.getNetworkId(), is(networkInstanceId_1));
96         assertThat(network.getNetworkName(), is("APPC-24595-T-IST-02AShared_cor_direct_net_1"));
97     }
98
99     @Test
100     public void pathToObject_vlanTagUri_yieldsAaiObject() {
101         final Vlan vlan = serviceInstanceStandardQuery.objectByUri(Vlan.class, toURI("/this is an invented link/aai/v12/tag/vlan-tags/vlan-tag/" + vlanTagInstanceId_1 + ""));
102         assertThat(vlan.getVlanInterface(), is("US-10688-genvnf-vlan-interface1"));
103         assertThat(vlan.getVlanIdInner(), is("917"));
104     }
105
106     @Test(expectedExceptions = Exception.class)
107     public void pathToObject_oneUnknownUri_throwsException() {
108         serviceInstanceStandardQuery.objectByUri(ServiceInstance.class, toURI("/aai/v12/non existing path"));
109     }
110
111     @Test
112     public void vnfsForServiceInstance_noRelatedButManyOthers_emptyResult() {
113         final Multival<ServiceInstance, Vnf> vnfs =
114                 serviceInstanceStandardQuery.fetchRelatedVnfs(getAaiObject(false, ServiceInstance.class));
115         assertThat(vnfs.getValues(), is(empty()));
116     }
117
118     @Test
119     public void vnfsForServiceInstance_2RelatedAndManyOthers_Result2CorrectPath2() {
120         final Multival<ServiceInstance, Vnf> vnfs =
121                 serviceInstanceStandardQuery.fetchRelatedVnfs(getAaiObject(ServiceInstance.class));
122
123         assertThat(vnfs.getValues(), hasSize(2));
124     }
125
126     @Test
127     public void serviceInstanceToL3Networks_noRelatedButManyOthers_emptyResult() {
128         final Multival<ServiceInstance, Network> l3Networks =
129                 serviceInstanceStandardQuery.fetchRelatedL3Networks(SERVICE_TYPE, getAaiObject(false, ServiceInstance.class));
130         assertThat(l3Networks.getValues(), is(empty()));
131     }
132
133     @Test
134     public void serviceInstanceToL3Networks_2RelatedAndManyOthers_Result2CorrectPath2() {
135         final Multival<ServiceInstance, Network> l3Networks =
136                 serviceInstanceStandardQuery.fetchRelatedL3Networks(SERVICE_TYPE, getAaiObject(ServiceInstance.class));
137
138         assertThat(l3Networks.getValues(), hasSize(2));
139     }
140
141     @Test
142     public void l3NetworkToVlanTags_noRelatedButManyOthers_emptyResult() {
143         final Multival<Network, Vlan> vlanTags =
144                 serviceInstanceStandardQuery.fetchRelatedVlanTags(getAaiObject(false, Network.class));
145         assertThat(vlanTags.getValues(), is(empty()));
146     }
147
148     @Test
149     public void l3NetworkToVlanTags__2RelatedAndManyOthers_Result2CorrectPath() {
150         final Multival<Network, Vlan> vlanTags =
151                 serviceInstanceStandardQuery.fetchRelatedVlanTags(getAaiObject(Network.class));
152
153         assertThat(vlanTags.getValues(), hasSize(3));
154     }
155
156     private <T> T getAaiObject(Class<T> valueType) {
157         return getAaiObject(true, valueType);
158     }
159
160     private <T> T getAaiObject(boolean withRelated, Class<T> valueType) {
161         try {
162             return MAPPER.readValue(getAaiObjectString(withRelated), valueType);
163         } catch (IOException e) {
164             throw new RuntimeException(e);
165         }
166     }
167
168     @Test
169     public void integrativeUsageWithLinearInvocation() throws JsonProcessingException {
170         final ServiceInstanceStandardQuery srv = this.serviceInstanceStandardQuery;
171         final ServiceInstance service = srv.fetchServiceInstance(toURI("path of service/" + serviceInstanceId + ""));
172         final Network l3Network = ImmutableList.copyOf(srv.fetchRelatedL3Networks(SERVICE_TYPE, service).getValues()).get(0);
173         final Vlan vlanTag = ImmutableList.copyOf(srv.fetchRelatedVlanTags(l3Network).getValues()).get(0);
174
175         assertThat(vlanTag.getVlanInterface(), is("US-10688-genvnf-vlan-interface1"));
176         assertThat(vlanTag.getVlanIdInner(), is("917"));
177     }
178
179     @Test
180     public void integrativeUsageWithGenericAccessors() throws JsonProcessingException {
181         final ServiceInstanceStandardQuery srv = this.serviceInstanceStandardQuery;
182
183         final ServiceInstance serviceInstance = srv.fetchServiceInstance(toURI("path of service/" + serviceInstanceId + ""));
184
185         final Multival<ServiceInstance, Network> serviceToNetworks =
186                 srv.fetchRelatedL3Networks(SERVICE_TYPE, serviceInstance);
187
188         final Multival<ServiceInstance, Multival<Network, Vlan>> serviceToNetworksToVlans =
189                 serviceToNetworks.mapEachVal(srv::fetchRelatedVlanTags);
190
191         logger.info(MAPPER.writeValueAsString(serviceToNetworksToVlans));
192
193         // check all tags are in place
194         final List<Vlan> vlanTags = serviceToNetworksToVlans
195                 .getValues().stream()
196                 .flatMap(networkVlanMultival -> networkVlanMultival.getValues().stream())
197                 .collect(Collectors.toList());
198
199         assertThat(vlanTags, hasSize(6)); // 2 networks, with 3 vlans each
200         assertThat(vlanTags, everyItem(hasProperty("vlanInterface", is("US-10688-genvnf-vlan-interface1"))));
201         assertThat(vlanTags, everyItem(hasProperty("vlanIdInner", is("917"))));
202     }
203
204     private String getAaiObjectString(boolean withRelated) {
205         final String relatedToVnfs = "" +
206                 "      { " +
207                 "        \"related-to\": \"generic-vnf\", " +
208                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
209                 "        \"related-link\": \"/aai/v12/network/generic-vnfs/generic-vnf/" + vnfInstanceId_1 + "\", " +
210                 "        \"relationship-data\": [{ " +
211                 "            \"relationship-key\": \"generic-vnf.vnf-id\", " +
212                 "            \"relationship-value\": \"" + vlanTagInstanceId_1 + "\" " +
213                 "          } " +
214                 "        ], " +
215                 "        \"related-to-property\": [{ " +
216                 "            \"property-key\": \"generic-vnf.vnf-name\", " +
217                 "            \"property-value\": \"\" " +
218                 "          } " +
219                 "        ] " +
220                 "      }, { " +
221                 "        \"related-to\": \"generic-vnf\", " +
222                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
223                 "        \"related-link\": \"/aai/v12/network/generic-vnfs/generic-vnf/" + vnfInstanceId_2 + "\", " +
224                 "        \"relationship-data\": [{ " +
225                 "            \"relationship-key\": \"generic-vnf.vnf-id\", " +
226                 "            \"relationship-value\": \"" + vlanTagInstanceId_2 + "\" " +
227                 "          } " +
228                 "        ], " +
229                 "        \"related-to-property\": [{ " +
230                 "            \"property-key\": \"generic-vnf.vnf-name\", " +
231                 "            \"property-value\": \"\" " +
232                 "          } " +
233                 "        ] " +
234                 "      }, ";
235
236
237         final String relatedToL3Networks = "" +
238                 "      { " +
239                 "        \"related-to\": \"l3-network\", " +
240                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
241                 "        \"related-link\": \"/aai/v12/network/l3-networks/l3-network/" + networkInstanceId_1 + "\", " +
242                 "        \"relationship-data\": [{ " +
243                 "            \"relationship-key\": \"l3-network.network-id\", " +
244                 "            \"relationship-value\": \"" + networkInstanceId_1 + "\" " +
245                 "          } " +
246                 "        ], " +
247                 "        \"related-to-property\": [{ " +
248                 "            \"property-key\": \"l3-network.network-name\", " +
249                 "            \"property-value\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1\" " +
250                 "          } " +
251                 "        ] " +
252                 "      }, { " +
253                 "        \"related-to\": \"l3-network\", " +
254                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
255                 "        \"related-link\": \"/aai/v12/network/l3-networks/l3-network/" + networkInstanceId_2 + "\", " +
256                 "        \"relationship-data\": [{ " +
257                 "            \"relationship-key\": \"l3-network.network-id\", " +
258                 "            \"relationship-value\": \"" + networkInstanceId_2 + "\" " +
259                 "          } " +
260                 "        ], " +
261                 "        \"related-to-property\": [{ " +
262                 "            \"property-key\": \"l3-network.network-name\", " +
263                 "            \"property-value\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1\" " +
264                 "          } " +
265                 "        ] " +
266                 "      }, ";
267
268         final String relatedToVlanTags = "" +
269                 "      { " +
270                 "        \"related-to\": \"vlan-tag\", " +
271                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
272                 "        \"related-link\": \"/this is an invented link/aai/v12/tag/vlan-tags/vlan-tag/" + vlanTagInstanceId_2 + "\", " +
273                 "        \"relationship-data\": [{ " +
274                 "            \"relationship-key\": \"vlan-tag.vlan-tag-id\", " +
275                 "            \"relationship-value\": \"" + vlanTagInstanceId_2 + "\" " +
276                 "          } " +
277                 "        ], " +
278                 "        \"related-to-property\": [{ " +
279                 "            \"property-key\": \"vlan-tag.vlan-tag-name\", " +
280                 "            \"property-value\": \"Behram_smeralda_56\" " +
281                 "          } " +
282                 "        ] " +
283                 "      }, { " +
284                 "        \"related-to\": \"vlan-tag\", " +
285                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
286                 "        \"related-link\": \"/this is an invented link/aai/v12/tag/vlan-tags/vlan-tag/" + vlanTagInstanceId_3 + "\" " +
287                 "      }, { " +
288                 "        \"related-to\": \"vlan-tag\", " +
289                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
290                 "        \"related-link\": \"/this is an invented link/aai/v12/tag/vlan-tags/vlan-tag/" + vlanTagInstanceId_1 + "\", " +
291                 "        \"relationship-data\": [{ " +
292                 "            \"relationship-key\": \"vlan-tag.vlan-tag-id\", " +
293                 "            \"relationship-value\": \"" + vlanTagInstanceId_1 + "\" " +
294                 "          } " +
295                 "        ], " +
296                 "        \"related-to-property\": [{ " +
297                 "            \"property-key\": \"vlan-tag.vlan-tag-name\", " +
298                 "            \"property-value\": \"Alexandra_Liron_3\" " +
299                 "          } " +
300                 "        ] " +
301                 "      }, ";
302
303         return "" +
304                 "{ " +
305
306                 // vlan props
307                 "  \"vlan-interface\": \"US-10688-genvnf-vlan-interface1\", " +
308                 "  \"vlan-id-inner\": 917, " +
309                 "  \"resource-version\": \"1518934744675\", " +
310                 "  \"in-maint\": false, " +
311                 "  \"is-ip-unnumbered\": false, " +
312                 // imaginary vlan props
313                 "  \"vlan-tag-id\": \"" + vlanTagInstanceId_2 + "\", " +
314                 "  \"vlan-tag-name\": \"Alexandra_Liron_3\", " +
315                 "  \"vlan-tag-type\": \"SUNIWOBA\", " +
316
317                 // service-instance props
318                 "  \"service-instance-name\": \"Network_repl_vMOG_rk\", " +
319                 "  \"service-instance-id\": \"" + serviceInstanceId + "\", " +
320                 "  \"environment-context\": \"General_Revenue-Bearing\", " +
321                 "  \"workload-context\": \"Production\", " +
322                 "  \"model-invariant-id\": \"92a72881-0a97-4d16-8c29-4831062e7e9b\", " +
323                 "  \"model-version-id\": \"5a3ad576-c01d-4bed-8194-0e72b4a3d020\", " +
324                 "  \"resource-version\": \"1516045827731\", " +
325                 "  \"orchestration-status\": \"Active\", " +
326
327                 // network props
328                 "  \"network-id\": \"" + networkInstanceId_1 + "\", " +
329                 "  \"network-name\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1\", " +
330                 "  \"network-type\": \"CONTRAIL30_BASIC\", " +
331                 "  \"network-role\": \"repl\", " +
332                 "  \"network-technology\": \"contrail\", " +
333                 "  \"neutron-network-id\": \"66ee6123-1c45-4e71-b6c0-a748ae0fee88\", " +
334                 "  \"is-bound-to-vpn\": true, " +
335                 "  \"service-id\": \"db171b8f-115c-4992-a2e3-ee04cae357e0\", " +
336                 "  \"network-role-instance\": 0, " +
337                 "  \"resource-version\": \"1516046029762\", " +
338                 "  \"heat-stack-id\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1/e8b256aa-8ce1-4384-9d99-6606eaca9eac\", " +
339                 "  \"contrail-network-fqdn\": \"default-domain:APPC-24595-T-IST-02C:APPC-24595-T-IST-02AShared_cor_direct_net_1\", " +
340                 "  \"physical-network-name\": \"FALSE\", " +
341                 "  \"is-provider-network\": false, " +
342                 "  \"is-shared-network\": true, " +
343                 "  \"is-external-network\": true, " +
344
345                 "  \"relationship-list\": { " +
346                 "    \"relationship\": [{ " +
347                 "        \"related-to\": \"service-instance\", " +
348                 "        \"relationship-label\": \"org.onap.relationships.inventory.ComposedOf\", " +
349                 "        \"related-link\": \"/aai/v12/business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/vMOG/service-instances/service-instance/" + serviceInstanceId + "\", " +
350                 "        \"relationship-data\": [{ " +
351                 "            \"relationship-key\": \"customer.global-customer-id\", " +
352                 "            \"relationship-value\": \"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb\" " +
353                 "          }, { " +
354                 "            \"relationship-key\": \"service-subscription.service-type\", " +
355                 "            \"relationship-value\": \"vMOG\" " +
356                 "          }, { " +
357                 "            \"relationship-key\": \"service-instance.service-instance-id\", " +
358                 "            \"relationship-value\": \"" + serviceInstanceId + "\" " +
359                 "          } " +
360                 "        ], " +
361                 "        \"related-to-property\": [{ " +
362                 "            \"property-key\": \"service-instance.service-instance-name\", " +
363                 "            \"property-value\": \"Network_repl_vMOG_rk\" " +
364                 "          } " +
365                 "        ] " +
366                 "      }, { " +
367                 "        \"related-to\": \"vpn-binding\", " +
368                 "        \"relationship-label\": \"org.onap.relationships.inventory.Uses\", " +
369                 "        \"related-link\": \"/aai/v12/network/vpn-bindings/vpn-binding/13e94b71-3ce1-4988-ab0e-61208fc91f1c\", " +
370                 "        \"relationship-data\": [{ " +
371                 "            \"relationship-key\": \"vpn-binding.vpn-id\", " +
372                 "            \"relationship-value\": \"13e94b71-3ce1-4988-ab0e-61208fc91f1c\" " +
373                 "          } " +
374                 "        ], " +
375                 "        \"related-to-property\": [{ " +
376                 "            \"property-key\": \"vpn-binding.vpn-name\", " +
377                 "            \"property-value\": \"vMDNS\" " +
378                 "          }, { " +
379                 "            \"property-key\": \"vpn-binding.vpn-type\" " +
380                 "          } " +
381                 "        ] " +
382                 "      }, " + (withRelated ? relatedToVlanTags : "") + "{ " +
383                 "        \"related-to\": \"project\", " +
384                 "        \"relationship-label\": \"org.onap.relationships.inventory.Uses\", " +
385                 "        \"related-link\": \"/aai/v12/business/projects/project/project1\", " +
386                 "        \"relationship-data\": [{ " +
387                 "            \"relationship-key\": \"project.project-name\", " +
388                 "            \"relationship-value\": \"project1\" " +
389                 "          } " +
390                 "        ] " +
391                 "      }, " + (withRelated ? relatedToL3Networks + relatedToVnfs : "") + "{ " +
392                 "        \"related-to\": \"owning-entity\", " +
393                 "        \"relationship-label\": \"org.onap.relationships.inventory.BelongsTo\", " +
394                 "        \"related-link\": \"/aai/v12/business/owning-entities/owning-entity/589fe0db-26c4-45e5-9f4e-a246c74fce76\", " +
395                 "        \"relationship-data\": [{ " +
396                 "            \"relationship-key\": \"owning-entity.owning-entity-id\", " +
397                 "            \"relationship-value\": \"589fe0db-26c4-45e5-9f4e-a246c74fce76\" " +
398                 "          } " +
399                 "        ] " +
400                 "      } " +
401                 "    ] " +
402                 "  } " +
403                 "} ";
404     }
405 }