1 package org.onap.vid.api;
3 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
4 import static org.hamcrest.CoreMatchers.containsString;
5 import static org.hamcrest.CoreMatchers.is;
6 import static org.hamcrest.MatcherAssert.assertThat;
7 import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.defaultPlacement;
8 import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofL3Network;
9 import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofServiceInstance;
10 import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofVlanTag;
11 import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofVnf;
12 import static org.onap.simulator.presetGenerator.presets.aai.PresetBaseAAICustomQuery.FORMAT.SIMPLE;
13 import static org.onap.simulator.presetGenerator.presets.ecompportal_att.EcompPortalPresetsUtils.getEcompPortalPresets;
14 import static org.testng.Assert.assertNotNull;
15 import static org.testng.Assert.assertTrue;
16 import static org.testng.AssertJUnit.assertEquals;
17 import static vid.automation.test.Constants.RegisterToSimulator.SearchForServiceInstance.GET_SUBSCRIBERS_FOR_CUSTOMER_CRAIG_ROBERTS;
18 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND;
19 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET;
20 import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets;
21 import static vid.automation.test.utils.TestHelper.GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS;
23 import com.fasterxml.jackson.core.JsonProcessingException;
24 import com.fasterxml.jackson.databind.JsonNode;
25 import com.fasterxml.jackson.databind.node.ArrayNode;
26 import com.google.common.collect.ImmutableList;
27 import com.google.common.collect.ImmutableMap;
28 import com.google.common.collect.ImmutableMultimap;
29 import java.io.IOException;
30 import java.lang.reflect.Method;
31 import java.net.URISyntaxException;
32 import java.util.List;
33 import java.util.UUID;
34 import net.javacrumbs.jsonunit.JsonAssert;
35 import net.javacrumbs.jsonunit.core.Configuration;
36 import net.javacrumbs.jsonunit.core.Option;
37 import org.apache.commons.text.StringEscapeUtils;
38 import org.apache.http.client.utils.URIBuilder;
39 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
40 import org.onap.simulator.presetGenerator.presets.aai.AAIBaseGetL3NetworksByCloudRegionPreset;
41 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIBadBodyForGetServicesGet;
42 import org.onap.simulator.presetGenerator.presets.aai.PresetAAICloudRegionAndSourceFromConfigurationPut;
43 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId;
44 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetHomingForVfModule;
45 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegion;
46 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest;
47 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing;
48 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetL3NetworksByCloudRegion;
49 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetL3NetworksByCloudRegionSpecificState;
50 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetModelsByOwningEntity;
51 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetNetworkCollectionDetails;
52 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetNetworkCollectionDetailsInvalidRequest;
53 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetNetworkCollectionDetailsRequiredMissing;
54 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetPortMirroringSourcePorts;
55 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetPortMirroringSourcePortsError;
56 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetRelatedInstanceGroupsByVnfId;
57 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet;
58 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetVpnsByType;
59 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIModelVersionsByInvariantId;
60 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet;
61 import org.onap.simulator.presetGenerator.presets.aai.PresetBaseAAICustomQuery;
62 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet;
63 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet;
64 import org.onap.vid.model.aai.AaiResponse;
65 import org.onap.vid.model.mso.OperationalEnvironmentList;
66 import org.onap.vid.more.LoggerFormatTest;
67 import org.onap.vid.more.LoggerFormatTest.LogName;
68 import org.springframework.core.ParameterizedTypeReference;
69 import org.springframework.http.HttpMethod;
70 import org.springframework.http.HttpStatus;
71 import org.springframework.http.ResponseEntity;
72 import org.springframework.web.client.HttpClientErrorException;
73 import org.springframework.web.client.HttpServerErrorException;
74 import org.springframework.web.util.UriComponentsBuilder;
75 import org.testng.AssertJUnit;
76 import org.testng.annotations.DataProvider;
77 import org.testng.annotations.Test;
78 import vid.automation.test.infra.FeatureTogglingTest;
79 import vid.automation.test.infra.Features;
80 import vid.automation.test.services.SimulatorApi;
81 import vid.automation.test.utils.TestHelper;
83 public class AaiApiTest extends BaseApiAaiTest {
85 private static final String AAI_HOMING_DATA_RESPONSE = "viewEdit/aaiHomingDataResponse.json";
86 public static final String GET_OPERATIONAL_ENVIRONMENTS_JSON = "get_operational_environments_aai.json";
87 public static final String GET_OPERATIONAL_ENVIRONMENTS_JSON_ERROR = "get_operational_environments_aai_error.json";
88 public static final String[] AAI_GET_SERVICES_ERROR_SIMULATOR_RESPONSES = {"getServicesAaiErrorResp.json", "create_new_instance/aai_get_full_subscribers.json"};
89 public static final String[] AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES = {"getServicesAaiFineResp.json", "create_new_instance/aai_get_full_subscribers.json"};
90 public static final String AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON = "changeManagement/get_vnf_data_by_globalid_and_service_type.json";
91 public static final String AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON_BY_PARAMS = "registration_to_simulator/changeManagement/get_vnf_data_by_globalid_and_service_type_reduced_response.json";
92 public static final String OPERATIONAL_ENVIRONMENT_TYPE = "VNF";
93 public static final String OPERATIONAL_ENVIRONMENT_STATUS = "Activate";
94 public static final String GET_INSTANCE_GROUPS_BY_CLOUDREGION_EXPECTED_RESPONSE = "{\"results\":[{\"instance-group\":{\"id\":\"AAI-12002-test3-vm230w\",\"description\":\"a9DEa0kpY\",\"instance-group-role\":\"JZmha7QSS4tJ\",\"model-invariant-id\":\"model-id3\",\"model-version-id\":\"a0efd5fc-f7be-4502-936a-a6c6392b958f\",\"instance-group-type\":\"type\",\"resource-version\":\"1520888659539\",\"instance-group-name\":\"wKmBXiO1xm8bK\",\"instance-group-function\":\"testfunction2\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"relatedToPropertyList\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}],\"related-to\":\"cloud-region\",\"related-link\":\"/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/AAI-12002-vm230w/AAI-region-vm230w\",\"relationship-label\":\"org.onap.relationships.inventory.Uses\",\"relationship-data\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"related-to-property\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}]}]}}},{\"instance-group\":{\"id\":\"AAI-12002-test1-vm230w\",\"description\":\"a9DEa0kpY\",\"instance-group-role\":\"JZmha7QSS4tJ\",\"model-invariant-id\":\"model-id1\",\"model-version-id\":\"a0efd5fc-f7be-4502-936a-a6c6392b958f\",\"instance-group-type\":\"type\",\"resource-version\":\"1520886467989\",\"instance-group-name\":\"wKmBXiO1xm8bK\",\"instance-group-function\":\"testfunction2\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"relatedToPropertyList\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}],\"related-to\":\"cloud-region\",\"related-link\":\"/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/AAI-12002-vm230w/AAI-region-vm230w\",\"relationship-label\":\"org.onap.relationships.inventory.Uses\",\"relationship-data\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"related-to-property\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}]}]}}},{\"instance-group\":{\"id\":\"AAI-12002-test2-vm230w\",\"description\":\"a9DEa0kpY\",\"instance-group-role\":\"JZmha7QSS4tJ\",\"model-invariant-id\":\"model-id2\",\"model-version-id\":\"version2\",\"instance-group-type\":\"type\",\"resource-version\":\"1520888629970\",\"instance-group-name\":\"wKmBXiO1xm8bK\",\"instance-group-function\":\"testfunction2\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"relatedToPropertyList\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}],\"related-to\":\"cloud-region\",\"related-link\":\"/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/AAI-12002-vm230w/AAI-region-vm230w\",\"relationship-label\":\"org.onap.relationships.inventory.Uses\",\"relationship-data\":[{\"relationship-key\":\"cloud-region.cloud-owner\",\"relationship-value\":\"AAI-12002-vm230w\"},{\"relationship-key\":\"cloud-region.cloud-region-id\",\"relationship-value\":\"AAI-region-vm230w\"}],\"related-to-property\":[{\"property-key\":\"cloud-region.owner-defined-type\",\"property-value\":null}]}]}}}]}\n";
95 public static final String GET_NETWORK_COLLECTION_EXPECTED_RESPONSE = "{\"results\":{\"collection\":{\"collection-id\":\"collection-1-2018-rs804s\",\"model-invariant-id\":\"5761e0a7-defj777\",\"model-version-id\":\"5761e0a7-defj232\",\"collection-name\":\"collection-name\",\"collection-type\":\"L3-NETWORK\",\"collection-role\":\"SUB-INTERFACE\",\"collection-function\":\"collection-function\",\"collection-customization-id\":\"custom-unique-data-id\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"customer.global-customer-id\",\"relationship-value\":\"customer-1-2017-rs804s\"},{\"relationship-key\":\"service-subscription.service-type\",\"relationship-value\":\"service-value7-rs804s\"},{\"relationship-key\":\"service-instance.service-instance-id\",\"relationship-value\":\"2UJZZ01777-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"service-instance.service-instance-name\",\"property-value\":null}],\"related-to\":\"service-instance\",\"related-link\":\"/aai/v13/business/customers/customer/customer-1-2017-rs804s/service-subscriptions/service-subscription/service-value7-rs804s/service-instances/service-instance/2UJZZ01777-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"customer.global-customer-id\",\"relationship-value\":\"customer-1-2017-rs804s\"},{\"relationship-key\":\"service-subscription.service-type\",\"relationship-value\":\"service-value7-rs804s\"},{\"relationship-key\":\"service-instance.service-instance-id\",\"relationship-value\":\"2UJZZ01777-rs804s\"}],\"related-to-property\":[{\"property-key\":\"service-instance.service-instance-name\",\"property-value\":null}]},{\"relationDataList\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}],\"related-to\":\"instance-group\",\"related-link\":\"/aai/v13/network/instance-groups/instance-group/instanceGroup-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"related-to-property\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}]}]},\"resource-version\":\"1521662811309\"},\"networks\":[{\"network-id\":\"l3network-id-rs804s\",\"network-name\":\"oam-net\",\"network-type\":\"Tenant_Layer_3\",\"network-role\":\"RosemaProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662814627\",\"orchestration-status\":\"Created\",\"is-provider-network\":false,\"is-shared-network\":false,\"is-external-network\":false,\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}],\"related-to\":\"instance-group\",\"related-link\":\"/aai/v13/network/instance-groups/instance-group/instanceGroup-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"related-to-property\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}]}]}},{\"network-id\":\"l3network-id-3-rs804s\",\"network-name\":\"oam-net\",\"network-type\":\"Tenant_Layer_3\",\"network-role\":\"RosemaProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662816043\",\"orchestration-status\":\"Created\",\"is-provider-network\":false,\"is-shared-network\":false,\"is-external-network\":false,\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}],\"related-to\":\"instance-group\",\"related-link\":\"/aai/v13/network/instance-groups/instance-group/instanceGroup-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"related-to-property\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}]}]}},{\"network-id\":\"l3network-id-2-rs804s\",\"network-name\":\"oam-net\",\"network-type\":\"Tenant_Layer_3\",\"network-role\":\"RosemaProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662815304\",\"orchestration-status\":\"Created\",\"is-provider-network\":false,\"is-shared-network\":false,\"is-external-network\":false,\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}],\"related-to\":\"instance-group\",\"related-link\":\"/aai/v13/network/instance-groups/instance-group/instanceGroup-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"instance-group.id\",\"relationship-value\":\"instanceGroup-2018-rs804s\"}],\"related-to-property\":[{\"property-key\":\"instance-group.description\",\"property-value\":\"zr6h\"},{\"property-key\":\"instance-group.instance-group-name\",\"property-value\":\"wKmBXiO1xm8bK\"}]}]}}],\"service-instance\":{\"service-instance-id\":\"2UJZZ01777-rs804s\",\"resource-version\":\"1521662813382\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"collection.collection-id\",\"relationship-value\":\"collection-1-2018-rs804s\"}],\"relatedToPropertyList\":null,\"related-to\":\"collection\",\"related-link\":\"/aai/v13/network/collections/collection/collection-1-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"collection.collection-id\",\"relationship-value\":\"collection-1-2018-rs804s\"}],\"related-to-property\":null}]}},\"instance-group\":{\"id\":\"instanceGroup-2018-rs804s\",\"description\":\"zr6h\",\"instance-group-role\":\"JZmha7QSS4tJ\",\"model-invariant-id\":\"5761e0a7-defj777\",\"model-version-id\":\"5761e0a7-defj22\",\"instance-group-type\":\"7DDjOdNL\",\"resource-version\":\"1521662814023\",\"instance-group-name\":\"wKmBXiO1xm8bK\",\"instance-group-function\":\"testfunction2\",\"relationship-list\":{\"relationship\":[{\"relationDataList\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}],\"related-to\":\"l3-network\",\"related-link\":\"/aai/v13/network/l3-networks/l3-network/l3network-id-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-rs804s\"}],\"related-to-property\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}]},{\"relationDataList\":[{\"relationship-key\":\"collection.collection-id\",\"relationship-value\":\"collection-1-2018-rs804s\"}],\"relatedToPropertyList\":null,\"related-to\":\"collection\",\"related-link\":\"/aai/v13/network/collections/collection/collection-1-2018-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"collection.collection-id\",\"relationship-value\":\"collection-1-2018-rs804s\"}],\"related-to-property\":null},{\"relationDataList\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-3-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}],\"related-to\":\"l3-network\",\"related-link\":\"/aai/v13/network/l3-networks/l3-network/l3network-id-3-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-3-rs804s\"}],\"related-to-property\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}]},{\"relationDataList\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-2-rs804s\"}],\"relatedToPropertyList\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}],\"related-to\":\"l3-network\",\"related-link\":\"/aai/v13/network/l3-networks/l3-network/l3network-id-2-rs804s\",\"relationship-label\":\"org.onap.relationships.inventory.MemberOf\",\"relationship-data\":[{\"relationship-key\":\"l3-network.network-id\",\"relationship-value\":\"l3network-id-2-rs804s\"}],\"related-to-property\":[{\"property-key\":\"l3-network.network-name\",\"property-value\":\"oam-net\"}]}]}}}}\n";
96 public static final String GET_AAI_SERVIES_EXPECTED_RESULT = "{\n" +
97 " \"services\": [{\n" +
98 " \"uuid\": \"20c4431c-246d-11e7-93ae-92361f002671\",\n" +
99 " \"invariantUUID\": \"78ca26d0-246d-11e7-93ae-92361f002671\",\n" +
100 " \"name\": \"vSAMP10aDEV::base::module-0\",\n" +
101 " \"version\": \"2\",\n" +
102 " \"toscaModelURL\": null,\n" +
103 " \"category\": \"resource\",\n" +
104 " \"lifecycleState\": null,\n" +
105 " \"lastUpdaterUserId\": null,\n" +
106 " \"lastUpdaterFullName\": null,\n" +
107 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
108 " \"orchestrationType\": null,\n" +
109 " \"isInstantiationTemplateExists\": false,\n" +
110 " \"artifacts\": null,\n" +
111 " \"resources\": null\n" +
113 " \"uuid\": \"797a6c41-0f80-4d35-a288-3920c4e06baa\",\n" +
114 " \"invariantUUID\": \"5b607929-6088-4614-97ef-cac817508e0e\",\n" +
115 " \"name\": \"CONTRAIL30_L2NODHCP\",\n" +
116 " \"version\": \"1.0\",\n" +
117 " \"toscaModelURL\": null,\n" +
118 " \"category\": \"resource\",\n" +
119 " \"lifecycleState\": null,\n" +
120 " \"lastUpdaterUserId\": null,\n" +
121 " \"lastUpdaterFullName\": null,\n" +
122 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_ERROR\",\n" +
123 " \"orchestrationType\": null,\n" +
124 " \"isInstantiationTemplateExists\": false,\n" +
125 " \"artifacts\": null,\n" +
126 " \"resources\": null\n" +
128 " \"uuid\": \"f1bde010-cc5f-4765-941f-75f15b24f9fc\",\n" +
129 " \"invariantUUID\": \"0143d57b-a517-4de9-a0a1-eb76db51f402\",\n" +
130 " \"name\": \"BkVmxAv061917..base_vPE_AV..module-0\",\n" +
131 " \"version\": \"2\",\n" +
132 " \"toscaModelURL\": null,\n" +
133 " \"category\": \"resource\",\n" +
134 " \"lifecycleState\": null,\n" +
135 " \"lastUpdaterUserId\": null,\n" +
136 " \"lastUpdaterFullName\": null,\n" +
137 " \"orchestrationType\": null,\n" +
138 " \"isInstantiationTemplateExists\": false,\n" +
139 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
140 " \"artifacts\": null,\n" +
141 " \"resources\": null\n" +
143 " \"uuid\": \"ipe-resource-id-ps-02\",\n" +
144 " \"invariantUUID\": \"ipe-resource-id-ps-02\",\n" +
145 " \"name\": \"abc\",\n" +
146 " \"version\": \"v1.0\",\n" +
147 " \"toscaModelURL\": null,\n" +
148 " \"category\": \"resource\",\n" +
149 " \"lifecycleState\": null,\n" +
150 " \"lastUpdaterUserId\": null,\n" +
151 " \"lastUpdaterFullName\": null,\n" +
152 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
153 " \"orchestrationType\": null,\n" +
154 " \"isInstantiationTemplateExists\": false,\n" +
155 " \"artifacts\": null,\n" +
156 " \"resources\": null\n" +
158 " \"uuid\": \"lmoser410-connector-model-version-id\",\n" +
159 " \"invariantUUID\": \"lmoser410-connector-model-id\",\n" +
160 " \"name\": \"connector\",\n" +
161 " \"version\": \"v1.0\",\n" +
162 " \"toscaModelURL\": null,\n" +
163 " \"category\": \"widget\",\n" +
164 " \"lifecycleState\": null,\n" +
165 " \"lastUpdaterUserId\": null,\n" +
166 " \"lastUpdaterFullName\": null,\n" +
167 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
168 " \"orchestrationType\": null,\n" +
169 " \"isInstantiationTemplateExists\": false,\n" +
170 " \"artifacts\": null,\n" +
171 " \"resources\": null\n" +
173 " \"uuid\": \"ff2ae348-214a-11e7-93ae-92361f002673\",\n" +
174 " \"invariantUUID\": \"3a97db99-c4bb-498a-a13a-38f65f1ced3d\",\n" +
175 " \"name\": \"vSAMP10aDEV::base::module-0\",\n" +
176 " \"version\": \"1.0\",\n" +
177 " \"toscaModelURL\": null,\n" +
178 " \"category\": \"resource\",\n" +
179 " \"lifecycleState\": null,\n" +
180 " \"lastUpdaterUserId\": null,\n" +
181 " \"lastUpdaterFullName\": null,\n" +
182 " \"orchestrationType\": null,\n" +
183 " \"isInstantiationTemplateExists\": false,\n" +
184 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
185 " \"artifacts\": null,\n" +
186 " \"resources\": null\n" +
188 " \"uuid\": \"204c641a-3494-48c8-979a-86856f5fd32a\",\n" +
189 " \"invariantUUID\": \"3c504d40-b847-424c-9d25-4fb7e0a3e994\",\n" +
190 " \"name\": \"named-query-element\",\n" +
191 " \"version\": \"1.0\",\n" +
192 " \"toscaModelURL\": null,\n" +
193 " \"category\": \"widget\",\n" +
194 " \"lifecycleState\": null,\n" +
195 " \"lastUpdaterUserId\": null,\n" +
196 " \"lastUpdaterFullName\": null,\n" +
197 " \"orchestrationType\": null,\n" +
198 " \"isInstantiationTemplateExists\": false,\n" +
199 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
200 " \"artifacts\": null,\n" +
201 " \"resources\": null\n" +
203 " \"uuid\": \"acba1f72-c6e0-477f-9426-ad190151e100\",\n" +
204 " \"invariantUUID\": \"93e56950-cb19-44e6-ace4-8b50f2d02e45\",\n" +
205 " \"name\": \"RG_6-19_Test\",\n" +
206 " \"version\": \"1.0\",\n" +
207 " \"toscaModelURL\": null,\n" +
208 " \"category\": \"resource\",\n" +
209 " \"lifecycleState\": null,\n" +
210 " \"lastUpdaterUserId\": null,\n" +
211 " \"lastUpdaterFullName\": null,\n" +
212 " \"orchestrationType\": null,\n" +
213 " \"isInstantiationTemplateExists\": false,\n" +
214 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
215 " \"artifacts\": null,\n" +
216 " \"resources\": null\n" +
218 " \"uuid\": \"fc65e5e7-45c7-488a-b36d-f453ab3057fe\",\n" +
219 " \"invariantUUID\": \"ee448504-ceee-47db-8e1b-742115f219db\",\n" +
220 " \"name\": \"ciServicea268facd387e\",\n" +
221 " \"version\": \"1.0\",\n" +
222 " \"toscaModelURL\": null,\n" +
223 " \"category\": \"service\",\n" +
224 " \"lifecycleState\": null,\n" +
225 " \"lastUpdaterUserId\": null,\n" +
226 " \"lastUpdaterFullName\": null,\n" +
227 " \"orchestrationType\": null,\n" +
228 " \"isInstantiationTemplateExists\": false,\n" +
229 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
230 " \"artifacts\": null,\n" +
231 " \"resources\": null\n" +
233 " \"uuid\": \"027948b6-25e2-4e39-b87d-d9f5797941de\",\n" +
234 " \"invariantUUID\": \"56f2d0d3-7943-4159-bf01-b82692ec035e\",\n" +
235 " \"name\": \"service_sanity_amir\",\n" +
236 " \"version\": \"2.0\",\n" +
237 " \"toscaModelURL\": null,\n" +
238 " \"category\": \"service\",\n" +
239 " \"lifecycleState\": null,\n" +
240 " \"lastUpdaterUserId\": null,\n" +
241 " \"lastUpdaterFullName\": null,\n" +
242 " \"orchestrationType\": null,\n" +
243 " \"isInstantiationTemplateExists\": false,\n" +
244 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
245 " \"artifacts\": null,\n" +
246 " \"resources\": null\n" +
248 " \"uuid\": \"fbf96e3b-1804-4c89-bf5b-53acb7f2edc0\",\n" +
249 " \"invariantUUID\": \"56f2d0d3-7943-4159-bf01-b82692ec035e\",\n" +
250 " \"name\": \"service_sanity_amir\",\n" +
251 " \"version\": \"3.0\",\n" +
252 " \"toscaModelURL\": null,\n" +
253 " \"category\": \"service\",\n" +
254 " \"lifecycleState\": null,\n" +
255 " \"lastUpdaterUserId\": null,\n" +
256 " \"lastUpdaterFullName\": null,\n" +
257 " \"orchestrationType\": null,\n" +
258 " \"isInstantiationTemplateExists\": false,\n" +
259 " \"distributionStatus\": \"DISTRIBUTION_COMPLETE_OK\",\n" +
260 " \"artifacts\": null,\n" +
261 " \"resources\": null\n" +
263 " \"readOnly\": false\n" +
265 private static final String AAI_GET_ACTIVE_NETWORKS = "/aai_get_active_networks";
267 private String getGetOperationEnvironmentsUri() {
268 return uri.toASCIIString() + "/get_operational_environments";
271 private String getAaiServicesUri() {
272 return uri.toASCIIString() + "/rest/models/services";
275 private String getGetOperationEnvironmentUriWithParameters() {
276 String url = getGetOperationEnvironmentsUri();
277 UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
278 // Add query parameter
279 .queryParam("operationalEnvironmentStatus", OPERATIONAL_ENVIRONMENT_STATUS)
280 .queryParam("operationalEnvironmentType", OPERATIONAL_ENVIRONMENT_TYPE);
282 String urlWithParameters = builder.toUriString();
283 return urlWithParameters;
287 private AaiResponse<OperationalEnvironmentList> loginAndDoGetWithUrl(String url) {
288 ResponseEntity<AaiResponse<OperationalEnvironmentList>> responseEntity = restTemplate.exchange(
292 new ParameterizedTypeReference<AaiResponse<OperationalEnvironmentList>>() {});
293 AaiResponse<OperationalEnvironmentList> response = responseEntity.getBody();
298 public void testErrorGetOperationalEnvironments() {
299 //Register required response
300 SimulatorApi.registerExpectation(GET_OPERATIONAL_ENVIRONMENTS_JSON_ERROR, APPEND);
301 String url = getGetOperationEnvironmentsUri();
302 AaiResponse<OperationalEnvironmentList> response = loginAndDoGetWithUrl(url);
303 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR.value(), response.getHttpCode());
304 assertEquals("simulated error text", response.getErrorMessage());
309 //This test requires a simulator which runs on VID
311 public void testSuccessGetOperationalEnvironments() {
312 //Register required response
313 String uuidOfOperationalEnvironment = "f07ca256-96dd-40ad-b4d2-7a77e2a974ed";
314 SimulatorApi.registerExpectation(GET_OPERATIONAL_ENVIRONMENTS_JSON, ImmutableMap.of("UUID_of_Operational_Environment", uuidOfOperationalEnvironment), APPEND);
315 String url = getGetOperationEnvironmentUriWithParameters();
316 AaiResponse<OperationalEnvironmentList> response = loginAndDoGetWithUrl(url);
317 assertEquals(HttpStatus.OK.value(), response.getHttpCode());
318 OperationalEnvironmentList list = response.getT();
319 assertNotNull(list.getOperationalEnvironment());
320 assertEquals(2, list.getOperationalEnvironment().size());
321 assertEquals(uuidOfOperationalEnvironment, list.getOperationalEnvironment().get(0).getOperationalEnvironmentId());
322 assertEquals(1, list.getOperationalEnvironment().get(0).getRelationshipList().getRelationship().size());
325 @Test(dataProvider = "errorCodes")
326 public void getServicesWitErrorResponse(int errorCode) throws IOException, URISyntaxException {
327 TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri);
328 final String expectedResult = "{\"services\":[],\"readOnly\":false}";
330 callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_ERROR_SIMULATOR_RESPONSES,
331 ImmutableMap.of("500", Integer.toString(errorCode), "ERROR_PAYLOAD", StringEscapeUtils.escapeJson(expectedResult)),
332 getAaiServicesUri(), "", 200, expectedResult, HttpMethod.GET);
337 public void getServicesFineRequest() throws IOException, URISyntaxException {
338 TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri);
339 callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES,
341 getAaiServicesUri(), "", 200, GET_AAI_SERVIES_EXPECTED_RESULT, HttpMethod.GET);
345 public void whenGetServicesErrorResponse_badResponseIsNotCached() throws IOException, URISyntaxException {
346 TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri);
349 final String expectedErrorResult = "{\"services\":[],\"readOnly\":false}";
350 //call AAI with bad response by clear exceptions from simulator, bad response shall not be cached
351 callAaiWithSimulatedErrorResponse(new String[]{}, ImmutableMap.of(), getAaiServicesUri(), "", 200, expectedErrorResult, HttpMethod.GET);
353 //call AAI with fine response
354 callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES,
356 getAaiServicesUri(), "", 200, GET_AAI_SERVIES_EXPECTED_RESULT, HttpMethod.GET);
360 public static Object[][] errorCodes(Method test) {
361 return new Object[][]{
362 {500},{505}, {400}, {401}, {405}
367 public void whenThrowExceptionInsAaiResponseErrorAreLogged() {
368 String notAJson = "not a json";
369 SimulatorApi.registerExpectationFromPreset(new PresetAAIBadBodyForGetServicesGet(notAJson), CLEAR_THEN_SET);
370 SimulatorApi.registerExpectationFromPresets(getEcompPortalPresets(), APPEND);
371 SimulatorApi.registerExpectationFromPreset(new PresetAAIGetSubscribersGet(), APPEND);
373 restTemplateErrorAgnostic.getForEntity(uri + "/aai_get_services", String.class);
374 String logLines = LoggerFormatTest.getLogLines(LogName.error, 15, 0, restTemplate, uri);
376 assertThat("not found in error log", logLines, containsString("Failed to parse aai response"));
377 assertThat("not found in error log", logLines, containsString(notAJson));
378 assertThat("not found in error log", logLines, containsString("GetServicesAAIRespone"));
383 public void portMirroringConfigData_givenValidAaiResponse_yieldCloudRegionId() {
384 SimulatorApi.registerExpectationFromPreset(new PresetAAICloudRegionAndSourceFromConfigurationPut("SOME-RANDOM-UUID", "THE-EXPECTED-REGION-ID"), CLEAR_THEN_SET);
386 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringConfigsData?configurationIds=" + "SOME-RANDOM-UUID", String.class);
388 final ImmutableMap<String, ImmutableMap<String, String>> expected = ImmutableMap.of(
389 "SOME-RANDOM-UUID", ImmutableMap.of(
390 "cloudRegionId", "THE-EXPECTED-REGION-ID"
393 assertResponse(expected, response);
397 [ ] Error responses from AAI (404 etc): descriptive error response, including what tried and what happened
398 [ ] malformed response from AAI: descriptive error response, including the payload
399 [ ] empty/missing value for configurationId: client-error http code
405 public void portMirroringSourcePorts_validAAIResponseWithSinglePort_yieldCorrectPortData() {
406 SimulatorApi.registerExpectationFromPreset(
407 new PresetAAIGetPortMirroringSourcePorts("CONFIGURATION-ID", "INTERFACE-ID", "INTERFACE-NAME", true),
411 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringSourcePorts?configurationIds=" + "CONFIGURATION-ID", String.class);
413 final ImmutableMap<String, ImmutableList> expected = ImmutableMap.of(
414 "CONFIGURATION-ID", ImmutableList.of(ImmutableMap.of(
415 "interfaceId", "INTERFACE-ID", "interfaceName", "INTERFACE-NAME", "isPortMirrored", true
418 assertResponse(expected, response);
422 public void portMirroringSourcePorts_nullValueForInterfaceId_yield200OkWithFineDescription() {
423 final PresetAAIGetPortMirroringSourcePorts preset = new PresetAAIGetPortMirroringSourcePorts("CONFIGURATION-ID", null, "INTERFACE-NAME", true);
424 SimulatorApi.registerExpectationFromPreset(
429 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringSourcePorts?configurationIds=" + "CONFIGURATION-ID", String.class);
431 final ImmutableMap<String, ImmutableList<ImmutableMap>> expected = ImmutableMap.of(
432 "CONFIGURATION-ID", ImmutableList.of(ImmutableMap.of(
433 "errorDescription", "Value of 'interface-id' is missing.",
434 "rawAaiResponse", preset.getResponseBody().toString()
437 assertResponse(expected, response);
441 public void portMirroringSourcePorts_given503ErrorAaiResponse_yield200OkWithErrorMsg() {
442 final PresetAAIGetPortMirroringSourcePortsError preset = new PresetAAIGetPortMirroringSourcePortsError("CONFIGURATION-ID", "INTERFACE-ID", "INTERFACE-NAME", true);
443 SimulatorApi.registerExpectationFromPreset(
448 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringSourcePorts?configurationIds=" + "CONFIGURATION-ID", String.class);
450 final ImmutableMap<String, ImmutableList<ImmutableMap>> expected = ImmutableMap.of(
451 "CONFIGURATION-ID", ImmutableList.of(ImmutableMap.of(
452 "errorDescription", "Got 503 from aai",
453 "rawAaiResponse", preset.getResponseBody()
456 assertResponse(expected, response);
460 public void portMirroringConfigData_given404ErrorAaiResponse_yield200OkWithErrorMsg() {
461 SimulatorApi.clearAll();
463 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringConfigsData?configurationIds=" + "SOME-RANDOM-UUID", String.class);
465 final ImmutableMap<String, ImmutableMap<String, String>> expected = ImmutableMap.of(
466 "SOME-RANDOM-UUID", ImmutableMap.of(
467 "errorDescription", "Got 404 from aai",
471 assertResponse(expected, response);
475 public void getNetworkCollectionDetailsByServiceInstanceId_yieldValidResponse() {
476 SimulatorApi.clearAll();
477 final PresetAAIGetNetworkCollectionDetails presetAAIGetNetworkCollectionDetails = new PresetAAIGetNetworkCollectionDetails("SOME-RANDOM-UUID");
478 SimulatorApi.registerExpectationFromPreset(presetAAIGetNetworkCollectionDetails, CLEAR_THEN_SET);
479 final String response = restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class);
481 assertResponse(GET_NETWORK_COLLECTION_EXPECTED_RESPONSE, response);
485 public void getNetworkCollectionDetailsByServiceInstanceId_responseWithExtraFields_yieldValidResponse() {
486 SimulatorApi.clearAll();
487 final PresetAAIGetNetworkCollectionDetailsInvalidRequest presetAAIGetNetworkCollectionDetails = new PresetAAIGetNetworkCollectionDetailsInvalidRequest("SOME-RANDOM-UUID");
488 SimulatorApi.registerExpectationFromPreset(presetAAIGetNetworkCollectionDetails, CLEAR_THEN_SET);
489 final String response = restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class);
491 assertResponse(GET_NETWORK_COLLECTION_EXPECTED_RESPONSE, response);
495 public void getNetworkCollectionDetailsByServiceInstanceId_given404ErrorAaiResponse_yield200OkWithErrorMsg() {
496 SimulatorApi.clearAll();
498 restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class);
499 } catch (HttpClientErrorException e) {
500 assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode());
505 public void getNetworkCollectionDetailsByServiceInstanceId_responseWithRequiredMissing() {
506 SimulatorApi.clearAll();
507 final PresetAAIGetNetworkCollectionDetailsRequiredMissing presetAAIGetNetworkCollectionDetails = new PresetAAIGetNetworkCollectionDetailsRequiredMissing("SOME-RANDOM-UUID");
508 SimulatorApi.registerExpectationFromPreset(presetAAIGetNetworkCollectionDetails, CLEAR_THEN_SET);
510 restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class);
511 } catch (HttpServerErrorException e) {
512 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatusCode());
517 public void getGetInstanceGroupsByCloudRegion_yieldValidResponse() {
518 SimulatorApi.clearAll();
519 final PresetAAIGetInstanceGroupsByCloudRegion presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegion("CLOUD%20OWNER", "CLOUD-REGION-ID", "NETWORK%20FUNCTION");
520 SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET);
521 final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK FUNCTION", String.class);
523 assertResponse(GET_INSTANCE_GROUPS_BY_CLOUDREGION_EXPECTED_RESPONSE, response);
527 public void getGetInstanceGroupsByCloudRegion_responseWithExtraFields_yieldValidResponse() {
528 SimulatorApi.clearAll();
529 final PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest("CLOUD-OWNER", "CLOUD-REGION-ID", "NETWORK-FUNCTION");
530 SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET);
531 final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class);
533 assertResponse(GET_INSTANCE_GROUPS_BY_CLOUDREGION_EXPECTED_RESPONSE, response);
537 public void getGetInstanceGroupsByCloudRegion_given404ErrorAaiResponse_yield200OkWithErrorMsg() {
538 SimulatorApi.clearAll();
540 restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class);
541 } catch (HttpClientErrorException e) {
542 assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode());
547 public void getGetInstanceGroupsByCloudRegion_responseWithRequiredMissing() {
548 SimulatorApi.clearAll();
549 final PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing("CLOUD-OWNER", "CLOUD-REGION-ID", "NETWORK-FUNCTION");
550 SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET);
552 restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class);
553 } catch (HttpServerErrorException e) {
554 assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatusCode());
559 public void portMirroringConfigData_emptyIdOnAaiResponse_yieldError() {
560 final PresetAAICloudRegionAndSourceFromConfigurationPut presetAAIResponseWitnProblem = new PresetAAICloudRegionAndSourceFromConfigurationPut("SOME-RANDOM-UUID", "");
561 SimulatorApi.registerExpectationFromPreset(presetAAIResponseWitnProblem, CLEAR_THEN_SET);
563 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringConfigsData?configurationIds=" + "SOME-RANDOM-UUID", String.class);
565 final ImmutableMap<String, ImmutableMap<String, String>> expected = ImmutableMap.of(
566 "SOME-RANDOM-UUID", ImmutableMap.of(
567 "errorDescription", "Node 'properties.cloud-region-id' of node-type 'cloud-region' is blank",
568 "rawAaiResponse", presetAAIResponseWitnProblem.getResponseBody().toString().replace(" ", "")
571 assertResponse(expected, response);
575 public void getGetRelatedInstanceGroupsByVnfId__yieldValidResponse() {
576 String vnfId = "some_vnf_id";
577 final PresetAAIGetRelatedInstanceGroupsByVnfId getRelatedInstanceGroupsByVnfId = new PresetAAIGetRelatedInstanceGroupsByVnfId(vnfId);
578 SimulatorApi.registerExpectationFromPreset(getRelatedInstanceGroupsByVnfId, CLEAR_THEN_SET);
580 final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_vnf_instance_id/" + vnfId,
583 assertResponse("[{\"type\":\"instance-group\",\"name\":\"instance group name\"},{\"type\":\"instance-group\",\"name\":\"instance group name\"}]", response);
587 public void getHomingDataForVfModule(){
588 String vnfId= "0846287b-65bf-45a6-88f6-6a1af4149fac", vfModuleId= "a9b70ac0-5917-4203-a308-0e6920e6d09b";
589 SimulatorApi.registerExpectationFromPreset(new PresetAAIGetHomingForVfModule(vnfId,vfModuleId), CLEAR_THEN_SET);
590 final String response = restTemplate.getForObject(uri + "/aai_get_homing_by_vfmodule/"+ vnfId +"/"+vfModuleId, String.class);
591 String exectedResponse = TestUtils.convertRequest(objectMapper, AAI_HOMING_DATA_RESPONSE);
592 assertResponse(exectedResponse,response);
596 public void getGetRelatedInstanceGroupsByVnfId__yield404NotFound() {
597 final PresetAAIGetRelatedInstanceGroupsByVnfId getRelatedInstanceGroupsByVnfId = new PresetAAIGetRelatedInstanceGroupsByVnfId("abcd");
598 SimulatorApi.registerExpectationFromPreset(getRelatedInstanceGroupsByVnfId, CLEAR_THEN_SET);
600 restTemplate.getForObject(uri + "/aai_get_instance_groups_by_vnf_instance_id/" + "dcba", String.class);
601 } catch (HttpClientErrorException e) {
602 assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode());
608 public void portMirroringConfigData_twoResponsesOneValidAndOneInvalid_yieldBothErrorAndOk() {
609 final PresetAAICloudRegionAndSourceFromConfigurationPut presetAAIResponseWitnProblem = new PresetAAICloudRegionAndSourceFromConfigurationPut("ANOTHER-RANDOM-UUID", "");
610 SimulatorApi.registerExpectationFromPreset(presetAAIResponseWitnProblem, CLEAR_THEN_SET);
611 SimulatorApi.registerExpectationFromPreset(new PresetAAICloudRegionAndSourceFromConfigurationPut("SOME-RANDOM-UUID", "THE-EXPECTED-REGION-ID"), APPEND);
613 final String response = restTemplate.getForObject(uri + "/aai_getPortMirroringConfigsData?configurationIds=" + "SOME-RANDOM-UUID,ANOTHER-RANDOM-UUID", String.class);
615 final ImmutableMap<String, ImmutableMap<String, Object>> expected = ImmutableMap.of(
616 "SOME-RANDOM-UUID", ImmutableMap.of(
617 "cloudRegionId", "THE-EXPECTED-REGION-ID"
619 "ANOTHER-RANDOM-UUID", ImmutableMap.of(
620 "errorDescription", "Node 'properties.cloud-region-id' of node-type 'cloud-region' is blank",
621 "rawAaiResponse", presetAAIResponseWitnProblem.getResponseBody().toString().replace(" ", "")
624 assertResponse(expected, response);
628 @FeatureTogglingTest(Features.FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS)
629 public void networksToVlans_simpleRequest_responseIsCorrect() {
630 // Prepare randomized values
631 // Some of these random values are persisted to match with the
632 // cypress preset "aaiGetNetworksToVlansByServiceInstance.json".
633 String globalCustomerId = UUID.randomUUID().toString();
634 String sdcModelUuid = "5a3ad576-c01d-4bed-8194-0e72b4a3d020";
635 String serviceType = "vMOG";
636 int vlanIdOuter = 34612;
637 int vlanIdOuter2 = 8568012;
638 int vlanIdOuter3 = 4;
640 // build hierarchical presets:
651 PresetAAIStandardQueryGet vlanTagPreset1 = ofVlanTag(vlanIdOuter);
652 PresetAAIStandardQueryGet vlanTagPreset2 = ofVlanTag(vlanIdOuter2);
653 PresetAAIStandardQueryGet vlanTagPreset3 = ofVlanTag(vlanIdOuter3);
655 PresetAAIStandardQueryGet l3NetworkPreset1 = ofL3Network("7989a6d2-ba10-4a5d-8f15-4520bc833090", "DDDEEEFFF", "Provider Network",
656 ImmutableMultimap.of("vlan-tag", vlanTagPreset1.getReqPath(), "vlan-tag", vlanTagPreset2.getReqPath()), "Failed");
657 PresetAAIStandardQueryGet l3NetworkPreset2 = ofL3Network("e8e2332e-1f84-4237-bc97-3b5b842f52e4","GGGHHHIII", "Network",
658 ImmutableMultimap.of("vlan-tag", vlanTagPreset3.getReqPath()), "Assigned");
660 PresetAAIStandardQueryGet serviceInstance = ofServiceInstance("9cdd1b2a-43a7-47bc-a88e-759ba2399f0b",
661 "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "6e59c5de-f052-46fa-aa7e-2fca9d674c44", globalCustomerId, serviceType,
662 ImmutableMultimap.of("l3-network", l3NetworkPreset1.getReqPath(), "l3-network", l3NetworkPreset2.getReqPath()));
664 SimulatorApi.registerExpectationFromPresets(ImmutableList.of(
665 serviceInstance, l3NetworkPreset1, l3NetworkPreset2, vlanTagPreset1, vlanTagPreset2, vlanTagPreset3,
666 new PresetSDCGetServiceMetadataGet(sdcModelUuid, UUID.randomUUID().toString(), "service-vl-with-5g-network-provider-alacarte.zip"),
667 new PresetSDCGetServiceToscaModelGet(sdcModelUuid, "service-vl-with-5g-network-provider-alacarte.zip")
671 final String response = restTemplate.getForObject(uri + "/aai/standardQuery/vlansByNetworks"
672 + "?serviceInstanceId=" + serviceInstance.getInstanceId()
673 + "&serviceType=" + serviceType
674 + "&globalCustomerId=" + globalCustomerId
675 + "&sdcModelUuid=" + sdcModelUuid
678 assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER),
679 getResourceAsString("serviceWithNetwork/aaiGetNetworksToVlansByServiceInstance.json"),
684 @FeatureTogglingTest(Features.FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS)
685 public void networksWithVlansToVnf_simpleRequest_responseIsCorrect() {
686 // Prepare randomized values
687 // Some of these random values are persisted to match with the
688 // cypress preset "aaiGetNetworksWithVlansToVnfByServiceInstance.json".
689 String globalCustomerId = UUID.randomUUID().toString();
690 String sdcModelUuid = "5a3ad576-c01d-4bed-8194-0e72b4a3d020";
691 String serviceType = "vMOG";
692 int vlanIdOuter = 34123;
693 int vlanIdOuter2 = 65540;
694 int vlanIdOuter3 = 12345;
695 int vlanIdOuter4 = 67890;
696 int vlanIdOuter5 = 417695;
697 int vlanIdOuter6 = 783243;
699 // build hierarchical presets:
716 PresetAAIStandardQueryGet vlanTagPreset1 = ofVlanTag(vlanIdOuter);
717 PresetAAIStandardQueryGet vlanTagPreset2 = ofVlanTag(vlanIdOuter2);
718 PresetAAIStandardQueryGet vlanTagPreset3 = ofVlanTag(vlanIdOuter3);
719 PresetAAIStandardQueryGet vlanTagPreset4 = ofVlanTag(vlanIdOuter4);
720 PresetAAIStandardQueryGet vlanTagPreset5 = ofVlanTag(vlanIdOuter5);
721 PresetAAIStandardQueryGet vlanTagPreset6 = ofVlanTag(vlanIdOuter6);
723 PresetAAIStandardQueryGet l3NetworkPreset1 = ofL3Network("36517f3d-2bc2-48f5-aaf8-418520c54330","AAAAABBBBCCCC", "Provider Network",
724 ImmutableMultimap.of("vlan-tag", vlanTagPreset1.getReqPath(), "vlan-tag", vlanTagPreset2.getReqPath()), "Assigned");
726 PresetAAIStandardQueryGet l3NetworkPreset2 = ofL3Network("12347f3d-2bc2-48f5-aaf8-418520c54330","DDDEEEE", "Provider Network",
727 ImmutableMultimap.of("vlan-tag", vlanTagPreset3.getReqPath(), "vlan-tag", vlanTagPreset4.getReqPath()), "Created");
729 PresetAAIStandardQueryGet vnfPreset1 = ofVnf("c015cc0f-0f37-4488-aabf-53795fd93cd3",
730 ImmutableMultimap.of("l3-network", l3NetworkPreset1.getReqPath() , "l3-network", l3NetworkPreset2.getReqPath()),
733 PresetAAIStandardQueryGet l3NetworkPreset3 = ofL3Network("12aa7f3d-2bc2-48f5-aaf8-418520c54330","XXXYYYZZZ", "Network",
734 ImmutableMultimap.of("vlan-tag", vlanTagPreset5.getReqPath(), "vlan-tag", vlanTagPreset6.getReqPath()), "Created");
736 PresetAAIStandardQueryGet vnfPreset2 = ofVnf("c55da606-cf38-42c7-bc3c-be8e23b19299", ImmutableMultimap.of("l3-network", l3NetworkPreset3.getReqPath()),
739 PresetAAIStandardQueryGet serviceInstance = ofServiceInstance("9cdd1b2a-43a7-47bc-a88e-759ba2399f0b",
740 "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "6e59c5de-f052-46fa-aa7e-2fca9d674c44", globalCustomerId, serviceType,
741 ImmutableMultimap.of("generic-vnf", vnfPreset1.getReqPath(), "generic-vnf", vnfPreset2.getReqPath()));
743 SimulatorApi.registerExpectationFromPresets(ImmutableList.of(
744 serviceInstance, vnfPreset1, vnfPreset2, l3NetworkPreset1, l3NetworkPreset2, l3NetworkPreset3, vlanTagPreset1, vlanTagPreset2, vlanTagPreset3, vlanTagPreset4, vlanTagPreset5, vlanTagPreset6,
745 new PresetSDCGetServiceMetadataGet(sdcModelUuid, UUID.randomUUID().toString(), "service-vl-with-5g-network-provider-alacarte.zip"),
746 new PresetSDCGetServiceToscaModelGet(sdcModelUuid, "service-vl-with-5g-network-provider-alacarte.zip")
750 final String response = restTemplate.getForObject(uri + "/aai/standardQuery/vlansByNetworks"
751 + "?serviceInstanceId=" + serviceInstance.getInstanceId()
752 + "&serviceType=" + serviceType
753 + "&globalCustomerId=" + globalCustomerId
754 + "&sdcModelUuid=" + sdcModelUuid
757 assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER),
758 getResourceAsString("serviceWithNetwork/aaiGetNetworksWithVlansToVnfByServiceInstance.json"),
762 @FeatureTogglingTest(value = Features.FLAG_FLASH_REDUCED_RESPONSE_CHANGEMG, flagActive = false)
764 public void getVnfDataByGlobalIdAndServiceType() {
766 SimulatorApi.registerExpectationFromPreset(new PresetBaseAAICustomQuery(
768 "business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/vRichardson/service-instances",
769 "query/vnf-topology-fromServiceInstance"
772 public Object getResponseBody() {
773 return getResourceAsString(
774 "registration_to_simulator/changeManagement/get_vnf_data_by_globalid_and_service_type_response.json");
778 String url = uri + "/get_vnf_data_by_globalid_and_service_type/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/vRichardson";
780 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
782 assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER),
783 getResourceAsString("registration_to_simulator/changeManagement/get_vnf_data_by_globalid_and_service_type_response.json"),
788 public void whenCallAaiThroughAAIRestInterface_thenRequestRecordedInMetricsLog() {
789 registerExpectationFromPresets(ImmutableList.of(
790 new PresetAAIGetVpnsByType(),
791 new PresetAAIGetSubscribersGet()
793 String internalPath = "/aai_get_vpn_list";
794 String url = uri + internalPath;
795 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
796 final String requestId = response.getHeaders().getFirst("X-ECOMP-RequestID-echo");
797 LoggerFormatTest.assertHeadersAndMetricLogs(restTemplate, uri, requestId,"/network/vpn-bindings" , 1);
798 LoggerFormatTest.verifyExistenceOfIncomingReqsInAuditLogs(restTemplate, uri, requestId, internalPath);
802 public void getVpnList() {
803 SimulatorApi.registerExpectationFromPreset(new PresetAAIGetVpnsByType(), CLEAR_THEN_SET);
804 String url = uri + "/aai_get_vpn_list";
805 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
806 String expected = getResourceAsString("viewEdit/aaiGetVpnList.json");
807 assertThat(response.getBody(), jsonEquals(expected).when(Option.IGNORING_ARRAY_ORDER).when(Option.IGNORING_EXTRA_FIELDS));
811 public static Object[][] getActiveNetworkAaiStates() {
812 return new Object[][] {
813 {1, "viewEdit/aaiGetActiveNetworks.json"},
814 {2, "viewEdit/aaiGetActiveNetworks2.json"}
818 @Test(dataProvider = "getActiveNetworkAaiStates")
819 public void getActiveNetworks_givenSpecificAAIState_cypressPresetMatch(int state, String expectedResultFileName) {
820 SimulatorApi.registerExpectationFromPresets(ImmutableList.of(
821 new PresetAAIGetL3NetworksByCloudRegionSpecificState(state),
822 PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AUK51A_TO_ATT_NC
824 String url = uri + AAI_GET_ACTIVE_NETWORKS
825 + "?cloudRegion=" + AAIBaseGetL3NetworksByCloudRegionPreset.DEFAULT_CLOUD_REGION_ID
826 + "&tenantId=" + AAIBaseGetL3NetworksByCloudRegionPreset.DEFAULT_TENANT_ID;
827 String response = restTemplate.getForObject(url, String.class);
828 System.out.println("response = " + response);
829 String expected = getResourceAsString(expectedResultFileName);
830 assertThat(response, jsonEquals(expected));
834 public void getActiveNetworks() throws JsonProcessingException {
835 String networkRole = "Some role";
836 PresetAAIGetL3NetworksByCloudRegion presetAAIGetL3NetworksByCloudRegion = new PresetAAIGetL3NetworksByCloudRegion(networkRole);
837 List<BasePreset> presets = ImmutableList.of(
838 presetAAIGetL3NetworksByCloudRegion,
839 PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AUK51A_TO_ATT_NC
841 SimulatorApi.registerExpectationFromPresets(presets, CLEAR_THEN_SET);
842 String url = uri + AAI_GET_ACTIVE_NETWORKS +
843 "?cloudRegion=" + presetAAIGetL3NetworksByCloudRegion.getCloudRegionId() +
844 "&tenantId=" + presetAAIGetL3NetworksByCloudRegion.getTenantId() +
845 "&networkRole=" + networkRole;
846 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
848 assertResponse(JsonAssert.when(Option.IGNORING_EXTRA_FIELDS, Option.IGNORING_ARRAY_ORDER),
849 presetAAIGetL3NetworksByCloudRegion.getActiveNetworksWithNameAndRelatedToVpnBindingAsJsonString(),
854 public void getNewestModelVersionByInvariant() throws JsonProcessingException {
855 String invariantId = "f6342be5-d66b-4d03-a1aa-c82c3094c4ea";
857 SimulatorApi.registerExpectationFromPreset(new PresetAAIModelVersionsByInvariantId(), CLEAR_THEN_SET );
860 "/aai_get_newest_model_version_by_invariant/" + invariantId;
861 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
863 assertTrue(response.toString().contains("the-newest-version"));
867 public void getNewestModelVersionByInvariant_modelNotExist_thenEmptyResponse() {
868 String invariantId = "f6342be5-d66b-4d03-a1aa-c82c3094c4ea";
870 SimulatorApi.registerExpectationFromPreset(new PresetAAIModelVersionsByInvariantId(), CLEAR_THEN_SET );
873 "/aai_get_newest_model_version_by_invariant/" + "model-not-exist";
874 ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
876 assertTrue(response.getStatusCode().is2xxSuccessful());
877 AssertJUnit.assertNull(response.getBody());
881 @FeatureTogglingTest(Features.FLAG_FLASH_REDUCED_RESPONSE_CHANGEMG)
882 public void getVnfsWithCustomQueryNewReducedResponse() throws URISyntaxException {
884 String globalCustomerId = "globalCustomerId1-360-as988q";
885 String serviceType = "TEST1-360";
886 String nfRole = "test360";
887 SimulatorApi.registerExpectationFromPreset(new PresetBaseAAICustomQuery(
889 "/business/customers/customer/" + globalCustomerId + "/service-subscriptions/service-subscription/"
890 + serviceType + "/service-instances",
891 "query/vnfs-fromServiceInstance-filter?nfRole=" + nfRole
894 public Object getResponseBody() {
895 return getResourceAsString(
896 AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON_BY_PARAMS);
899 URIBuilder urlBuilder = new URIBuilder(uri + "/get_vnf_data_by_globalid_and_service_type/" + globalCustomerId + "/" + serviceType);
900 urlBuilder.addParameter("nfRole", nfRole);
901 ResponseEntity<String> response = restTemplate.getForEntity(urlBuilder.build().toString(), String.class);
902 assertTrue(response.getStatusCode().is2xxSuccessful());
903 assertThat(response.getBody(), jsonEquals(getResourceAsString(AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON_BY_PARAMS)));
907 public void searchServiceInstancesBySubscriber_serviceInstanceOfAnotherSubscriber_authIsFollowingFeatureToggle() {
908 String craigRobertsSubscriberId = "31739f3e-526b-11e6-beb8-9e71128cae77";
909 String aServiceOwningEntityId = "f160c875-ddd1-4ef5-84d8-d098784daa3a";
910 String currentUserAuthorizedOwningEntityId = "SILVIA ROBBINS"; // this will need to change with translateOwningEntityNameToOwningEntityId
912 SimulatorApi.registerExpectation(GET_SUBSCRIBERS_FOR_CUSTOMER_CRAIG_ROBERTS,
913 ImmutableMap.of(aServiceOwningEntityId, currentUserAuthorizedOwningEntityId), CLEAR_THEN_SET);
915 searchServicesAndAssertIsPermitted("subscriberId=" + craigRobertsSubscriberId, "4ea864f2-b946-473a-b51c-51a7c10b8391");
919 public void searchServiceInstancesByOwningEntity_serviceInstanceOfAnotherSubscriber_authIsFollowingFeatureToggle() {
920 String owningEntityName = "someOwning";
921 String owningEntityId = "SILVIA ROBBINS"; // this will need to change with translateOwningEntityNameToOwningEntityId
923 SimulatorApi.registerExpectationFromPreset(new PresetAAIGetModelsByOwningEntity(owningEntityName, owningEntityId, "fakeSubscriberId"), CLEAR_THEN_SET);
925 searchServicesAndAssertIsPermitted("owningEntity=" + owningEntityName, "af9d52f9-13b2-4657-a198-463677f82dc0");
928 private void searchServicesAndAssertIsPermitted(String queryParams, String aServiceInstanceId) {
929 boolean expectedPermission = Features.FLAG_2006_USER_PERMISSIONS_BY_OWNING_ENTITY.isActive();
931 SimulatorApi.registerExpectationFromPreset(new PresetAAIGetSubscribersGet(), APPEND);
933 JsonNode serviceInstancesResult = restTemplate
934 .getForObject(uri + "/search_service_instances?" + queryParams, JsonNode.class);
936 assertThat(serviceInstancesResult.path("service-instances").isArray(), is(true));
938 ArrayNode servicesArray = ((ArrayNode) serviceInstancesResult.path("service-instances"));
940 JsonNode aServiceResult = Streams.fromIterator(servicesArray.iterator())
941 .filter(it -> it.path("serviceInstanceId").asText().equals(aServiceInstanceId))
943 .orElseThrow(() -> new AssertionError("could not find serviceInstanceId=" + aServiceInstanceId));
945 assertThat(aServiceResult.toString(),
946 aServiceResult.path("isPermitted").booleanValue(), is(expectedPermission));
949 private void assertResponse(Object expected, String response) {
950 assertResponse(Configuration.empty(), expected, response);
953 private void assertResponse(Configuration configuration, Object expected, String response) {
955 JsonAssert.assertJsonEquals(expected, response, configuration);
956 } catch (Exception | AssertionError e) {
957 System.err.println("response was: " + response);