1 package org.onap.vid.aai.util;
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;
24 import java.io.IOException;
26 import java.util.List;
27 import java.util.stream.Collectors;
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;
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";
53 AaiClientInterface aaiClient;
55 private ServiceInstanceStandardQuery serviceInstanceStandardQuery;
58 public void initMocks() {
59 MockitoAnnotations.initMocks(this);
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(".*/", "");
66 case serviceInstanceId:
67 return getAaiObject(ServiceInstance.class);
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);
79 throw new ExceptionWithRequestInfo(HttpMethod.GET, uri.toASCIIString(), getAaiObjectString(true), 404,
80 new HttpClientErrorException(HttpStatus.NOT_FOUND));
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"));
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"));
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"));
106 @Test(expectedExceptions = Exception.class)
107 public void pathToObject_oneUnknownUri_throwsException() {
108 serviceInstanceStandardQuery.objectByUri(ServiceInstance.class, toURI("/aai/v12/non existing path"));
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()));
119 public void vnfsForServiceInstance_2RelatedAndManyOthers_Result2CorrectPath2() {
120 final Multival<ServiceInstance, Vnf> vnfs =
121 serviceInstanceStandardQuery.fetchRelatedVnfs(getAaiObject(ServiceInstance.class));
123 assertThat(vnfs.getValues(), hasSize(2));
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()));
134 public void serviceInstanceToL3Networks_2RelatedAndManyOthers_Result2CorrectPath2() {
135 final Multival<ServiceInstance, Network> l3Networks =
136 serviceInstanceStandardQuery.fetchRelatedL3Networks(SERVICE_TYPE, getAaiObject(ServiceInstance.class));
138 assertThat(l3Networks.getValues(), hasSize(2));
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()));
149 public void l3NetworkToVlanTags__2RelatedAndManyOthers_Result2CorrectPath() {
150 final Multival<Network, Vlan> vlanTags =
151 serviceInstanceStandardQuery.fetchRelatedVlanTags(getAaiObject(Network.class));
153 assertThat(vlanTags.getValues(), hasSize(3));
156 private <T> T getAaiObject(Class<T> valueType) {
157 return getAaiObject(true, valueType);
160 private <T> T getAaiObject(boolean withRelated, Class<T> valueType) {
162 return MAPPER.readValue(getAaiObjectString(withRelated), valueType);
163 } catch (IOException e) {
164 throw new RuntimeException(e);
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);
175 assertThat(vlanTag.getVlanInterface(), is("US-10688-genvnf-vlan-interface1"));
176 assertThat(vlanTag.getVlanIdInner(), is("917"));
180 public void integrativeUsageWithGenericAccessors() throws JsonProcessingException {
181 final ServiceInstanceStandardQuery srv = this.serviceInstanceStandardQuery;
183 final ServiceInstance serviceInstance = srv.fetchServiceInstance(toURI("path of service/" + serviceInstanceId + ""));
185 final Multival<ServiceInstance, Network> serviceToNetworks =
186 srv.fetchRelatedL3Networks(SERVICE_TYPE, serviceInstance);
188 final Multival<ServiceInstance, Multival<Network, Vlan>> serviceToNetworksToVlans =
189 serviceToNetworks.mapEachVal(srv::fetchRelatedVlanTags);
191 logger.info(MAPPER.writeValueAsString(serviceToNetworksToVlans));
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());
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"))));
204 private String getAaiObjectString(boolean withRelated) {
205 final String relatedToVnfs = "" +
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 + "\" " +
215 " \"related-to-property\": [{ " +
216 " \"property-key\": \"generic-vnf.vnf-name\", " +
217 " \"property-value\": \"\" " +
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 + "\" " +
229 " \"related-to-property\": [{ " +
230 " \"property-key\": \"generic-vnf.vnf-name\", " +
231 " \"property-value\": \"\" " +
237 final String relatedToL3Networks = "" +
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 + "\" " +
247 " \"related-to-property\": [{ " +
248 " \"property-key\": \"l3-network.network-name\", " +
249 " \"property-value\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1\" " +
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 + "\" " +
261 " \"related-to-property\": [{ " +
262 " \"property-key\": \"l3-network.network-name\", " +
263 " \"property-value\": \"APPC-24595-T-IST-02AShared_cor_direct_net_1\" " +
268 final String relatedToVlanTags = "" +
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 + "\" " +
278 " \"related-to-property\": [{ " +
279 " \"property-key\": \"vlan-tag.vlan-tag-name\", " +
280 " \"property-value\": \"Behram_smeralda_56\" " +
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 + "\" " +
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 + "\" " +
296 " \"related-to-property\": [{ " +
297 " \"property-key\": \"vlan-tag.vlan-tag-name\", " +
298 " \"property-value\": \"Alexandra_Liron_3\" " +
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\", " +
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\", " +
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, " +
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\" " +
354 " \"relationship-key\": \"service-subscription.service-type\", " +
355 " \"relationship-value\": \"vMOG\" " +
357 " \"relationship-key\": \"service-instance.service-instance-id\", " +
358 " \"relationship-value\": \"" + serviceInstanceId + "\" " +
361 " \"related-to-property\": [{ " +
362 " \"property-key\": \"service-instance.service-instance-name\", " +
363 " \"property-value\": \"Network_repl_vMOG_rk\" " +
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\" " +
375 " \"related-to-property\": [{ " +
376 " \"property-key\": \"vpn-binding.vpn-name\", " +
377 " \"property-value\": \"vMDNS\" " +
379 " \"property-key\": \"vpn-binding.vpn-type\" " +
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\" " +
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\" " +