diff options
Diffstat (limited to 'vid-automation/src/test/java/org/onap/vid/api')
23 files changed, 2630 insertions, 1012 deletions
diff --git a/vid-automation/src/test/java/org/onap/vid/api/AaiApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/AaiApiTest.java index 7d558940d..952aa522d 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/AaiApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/AaiApiTest.java @@ -1,12 +1,33 @@ package org.onap.vid.api; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofL3Network; +import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofServiceInstance; +import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofVlanTag; +import static org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet.ofVnf; +import static org.onap.simulator.presetGenerator.presets.ecompportal_att.EcompPortalPresetsUtils.getEcompPortalPresets; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; +import static vid.automation.test.utils.TestHelper.GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS; + import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.util.UUID; import net.javacrumbs.jsonunit.JsonAssert; +import net.javacrumbs.jsonunit.core.Configuration; +import net.javacrumbs.jsonunit.core.Option; import org.apache.commons.text.StringEscapeUtils; -import org.codehaus.jackson.map.ObjectMapper; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIBadBodyForGetServicesGet; import org.onap.simulator.presetGenerator.presets.aai.PresetAAICloudRegionAndSourceFromConfigurationPut; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetHomingForVfModule; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegion; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing; @@ -17,6 +38,9 @@ import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetPortMirroringS import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetPortMirroringSourcePortsError; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetRelatedInstanceGroupsByVnfId; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIStandardQueryGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; import org.onap.vid.model.aai.AaiResponse; import org.onap.vid.model.mso.OperationalEnvironmentList; import org.onap.vid.more.LoggerFormatTest; @@ -29,31 +53,23 @@ import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.util.UriComponentsBuilder; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +import vid.automation.test.infra.FeatureTogglingTest; +import vid.automation.test.infra.Features; import vid.automation.test.services.SimulatorApi; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.net.URISyntaxException; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.*; -import static org.onap.simulator.presetGenerator.presets.ecompportal_att.EcompPortalPresetsUtils.getEcompPortalPresets; -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND; -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; +import vid.automation.test.utils.TestHelper; public class AaiApiTest extends BaseApiAaiTest { - + private static final String AAI_HOMING_DATA_RESPONSE = "viewEdit/aaiHomingDataResponse.json"; public static final String GET_OPERATIONAL_ENVIRONMENTS_JSON = "get_operational_environments_aai.json"; public static final String GET_OPERATIONAL_ENVIRONMENTS_JSON_ERROR = "get_operational_environments_aai_error.json"; - public static final String[] AAI_GET_SERVICES_ERROR_SIMULATOR_RESPONSES = {"getServicesAaiErrorResp.json", "aai_get_full_subscribers.json"}; - public static final String[] AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES = {"getServicesAaiFineResp.json", "aai_get_full_subscribers.json"}; - + public static final String[] AAI_GET_SERVICES_ERROR_SIMULATOR_RESPONSES = {"getServicesAaiErrorResp.json", "create_new_instance/aai_get_full_subscribers.json"}; + public static final String[] AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES = {"getServicesAaiFineResp.json", "create_new_instance/aai_get_full_subscribers.json"}; + public static final String AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON = "changeManagement/get_vnf_data_by_globalid_and_service_type.json"; public static final String OPERATIONAL_ENVIRONMENT_TYPE = "VNF"; public static final String OPERATIONAL_ENVIRONMENT_STATUS = "Activate"; - public static final String BASE_GET_SERVICES_AAI_REQUEST_BODY = "{\"start\" : \"service-design-and-creation/models\", \"query\" : \"query/serviceModels-byDistributionStatus?distributionStatus=DISTRIBUTION_COMPLETE_OK\";}"; 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"; - 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\":\"HngwProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662814627\",\"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\":\"HngwProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662816043\",\"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\":\"HngwProtectedOam.OAM\",\"network-technology\":\"Contrail\",\"is-bound-to-vpn\":false,\"resource-version\":\"1521662815304\",\"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"; + 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"; public static final String GET_AAI_SERVIES_EXPECTED_RESULT = "{\n" + " \"services\": [{\n" + " \"uuid\": \"20c4431c-246d-11e7-93ae-92361f002671\",\n" + @@ -202,8 +218,6 @@ public class AaiApiTest extends BaseApiAaiTest { " \"readOnly\": false\n" + "}"; - static final ObjectMapper om = new ObjectMapper(); - private String getGetOperationEnvironmentsUri() { return uri.toASCIIString() + "/get_operational_environments"; } @@ -262,18 +276,9 @@ public class AaiApiTest extends BaseApiAaiTest { assertEquals(1, list.getOperationalEnvironment().get(0).getRelationshipList().getRelationship().size()); } - - @Test - public void testVoid(){ - SimulatorApi.registerExpectation(SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET, - "add_subinterface/aai_get_tenants.json" - , "add_subinterface/aai_get_services.json" - ); - } - - @Test(dataProvider = "errorCodes") public void getServicesWitErrorResponse(int errorCode) throws IOException, URISyntaxException { + TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri); final String expectedResult = "{\"services\":[],\"readOnly\":false}"; callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_ERROR_SIMULATOR_RESPONSES, @@ -284,11 +289,25 @@ public class AaiApiTest extends BaseApiAaiTest { @Test public void getServicesFineRequest() throws IOException, URISyntaxException { - + TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri); callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES, ImmutableMap.of(), getAaiServicesUri(), "", 200, GET_AAI_SERVIES_EXPECTED_RESULT, HttpMethod.GET); + } + @Test + public void whenGetServicesErrorResponse_badResponseIsNotCached() throws IOException, URISyntaxException { + TestHelper.resetAaiCache(GET_SERVICE_MODELS_BY_DISTRIBUTION_STATUS, restTemplate, uri); + + + final String expectedErrorResult = "{\"services\":[],\"readOnly\":false}"; + //call AAI with bad response by clear exceptions from simulator, bad response shall not be cached + callAaiWithSimulatedErrorResponse(new String[]{}, ImmutableMap.of(), getAaiServicesUri(), "", 200, expectedErrorResult, HttpMethod.GET); + + //call AAI with fine response + callAaiWithSimulatedErrorResponse(AAI_GET_SERVICES_FINE_SIMULATOR_RESPONSES, + ImmutableMap.of(), + getAaiServicesUri(), "", 200, GET_AAI_SERVIES_EXPECTED_RESULT, HttpMethod.GET); } @DataProvider @@ -305,7 +324,7 @@ public class AaiApiTest extends BaseApiAaiTest { SimulatorApi.registerExpectationFromPresets(getEcompPortalPresets(), APPEND); SimulatorApi.registerExpectationFromPreset(new PresetAAIGetSubscribersGet(), APPEND); - restTemplateErrorAgnostic.getForEntity(uri + "/aai_get_services",String.class); + restTemplateErrorAgnostic.getForEntity(uri + "/aai_get_services", String.class); String logLines = LoggerFormatTest.getLogLines("error", 15, 0, restTemplate, uri); assertThat("not found in error log", logLines, containsString("Failed to parse aai response")); @@ -425,12 +444,13 @@ public class AaiApiTest extends BaseApiAaiTest { assertResponse(GET_NETWORK_COLLECTION_EXPECTED_RESPONSE, response); } + @Test public void getNetworkCollectionDetailsByServiceInstanceId_given404ErrorAaiResponse_yield200OkWithErrorMsg() { SimulatorApi.clearAll(); try { restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class); - }catch (HttpClientErrorException e){ + } catch (HttpClientErrorException e) { assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); } } @@ -442,7 +462,7 @@ public class AaiApiTest extends BaseApiAaiTest { SimulatorApi.registerExpectationFromPreset(presetAAIGetNetworkCollectionDetails, CLEAR_THEN_SET); try { restTemplate.getForObject(uri + "/aai_get_network_collection_details/" + "SOME-RANDOM-UUID", String.class); - }catch (HttpServerErrorException e){ + } catch (HttpServerErrorException e) { assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatusCode()); } } @@ -450,9 +470,9 @@ public class AaiApiTest extends BaseApiAaiTest { @Test public void getGetInstanceGroupsByCloudRegion_yieldValidResponse() { SimulatorApi.clearAll(); - final PresetAAIGetInstanceGroupsByCloudRegion presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegion("CLOUD-OWNER", "CLOUD-REGION-ID", "NETWORK-FUNCTION"); + final PresetAAIGetInstanceGroupsByCloudRegion presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegion("CLOUD%20OWNER", "CLOUD-REGION-ID", "NETWORK%20FUNCTION"); SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET); - final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" +"NETWORK-FUNCTION", String.class); + final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK FUNCTION", String.class); assertResponse(GET_INSTANCE_GROUPS_BY_CLOUDREGION_EXPECTED_RESPONSE, response); } @@ -462,16 +482,17 @@ public class AaiApiTest extends BaseApiAaiTest { SimulatorApi.clearAll(); final PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegionInvalidRequest("CLOUD-OWNER", "CLOUD-REGION-ID", "NETWORK-FUNCTION"); SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET); - final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" +"NETWORK-FUNCTION", String.class); + final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class); assertResponse(GET_INSTANCE_GROUPS_BY_CLOUDREGION_EXPECTED_RESPONSE, response); } + @Test public void getGetInstanceGroupsByCloudRegion_given404ErrorAaiResponse_yield200OkWithErrorMsg() { SimulatorApi.clearAll(); try { - restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" +"NETWORK-FUNCTION", String.class); - }catch (HttpClientErrorException e){ + restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class); + } catch (HttpClientErrorException e) { assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); } } @@ -482,8 +503,8 @@ public class AaiApiTest extends BaseApiAaiTest { final PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing presetAAIGetInstanceGroupsByCloudRegion = new PresetAAIGetInstanceGroupsByCloudRegionRequiredMissing("CLOUD-OWNER", "CLOUD-REGION-ID", "NETWORK-FUNCTION"); SimulatorApi.registerExpectationFromPreset(presetAAIGetInstanceGroupsByCloudRegion, CLEAR_THEN_SET); try { - restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" +"NETWORK-FUNCTION", String.class); - }catch (HttpServerErrorException e){ + restTemplate.getForObject(uri + "/aai_get_instance_groups_by_cloudregion/" + "CLOUD-OWNER" + "/" + "CLOUD-REGION-ID" + "/" + "NETWORK-FUNCTION", String.class); + } catch (HttpServerErrorException e) { assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatusCode()); } } @@ -510,18 +531,28 @@ public class AaiApiTest extends BaseApiAaiTest { final PresetAAIGetRelatedInstanceGroupsByVnfId getRelatedInstanceGroupsByVnfId = new PresetAAIGetRelatedInstanceGroupsByVnfId(vnfId); SimulatorApi.registerExpectationFromPreset(getRelatedInstanceGroupsByVnfId, CLEAR_THEN_SET); - final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_vnf_instance_id/" + vnfId, String.class); + final String response = restTemplate.getForObject(uri + "/aai_get_instance_groups_by_vnf_instance_id/" + vnfId, + String.class); assertResponse("[{\"type\":\"instance-group\",\"name\":\"instance group name\"},{\"type\":\"instance-group\",\"name\":\"instance group name\"}]", response); } @Test + public void getHomingDataForVfModule(){ + String vnfId= "0846287b-65bf-45a6-88f6-6a1af4149fac", vfModuleId= "a9b70ac0-5917-4203-a308-0e6920e6d09b"; + SimulatorApi.registerExpectationFromPreset(new PresetAAIGetHomingForVfModule(vnfId,vfModuleId), CLEAR_THEN_SET); + final String response = restTemplate.getForObject(uri + "/aai_get_homing_by_vfmodule/"+ vnfId +"/"+vfModuleId, String.class); + String exectedResponse = TestUtils.convertRequest(objectMapper, AAI_HOMING_DATA_RESPONSE); + assertResponse(exectedResponse,response); + } + + @Test public void getGetRelatedInstanceGroupsByVnfId__yield404NotFound() { final PresetAAIGetRelatedInstanceGroupsByVnfId getRelatedInstanceGroupsByVnfId = new PresetAAIGetRelatedInstanceGroupsByVnfId("abcd"); SimulatorApi.registerExpectationFromPreset(getRelatedInstanceGroupsByVnfId, CLEAR_THEN_SET); try { restTemplate.getForObject(uri + "/aai_get_instance_groups_by_vnf_instance_id/" + "dcba", String.class); - } catch (HttpClientErrorException e){ + } catch (HttpClientErrorException e) { assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); } @@ -547,9 +578,162 @@ public class AaiApiTest extends BaseApiAaiTest { assertResponse(expected, response); } + @Test + @FeatureTogglingTest(Features.FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS) + public void networksToVlans_simpleRequest_responseIsCorrect() { + // Prepare randomized values + // Some of these random values are persisted to match with the + // cypress preset "aaiGetNetworksToVlansByServiceInstance.json". + String globalCustomerId = UUID.randomUUID().toString(); + String sdcModelUuid = "5a3ad576-c01d-4bed-8194-0e72b4a3d020"; + String serviceType = "vMOG"; + int vlanIdOuter = 34612; + int vlanIdOuter2 = 8568012; + int vlanIdOuter3 = 4; + + // build hierarchical presets: + // + // service instance + // ║ + // ╠═ network 1 + // ║ ╠═ vlan 1 + // ║ ╚═ vlan 2 + // ║ + // ╠═ network 2 + // ║ ╚═ vlan 3 + // ║ + PresetAAIStandardQueryGet vlanTagPreset1 = ofVlanTag(vlanIdOuter); + PresetAAIStandardQueryGet vlanTagPreset2 = ofVlanTag(vlanIdOuter2); + PresetAAIStandardQueryGet vlanTagPreset3 = ofVlanTag(vlanIdOuter3); + + PresetAAIStandardQueryGet l3NetworkPreset1 = ofL3Network("7989a6d2-ba10-4a5d-8f15-4520bc833090", "DDDEEEFFF", "Provider Network", + ImmutableMultimap.of("vlan-tag", vlanTagPreset1.getReqPath(), "vlan-tag", vlanTagPreset2.getReqPath()), "Failed"); + PresetAAIStandardQueryGet l3NetworkPreset2 = ofL3Network("e8e2332e-1f84-4237-bc97-3b5b842f52e4","GGGHHHIII", "Network", + ImmutableMultimap.of("vlan-tag", vlanTagPreset3.getReqPath()), "Assigned"); + + PresetAAIStandardQueryGet serviceInstance = ofServiceInstance("9cdd1b2a-43a7-47bc-a88e-759ba2399f0b", + "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "6e59c5de-f052-46fa-aa7e-2fca9d674c44", globalCustomerId, serviceType, + ImmutableMultimap.of("l3-network", l3NetworkPreset1.getReqPath(), "l3-network", l3NetworkPreset2.getReqPath())); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, l3NetworkPreset1, l3NetworkPreset2, vlanTagPreset1, vlanTagPreset2, vlanTagPreset3, + new PresetSDCGetServiceMetadataGet(sdcModelUuid, UUID.randomUUID().toString(), "service-vl-with-5g-network-provider-alacarte.zip"), + new PresetSDCGetServiceToscaModelGet(sdcModelUuid, "service-vl-with-5g-network-provider-alacarte.zip") + ), CLEAR_THEN_SET); + + // THE TEST + final String response = restTemplate.getForObject(uri + "/aai/standardQuery/vlansByNetworks" + + "?serviceInstanceId=" + serviceInstance.getInstanceId() + + "&serviceType=" + serviceType + + "&globalCustomerId=" + globalCustomerId + + "&sdcModelUuid=" + sdcModelUuid + , String.class); + + assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER), + getResourceAsString("serviceWithNetwork/aaiGetNetworksToVlansByServiceInstance.json"), + response); + } + + @Test + @FeatureTogglingTest(Features.FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS) + public void networksWithVlansToVnf_simpleRequest_responseIsCorrect() { + // Prepare randomized values + // Some of these random values are persisted to match with the + // cypress preset "aaiGetNetworksWithVlansToVnfByServiceInstance.json". + String globalCustomerId = UUID.randomUUID().toString(); + String sdcModelUuid = "5a3ad576-c01d-4bed-8194-0e72b4a3d020"; + String serviceType = "vMOG"; + int vlanIdOuter = 34123; + int vlanIdOuter2 = 65540; + int vlanIdOuter3 = 12345; + int vlanIdOuter4 = 67890; + int vlanIdOuter5 = 417695; + int vlanIdOuter6 = 783243; + + // build hierarchical presets: + // + // service instance + // ║ + // ╠═ vnf 1 + // ║ ╚═ network 1 + // ║ ╠═ vlan 1 + // ║ ╚═ vlan 2 + // ║ ╚═ network 2 + // ║ ╠═ vlan 3 + // ║ ╚═ vlan 4 + // ║ + // ╠═ vnf 2 + // ║ ╚═ network 3 + // ║ ╠═ vlan 5 + // ║ ╚═ vlan 6 + // ║ + PresetAAIStandardQueryGet vlanTagPreset1 = ofVlanTag(vlanIdOuter); + PresetAAIStandardQueryGet vlanTagPreset2 = ofVlanTag(vlanIdOuter2); + PresetAAIStandardQueryGet vlanTagPreset3 = ofVlanTag(vlanIdOuter3); + PresetAAIStandardQueryGet vlanTagPreset4 = ofVlanTag(vlanIdOuter4); + PresetAAIStandardQueryGet vlanTagPreset5 = ofVlanTag(vlanIdOuter5); + PresetAAIStandardQueryGet vlanTagPreset6 = ofVlanTag(vlanIdOuter6); + + PresetAAIStandardQueryGet l3NetworkPreset1 = ofL3Network("36517f3d-2bc2-48f5-aaf8-418520c54330","AAAAABBBBCCCC", "Provider Network", + ImmutableMultimap.of("vlan-tag", vlanTagPreset1.getReqPath(), "vlan-tag", vlanTagPreset2.getReqPath()), "Assigned"); + + PresetAAIStandardQueryGet l3NetworkPreset2 = ofL3Network("12347f3d-2bc2-48f5-aaf8-418520c54330","DDDEEEE", "Provider Network", + ImmutableMultimap.of("vlan-tag", vlanTagPreset3.getReqPath(), "vlan-tag", vlanTagPreset4.getReqPath()), "Created"); + + PresetAAIStandardQueryGet vnfPreset1 = ofVnf("c015cc0f-0f37-4488-aabf-53795fd93cd3", + ImmutableMultimap.of("l3-network", l3NetworkPreset1.getReqPath() , "l3-network", l3NetworkPreset2.getReqPath())); + + PresetAAIStandardQueryGet l3NetworkPreset3 = ofL3Network("12aa7f3d-2bc2-48f5-aaf8-418520c54330","XXXYYYZZZ", "Network", + ImmutableMultimap.of("vlan-tag", vlanTagPreset5.getReqPath(), "vlan-tag", vlanTagPreset6.getReqPath()), "Created"); + + PresetAAIStandardQueryGet vnfPreset2 = ofVnf("c55da606-cf38-42c7-bc3c-be8e23b19299", ImmutableMultimap.of("l3-network", l3NetworkPreset3.getReqPath())); + + PresetAAIStandardQueryGet serviceInstance = ofServiceInstance("9cdd1b2a-43a7-47bc-a88e-759ba2399f0b", + "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "6e59c5de-f052-46fa-aa7e-2fca9d674c44", globalCustomerId, serviceType, + ImmutableMultimap.of("generic-vnf", vnfPreset1.getReqPath(), "generic-vnf", vnfPreset2.getReqPath())); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, vnfPreset1, vnfPreset2, l3NetworkPreset1, l3NetworkPreset2, l3NetworkPreset3, vlanTagPreset1, vlanTagPreset2, vlanTagPreset3, vlanTagPreset4, vlanTagPreset5, vlanTagPreset6, + new PresetSDCGetServiceMetadataGet(sdcModelUuid, UUID.randomUUID().toString(), "service-vl-with-5g-network-provider-alacarte.zip"), + new PresetSDCGetServiceToscaModelGet(sdcModelUuid, "service-vl-with-5g-network-provider-alacarte.zip") + ), CLEAR_THEN_SET); + + // THE TEST + final String response = restTemplate.getForObject(uri + "/aai/standardQuery/vlansByNetworks" + + "?serviceInstanceId=" + serviceInstance.getInstanceId() + + "&serviceType=" + serviceType + + "&globalCustomerId=" + globalCustomerId + + "&sdcModelUuid=" + sdcModelUuid + , String.class); + + assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER), + getResourceAsString("serviceWithNetwork/aaiGetNetworksWithVlansToVnfByServiceInstance.json"), + response); + } + + @Test + public void getVnfDataByGlobalIdAndServiceType() { + + SimulatorApi.registerExpectation(AAI_VNFS_FOR_CHANGE_MANAGEMENT_JSON, APPEND); + + String url = uri + "/get_vnf_data_by_globalid_and_service_type/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/vFlowLogic"; + + ResponseEntity<String> response = restTemplate.getForEntity(url, String.class); +//reduced_vnf_data_by_globalid_and_service_type.json + assertTrue(false == response.getBody().contains("generic-vfmodule")); + assertResponse(JsonAssert.when(Option.IGNORING_ARRAY_ORDER), + getResourceAsString("changeManagement/reduced_vnf_data_by_globalid_and_service_type.json"), + response.getBody()); + + } + private void assertResponse(Object expected, String response) { + assertResponse(Configuration.empty(), expected, response); + } + + private void assertResponse(Configuration configuration, Object expected, String response) { try { - JsonAssert.assertJsonEquals(expected, response); + JsonAssert.assertJsonEquals(expected, response, configuration); } catch (Exception | AssertionError e) { System.err.println("response was: " + response); throw e; diff --git a/vid-automation/src/test/java/org/onap/vid/api/AsyncInfraApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/AsyncInfraApiTest.java index 5f83f36dc..058cb2f5b 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/AsyncInfraApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/AsyncInfraApiTest.java @@ -1,205 +1,30 @@ package org.onap.vid.api; import com.google.common.collect.ImmutableList; -import com.google.gson.JsonObject; -import net.codestory.http.WebServer; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; import org.onap.vid.more.LoggerFormatTest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.testng.Assert; import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import vid.automation.test.infra.Features; -import vid.automation.test.infra.Wait; -import vid.automation.test.model.JobBulk; -import vid.automation.test.model.JobModel; import vid.automation.test.services.SimulatorApi; -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collection; -import java.util.Enumeration; -import java.util.List; import java.util.UUID; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.containsString; import static org.testng.AssertJUnit.assertEquals; public class AsyncInfraApiTest extends BaseApiTest { - private static final String PENDING = "PENDING"; public static final String API_URL = "asyncForTests"; - private boolean asyncJobsIsOn() { - return Features.FLAG_ASYNC_JOBS.isActive() - && Features.FLAG_ASYNC_INSTANTIATION.isActive(); - } - @BeforeClass public void login() { super.login(); } - @BeforeMethod - protected void deleteAllPendingJobs() { - System.out.println("Connecting database..."); - - try (Connection connection = DriverManager.getConnection(DB_CONFIG.url, DB_CONFIG.username, DB_CONFIG.password)) { - System.out.println("Database connected!"); - try (Statement stmt = connection.createStatement()) { - stmt.addBatch("DELETE from `vid_service_info`"); - stmt.addBatch("DELETE FROM `vid_job`"); - - int[] executeBatch = stmt.executeBatch(); - } - - } catch (SQLException e) { - throw new IllegalStateException("Cannot connect the database!", e); - } - } - - - @Test - public void createBulkOfJobsViaApi_thenGetEachOneOfThem() { - int jobCount = 10; - final String url = "http://localhost:1234/testMe"; - ResponseEntity<JobBulk> result = postJobBulk(jobCount, url, "NoOp"); - assertEquals(HttpStatus.OK, result.getStatusCode()); - Assert.assertNotNull(result.getBody()); - assertEquals(jobCount, getJobChildren(result).size()); - - - result.getBody().getJobs().forEach(job -> { - assertThat(job.getUuid(), not(isEmptyOrNullString())); - assertEquals(PENDING, job.getStatus()); - }); - - result.getBody().getJobs().forEach(job -> { - ResponseEntity<JobModel> jobResult = restTemplate.getForEntity(buildUri(API_URL+"/job/{uuid}"), JobModel.class, job.getUuid()); - assertEquals(job.getUuid(), jobResult.getBody().getUuid()); - //assertEquals(PENDING, jobResult.getBody().getStatus()); - }); - } - - private List<JobModel> getJobChildren(ResponseEntity<JobBulk> result) { - return result.getBody().getJobs().stream().filter(job -> job.getTemplateId() != null).collect(Collectors.toList()); - } - - private ResponseEntity<JobBulk> postJobBulk(int jobCount, String url, String type) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("name", "service-"+random.nextInt()); - jsonObject.addProperty("count", jobCount); - jsonObject.addProperty("url", url); - jsonObject.addProperty("type", type); - ResponseEntity<JobBulk> result = restTemplate.postForEntity(buildUri(API_URL), jsonObject.toString(), JobBulk.class); - return result; - } - - @Test - public void addFewJobs_verifyCallbacksAreAllAndNoDuplicates() throws InterruptedException { - final Collection<String> expected = new ConcurrentSkipListSet<>(); - final Collection<String> results = new ConcurrentSkipListSet<>(); - final Collection<String> duplicates = new ConcurrentSkipListSet<>(); - final String targetPath = "/my-mso"; - - // https://github.com/CodeStory/fluent-http - final WebServer server = new WebServer().configure(routes -> routes - .post(targetPath, (context) -> { - final String body = context.extract(String.class); - if (!results.add(body)) { - duplicates.add(body); - } - return body; - }) - ).startOnRandomPort(); - - final int jobCount = 10; - final int childCount = 2; - - InetAddress inetAddress = getExternalInetAddress(); - - final String returnUrl = "http://" + inetAddress.getHostAddress() + ":" + server.port() + targetPath; - System.out.println(returnUrl); - - // POST jobs - IntStream.range(0, jobCount).parallel().forEach(i -> { - ResponseEntity<JobBulk> result = postJobBulk(childCount, returnUrl, "HttpCall"); - getJobChildren(result).forEach(child -> { - expected.add(child.getUuid()); - }); - }); - Wait.waitFor((actual -> actual.size() == expected.size()), results, 75, 200, TimeUnit.MILLISECONDS); - // wait some another time give change for duplications - TimeUnit.SECONDS.sleep(5); - - if (asyncJobsIsOn()) { - assertThat("async jobs is on: should callback for all jobs - no more, no less", results, equalTo(expected)); - assertThat("async jobs is on: should callback for exactly number of jobs", results, hasSize(jobCount * childCount)); - assertThat("async jobs is on: should have no duplicate jobs callback", duplicates, empty()); - } else { - assertThat("async jobs is off: should not callback for any job", results, empty()); - assertThat("async jobs is off: should have no duplicate jobs callback", duplicates, empty()); - } - - server.stop(); - - } - - private InetAddress getExternalInetAddress() { - // https://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java - InetAddress candidateAddress = null; - try { - for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) { - NetworkInterface iface = (NetworkInterface) ifaces.nextElement(); - - if (iface.getName().contains("docker")) { - // ignore local docker virtual gateway IPs - continue; - } - - // Iterate all IP addresses assigned to each card... - for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) { - InetAddress inetAddr = (InetAddress) inetAddrs.nextElement(); - - // take only non-loopback, ipv4 addresses - if (!inetAddr.isLoopbackAddress() && inetAddr instanceof Inet4Address) { - - System.out.println("inetAddr (" + iface.getName() + "): " + inetAddr); - if (inetAddr.isSiteLocalAddress()) { - // Found non-loopback site-local address. Return it immediately... - System.out.println("inetAddr, site-local (" + iface.getName() + "): " + inetAddr); - candidateAddress = inetAddr; - } - else if (candidateAddress == null) { - // Found non-loopback address, but not necessarily site-local. - // Store it as a candidate to be returned if site-local address is not subsequently found... - candidateAddress = inetAddr; - // Note that we don't repeatedly assign non-loopback non-site-local addresses as candidates, - // only the first. For subsequent iterations, candidate will be non-null. - } - } - } - - } - } catch (Exception e) { - throw new RuntimeException(e); - } - return candidateAddress; - } - @Test public void testGetStatusBadRequest() { ResponseEntity<String> jobResult = getJob("1234"); diff --git a/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest.java new file mode 100644 index 000000000..539e857c9 --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest.java @@ -0,0 +1,532 @@ +package org.onap.vid.api; + +import static java.util.Collections.emptyMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset.DEFAULT_INSTANCE_ID; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost.DEFAULT_REQUEST_ID; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet.COMPLETE; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.SERVICE_NAME; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset; +import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember.InstanceGroupMemberAction; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseDelete; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateNetworkALaCarteCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteServiceCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVfModuleALaCarteCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfALaCarteCypress2; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfGroup; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteALaCarteService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteInstanceGroup; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus.SourceStatus; +import org.onap.vid.model.asyncInstantiation.ServiceInfo; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import vid.automation.test.Constants; +import vid.automation.test.infra.FeatureTogglingTest; +import vid.automation.test.infra.Features; +import vid.automation.test.model.JobStatus; +import vid.automation.test.model.ServiceAction; +import vid.automation.test.services.AsyncJobsService; +import vid.automation.test.services.SimulatorApi; +import vid.automation.test.services.SimulatorApi.RegistrationStrategy; + +@FeatureTogglingTest({Features.FLAG_ASYNC_JOBS, Features.FLAG_ASYNC_INSTANTIATION, Features.FLAG_ASYNC_ALACARTE_VNF}) +public class AsyncInstantiationALaCarteApiTest extends AsyncInstantiationBase { + + private static final String CREATE_BULK_OF_ALACARTE_REQUEST = "asyncInstantiation/vidRequestCreateALaCarte.json"; + private static final String CREATE_BULK_OF_ALACARTE_REQUEST_CYPRESS = "a-la-carte/redux-a-la-carte.json"; + private static final String CREATE_BULK_OF_ALACARTE_NO_TESTAPI_REQUEST_CYPRESS = "a-la-carte/redux-a-la-carte-no-testapi.json"; + private static final String DELETE_BULK_OF_ALACARTE_REQUEST = "VnfGroup/ServiceWithVnfGroupsDeleteRequest.json"; + private static final String VIEW_EDIT_VNF_GROUPS_REQUEST = "VnfGroup/VnfGroupCreate1Delete1None1Request.json"; + private static final String DELETE_TWO_VNF_GROUPS_MEMBER_AND_ADD_ONE_REQUEST = "VnfGroup/vnfGroupCreate1VnfGroupAndDelete2VnfGroupsRequest.json"; + private static final String DELETE_SERVICE_WITH_TWO_VNF_GROUPS_REQUEST_WITH_GROUPMEMBERS = "VnfGroup/deleteServiceWith2VnfGroupsRequest_AndThreeGroupMembers.json"; + + + private static final String SERVICE_INSTANCE_ID = BaseMSOPreset.DEFAULT_INSTANCE_ID; + private static final String MSO_COMPLETE_STATUS = "COMPLETE"; + private static final String MSO_FAILED_STATUS = "FAILED"; + + + @DataProvider + public static Object[][] scenarios() { + return new Object[][]{ + {Scenario.PARALLEL}, + {Scenario.COMPLETED}, +// {Scenario.NAME_TAKEN}, Not relevant because the name uniqueness is supported only for bulk in Macro +// {Scenario.DUPLICATE_NAME}, Not relevant because name duplication is not handled in A La Carte + {Scenario.IN_PROGRESS}, + {Scenario.MSO_FAIL} + }; + } + + @AfterMethod + protected void dropAllFromNameCounter() { + AsyncJobsService asyncJobsService = new AsyncJobsService(); + asyncJobsService.dropAllFromNameCounter(); + } + + @Test + public void deploy1Service0VnfWithStrictSimulatorCompare__verifyStatusAndAudit() { + /* + Legit Preset || deploy 1 Service, no VNF inside + -> JobStatus is Eventually success, audit + is adequate; strict simulator compare + */ + + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "calazixide85"); + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of(new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService(names, 0, DEFAULT_REQUEST_ID)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(new PresetMSOOrchestrationRequestGet()); + List<BasePreset> presets = getPresets(createPresets, inProgressPresets); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertServiceInfoSpecific1(jobId, JobStatus.COMPLETED, names.get(SERVICE_NAME)); + assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), msoAuditStatusesCompleted(jobId)); + } + + @Test + public void deleteServiceWithTwoVnfGroups_andRetry() { + String parentServiceInstanceId = "service-instance-id"; + String firstVnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID"; + String secondVnfGroupToDeleteInstanceId = "VNF_GROUP2_INSTANCE_ID"; + String firstVnfGroupToDeleteRequestId = UUID.randomUUID().toString(); + String secondVnfGroupToDeleteRequestId = UUID.randomUUID().toString(); + String parentServiceRequestId = UUID.randomUUID().toString(); + List<String> vnfGroupMemberRemoveRequestsIds = ImmutableList.of(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()); + + //failed to delete vnf group, and then also service is not deleted + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(0), InstanceGroupMemberAction.Remove), + new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(1), InstanceGroupMemberAction.Remove), + new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF3_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(2), InstanceGroupMemberAction.Remove)); + + List<PresetMSOBaseDelete> deletePresets = ImmutableList.of( + new PresetMSODeleteInstanceGroup(firstVnfGroupToDeleteRequestId, firstVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()), + new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()) + ); + + List<PresetMSOOrchestrationRequestGet> inProgressPresets = new ArrayList<>(); + inProgressPresets.add(new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, firstVnfGroupToDeleteRequestId)); + inProgressPresets.add(new PresetMSOOrchestrationRequestGet( MSO_FAILED_STATUS, secondVnfGroupToDeleteRequestId)); + inProgressPresets.add(new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(0))); + inProgressPresets.add(new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(1))); + inProgressPresets.add(new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(2))); + + List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets); + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_SERVICE_WITH_TWO_VNF_GROUPS_REQUEST_WITH_GROUPMEMBERS); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + assertServiceInfoSpecificDeletion(jobId, JobStatus.COMPLETED_WITH_ERRORS, "SERVICE_INSTANCE_NAME", "service-instance-type"); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(deletePresets.get(1).getReqPath(), 1L), + + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 3L) + + )); + + //retry to delete vnf-group and then delete service + List<BasePreset> retryPresets = ImmutableList.of( + new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()), + new PresetMSODeleteALaCarteService(parentServiceRequestId,parentServiceInstanceId ), + new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, secondVnfGroupToDeleteRequestId), + new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, parentServiceRequestId)); + registerExpectationFromPresets(retryPresets, RegistrationStrategy.CLEAR_THEN_SET); + + List<String> retryUuids = retryJob(jobId); + assertThat(retryUuids, hasSize(1)); + final String retryJobId = retryUuids.get(0); + assertServiceInfoSpecificDeletion(retryJobId, JobStatus.COMPLETED, "SERVICE_INSTANCE_NAME", "service-instance-type"); + + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(retryPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(retryPresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(retryPresets.get(2).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(retryPresets.get(3).getReqPath(), 1L) + )); + } + + @DataProvider + public static Object[][] msoRequestStatusDataProvider() { + return new Object[][]{ + {MSO_COMPLETE_STATUS, JobStatus.COMPLETED}, + {MSO_FAILED_STATUS, JobStatus.FAILED} + }; + } + + @Test(dataProvider = "msoRequestStatusDataProvider") + public void deleteServiceWithStrictSimulatorCompare__verifyStatusAndAudit(String msoStatus, JobStatus expectedStatus) { + List<PresetMSOBaseDelete> deletePresets = ImmutableList.of(new PresetMSODeleteALaCarteService( DEFAULT_REQUEST_ID, SERVICE_INSTANCE_ID)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of (new PresetMSOOrchestrationRequestGet(msoStatus), + new PresetMSOOrchestrationRequestGet(msoStatus)); + List<BasePreset> presets = getDeletePresets(deletePresets, inProgressPresets); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_BULK_OF_ALACARTE_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertServiceInfoSpecificDeletion(jobId, expectedStatus, "wowServiceWithVnfGroping", "TYLER SILVIA"); + switch (expectedStatus) { + case COMPLETED: + assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), msoAuditStatusesCompleted(jobId)); + break; + + case FAILED: + assertAuditStatuses(jobId, vidAuditStatusesFailed(jobId), null); + break; + } + + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L) + )); + } + + @Test(dataProvider = "msoRequestStatusDataProvider") + public void deleteTwoGroupsAddOneGroup(String msoStatus, JobStatus expectedStatus) { + String parentServiceInstanceId = "service-instance-id"; + String firstVnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID"; + String secondVnfGroupToDeleteInstanceId = "VNF_GROUP2_INSTANCE_ID"; + String firstVnfGroupToDeleteRequestId = UUID.randomUUID().toString(); + String secondVnfGroupToDeleteRequestId = UUID.randomUUID().toString(); + String vnfGroupToCreateRequestId = UUID.randomUUID().toString(); + + List<PresetMSOBaseDelete> deletePresets = ImmutableList.of( + new PresetMSODeleteInstanceGroup(firstVnfGroupToDeleteRequestId, firstVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()), + new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId())); + + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOCreateVnfGroup("VNF_GROUP3_INSTANCE_NAME", vnfGroupToCreateRequestId, + PresetMSOCreateVnfGroup.MODEL_INFO_0, parentServiceInstanceId, false)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet(msoStatus, firstVnfGroupToDeleteRequestId), + new PresetMSOOrchestrationRequestGet(msoStatus, secondVnfGroupToDeleteRequestId), + new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupToCreateRequestId, "Instance group was created successfully.") + ); + List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets); + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_TWO_VNF_GROUPS_MEMBER_AND_ADD_ONE_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertServiceInfoSpecificUpdate(jobId, expectedStatus, "SERVICE_INSTANCE_NAME"); + assertExpectedStatus(expectedStatus, jobId); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(deletePresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(2).getReqPath(), 1L) + )); + + } + + @Test + public void viewEditVnfGroup__verifyStatusAndAudit() { + String parentServiceInstanceId = "service-instance-id"; + String vnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID"; + + //failed to create vnf group, failed to remove 1 member (and then also vnf group isn't deleted) + viewEditVnfGroup_registerPresets(parentServiceInstanceId, vnfGroupToDeleteInstanceId, MSO_FAILED_STATUS); + + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), VIEW_EDIT_VNF_GROUPS_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertServiceInfoSpecificUpdate(jobId, JobStatus.COMPLETED_WITH_ERRORS, "SERVICE_INSTANCE_NAME"); + assertExpectedStatus(JobStatus.COMPLETED_WITH_ERRORS, jobId); + Map<String, Long> recordedRequest = SimulatorApi.retrieveRecordedRequestsPathCounter(); + assertThat(recordedRequest, allOf( + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId, 0L), //delete vnf group + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups", 1L), //create vnf group + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId + "/removeMembers", 3L) //remove vnf group members + )); + + //retry - vnf group create, 1 member remove, vnf group delete + viewEditVnfGroup_registerPresets(parentServiceInstanceId, vnfGroupToDeleteInstanceId, MSO_COMPLETE_STATUS); + final List<String> retryUuids = retryJob(jobId); + assertThat(retryUuids, hasSize(1)); + final String retryJobId = retryUuids.get(0); + + assertServiceInfoSpecificUpdate(retryJobId, JobStatus.COMPLETED, "SERVICE_INSTANCE_NAME"); + assertExpectedStatus(JobStatus.COMPLETED, retryJobId); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId, 1L), //delete vnf group + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups", 1L), //create vnf group + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId + "/removeMembers", 1L) //remove vnf group members + )); + } + + private void viewEditVnfGroup_registerPresets(String parentServiceInstanceId, String vnfGroupToDeleteInstanceId, String msoStatus) { + String vnfGroupToDeleteRequestId = UUID.randomUUID().toString(); + String vnfGroupToCreateRequestId = UUID.randomUUID().toString(); + List<String> vnfGroupMemberRemoveRequestsIds = ImmutableList.of(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()); + + List<PresetMSOBaseDelete> deletePresets = ImmutableList.of( + new PresetMSODeleteInstanceGroup(vnfGroupToDeleteRequestId, vnfGroupToDeleteInstanceId, getUserCredentials().getUserId())); + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOCreateVnfGroup("VNF_GROUP3_INSTANCE_NAME", vnfGroupToCreateRequestId, + PresetMSOCreateVnfGroup.MODEL_INFO_0, parentServiceInstanceId, false), + new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(0), InstanceGroupMemberAction.Remove), + new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(1), InstanceGroupMemberAction.Remove), + new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF3_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(2), InstanceGroupMemberAction.Remove)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupToDeleteRequestId), // delete instance group + new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupToCreateRequestId, "Instance group was created successfully."), // create instance group + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(0)), // remove instance group member + new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupMemberRemoveRequestsIds.get(1)), // remove instance group member + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(2))); // remove instance group member + + List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets); + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + } + + private void assertExpectedStatus(JobStatus expectedStatus, String jobId) { + switch (expectedStatus) { + case COMPLETED: + assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), null); + break; + + case FAILED: + assertAuditStatuses(jobId, vidAuditStatusesFailed(jobId), null); + break; + } + } + + @Test + public void deploy1Service1FailedVnf__verifyStatus_andRetry() { + //CreateServiceWithFailedVnf is common for API test and UI test, + //so if you change it, make sure both test are compatible with your changes + CreateServiceWithFailedVnf createServiceWithFailedVnf = new CreateServiceWithFailedVnf(this); + createServiceWithFailedVnf.deployService1FailedVnf(); + createServiceWithFailedVnf.secondRegistration(); + createServiceWithFailedVnf.retryJob(); + createServiceWithFailedVnf.retryAssertion(); + createServiceWithFailedVnf.simulatorCallsAssertion(); + } + + @DataProvider + Object[][] data_deploy1ServiceFromCypress__verifyStatusAndMsoCalls() { + return Features.FLAG_ASYNC_ALACARTE_VFMODULE.isActive() ? new Object[][]{ + {"none", emptyMap(), emptyMap(), true}, + {"none", emptyMap(), emptyMap(), false}, + {"instance", ImmutableMap.of("vnfs", 0L, "networks", 0L, "vfModules", 0L, "volumeGroups", 0L), + ImmutableMap.of("serviceInstances", 1L, "vnfs", 1L, "networks", 1L, "vfModules", 3L, "volumeGroups", 1L),true}, + {"network", emptyMap(), + ImmutableMap.of("networks", 1L), true}, + {"vnf0", ImmutableMap.of("vfModules", 0L, "volumeGroups", 0L), + ImmutableMap.of("vnfs", 1L, "vfModules", 3L, "volumeGroups", 1L), true}, + {"vfModule0", ImmutableMap.of("vfModules", 1L, "volumeGroups", 0L), + ImmutableMap.of("vfModules", 3L, "volumeGroups", 1L), true}, + {"volumeGroup", ImmutableMap.of("vfModules", 2L), + ImmutableMap.of("vfModules", 1L, "volumeGroups", 1L), true}, + {"vfModule1", emptyMap(), + ImmutableMap.of("vfModules", 1L, "volumeGroups", 1L), true}, + {"vfModule2", emptyMap(), + ImmutableMap.of("vfModules", 1L), true} + } : new Object[][]{ + {"none", ImmutableMap.of("vfModules", 0L, "volumeGroups", 0L), emptyMap(), true} + }; + } + + @Test(dataProvider = "data_deploy1ServiceFromCypress__verifyStatusAndMsoCalls") + public void deploy1ServiceFromCypress__verifyStatusAndMsoCalls_andRetry(String whatToFail, Map<String, Long> pathCounterOverride, Map<String, Long> retryPathCounterOverride, boolean withTestApi) { + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "serviceInstanceName"); + String vnfRequestId = UUID.randomUUID().toString(); + registerPresetsForRetryTest(whatToFail, names, vnfRequestId, withTestApi); + + final List<String> uuids = createBulkOfInstances(false, 1, names, withTestApi? CREATE_BULK_OF_ALACARTE_REQUEST_CYPRESS: CREATE_BULK_OF_ALACARTE_NO_TESTAPI_REQUEST_CYPRESS); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + JobStatus finalJobStatus; + switch (whatToFail) { + case "none": finalJobStatus = JobStatus.COMPLETED; break; + case "instance": finalJobStatus = JobStatus.FAILED; break; + default: finalJobStatus = JobStatus.COMPLETED_WITH_ERRORS; break; + } + assertServiceInfoSpecific2(jobId, finalJobStatus, names.get(SERVICE_NAME)); + assertRecordedRequests(pathCounterOverride, 1L, vnfRequestId); + + if (!"none".equals(whatToFail)) { + registerPresetsForRetryTest("none", names, vnfRequestId, withTestApi); + + List<String> retryUuids = retryJob(jobId); + assertThat(retryUuids, hasSize(1)); + final String retryJobId = retryUuids.get(0); + + ServiceAction serviceAction = "instance".equals(whatToFail) ? ServiceAction.INSTANTIATE : ServiceAction.UPDATE; + assertServiceInfoSpecific2(retryJobId, JobStatus.COMPLETED, names.get(SERVICE_NAME), serviceAction); + + assertRecordedRequests(retryPathCounterOverride, 0L, vnfRequestId); + } + } + + private void registerPresetsForRetryTest(String whatToFail, ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names, String vnfRequestId, boolean withTestApi ) { + String networkRequestId = UUID.randomUUID().toString(); + String vfModule0RequestId = UUID.randomUUID().toString(); + String vfModule1RequestId = UUID.randomUUID().toString(); + String vfModule2RequestId = UUID.randomUUID().toString(); + String volumeGroupRequestId = UUID.randomUUID().toString(); + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteServiceCypress(names, 0, DEFAULT_REQUEST_ID, Constants.GR_API, withTestApi), + new PresetMSOCreateVnfALaCarteCypress2(vnfRequestId, DEFAULT_INSTANCE_ID, vnfRequestId, "2017-488_PASQUALE-vPE", Constants.GR_API, withTestApi), + new PresetMSOCreateNetworkALaCarteCypress(networkRequestId, DEFAULT_INSTANCE_ID, networkRequestId, "ExtVL", Constants.GR_API, withTestApi) + ); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet("instance".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE), + new PresetMSOOrchestrationRequestGet("vnf0".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vnfRequestId), + new PresetMSOOrchestrationRequestGet("vfModule0".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule0RequestId), + new PresetMSOOrchestrationRequestGet("vfModule1".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule1RequestId), + new PresetMSOOrchestrationRequestGet("vfModule2".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule2RequestId), + new PresetMSOOrchestrationRequestGet("volumeGroup".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, volumeGroupRequestId), + new PresetMSOOrchestrationRequestGet("network".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, networkRequestId) + ); + List<BasePreset> presetsWithoutVfModule = getPresets(createPresets, inProgressPresets); + + ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() + .addAll(presetsWithoutVfModule) + .add(new PresetSDCGetServiceToscaModelGet("2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "csar-noDynamicFields-ecompNamingFalse-fullModelDetails.zip")) + .add(new PresetSDCGetServiceMetadataGet("2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", "csar-noDynamicFields-ecompNamingFalse-fullModelDetails.zip")) + .add(new PresetMSOCreateVfModuleALaCarteCypress(vfModule0RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, PresetMSOCreateVfModuleALaCarteCypress.module0Names, Constants.GR_API, withTestApi)) + .add(PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress.forVolumeGroup(volumeGroupRequestId, DEFAULT_INSTANCE_ID, vnfRequestId, Constants.GR_API, withTestApi)) + .add(PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress.forVfModule(vfModule1RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, volumeGroupRequestId, Constants.GR_API, withTestApi)) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_JUST_ANOTHER_REGION_TO_ATT_AIC) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MY_REGION_TO_ATT_AIC) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_LCP_REGION_TEXT_TO_ATT_AIC) + .add(new PresetMSOCreateVfModuleALaCarteCypress(vfModule2RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, PresetMSOCreateVfModuleALaCarteCypress.module2Names, Constants.GR_API, withTestApi)) + .build(); + + registerExpectationFromPresets( + Features.FLAG_ASYNC_ALACARTE_VFMODULE.isActive() ? presets : presetsWithoutVfModule, + RegistrationStrategy.CLEAR_THEN_SET); + } + + private void assertRecordedRequests(Map<String, Long> pathCounterOverride, Long defaultValue, String vnfRequestId) { + Long vfModulesDefaultValue = defaultValue == 1L ? 3L : 0L; + + //noinspection unchecked + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances", + pathCounterOverride.getOrDefault("serviceInstances", defaultValue)), + + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/networks", + pathCounterOverride.getOrDefault("networks", defaultValue)), + + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/vnfs", + pathCounterOverride.getOrDefault("vnfs", defaultValue)), + + TestUtils.hasOrLacksOfEntry("/mso/serviceInstances/v./" + DEFAULT_INSTANCE_ID + "/vnfs/" + vnfRequestId + "/volumeGroups", + pathCounterOverride.getOrDefault("volumeGroups", defaultValue)), + + TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/vnfs/" + vnfRequestId + "/vfModules", + pathCounterOverride.getOrDefault("vfModules", vfModulesDefaultValue)) + )); + } + + private ImmutableList<JobAuditStatus> vidAuditStatusesCompleted(String jobId) { + return ImmutableList.of( + vidAuditStatus(jobId, "PENDING", false), + vidAuditStatus(jobId, "IN_PROGRESS", false), + vidAuditStatus(jobId, "COMPLETED", true) + ); + } + + private ImmutableList<JobAuditStatus> msoAuditStatusesCompleted(String jobId ) { + return ImmutableList.of( + msoAuditStatus(jobId, "REQUESTED", null, UUID.fromString(DEFAULT_REQUEST_ID)), + msoAuditStatus(jobId, MSO_COMPLETE_STATUS, "Service Instance was created successfully.", UUID.fromString(DEFAULT_REQUEST_ID)) + ); + } + + private JobAuditStatus msoAuditStatus(String jobId, String jobStatus, String additionalInfo, UUID requestId) { + return new JobAuditStatus(UUID.fromString(jobId), jobStatus, SourceStatus.MSO, requestId, additionalInfo, false); + } + + private void assertServiceInfoSpecific2(String jobId, JobStatus jobStatus, String serviceInstanceName) { + assertServiceInfoSpecific2(jobId, jobStatus, serviceInstanceName, ServiceAction.INSTANTIATE); + } + + private void assertServiceInfoSpecific2(String jobId, JobStatus jobStatus, String serviceInstanceName, ServiceAction serviceAction) { + assertExpectedStatusAndServiceInfo(jobStatus, jobId, true, new ServiceInfo( + "us16807000", jobStatus, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + "JAG1", null, + "092eb9e8e4b7412e8787dd091bc58e86", null, + "JANET25", null, + "TYLER SILVIA", null, + null, serviceInstanceName, + "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "action-data", "1.0", + jobId, null, serviceAction, false) + ); + } + + private void assertServiceInfoSpecificDeletion(String jobId, JobStatus jobStatus, String serviceInstanceName, String serviceType) { + assertExpectedStatusAndServiceInfo(jobStatus, jobId, true, new ServiceInfo( + "us16807000", jobStatus, false, + null, null, null, + null, null, + null, null, + null, null, + serviceType, null, + null, serviceInstanceName, + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0", + jobId, null, ServiceAction.DELETE, false) + ); + } + + private void assertServiceInfoSpecificUpdate(String jobId, JobStatus jobStatus, String serviceInstanceName) { + assertExpectedStatusAndServiceInfo(jobStatus, jobId, true, new ServiceInfo( + "us16807000", jobStatus, false, + null, null, null, + null, null, + null, null, + null, null, + "service-instance-type", null, + "service-instance-id", serviceInstanceName, + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0", + jobId, null, ServiceAction.UPDATE, false) + ); + } + + enum Scenario { + PARALLEL, COMPLETED, NAME_TAKEN, DUPLICATE_NAME, IN_PROGRESS, MSO_FAIL + } + +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest2.java b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest2.java new file mode 100644 index 000000000..54f2cc66f --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest2.java @@ -0,0 +1,211 @@ +package org.onap.vid.api; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost.DEFAULT_REQUEST_ID; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.SERVICE_NAME; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPreset; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset; +import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; +import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseDelete; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2ErrorResponse; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteALaCarteService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGetErrorResponse; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestsGetByRequestId; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestsGetByServiceInstanceId; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus.SourceStatus; +import org.onap.vid.model.asyncInstantiation.ServiceInfo; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import vid.automation.test.infra.FeatureTogglingTest; +import vid.automation.test.infra.Features; +import vid.automation.test.model.JobStatus; +import vid.automation.test.model.ServiceAction; +import vid.automation.test.services.AsyncJobsService; +import vid.automation.test.services.SimulatorApi; +import vid.automation.test.services.SimulatorApi.RegistrationStrategy; + +@FeatureTogglingTest({Features.FLAG_ASYNC_JOBS, Features.FLAG_ASYNC_INSTANTIATION, Features.FLAG_ASYNC_ALACARTE_VNF}) +public class AsyncInstantiationALaCarteApiTest2 extends AsyncInstantiationBase { + + private static final String CREATE_BULK_OF_ALACARTE_MULTIPLE_VNF_NETWORK_REQUEST_CYPRESS = "a-la-carte/redux-multiple-vnf-network.json"; + private static final String DELETE_BULK_OF_ALACARTE_REQUEST = "VnfGroup/ServiceWithVnfGroupsDeleteRequest.json"; + private static final String SERVICE_INSTANCE_ID = BaseMSOPreset.DEFAULT_INSTANCE_ID; + + + @DataProvider + public static Object[][] scenarios() { + return new Object[][]{ + {Scenario.PARALLEL}, + {Scenario.COMPLETED}, +// {Scenario.NAME_TAKEN}, Not relevant because the name uniqueness is supported only for bulk in Macro +// {Scenario.DUPLICATE_NAME}, Not relevant because name duplication is not handled in A La Carte + {Scenario.IN_PROGRESS}, + {Scenario.MSO_FAIL} + }; + } + + @AfterMethod + protected void dropAllFromNameCounter() { + AsyncJobsService asyncJobsService = new AsyncJobsService(); + asyncJobsService.dropAllFromNameCounter(); + } + + @Test + public void deleteService_withBadResponseFromMso_verifyStatus() { + List<PresetMSOBaseDelete> deletePresets = ImmutableList.of(new PresetMSODeleteALaCarteService( DEFAULT_REQUEST_ID, SERVICE_INSTANCE_ID, 500)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(new PresetMSOOrchestrationRequestGet()); + List<BasePreset> presets = getDeletePresets(deletePresets, inProgressPresets); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_BULK_OF_ALACARTE_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertServiceInfoSpecificDeletion(jobId, JobStatus.FAILED, "wowServiceWithVnfGroping", "TYLER SILVIA"); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 0L) + )); + } + + + @Test + public void instantiationFailedForService(){ + CreateInstanceWithFailedService createInstanceWithFailedService = new CreateInstanceWithFailedService(this); + createInstanceWithFailedService.deployServiceFailedInstance(); + } + + @Test + void getBulkForRetry_notFoundException(){ + CreateServiceWithFailedVnf createServiceWithFailedVnf = new CreateServiceWithFailedVnf(this); + createServiceWithFailedVnf.getBulkForRetryNotFound(); + } + + + @Test + public void deploy1Service1FailedVnf_EditJobSendingSameDataAndRetry_verifyNewJobWithSameData() { + CreateServiceWithFailedVnf createServiceWithFailedVnf = new CreateServiceWithFailedVnf(this); + String bulkRetryPayload = createServiceWithFailedVnf.deployService1FailedVnf(); + createServiceWithFailedVnf.assertResourceAuditStatus(bulkRetryPayload); + createServiceWithFailedVnf.secondRegistration(); + createServiceWithFailedVnf.retryJobWithOtherDataAndAssert(bulkRetryPayload); + } + + @Test + public void deploy1Service1FailedVnf_EditSomeDetailsAndRetry_verifyNewJobWithEditedData() { + CreateServiceWithFailedVnf createServiceWithFailedVnf = new CreateServiceWithFailedVnf(this); + String originalBulkForRetry = createServiceWithFailedVnf.deployService1FailedVnf(); + createServiceWithFailedVnf.assertResourceAuditStatus(originalBulkForRetry); + String changedData = createServiceWithFailedVnf.changeSomeDataAndRegisterToSimulator(originalBulkForRetry); + createServiceWithFailedVnf.retryJobWithOtherDataAndAssert(changedData); + } + + private List<JobAuditStatus> getExpectedAuditFromFile(String fileName) throws IOException { + String content = TestUtils.convertRequest(objectMapper, fileName); + List<JobAuditStatus> auditStatusList = ImmutableList.copyOf(objectMapper.readValue(content, JobAuditStatus[].class)); + return auditStatusList; + + + } + + @Test + public void getAuditInfoForALaCarteByServiceInstanceId() throws IOException { + final String expectedMsoAuditInfo = "a-la-carte/auditInfoMSOALaCarte.json"; + registerExpectationFromPreset( + new PresetMSOOrchestrationRequestsGetByServiceInstanceId(), + RegistrationStrategy.CLEAR_THEN_SET); + List<JobAuditStatus> actualMsoAudits = getJobMsoAuditStatusForAlaCarte(UUID.randomUUID().toString(), "aa1234d1-5a33-55df-13ab-12abad84e333", "bc305d54-75b4-431b-adb2-eb6b9e546014"); + List<JobAuditStatus> expectedMsoAudits = getExpectedAuditFromFile(expectedMsoAuditInfo); + assertThat(actualMsoAudits, is(expectedMsoAudits)); + + } + + @Test + public void getAuditInfoForALaCarteByRequestId() { + registerExpectationFromPreset( + new PresetMSOOrchestrationRequestsGetByRequestId(), + RegistrationStrategy.CLEAR_THEN_SET); + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "serviceInstanceName"); + String uuid = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_MULTIPLE_VNF_NETWORK_REQUEST_CYPRESS).get(0); + List<JobAuditStatus> actualMsoAudits = getJobMsoAuditStatusForAlaCarte( uuid, "405652f4-ceb3-4a75-9474-8aea71480a77", null); + List<JobAuditStatus> expectedMsoAudits = ImmutableList.of( + new JobAuditStatus("serviceInstanceName", "FAILED", UUID.fromString("405652f4-ceb3-4a75-9474-8aea71480a77"),"Service Instance was failed.",false, "service")); + assertThat(actualMsoAudits, is(expectedMsoAudits)); + + } + + @Test + public void getAuditInfoForALaCarteByJobId() throws IOException { + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + new PresetMSOCreateServiceInstanceGen2ErrorResponse(), + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet() + ), + RegistrationStrategy.CLEAR_THEN_SET); + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "serviceInstanceName"); + String uuid = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_MULTIPLE_VNF_NETWORK_REQUEST_CYPRESS).get(0); + + assertAndRetryIfNeeded(() -> { + final List<JobAuditStatus> actualMsoAudits = getJobMsoAuditStatusForAlaCarte( uuid, null, null); + List<JobAuditStatus> expectedMsoAudits = ImmutableList.of( + new JobAuditStatus(UUID.fromString(uuid), "FAILED", SourceStatus.MSO, null, + "Http Code:500, \"messageId\":\"SVC0002\",\"text\":\"JSON Object Mapping Request\"", false, "serviceInstanceName")); + assertThat(actualMsoAudits, is(expectedMsoAudits)); + }, 15); + + //assert error audit status + Map<String, Object> bulkForRetry = objectMapper.readValue(getRetryBulk(uuid).getBody(), new TypeReference<Map<String, Object>>(){}); + String serviceTrackById = bulkForRetry.get("trackById").toString(); + Map<String, Object> resourceAuditInfo = (Map) getResourceAuditInfo(serviceTrackById); + assertThat(resourceAuditInfo.get("jobStatus"), equalTo("FAILED")); + assertThat(resourceAuditInfo.get("additionalInfo"), equalTo("Http Code:500, \"messageId\":\"SVC0002\",\"text\":\"JSON Object Mapping Request\"")); + } + + @Test(expectedExceptions = RuntimeException.class) + public void getAuditInfoForALaCarte_badResponseFromMso_throwsException() { + registerExpectationFromPreset( + new PresetMSOOrchestrationRequestGetErrorResponse(500), + RegistrationStrategy.CLEAR_THEN_SET); + getJobMsoAuditStatusForAlaCarte( UUID.randomUUID().toString(), "405652f4-ceb3-4a75-9474-8aea71480a77", null); + } + + private void assertServiceInfoSpecificDeletion(String jobId, JobStatus jobStatus, String serviceInstanceName, String serviceType) { + assertExpectedStatusAndServiceInfo(jobStatus, jobId, true, new ServiceInfo( + "us16807000", jobStatus, false, + null, null, null, + null, null, + null, null, + null, null, + serviceType, null, + null, serviceInstanceName, + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0", + jobId, null, ServiceAction.DELETE, false) + ); + } + + + enum Scenario { + PARALLEL, COMPLETED, NAME_TAKEN, DUPLICATE_NAME, IN_PROGRESS, MSO_FAIL + } + +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest3.java b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest3.java new file mode 100644 index 000000000..eed6ee90b --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationALaCarteApiTest3.java @@ -0,0 +1,645 @@ +package org.onap.vid.api; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost.DEFAULT_REQUEST_ID; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet.COMPLETE; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.RELATED_VNF1_ACTION; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.RELATED_VNF2_ACTION; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.SERVICE_NAME; +import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.VNF_GROUP1_ACTION; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPreset; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Function; +import org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset; +import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAISearchNodeQueryNonEmptyResult; +import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember.InstanceGroupMemberAction; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateNetworkALaCarteServiceCypress2; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteGroupingService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceMultipleVnfsServiceCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfALaCarteServiceCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfALaCarteServiceCypress2; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfGroup; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteBaseVfModuleCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteNetworkAlaCarteCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteService; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteVfModuleCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteVnfAlaCarteCypress; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus; +import org.onap.vid.model.asyncInstantiation.JobAuditStatus.SourceStatus; +import org.onap.vid.model.asyncInstantiation.ServiceInfo; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import vid.automation.test.infra.FeatureTogglingTest; +import vid.automation.test.infra.Features; +import vid.automation.test.model.JobStatus; +import vid.automation.test.model.ServiceAction; +import vid.automation.test.services.AsyncJobsService; +import vid.automation.test.services.SimulatorApi; +import vid.automation.test.services.SimulatorApi.RegistrationStrategy; + +@FeatureTogglingTest({Features.FLAG_ASYNC_JOBS, Features.FLAG_ASYNC_INSTANTIATION, Features.FLAG_ASYNC_ALACARTE_VNF}) +public class AsyncInstantiationALaCarteApiTest3 extends AsyncInstantiationBase { + + private static final String CREATE_BULK_OF_ALACARTE_REQUEST = "asyncInstantiation/vidRequestCreateALaCarte.json"; + private static final String CREATE_BULK_OF_ALACARTE_MULTIPLE_VNF_NETWORK_REQUEST_CYPRESS = "a-la-carte/redux-multiple-vnf-network.json"; + private static final String CREATE_BULK_OF_ALACARTE_REQUEST_WITH_VNF_GROUP = "VnfGroup/serviceWithVnfGroupCreateRequest.json"; + private static final String PAYLOAD_TEMPLATE_1_VNF_GROUP_WITH_3_MEMBERS_REQUEST = "VnfGroup/payloadTemplate1VnfGroupWith3MembersRequest.json"; + private static final String DELETE_AND_CREATE_NETWORK_FROM_SERVICE = "asyncInstantiation/vidRequestDelete1Create1Network.json"; + private static final String DELETE_SERVICE_WITH_NETWORK = "asyncInstantiation/vidRequestDeleteServiceWithNetwork.json"; + private static final String DELETE_AND_CREATE_VNF_FROM_SERVICE = "asyncInstantiation/vidRequestDelete1Create1Vnf.json"; + private static final String DELETE_SERVICE_WITH_VNF = "asyncInstantiation/vidRequestDeleteServiceWithVnf.json"; + + + private static final String FIRST_REQUEST_ID = "d1011670-0e1a-4b74-945d-8bf5aede1d9c"; + private static final String SECOND_REQUEST_ID = "e2011670-0e1a-4b74-945d-8bf5aede1d9c"; + private static final String THIRD_REQUEST_ID = "f3011670-0e1a-4b74-945d-8bf5aede1d9c"; + private static final String SERVICE_INSTANCE_ID = BaseMSOPreset.DEFAULT_INSTANCE_ID; + private static final String MSO_COMPLETE_STATUS = "COMPLETE"; + private static final String MSO_FAILED_STATUS = "FAILED"; + + + @DataProvider + public static Object[][] scenarios() { + return new Object[][]{ + {Scenario.PARALLEL}, + {Scenario.COMPLETED}, +// {Scenario.NAME_TAKEN}, Not relevant because the name uniqueness is supported only for bulk in Macro +// {Scenario.DUPLICATE_NAME}, Not relevant because name duplication is not handled in A La Carte + {Scenario.IN_PROGRESS}, + {Scenario.MSO_FAIL} + }; + } + + @AfterMethod + protected void dropAllFromNameCounter() { + AsyncJobsService asyncJobsService = new AsyncJobsService(); + asyncJobsService.dropAllFromNameCounter(); + } + + @Test(dataProvider = "multipleVnfDataProvider") + public void deployServiceFromCypress__multipleVnfsAndNetwork(String expectedStatus, JobStatus expectedJobStatus) { + dropAllFromNameCounter();// needed because each data provider info not going to after method + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "serviceInstanceName"); + + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOCreateServiceInstanceMultipleVnfsServiceCypress(names, 0, DEFAULT_REQUEST_ID), + new PresetMSOCreateVnfALaCarteServiceCypress(FIRST_REQUEST_ID, SERVICE_INSTANCE_ID,"VFvGeraldine00001", "zzz1"), + new PresetMSOCreateVnfALaCarteServiceCypress(SECOND_REQUEST_ID, SERVICE_INSTANCE_ID,"VFvGeraldine00001_001", "ONAP"), + new PresetMSOCreateNetworkALaCarteServiceCypress2(THIRD_REQUEST_ID, SERVICE_INSTANCE_ID, "ExtVL") + ); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet(expectedStatus.equals("SERVICE_FAILED") ? MSO_FAILED_STATUS : MSO_COMPLETE_STATUS, DEFAULT_REQUEST_ID), + new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, FIRST_REQUEST_ID, "First VNF instance was created successfully." ), + new PresetMSOOrchestrationRequestGet(expectedStatus, SECOND_REQUEST_ID, expectedStatus.equals(MSO_COMPLETE_STATUS)?"Second VNF instance was created successfully.": MSO_BASE_ERROR), + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, THIRD_REQUEST_ID,"Network was created successfully.") + ); + List<BasePreset> presets = getPresets( createPresets, inProgressPresets); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + registerExpectationFromPreset(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC, RegistrationStrategy.APPEND); + + final List<String> uuids = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_MULTIPLE_VNF_NETWORK_REQUEST_CYPRESS); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + //expected vid statuses + ImmutableList<JobAuditStatus> vidAuditStatuses; + + if (expectedStatus.equals(MSO_COMPLETE_STATUS)){ + vidAuditStatuses = vidAuditStatusesCompleted(jobId); + } else if (expectedStatus.equals("SERVICE_FAILED")){ + vidAuditStatuses = vidAuditStatusesFailed(jobId); + } else { + vidAuditStatuses = vidAuditStatusesCompletedWithErrors(jobId); + } + + assertServiceInfoSpecific3(jobId, expectedJobStatus , names.get(SERVICE_NAME)); + assertAuditStatuses(jobId, vidAuditStatuses, null); + } + + + @DataProvider + Object[][] multipleVnfDataProvider() { + return new Object[][]{{MSO_FAILED_STATUS, JobStatus.COMPLETED_WITH_ERRORS},{MSO_COMPLETE_STATUS, JobStatus.COMPLETED}, {"SERVICE_FAILED", JobStatus.FAILED}}; + } + + @Test + @FeatureTogglingTest(Features.FLAG_1902_VNF_GROUPING) + public void deploy1ServiceWith1VnfGroup() { + final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "Grouping_Service_Instance"); + String serviceReqId = "3cf5ea96-6b34-4945-b5b1-4a7798b1caf2"; + String serviceInstanceId = BaseMSOPreset.DEFAULT_INSTANCE_ID; + String instanceGroupReqId = "715a5106-cdcc-44ee-8923-83d68a896908"; + + List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of( + new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteGroupingService(names, 0, serviceReqId), + new PresetMSOCreateVnfGroup("ABC", instanceGroupReqId, PresetMSOCreateVnfGroup.MODEL_INFO_1, serviceInstanceId, false)); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet("COMPLETE", serviceReqId), + new PresetMSOOrchestrationRequestGet("COMPLETE", instanceGroupReqId, "Instance group was created successfully.")); + List<BasePreset> presets = getPresets(createPresets, inProgressPresets); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + + final List<String> uuids = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_REQUEST_WITH_VNF_GROUP); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertExpectedStatusAndServiceInfo(JobStatus.COMPLETED, jobId, new ServiceInfo( + "us16807000", JobStatus.COMPLETED, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + null, null, + null, null, + null, null, + "TYLER SILVIA", "SILVIA ROBBINS", + null, names.get(SERVICE_NAME), + "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0", + jobId, null, ServiceAction.INSTANTIATE, false)); + + + assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId),null); + + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(createPresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L))); + } + + @DataProvider + public static Object[][] addAndDeleteMembersMsoStatus() { + return new Object[][]{ + {MSO_COMPLETE_STATUS, MSO_COMPLETE_STATUS, JobStatus.COMPLETED}, + {MSO_FAILED_STATUS, MSO_FAILED_STATUS, JobStatus.FAILED}, + {MSO_COMPLETE_STATUS, MSO_FAILED_STATUS, JobStatus.COMPLETED_WITH_ERRORS} + }; + } + + @Test(dataProvider = "addAndDeleteMembersMsoStatus") + @FeatureTogglingTest(Features.FLAG_1902_VNF_GROUPING) + public void add1delete1GroupMembers_withGoodResponseFromMso_verifyStatusAndRequests(String firstMemberStatus, String secondMemberStatus, JobStatus expectedJobStatus) { + + String firstMemberRequestId = UUID.randomUUID().toString(); + String secondMemberRequestId = UUID.randomUUID().toString(); + + List<PresetMSOAddOrRemoveOneInstanceGroupMember> instanceGroupMemberPreset = ImmutableList.of( + new PresetMSOAddOrRemoveOneInstanceGroupMember("VNF_GROUP1_INSTANCE_ID", "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), firstMemberRequestId, InstanceGroupMemberAction.Add), + new PresetMSOAddOrRemoveOneInstanceGroupMember("VNF_GROUP1_INSTANCE_ID", "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), secondMemberRequestId, InstanceGroupMemberAction.Remove) + ); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet(firstMemberStatus, firstMemberRequestId), + new PresetMSOOrchestrationRequestGet(secondMemberStatus, secondMemberRequestId) + ); + + List<BasePreset> presets = getGroupMembersPresets(instanceGroupMemberPreset,inProgressPresets); + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of( + VNF_GROUP1_ACTION, "None", + RELATED_VNF1_ACTION, "Create", + RELATED_VNF2_ACTION, "None_Delete" + ), PAYLOAD_TEMPLATE_1_VNF_GROUP_WITH_3_MEMBERS_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertAuditStatuses(jobId, vidAuditStatuses(jobId, expectedJobStatus), null, 60); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(instanceGroupMemberPreset.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(instanceGroupMemberPreset.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L) + )); + } + + @Test + @FeatureTogglingTest(Features.FLAG_1902_VNF_GROUPING) + public void addVnfGroupWith2GroupMembers_withGoodResponseFromMso_verifyStatusAndRequests() { + + String vnfGroupRequestId = UUID.randomUUID().toString(); + String firstMemberRequestId = UUID.randomUUID().toString(); + String secondMemberRequestId = UUID.randomUUID().toString(); + + List <PresetMSOCreateVnfGroup> vnfGroupPreset = ImmutableList.of( + new PresetMSOCreateVnfGroup("VNF_GROUP1_INSTANCE_NAME",vnfGroupRequestId,PresetMSOCreateVnfGroup.MODEL_INFO_0,"service-instance-id", true)); + List<PresetMSOAddOrRemoveOneInstanceGroupMember> instanceGroupMemberPreset = ImmutableList.of( + new PresetMSOAddOrRemoveOneInstanceGroupMember("VNF_GROUP1_INSTANCE_ID", "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), firstMemberRequestId, InstanceGroupMemberAction.Add), + new PresetMSOAddOrRemoveOneInstanceGroupMember("VNF_GROUP1_INSTANCE_ID", "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), secondMemberRequestId, InstanceGroupMemberAction.Add) + ); + List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of( + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupRequestId), + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, firstMemberRequestId), + new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, secondMemberRequestId) + ); + + final ImmutableList.Builder<BasePreset> basePresetBuilder = new ImmutableList.Builder<>(); + basePresetBuilder + .add(new PresetGetSessionSlotCheckIntervalGet()) + .add(new PresetAAIGetSubscribersGet()) + .addAll(instanceGroupMemberPreset) + .addAll(inProgressPresets) + .addAll(vnfGroupPreset); + List<BasePreset> presets = basePresetBuilder.build(); + + registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET); + final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of( + VNF_GROUP1_ACTION, "Create", + RELATED_VNF1_ACTION, "Create", + RELATED_VNF2_ACTION, "Create" + ), PAYLOAD_TEMPLATE_1_VNF_GROUP_WITH_3_MEMBERS_REQUEST); + + assertThat(uuids, hasSize(1)); + final String jobId = uuids.get(0); + + assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), null, 60); + assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf( + TestUtils.hasOrLacksOfEntry(vnfGroupPreset.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(instanceGroupMemberPreset.get(0).getReqPath(), 2L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L), + TestUtils.hasOrLacksOfEntry(inProgressPresets.get(2).getReqPath(), 1L) + )); + } + + @Test(dataProvider = "scenarios") + public void aLaCarteServiceScenarioRunner(Scenario scenario) { + /* + This tests creates one or more a-la-carte requests, following one of the these scenarios: + + MSO_FAIL: Submits to MSO, but while getting Orchestration status -> MSO + reports failure + COMPLETED: Clean legit flow. + NAME_TAKEN: Sends request for instance, where AAI reports the name is + already taken. Therefore, MSO expects added postfix _001. + IN_PROGRESS: Submits to MSO, but while getting Orchestration status -> MSO + reports IN_PROGRESS endlessly + DUPLICATE_NAME: Sends two requests for instances with the same name. + PARALLEL: Submits 3 requests, that must not interfere with each other. + */ + + registerExpectationFromPresets(ImmutableList.of( + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet() + ), RegistrationStrategy.CLEAR_THEN_SET); + + + final String name0 = randomAlphabetic(18); + + OneServiceActor inProgressCase = new OneServiceActor( + scenario == Scenario.PARALLEL || scenario == Scenario.IN_PROGRESS || scenario == Scenario.DUPLICATE_NAME, + "IN_PROGRESS", "status #1", + ImmutableMap.of(SERVICE_NAME, name0), 0, + JobStatus.IN_PROGRESS, this::vidAuditStatusesInProgress + ); + + OneServiceActor completedCase = new OneServiceActor( + scenario == Scenario.PARALLEL || scenario == Scenario.COMPLETED, + MSO_COMPLETE_STATUS, "status #2", + ImmutableMap.of(SERVICE_NAME, randomAlphabetic(5)), 0, + JobStatus.COMPLETED, this::vidAuditStatusesCompleted + ); + + final String name1 = randomAlphabetic(5); + OneServiceActor occupiedNameCase = new OneServiceActor( + scenario == Scenario.NAME_TAKEN, + MSO_COMPLETE_STATUS, "status #6", + ImmutableMap.of(SERVICE_NAME, name1), 1, + JobStatus.COMPLETED, this::vidAuditStatusesCompleted, + ImmutableList.of(new PresetAAISearchNodeQueryNonEmptyResult("service-instance", name1)) + ); + + OneServiceActor failedCase = new OneServiceActor( + scenario == Scenario.PARALLEL || scenario == Scenario.MSO_FAIL, + "FAILED", "status #3", + ImmutableMap.of(SERVICE_NAME, randomAlphabetic(10)), 0, + JobStatus.FAILED, this::vidAuditStatusesFailed + ); + + OneServiceActor duplicateNameCase = new OneServiceActor( + scenario == Scenario.DUPLICATE_NAME, + MSO_COMPLETE_STATUS, "status #4", + ImmutableMap.of(SERVICE_NAME, name0), 1, + JobStatus.COMPLETED, this::vidAuditStatusesCompleted + ); + + OneServiceActor inProgressTooLongCase = new OneServiceActor( + scenario == Scenario.IN_PROGRESS, + "IN_PROGRESS", "status #5", + ImmutableMap.of(SERVICE_NAME, randomAlphabetic(10)), 0, + JobStatus.FAILED, this::vidAuditStatusesFailed, 24 + ); + + final List<OneServiceActor> servicesActors = + ImmutableList.of(inProgressCase, completedCase, occupiedNameCase, failedCase, duplicateNameCase, inProgressTooLongCase); + + servicesActors.forEach(actor -> registerExpectationFromPresets(actor.getPresets(), + RegistrationStrategy.APPEND)); + + servicesActors.forEach(OneServiceActor::createInstances); + + servicesActors.forEach(OneServiceActor::assertServiceInfo); + servicesActors.forEach(OneServiceActor::assertAuditStatuses2); + } + + @Test + public void delete1Create1NetworkFromService() { + String deleteRequestId = UUID.randomUUID().toString(); + String createRequestId = UUID.randomUUID().toString(); + String serviceInstanceId = BaseMSOPreset.DEFAULT_INSTANCE_ID; + String networkInstanceId = "NETWORK_INSTANCE_ID"; + + registerExpectationFromPresets(ImmutableList.of( + new PresetMSODeleteNetworkAlaCarteCypress(deleteRequestId, serviceInstanceId, networkInstanceId, "us16807000"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteRequestId), + new PresetMSOCreateNetworkALaCarteServiceCypress2(createRequestId, serviceInstanceId, "ExtVL", "action-data", "6b528779-44a3-4472-bdff-9cd15ec93450"), + new PresetMSOOrchestrationRequestGet(COMPLETE, createRequestId), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC + ), RegistrationStrategy.CLEAR_THEN_SET); + + List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_AND_CREATE_NETWORK_FROM_SERVICE); + assertThat(uuids, hasSize(1)); + String jobId = uuids.get(0); + + assertExpectedStatusAndServiceInfo(JobStatus.COMPLETED, jobId, true, new ServiceInfo( + "us16807000", JobStatus.COMPLETED, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + "JAG1", "YUDFJULP-JAG1", + "092eb9e8e4b7412e8787dd091bc58e86", "USP-SIP-IC-24335-T-01", + "JANET25", null, + "TYLER SILVIA", null, + null, "InstanceName", + "6b528779-44a3-4472-bdff-9cd15ec93450", "action-data", "1.0", + jobId, null, ServiceAction.UPDATE, false) + ); + } + + @Test + public void deleteServiceWithNetwork() { + String deleteNetworkRequestId = UUID.randomUUID().toString(); + String deleteServiceRequestId = UUID.randomUUID().toString(); + String serviceInstanceId = BaseMSOPreset.DEFAULT_INSTANCE_ID; + String networkInstanceId = "NETWORK_INSTANCE_ID"; + + registerExpectationFromPresets(ImmutableList.of( + new PresetMSODeleteNetworkAlaCarteCypress(deleteNetworkRequestId, serviceInstanceId, networkInstanceId, "us16807000"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteNetworkRequestId), + new PresetMSODeleteService(deleteServiceRequestId, serviceInstanceId), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteServiceRequestId), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC + ), RegistrationStrategy.CLEAR_THEN_SET); + + List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_SERVICE_WITH_NETWORK); + assertThat(uuids, hasSize(1)); + String jobId = uuids.get(0); + + assertExpectedStatusAndServiceInfo(JobStatus.COMPLETED, jobId, true, new ServiceInfo( + "us16807000", JobStatus.COMPLETED, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + "JAG1", "YUDFJULP-JAG1", + "092eb9e8e4b7412e8787dd091bc58e86", "USP-SIP-IC-24335-T-01", + "JANET25", null, + "TYLER SILVIA", null, + null, "InstanceName", + "6b528779-44a3-4472-bdff-9cd15ec93450", "action-data", "1.0", + jobId, null, ServiceAction.DELETE, false) + ); + } + + @Test + public void delete1VnfWithVfModulesAndCreate1VnfFromService() { + String deleteVnfRequestId = UUID.randomUUID().toString(); + String createVnfRequestId = UUID.randomUUID().toString(); + String deleteVfModuleRequestId = UUID.randomUUID().toString(); + String deleteBaseVfModuleRequestId = UUID.randomUUID().toString(); + String serviceInstanceId = BaseMSOPreset.DEFAULT_INSTANCE_ID; + String vnfInstanceId = "VNF_INSTANCE_ID"; + + registerExpectationFromPresets(ImmutableList.of( + new PresetAAIGetSubscribersGet(), + new PresetMSODeleteVnfAlaCarteCypress(deleteVnfRequestId, serviceInstanceId, vnfInstanceId, "us16807000"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteVnfRequestId), + new PresetSDCGetServiceToscaModelGet("6b528779-44a3-4472-bdff-9cd15ec93450", "csar-withDynamicFields-ecompNamingFalse-partialModelDetails-vnfEcompNamingFalse.zip"), + new PresetSDCGetServiceMetadataGet("6b528779-44a3-4472-bdff-9cd15ec93450", "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0" , "csar-withDynamicFields-ecompNamingFalse-partialModelDetails-vnfEcompNamingFalse.zip"), + new PresetMSODeleteVfModuleCypress(deleteVfModuleRequestId, serviceInstanceId, vnfInstanceId, "VF_MODULE_INSTANCE_ID"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteVfModuleRequestId), + new PresetMSODeleteBaseVfModuleCypress(deleteBaseVfModuleRequestId, serviceInstanceId, vnfInstanceId, "VF_MODULE_BASE_INSTANCE_ID"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteBaseVfModuleRequestId), + new PresetMSOCreateVnfALaCarteServiceCypress2(createVnfRequestId, serviceInstanceId, "2017388_PASQUALEvPEmCaNkinstanceName", "zzz1"), + new PresetMSOOrchestrationRequestGet(COMPLETE, createVnfRequestId), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_SOME_LEGACY_REGION_TO_ATT_AIC, + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC, + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AAIAIC25_TO_ATT_AIC + ), RegistrationStrategy.CLEAR_THEN_SET); + + List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_AND_CREATE_VNF_FROM_SERVICE); + assertThat(uuids, hasSize(1)); + String jobId = uuids.get(0); + + assertExpectedStatusAndServiceInfo(JobStatus.COMPLETED, jobId, true, new ServiceInfo( + "us16807000", JobStatus.COMPLETED, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + "NFT1", "NFTJSSSS-NFT1", + "bae71557c5bb4d5aac6743a4e5f1d054", "AIN Web Tool-15-D-testalexandria", + "hvf6", null, + "TYLER SILVIA", null, + "f8791436-8d55-4fde-b4d5-72dd2cf13cfb", "mCaNkinstancename", + "6b528779-44a3-4472-bdff-9cd15ec93450", "action-data", "1.0", + jobId, null, ServiceAction.UPDATE, false) + ); + } + + @Test + public void deleteServiceWithVnf() { + String deleteVnfRequestId = UUID.randomUUID().toString(); + String deleteServiceRequestId = UUID.randomUUID().toString(); + String serviceInstanceId = BaseMSOPreset.DEFAULT_INSTANCE_ID; + String vnfInstanceId = "VNF_INSTANCE_ID"; + + registerExpectationFromPresets(ImmutableList.of( + new PresetMSODeleteVnfAlaCarteCypress(deleteVnfRequestId, serviceInstanceId, vnfInstanceId, "us16807000"), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteVnfRequestId), + new PresetMSODeleteService(deleteServiceRequestId, serviceInstanceId), + new PresetMSOOrchestrationRequestGet(COMPLETE, deleteServiceRequestId), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_SOME_LEGACY_REGION_TO_ATT_AIC + ), RegistrationStrategy.CLEAR_THEN_SET); + + List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_SERVICE_WITH_VNF); + assertThat(uuids, hasSize(1)); + String jobId = uuids.get(0); + + assertExpectedStatusAndServiceInfo(JobStatus.COMPLETED, jobId, true, new ServiceInfo( + "us16807000", JobStatus.COMPLETED, false, + "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS", + "NFT1", "NFTJSSSS-NFT1", + "bae71557c5bb4d5aac6743a4e5f1d054", "AIN Web Tool-15-D-testalexandria", + "hvf6", null, + "TYLER SILVIA", null, + "f8791436-8d55-4fde-b4d5-72dd2cf13cfb", "mCaNkinstancename", + "6b528779-44a3-4472-bdff-9cd15ec93450", "action-data", "1.0", + jobId, null, ServiceAction.DELETE, false) + ); + } + + private ImmutableList<JobAuditStatus> vidAuditStatusesInProgress(String jobId) { + return ImmutableList.of( + vidAuditStatus(jobId, "PENDING", false), + vidAuditStatus(jobId, "IN_PROGRESS", false) + ); + } + + private ImmutableList<JobAuditStatus> vidAuditStatusesCompleted(String jobId) { + return ImmutableList.of( + vidAuditStatus(jobId, "PENDING", false), + vidAuditStatus(jobId, "IN_PROGRESS", false), + vidAuditStatus(jobId, "COMPLETED", true) + ); + } + + private ImmutableList<JobAuditStatus> vidAuditStatuses(String jobId, JobStatus jobStatus) { + switch(jobStatus) { + case COMPLETED: + return vidAuditStatusesCompleted(jobId); + case COMPLETED_WITH_ERRORS: + return vidAuditStatusesCompletedWithErrors(jobId); + case FAILED: + return vidAuditStatusesFailed(jobId); + case IN_PROGRESS: + return vidAuditStatusesInProgress(jobId); + } + + return null; + } + + private ImmutableList<JobAuditStatus> msoAuditStatuses(String jobId , String lastStatus, String lastAdditionalInfo) { + final List<JobAuditStatus> auditMsoStatuses = getAuditStatuses(jobId, SourceStatus.MSO.name()); + final UUID actualRequestId = auditMsoStatuses.get(0).getRequestId(); + return ImmutableList.of( + msoAuditStatus(jobId, "REQUESTED", null, actualRequestId), + msoAuditStatus(jobId, lastStatus, lastAdditionalInfo, actualRequestId) + ); + } + + private JobAuditStatus msoAuditStatus(String jobId, String jobStatus, String additionalInfo, UUID requestId) { + return new JobAuditStatus(UUID.fromString(jobId), jobStatus, SourceStatus.MSO, requestId, additionalInfo, false); + } + + private void assertServiceInfoSpecific3(String jobId, JobStatus jobStatus, String serviceInstanceName) { + assertExpectedStatusAndServiceInfo(jobStatus, jobId, true, new ServiceInfo( + "us16807000", jobStatus, false, + "aaa1", "aaa1", "yyy1", + "YYY1", "UUUAIAAI-YYY1", + "1178612d2b394be4834ad77f567c0af2", "AIN Web Tool-15-D-SSPtestcustome", + "hvf6", null, + "TYLER SILVIA", null, + null, serviceInstanceName, + "6e59c5de-f052-46fa-aa7e-2fca9d674c44", "ComplexService", "1.0", + jobId, null, ServiceAction.INSTANTIATE, false) + ); + } + + private List<BasePreset> getGroupMembersPresets(List<PresetMSOAddOrRemoveOneInstanceGroupMember> deleteMembersPreset, List<PresetMSOOrchestrationRequestGet> inProgressPresets) { + final ImmutableList.Builder<BasePreset> basePresetBuilder = new ImmutableList.Builder<>(); + basePresetBuilder + .add(new PresetGetSessionSlotCheckIntervalGet()) + .add(new PresetAAIGetSubscribersGet()) + .addAll(deleteMembersPreset) + .addAll(inProgressPresets); + return basePresetBuilder.build(); + } + + + enum Scenario { + PARALLEL, COMPLETED, NAME_TAKEN, DUPLICATE_NAME, IN_PROGRESS, MSO_FAIL + } + + class OneServiceActor { + private final boolean isRelevant; + private final String requestId; + private final String msoInfo; + private final Map<PresetMSOServiceInstanceGen2WithNames.Keys, String> serviceNames; + private final int suffix; + private final String expectedMsoLastStatus; + private final JobStatus jobStatus; + private final Function<String, List<JobAuditStatus>> jobAuditStatusesProvider; + private String jobId; + private int startedHoursAgo = 1; + private List<BasePreset> morePresets = ImmutableList.of(); + + private OneServiceActor(boolean isRelevant, String msoLastStatus, String msoInfo, Map<PresetMSOServiceInstanceGen2WithNames.Keys, String> serviceNames, int suffix, JobStatus jobStatus, Function<String, List<JobAuditStatus>> jobAuditStatusesProvider) { + this.isRelevant = isRelevant; + this.requestId = UUID.randomUUID().toString(); + this.msoInfo = msoInfo; + this.serviceNames = serviceNames; + this.suffix = suffix; + this.expectedMsoLastStatus = msoLastStatus; + this.jobStatus = jobStatus; + this.jobAuditStatusesProvider = jobAuditStatusesProvider; + } + + private OneServiceActor(boolean isRelevant, String msoLastStatus, String msoInfo, Map<PresetMSOServiceInstanceGen2WithNames.Keys, String> serviceNames, int suffix, JobStatus jobStatus, Function<String, List<JobAuditStatus>> jobAuditStatusesProvider, int startedHoursAgo) { + this(isRelevant, msoLastStatus, msoInfo, serviceNames, suffix, jobStatus, jobAuditStatusesProvider); + this.startedHoursAgo = startedHoursAgo; + } + + private OneServiceActor(boolean isRelevant, String msoLastStatus, String msoInfo, Map<PresetMSOServiceInstanceGen2WithNames.Keys, String> serviceNames, int suffix, JobStatus jobStatus, Function<String, List<JobAuditStatus>> jobAuditStatusesProvider, List<BasePreset> morePresets) { + this(isRelevant, msoLastStatus, msoInfo, serviceNames, suffix, jobStatus, jobAuditStatusesProvider); + this.morePresets = morePresets; + } + + public List<BasePreset> getPresets() { + // if not relevant -> return empty list + return isRelevant ? + ImmutableList.<BasePreset>builder().add( + new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService(serviceNames, suffix, requestId), + new PresetMSOOrchestrationRequestGet(expectedMsoLastStatus, requestId, msoInfo, startedHoursAgo) + ).addAll(morePresets).build() + : ImmutableList.of(); + } + + private void createInstances() { + // call VID with 1 request, keep the job id + if (!isRelevant) return; + final List<String> jobIds = createBulkOfInstances(false, 1, serviceNames, CREATE_BULK_OF_ALACARTE_REQUEST); + assertThat(jobIds, hasSize(1)); + jobId = jobIds.get(0); + } + + private void assertServiceInfo() { + if (!isRelevant) return; + assertThat(jobId, is(not(nullValue()))); + assertServiceInfoSpecific1(jobId, jobStatus, serviceNames.get(SERVICE_NAME)); + } + + private void assertAuditStatuses2() { + if (!isRelevant) return; + assertThat(jobId, is(not(nullValue()))); + assertAuditStatuses(jobId, jobAuditStatusesProvider.apply(jobId), msoAuditStatuses(jobId, expectedMsoLastStatus, msoInfo)); + } + } + +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationApiTest.java index a5b72c261..5c4d8a876 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/AsyncInstantiationApiTest.java @@ -1,27 +1,22 @@ package org.onap.vid.api; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import net.bytebuddy.utility.RandomString; import net.javacrumbs.jsonunit.JsonAssert; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import org.hamcrest.BaseMatcher; -import org.hamcrest.CoreMatchers; -import org.hamcrest.Description; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; -import org.onap.simulator.presetGenerator.presets.aai.PresetAAISearchNodeQueryEmptyResult; import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; import org.onap.simulator.presetGenerator.presets.mso.*; import org.onap.vid.model.asyncInstantiation.JobAuditStatus; import org.onap.vid.model.asyncInstantiation.ServiceInfo; -import org.onap.vid.model.mso.MsoResponseWrapper2; -import org.springframework.core.ParameterizedTypeReference; +import org.onap.sdc.ci.tests.datatypes.UserCredentials; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.HttpServerErrorException; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -32,76 +27,33 @@ import vid.automation.test.model.JobStatus; import vid.automation.test.services.SimulatorApi; import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.IntStream; import java.util.stream.Stream; -import static java.lang.Boolean.FALSE; -import static java.lang.Boolean.TRUE; import static java.util.stream.Collectors.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasSize; import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys; -import static org.testng.Assert.assertNotNull; +import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; +import static vid.automation.test.infra.Features.FLAG_1906_INSTANTIATION_API_USER_VALIDATION; +import static vid.automation.test.utils.ExtendedHamcrestMatcher.hasItemsFromCollection; @FeatureTogglingTest({Features.FLAG_ASYNC_JOBS, Features.FLAG_ASYNC_INSTANTIATION}) -public class AsyncInstantiationApiTest extends BaseMsoApiTest { +public class AsyncInstantiationApiTest extends AsyncInstantiationBase { + private static final Logger logger = LogManager.getLogger(AsyncInstantiationApiTest.class); - private static final String CREATE_BULK_OF_MACRO_REQUEST = "asyncInstantiation/vidRequestCreateBulkOfMacro.json"; - - @DataProvider - public static Object[][] trueAndFalse() { - return new Object[][]{{TRUE},{FALSE}}; - } - - private String getCreateBulkUri() { - return uri.toASCIIString() + "/asyncInstantiation/bulk"; - } - - private String getHideServiceUri(String jobId) { - return uri.toASCIIString() + "/asyncInstantiation/hide/"+jobId; - } - - private String getServiceInfoUrl() { - return uri.toASCIIString() + "/asyncInstantiation"; - } - - private String getJobAuditUrl() { - return uri.toASCIIString() + "/asyncInstantiation/auditStatus/{JOB_ID}?source={SOURCE}"; - } - - private String getDeleteServiceUrl(String uuid) { - return uri.toASCIIString() + "/asyncInstantiation/job/" + uuid; - } - - public static class JobIdAndStatusMatcher extends BaseMatcher<ServiceInfo> { - private String expectedJobId; - - public JobIdAndStatusMatcher(String expectedJobId) { - this.expectedJobId = expectedJobId; - } - - @Override - public boolean matches(Object item) { - if (!(item instanceof ServiceInfo)) { - return false; - } - ServiceInfo serviceInfo = (ServiceInfo) item; - return expectedJobId.equals(serviceInfo.jobId); - } - - @Override - public void describeTo(Description description) { - description.appendText("failed to find job with uuid ") - .appendValue(expectedJobId); - } - } + private static final String MSO_BASE_ERROR = + "Received error from SDN-C: java.lang.IllegalArgumentException: All keys must be specified for class org."+ + "opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.vf.module.assignments.vf."+ + "module.assignments.vms.VmKey. Missing key is getVmType. Supplied key is VmKey []."; + private static final String MSO_ERROR = MSO_BASE_ERROR + StringUtils.repeat(" and a lot of sentences for long message", 60); + private static final String INSTANCE_GROUP_ID_LABEL = "instanceGroupId"; + private static final String INSTANCE_GROUP_LABEL = "instanceGroup"; @Test public void createBulkOfCreateInstances(){ @@ -111,40 +63,6 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { createBulkOfInstancesAndAssert(presets, false, bulkSize, JobStatus.COMPLETED, names); } - private Map<Keys,String> generateNames() { - return Stream.of(Keys.values()).collect( - Collectors.toMap(x->x, x -> UUID.randomUUID().toString().replace("-",""))); - } - - private ImmutableList<BasePreset> addPresetsForCreateBulkOfCreateInstances(int bulkSize, Map<Keys, String> names){ - ImmutableList<BasePreset> msoBulkPresets = IntStream.rangeClosed(1,bulkSize). - mapToObj(i-> new PresetMSOCreateServiceInstanceGen2WithNames(names, i)) - .collect(ImmutableList.toImmutableList()); - ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() - .add(new PresetGetSessionSlotCheckIntervalGet()) - .add(new PresetAAIGetSubscribersGet()) - .add(new PresetAAISearchNodeQueryEmptyResult()) - .addAll(msoBulkPresets) - .add(new PresetMSOOrchestrationRequestGet()) - .build(); - return presets; - - } - - private ResponseEntity<List<JobAuditStatus>> auditStatusCall(String url) { - return restTemplate.exchange( - url, - org.springframework.http.HttpMethod.GET, - null, - new ParameterizedTypeReference<List<JobAuditStatus>>() {}); - } - - @DataProvider - public static Object[][] auditSources() { - return new Object[][]{{JobAuditStatus.SourceStatus.VID},{JobAuditStatus.SourceStatus.MSO}}; - } - - @Test(dataProvider = "auditSources") public void getAuditStatus_nonExistingJobId_returnsEmptyList(JobAuditStatus.SourceStatus source){ List<JobAuditStatus> audits = getAuditStatuses(UUID.randomUUID().toString(), source.name()); @@ -170,13 +88,8 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { for(String jobId: jobIds) { List<JobAuditStatus> actualVidAudits = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.VID.name()); List<JobAuditStatus> expectedVidAudits = Stream.of(JobStatus.PENDING, JobStatus.IN_PROGRESS, JobStatus.COMPLETED) - .map(status->new JobAuditStatus(UUID.fromString(jobId), - status.name(), - JobAuditStatus.SourceStatus.VID, - null, - null, - status.equals(JobStatus.COMPLETED))).collect(toList()); - assertThat(actualVidAudits, is(expectedVidAudits)); + .map(status-> vidAuditStatus(jobId, status.name(), status.equals(JobStatus.COMPLETED))).collect(toList()); + assertThat(actualVidAudits, hasItemsFromCollection(expectedVidAudits)); List<JobAuditStatus> actualMsoAudits = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO.name()); List<JobAuditStatus> expectedMsoAudits = Stream.of("REQUESTED", "COMPLETE") @@ -190,29 +103,6 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { } } - protected List<String> createBulkAndWaitForBeCompleted(int bulkSize){ - Map<Keys, String> names = generateNames(); - ImmutableList<BasePreset> presets = addPresetsForCreateBulkOfCreateInstances(bulkSize, names); - final List<String> jobIds = createBulkOfInstances(presets, false, bulkSize, names); - Assert.assertEquals(jobIds.size(),bulkSize); - - assertTrue(String.format("Not all services with ids: %s are in state completed after 30 sec", - jobIds.stream().collect(joining(","))), - - Wait.waitFor(y-> serviceListCall().getBody().stream() - .filter(si -> jobIds.contains(si.jobId)) - .filter(si -> si.jobStatus==JobStatus.COMPLETED) - .count() == bulkSize, - null, 30, 1 )); - return jobIds; - } - - private List<JobAuditStatus> getAuditStatuses(String jobUUID, String source){ - String url = getJobAuditUrl().replace("{JOB_ID}",jobUUID).replace("{SOURCE}", source); - ResponseEntity<List<JobAuditStatus>> statusesResponse = auditStatusCall(url); - assertThat(statusesResponse.getStatusCode(), CoreMatchers.equalTo(HttpStatus.OK)); - return statusesResponse.getBody(); - } @Test(expectedExceptions = HttpClientErrorException.class) public void addBulkAndDeleteInProgress_deletionIsRejected(){ @@ -245,52 +135,6 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { assertThat("deleted job shall not be present in StatusInfo response", statusesNow, is(statusesBefore)); } - private Map<String, JobStatus> addBulkAllPendingButOneInProgress(){ - return addBulkAllPendingButOneInProgress(3); - } - - private Map<String, JobStatus> addBulkAllPendingButOneInProgress(int bulkSize){ - Map<Keys, String> names = generateNames(); - ImmutableList<BasePreset> msoBulkPresets = IntStream.rangeClosed(1,bulkSize) - .mapToObj(i-> new PresetMSOCreateServiceInstanceGen2WithNames(names, i)) - .collect(ImmutableList.toImmutableList()); - ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() - .add(new PresetGetSessionSlotCheckIntervalGet()) - .add(new PresetAAISearchNodeQueryEmptyResult()) - .add(new PresetAAIGetSubscribersGet()) - .addAll(msoBulkPresets) - .add(new PresetMSOOrchestrationRequestGet("IN_PROGRESS")) - .build(); - final List<String> jobIds = createBulkOfInstances(presets, false, bulkSize, names); - - // wait for single IN_PROGRESS, so statuses will stop from changing - Wait.waitFor(foo -> serviceListCall().getBody().stream() - .filter(si -> jobIds.contains(si.jobId)) - .anyMatch(si -> si.jobStatus.equals(JobStatus.IN_PROGRESS)), - null, 20, 1); - - final Map<String, JobStatus> statusMapBefore = serviceListCall().getBody().stream() - .filter(si -> jobIds.contains(si.jobId)) - .collect(toMap(si -> si.jobId, si -> si.jobStatus)); - - assertThat(jobIds, hasSize(bulkSize)); - - - return statusMapBefore; - } - - private String deleteOneJobHavingTheStatus(Map<String, JobStatus> jobIdToStatus, JobStatus jobStatus) { - final String jobToDelete = jobIdToStatus.entrySet().stream() - .filter(entry -> entry.getValue().equals(jobStatus)) - .map(Map.Entry::getKey) - .findFirst().orElseThrow(() -> new AssertionError("no job in " + jobStatus + " state: " + jobIdToStatus)); - - - restTemplate.delete(getDeleteServiceUrl(jobToDelete)); - - return jobToDelete; - } - @Test(invocationCount = 3) public void createBulkOfCreateInstancesWithSinglePreset_firstOneInProgressOtherArePending(){ final int bulkSize = 3; @@ -306,7 +150,6 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { // PENDING: The other two jobs - named with _002 and _003 - are the still pending assertThat(jobIds, hasSize(bulkSize)); assertThat(statuses.get(JobStatus.IN_PROGRESS), hasSize(1)); - assertThat(statuses.get(JobStatus.IN_PROGRESS), everyItem(hasProperty("serviceInstanceName", endsWith("_001")))); assertThat(statuses.get(JobStatus.PENDING), hasSize(bulkSize - 1)); } @@ -320,18 +163,16 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { //if there is a preset for create, service shall failed during in_progress (upon get status) //it there is no preset for create, service shall failed during pending (upon create request) List<BasePreset> msoBulkPresets = isPresetForCreate ? - IntStream.rangeClosed(1,bulkSize) - .mapToObj(i-> new PresetMSOCreateServiceInstanceGen2WithNames(names, i)) - .collect(ImmutableList.toImmutableList()) : + generateMsoCreateBulkPresets(bulkSize, names) : new LinkedList<>(); ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() .add(new PresetGetSessionSlotCheckIntervalGet()) .add(new PresetAAIGetSubscribersGet()) - .add(new PresetAAISearchNodeQueryEmptyResult()) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN3_TO_ATT_SABABA) .addAll(msoBulkPresets) .add(new PresetMSOOrchestrationRequestGet("FAILED")) .build(); - List<String> jobIds = createBulkOfInstances(presets, false, bulkSize, names); + List<String> jobIds = createBulkOfMacroInstances(presets, false, bulkSize, names); Assert.assertEquals(jobIds.size(),bulkSize); boolean result = Wait.waitFor(x->{ List<ServiceInfo> serviceInfoList = serviceListCall().getBody(); @@ -346,13 +187,13 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { public void createBulkOfAssignInstances(){ Map<Keys, String> names = generateNames(); final int bulkSize = 2; - ImmutableList<BasePreset> msoBulkPresets = IntStream.rangeClosed(1,bulkSize) + ImmutableList<BasePreset> msoBulkPresets = IntStream.rangeClosed(0, bulkSize-1) .mapToObj(i-> new PresetMSOAssignServiceInstanceGen2WithNames(names, i)) .collect(ImmutableList.toImmutableList()); ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() .add(new PresetGetSessionSlotCheckIntervalGet()) .add(new PresetAAIGetSubscribersGet()) - .add(new PresetAAISearchNodeQueryEmptyResult()) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN3_TO_ATT_SABABA) .addAll(msoBulkPresets) .add(new PresetMSOOrchestrationRequestGet()) .build(); @@ -364,13 +205,12 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { ImmutableList<BasePreset> presets = ImmutableList.of( new PresetGetSessionSlotCheckIntervalGet(), new PresetAAIGetSubscribersGet(), - new PresetAAISearchNodeQueryEmptyResult(), new PresetMSOServiceInstanceGen2ErrorResponse(406)); List<String> jobIds = createBulkOfInstancesAndAssert(presets, true,1, JobStatus.FAILED, generateNames()); String jobId = jobIds.get(0); List<JobAuditStatus> actualMsoAudits = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO.name()); - JobAuditStatus expectedMsoAudit = new JobAuditStatus(UUID.fromString(jobId),"FAILED",JobAuditStatus.SourceStatus.MSO, + JobAuditStatus expectedMsoAudit = new JobAuditStatus(UUID.fromString(jobId), "FAILED", JobAuditStatus.SourceStatus.MSO, null, "Http Code:406, \"messageId\":\"SVC0002\",\"text\":\"JSON Object Mapping Request\"" , false); @@ -378,6 +218,24 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { } @Test + public void whenGetLongErrorMessageFromMso_ThenAuditFirst2000Chars() { + Map<Keys, String> names = generateNames(); + ImmutableList<BasePreset> presets = ImmutableList.of( + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet(), + new PresetMSOCreateServiceInstanceGen2WithNames(names, 0), + new PresetMSOOrchestrationRequestGet("FAILED", PresetMSOOrchestrationRequestGet.DEFAULT_REQUEST_ID, MSO_ERROR)); + + List<String> jobIds = createBulkOfInstancesAndAssert(presets, false, 1, JobStatus.FAILED, names); + String jobId = jobIds.get(0); + List<JobAuditStatus> actualMsoAudits = getAuditStatuses(jobId, JobAuditStatus.SourceStatus.MSO.name()); + Optional<JobAuditStatus> jobAuditStatus = actualMsoAudits.stream().filter(x -> x.getJobStatus().equals("FAILED")).findFirst(); + assertTrue(jobAuditStatus.isPresent()); + assertThat(jobAuditStatus.get().getAdditionalInfo(), startsWith(MSO_BASE_ERROR)); + assertThat(jobAuditStatus.get().getAdditionalInfo().length(), is(2000)); + } + + @Test public void whenHideCompletedService_thenServiceNotReturnInServiceList(){ List<String> services = createBulkAndWaitForBeCompleted(2); hideService(services.get(0)); @@ -386,116 +244,14 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { assertThat(serviceInfoList, not(hasItem(services.get(0)))); } - private MsoResponseWrapper2 hideService(String jobId) { - MsoResponseWrapper2 responseWrapper2 = callMsoForResponseWrapper(org.springframework.http.HttpMethod.POST, getHideServiceUri(jobId), ""); - return responseWrapper2; - } - - private List<String> createBulkOfInstancesAndAssert(ImmutableList<BasePreset> presets, boolean isPause, int bulkSize, JobStatus finalState, Map<Keys, String> names){ - List<String> jobIds = createBulkOfInstances(presets, isPause, bulkSize, names); - Assert.assertEquals(jobIds.size(),bulkSize); - for(String jobId: jobIds) { - ServiceInfo expectedServiceInfo = new ServiceInfo("vid1", JobStatus.IN_PROGRESS, isPause, "someID", - "someName", "myProject", "NFT1", "NFTJSSSS-NFT1", "greatTenant", "greatTenant", "mtn3", null, - "mySubType", "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", null, names.get(Keys.SERVICE_NAME), - "300adb1e-9b0c-4d52-bfb5-fa5393c4eabb", "AIM_TRANSPORT_00004", "1.0", jobId, null); - JobInfoChecker jobInfoChecker = new JobInfoChecker( - restTemplate, ImmutableSet.of(JobStatus.PENDING, JobStatus.IN_PROGRESS, finalState), jobId, expectedServiceInfo); - boolean result = jobInfoChecker.test(null); - assertTrue("service info of jobId: " + jobId + " was in status: " + jobInfoChecker.lastStatus, result); - - jobInfoChecker.setExpectedJobStatus(ImmutableSet.of(finalState)); - if (ImmutableList.of(JobStatus.COMPLETED, JobStatus.PAUSE).contains(finalState)) { - expectedServiceInfo.serviceInstanceId = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb"; - } - result = Wait.waitFor(jobInfoChecker, null, 20, 1); - assertTrue("service info of jobId: " + jobId + " was in status: " + jobInfoChecker.lastStatus, result); - } - - return jobIds; - } - - private List<String> createBulkOfInstances(ImmutableList<BasePreset> presets, boolean isPause, int bulkSize, Map<Keys, String> names){ - - SimulatorApi.registerExpectationFromPresets(presets, SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET); - - String requestBody = TestUtils.convertRequest(objectMapper, CREATE_BULK_OF_MACRO_REQUEST); - requestBody = requestBody.replace("\"IS_PAUSE_VALUE\"", String.valueOf(isPause)).replace("\"BULK_SIZE\"", String.valueOf(bulkSize)); - for (Map.Entry<Keys, String> e : names.entrySet()) { - requestBody = requestBody.replace(e.getKey().name(), e.getValue()); - } - MsoResponseWrapper2 responseWrapper2 = callMsoForResponseWrapper(org.springframework.http.HttpMethod.POST, getCreateBulkUri(), requestBody); - assertNotNull(responseWrapper2); - return (List<String>)responseWrapper2.getEntity(); - } - - public class JobInfoChecker<Integer> implements Predicate<Integer> { - - private final RestTemplate restTemplate; - private Set<JobStatus> expectedJobStatus; - private ServiceInfo expectedServiceInfo; - private final String jobId; - private JobStatus lastStatus; - - public JobInfoChecker(RestTemplate restTemplate, Set<JobStatus> expectedJobStatus, String jobId, ServiceInfo expectedServiceInfo) { - this.restTemplate = restTemplate; - this.expectedJobStatus = expectedJobStatus; - this.jobId = jobId; - this.expectedServiceInfo = expectedServiceInfo; - } - - public void setExpectedJobStatus(Set<JobStatus> expectedJobStatus) { - this.expectedJobStatus = expectedJobStatus; - } - - @Override - public boolean test(Integer integer) { - ResponseEntity<List<ServiceInfo>> serviceListResponse = serviceListCall(); - assertThat(serviceListResponse.getStatusCode(), CoreMatchers.equalTo(HttpStatus.OK)); - assertThat(serviceListResponse.getBody(), hasItem(new JobIdAndStatusMatcher(jobId))); - ServiceInfo serviceInfoFromDB = serviceListResponse.getBody().stream() - .filter(serviceInfo -> serviceInfo.jobId.equals(jobId)) - .findFirst().orElse(null); - Assert.assertNotNull(serviceInfoFromDB); - Assert.assertEquals(serviceInfoDataReflected(serviceInfoFromDB), serviceInfoDataReflected(expectedServiceInfo)); - assertTrue("actual service instance doesn't contain template service name:" + expectedServiceInfo.serviceInstanceName, - serviceInfoFromDB.serviceInstanceName.contains(expectedServiceInfo.serviceInstanceName)); - if (serviceInfoFromDB.jobStatus==JobStatus.IN_PROGRESS || serviceInfoFromDB.jobStatus==JobStatus.COMPLETED) { - assertTrue("actual service instance doesn't contain template service name and trailing numbers:" + expectedServiceInfo.serviceInstanceName, - serviceInfoFromDB.serviceInstanceName.contains(expectedServiceInfo.serviceInstanceName+"_00")); - } - - if (expectedServiceInfo.serviceInstanceId != null) { - assertThat(serviceInfoFromDB.serviceInstanceId, is(expectedServiceInfo.serviceInstanceId)); - } - lastStatus = serviceInfoFromDB.jobStatus; - return expectedJobStatus.contains(serviceInfoFromDB.jobStatus); - } - } - - private ResponseEntity<List<ServiceInfo>> serviceListCall() { - return restTemplate.exchange( - getServiceInfoUrl(), - org.springframework.http.HttpMethod.GET, - null, - new ParameterizedTypeReference<List<ServiceInfo>>() {}); - } - - //serialize fields except of fields we cannot know ahead of time - private static String serviceInfoDataReflected(ServiceInfo service1) { - return new ReflectionToStringBuilder(service1, ToStringStyle.SHORT_PREFIX_STYLE) - .setExcludeFieldNames("jobStatus", "templateId", "statusModifiedDate", "createdBulkDate", "serviceInstanceId", "serviceInstanceName") - .toString(); - } - @Test public void errorResponseInGetStatusFromMso_getAuditStatusFromMso_errorMsgExistInAdditionalInfo(){ Map<Keys, String> names = generateNames(); ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>() .add(new PresetGetSessionSlotCheckIntervalGet()) .add(new PresetAAIGetSubscribersGet()) - .add(new PresetAAISearchNodeQueryEmptyResult()) - .add(new PresetMSOAssignServiceInstanceGen2WithNames(names, 1)) + .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN3_TO_ATT_SABABA) + .add(new PresetMSOAssignServiceInstanceGen2WithNames(names, 0)) .add(new PresetMSOOrchestrationRequestGetErrorResponse(406)) .build(); @@ -516,4 +272,97 @@ public class AsyncInstantiationApiTest extends BaseMsoApiTest { } + @Test + public void inProgressJobMoreThan24HoursIsFailedInVidAudit(){ + addBulkPendingWithCustomList(Collections.singletonList(new PresetMSOOrchestrationRequestGet("IN_PROGRESS",24))); + + AtomicReference<ServiceInfo> inProgressJob = new AtomicReference<>(); + boolean isJobFound = Wait.waitFor(x->{ + List<ServiceInfo> serviceInfoList = serviceListCall().getBody(); + inProgressJob.set(serviceInfoList.stream(). + filter(serviceInfo -> serviceInfo.serviceInstanceId.equals(PresetMSOOrchestrationRequestGet.DEFAULT_SERVICE_INSTANCE_ID) && serviceInfo.jobStatus.equals(JobStatus.FAILED)) + .findFirst() + .orElse(null)); + return inProgressJob.get() != null; + }, null, 15, 1); + + org.junit.Assert.assertTrue("Job with DEFAULT_SERVICE_INSTANCE_ID and status FAILED should present", isJobFound); + + verifyAuditStatuses(inProgressJob.get().jobId, Arrays.asList(JobStatus.PENDING.name(), JobStatus.IN_PROGRESS.name(),JobStatus.FAILED.name()), JobAuditStatus.SourceStatus.VID); + verifyAuditStatuses(inProgressJob.get().jobId, Arrays.asList("REQUESTED", "IN_PROGRESS"), JobAuditStatus.SourceStatus.MSO); + } + + @Test + public void inProgressJobLessThan24HoursIsStillInProgressInVidAudit(){ + addBulkPendingWithCustomList(Collections.singletonList(new PresetMSOOrchestrationRequestGet("IN_PROGRESS",23))); + + AtomicReference<ServiceInfo> inProgressJob = new AtomicReference<>(); + boolean isJobFound = Wait.waitFor(x->{ + List<ServiceInfo> serviceInfoList = serviceListCall().getBody(); + inProgressJob.set(serviceInfoList.stream().filter(serviceInfo -> serviceInfo.serviceInstanceId.equals(PresetMSOOrchestrationRequestGet.DEFAULT_SERVICE_INSTANCE_ID)) + .findFirst() + .orElse(null)); + return inProgressJob.get() != null; + }, null, 15, 1); + + org.junit.Assert.assertTrue("Job with DEFAULT_SERVICE_INSTANCE_ID should present", isJobFound); + org.junit.Assert.assertEquals("Tested job status is not as expected", JobStatus.IN_PROGRESS, inProgressJob.get().getJobStatus()); + + verifyAuditStatuses(inProgressJob.get().jobId, Arrays.asList(JobStatus.PENDING.name(), JobStatus.IN_PROGRESS.name()), JobAuditStatus.SourceStatus.VID); + verifyAuditStatuses(inProgressJob.get().jobId, Arrays.asList("REQUESTED", "IN_PROGRESS"), JobAuditStatus.SourceStatus.MSO); + } + + @Test + public void verifyAuditStatusOfInstanceGroupId(){ + SimulatorApi.registerExpectationFromPreset(new PresetMSOOrchestrationRequestsManyInstanceStatusesGet(INSTANCE_GROUP_ID_LABEL, INSTANCE_GROUP_LABEL), SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET); + final List<JobAuditStatus> expectedAuditStatusList = getAuditStatusesForInstance("VNFGROUP", "df305d54-75b4-431b-adb2-eb6b9e5460df"); + verifyInstanceAuditStatuses(Arrays.asList( + new JobAuditStatus("groupTestName", "IN_PROGRESS", UUID.fromString("28502bd2-3aff-4a03-9f2b-5a0d1cb1ca24") , INSTANCE_GROUP_LABEL+" instance creation", null, INSTANCE_GROUP_LABEL), + new JobAuditStatus("groupTestName", "COMPLETE",UUID.fromString("28502bd2-3aff-4a03-9f2b-5a0d1cb1ca24") , INSTANCE_GROUP_LABEL+" instance creation", null, INSTANCE_GROUP_LABEL), + new JobAuditStatus("groupTestName", "IN_PROGRESS", UUID.fromString("f711f0ff-24b6-4d7f-9314-4b4eae15f48c") , INSTANCE_GROUP_LABEL+" instance deletion", null, INSTANCE_GROUP_LABEL), + new JobAuditStatus("groupTestName", "COMPLETE",UUID.fromString("f711f0ff-24b6-4d7f-9314-4b4eae15f48c") , INSTANCE_GROUP_LABEL+" instance deletion", null, INSTANCE_GROUP_LABEL)), + expectedAuditStatusList); + } + + @Test(expectedExceptions = HttpClientErrorException.class) + public void verifyAuditStatusOfInstanceGroupId_notExistingVidType(){ + try { + getAuditStatusesForInstance("KUKU", "df305d54-75b4-431b-adb2-eb6b9e5460df"); + } catch (HttpClientErrorException e){ //to verify the properiatary statusCode field + assertThat("Code is not as expected", HttpStatus.BAD_REQUEST.equals(e.getStatusCode())); + throw e; + } + } + + @Test(expectedExceptions = HttpServerErrorException.class) + public void verifyAuditStatusOfInstanceGroupId_notExistingMsoInstanceId(){ + try { + getAuditStatusesForInstance("VNFGROUP", "df305d54-75b4-431b-adb2-eb6b9e5460aa"); + } catch (HttpServerErrorException e){ //to verify the properiatary statusCode field + assertThat("Code is not as expected", HttpStatus.INTERNAL_SERVER_ERROR.equals(e.getStatusCode())); + throw e; + } + } + + @DataProvider + public static Object[][] macroAndALaCarteBulk(){ + return new Object[][]{{CREATE_BULK_OF_MACRO_REQUEST}, {CREATE_BULK_OF_ALACARTE_REQUEST_WITH_VNF}}; + } + + @Test(dataProvider = "macroAndALaCarteBulk", expectedExceptions = HttpClientErrorException.class) + @FeatureTogglingTest(FLAG_1906_INSTANTIATION_API_USER_VALIDATION) + public void verifyCreateBulkOfInstancesUserPermissionValidation(String requestDetailsFileName) { + login(new UserCredentials("mo57174000", "mo57174000", null, null, null)); + try { + createBulkOfInstances(false, 1, Collections.EMPTY_MAP, requestDetailsFileName); + } catch (HttpClientErrorException e){ + assertEquals("Code is not as expected", HttpStatus.FORBIDDEN.value(), e.getStatusCode().value()); + throw e; + } + finally { + login(); + } + + } + } diff --git a/vid-automation/src/test/java/org/onap/vid/api/BaseApiAaiTest.java b/vid-automation/src/test/java/org/onap/vid/api/BaseApiAaiTest.java index 69a6f66cc..4ac38a0e7 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/BaseApiAaiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/BaseApiAaiTest.java @@ -15,9 +15,9 @@ import java.net.URI; import java.net.URISyntaxException; import static net.javacrumbs.jsonunit.JsonMatchers.jsonStringEquals; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.either; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; import static vid.automation.test.services.SimulatorApi.registerExpectation; /** diff --git a/vid-automation/src/test/java/org/onap/vid/api/BaseApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/BaseApiTest.java deleted file mode 100644 index e7c6045a4..000000000 --- a/vid-automation/src/test/java/org/onap/vid/api/BaseApiTest.java +++ /dev/null @@ -1,203 +0,0 @@ -package org.onap.vid.api; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.primitives.Ints; -import org.apache.commons.io.IOUtils; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.SerializationConfig; -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.uri.internal.JerseyUriBuilder; -import org.openecomp.sdc.ci.tests.datatypes.UserCredentials; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.web.client.DefaultResponseErrorHandler; -import org.springframework.web.client.RestTemplate; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import vid.automation.test.infra.FeaturesTogglingConfiguration; -import vid.automation.test.services.UsersService; -import vid.automation.test.utils.CookieAndJsonHttpHeadersInterceptor; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Properties; -import java.util.Random; - -import static java.util.Collections.singletonList; -import static org.apache.commons.text.StringEscapeUtils.unescapeJson; -import static org.hamcrest.CoreMatchers.everyItem; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThan; - -public class BaseApiTest { - protected static final Logger LOGGER = LogManager.getLogger(BaseApiTest.class); - - @SuppressWarnings("WeakerAccess") - protected URI uri; - @SuppressWarnings("WeakerAccess") - protected ObjectMapper objectMapper = new ObjectMapper(); - @SuppressWarnings("WeakerAccess") - protected Client client; - protected Random random; - protected final RestTemplate restTemplate = new RestTemplate(); - - protected final UsersService usersService = new UsersService(); - protected final RestTemplate restTemplateErrorAgnostic = new RestTemplate(); - - @BeforeClass - public void init() { - uri = getUri(); - objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); - client = ClientBuilder.newClient(); - client.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); - random = new Random(System.currentTimeMillis()); - FeaturesTogglingConfiguration.initializeFeatureManager(); - } - - private URI getUri() { - String host = System.getProperty("VID_HOST", "127.0.0.1"); - Integer port = Integer.valueOf(System.getProperty("VID_PORT", "8080")); - return new JerseyUriBuilder().host(host).port(port).scheme("http").path("vid").build(); - } - - public void login() { - UserCredentials userCredentials = getUserCredentials(); - final List<ClientHttpRequestInterceptor> interceptors = singletonList(new CookieAndJsonHttpHeadersInterceptor(getUri(), userCredentials)); - restTemplate.setInterceptors(interceptors); - - restTemplateErrorAgnostic.setInterceptors(interceptors); - restTemplateErrorAgnostic.setErrorHandler(new DefaultResponseErrorHandler() { - @Override - public boolean hasError(ClientHttpResponse response) { - return false; - } - }); - } - - - static class DB_CONFIG { - static String url = String.format("jdbc:mariadb://%s:%d/vid_portal", - System.getProperty("DB_HOST", System.getProperty("VID_HOST", "127.0.0.1")), - Integer.valueOf(System.getProperty("DB_PORT", "3306")) - ); - static String username = "euser"; - static String password = "euser"; - - static final int userId = 2222; - static final String loginId = "vid1"; - static final int roleId = 2222221; - static final int logRoleId = 2222222; - } - - - @BeforeClass - protected void createNewTestUser() { - - deleteNewTestUser(); - - LOGGER.debug("Connecting database..."); - - try (Connection connection = DriverManager.getConnection(DB_CONFIG.url, DB_CONFIG.username, DB_CONFIG.password)) { - - LOGGER.debug("Database connected!"); - //create new user with specific role - Statement stmt = connection.createStatement(); - stmt.addBatch("INSERT INTO `fn_user` (`USER_ID`, `ORG_USER_ID`, `LOGIN_ID`, `LOGIN_PWD`) VALUES (" + DB_CONFIG.userId + ", 'Porfirio Gerhardt', '" + DB_CONFIG.loginId + "', '" + DB_CONFIG.loginId + "')"); - stmt.addBatch("INSERT INTO `fn_role` (`ROLE_ID`, `ROLE_NAME`, `ACTIVE_YN`, `PRIORITY`) VALUES (" + DB_CONFIG.roleId + ", 'PACKET CORE___vFlowLogic', 'Y', 5)"); - stmt.addBatch("INSERT INTO `fn_role` (`ROLE_ID`, `ROLE_NAME`, `ACTIVE_YN`, `PRIORITY`) VALUES (" + DB_CONFIG.logRoleId + ", 'READ___LOGS___PERMITTED', 'Y', 5)"); - stmt.addBatch("INSERT INTO `fn_user_role` (`USER_ID`, `ROLE_ID`, `PRIORITY`, `APP_ID`) VALUES (" + DB_CONFIG.userId + ", " + DB_CONFIG.roleId + ", NULL, 1)"); - stmt.addBatch("INSERT INTO `fn_user_role` (`USER_ID`, `ROLE_ID`, `PRIORITY`, `APP_ID`) VALUES (" + DB_CONFIG.userId + ", " + DB_CONFIG.logRoleId + ", NULL, 1)"); - - - int[] executeBatch = stmt.executeBatch(); - assertThat(Ints.asList(executeBatch), everyItem(greaterThan(0))); - - } catch (SQLException e) { - throw new IllegalStateException("Cannot connect the database!", e); - } - - } - - @AfterClass - protected void deleteNewTestUser() { - LOGGER.debug("Connecting database..."); - - try (Connection connection = DriverManager.getConnection(DB_CONFIG.url, DB_CONFIG.username, DB_CONFIG.password)) { - LOGGER.debug("Database connected!"); - Statement stmt = connection.createStatement(); - stmt.addBatch("DELETE FROM `fn_user_role` WHERE `USER_ID` = " + DB_CONFIG.userId); - stmt.addBatch("DELETE FROM `fn_user` WHERE `USER_ID` = " + DB_CONFIG.userId); - stmt.addBatch("DELETE FROM `fn_role` WHERE `ROLE_ID` = " + DB_CONFIG.roleId); - stmt.addBatch("DELETE FROM `fn_role` WHERE `ROLE_ID` = " + DB_CONFIG.logRoleId); - - - int[] executeBatch = stmt.executeBatch(); - - } catch (SQLException e) { - throw new IllegalStateException("Cannot connect the database!", e); - } - } - - protected UserCredentials getUserCredentials() { - final Properties configProp = new Properties(); - try { - InputStream input = ClassLoader.getSystemResourceAsStream("test_config.properties"); - configProp.load(input); - } catch (IOException e) { - throw new RuntimeException(e); - } - - HttpHeaders loginRequestHeaders = new HttpHeaders(); - loginRequestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - String loginId = configProp.getProperty("test.loginId", "i'm illegal"); - String loginPassword = configProp.getProperty("test.loginPassword", "i'm illegal"); - return new UserCredentials(loginId, loginPassword, null, null, null); - } - - - - - protected String getCleanJsonString(String jsonString) { - // remove leading/trailing double-quotes and unescape - String res = unescapeJson(jsonString.replaceAll("^\"|\"$", "")); - LOGGER.debug("getCleanJsonString: " + jsonString + " ==> " + res); - return res; - } - - protected String getCleanJsonString(Object object) throws JsonProcessingException { - if (object instanceof String) { - return getCleanJsonString((String) object); - } else { - return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(object); - } - } - - protected String buildUri(String path) { - return uri + "/" + path; - } - - public static String getResourceAsString(String resourcePath) { - // load expected result - final URL resource = BaseApiTest.class.getClassLoader().getResource(resourcePath); - if (resource == null) throw new RuntimeException("resource file not found: " + resourcePath); - try { - return IOUtils.toString(resource, "UTF-8"); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/vid-automation/src/test/java/org/onap/vid/api/BaseMsoApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/BaseMsoApiTest.java deleted file mode 100644 index 1495f1852..000000000 --- a/vid-automation/src/test/java/org/onap/vid/api/BaseMsoApiTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.onap.vid.api; - -import com.google.common.collect.ImmutableMap; -import org.json.JSONException; -import org.onap.vid.model.mso.MsoResponseWrapper2; -import org.skyscreamer.jsonassert.JSONAssert; -import org.skyscreamer.jsonassert.JSONCompareMode; -import org.springframework.http.HttpMethod; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.DataProvider; -import vid.automation.test.services.SimulatorApi; -import vid.automation.test.services.SimulatorApi.RegistrationStrategy; - -import java.io.IOException; -import java.lang.reflect.Method; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; - -public class BaseMsoApiTest extends BaseApiTest { - - @BeforeClass - public void login() { - super.login(); - } - - protected void callMsoWithSimulatedErrorResponse(String expectationJsonFileName, ImmutableMap<String, Object> replacementsForJson, String targetUri, String basicRequestBody, int expectedErrorCode, String expectedResult, HttpMethod method) throws IOException { - SimulatorApi.registerExpectation(expectationJsonFileName, replacementsForJson, RegistrationStrategy.CLEAR_THEN_SET); - try { - MsoResponseWrapper2 responseWrapper = callMsoForResponseWrapper(method, targetUri, basicRequestBody); - - assertThat("Wrong propagated status from MSO", responseWrapper.getStatus(), is(expectedErrorCode)); - assertThat("Wrong propagated body from MSO", getCleanJsonString(responseWrapper.getEntity()), is(expectedResult)); - }catch(HttpClientErrorException | HttpServerErrorException e) { - assertThat("Wrong propagated status from MSO", e.getStatusCode().value(), is(expectedErrorCode)); - } - } - - - protected void callMsoWithFineRequest(String expectationJsonFileName, ImmutableMap<String, Object> replacementsForJson, String targetUri, String requestBody, int expectedStatusCode, String expectedResult, HttpMethod method) throws IOException { - SimulatorApi.registerExpectation(expectationJsonFileName, replacementsForJson, RegistrationStrategy.CLEAR_THEN_SET); - - MsoResponseWrapper2 responseWrapper = callMsoForResponseWrapper(method, targetUri, requestBody); - - assertThat("Wrong propagated status from MSO", responseWrapper.getStatus(), is(expectedStatusCode)); - try { - JSONAssert.assertEquals("Wrong propagated body from MSO", expectedResult, getCleanJsonString(responseWrapper.getEntity()), JSONCompareMode.NON_EXTENSIBLE); - } catch (JSONException e) { - throw new RuntimeException(e); - } - } - - protected MsoResponseWrapper2 callMsoForResponseWrapper(HttpMethod method, String uri, String body) { - MsoResponseWrapper2 responseWrapper; - switch (method) { - case POST: - responseWrapper = restTemplate.postForObject(uri, body, MsoResponseWrapper2.class); - break; - case GET: - default: - responseWrapper = restTemplate.getForObject(uri, MsoResponseWrapper2.class); - break; - } - - System.out.println("response: " + responseWrapper); - - return responseWrapper; - } - - @DataProvider - public static Object[][] errorCodes(Method test) { - return new Object[][]{ - {500},{505}, {400}, {401}, {404}, {405} - }; - } -} diff --git a/vid-automation/src/test/java/org/onap/vid/api/CategoryParametersApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/CategoryParametersApiTest.java index 54df0e83e..c04d2ff0d 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/CategoryParametersApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/CategoryParametersApiTest.java @@ -17,6 +17,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; import java.util.List; +import java.util.Random; import java.util.UUID; import java.util.stream.Collectors; diff --git a/vid-automation/src/test/java/org/onap/vid/api/ChangeManagementApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ChangeManagementApiTest.java index 2ad68d75d..999b66cee 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/ChangeManagementApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/ChangeManagementApiTest.java @@ -3,35 +3,27 @@ package org.onap.vid.api; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.onap.vid.model.mso.ChangeManagementRequest; -import org.onap.vid.model.mso.ChangeManagementRequestDetails; -import org.onap.vid.model.mso.CloudConfiguration; -import org.onap.vid.model.mso.MsoExceptionResponse; -import org.onap.vid.model.mso.MsoResponseWrapper2; -import org.onap.vid.model.mso.RelatedInstance; -import org.onap.vid.model.mso.RelatedInstanceList; -import org.onap.vid.model.mso.RequestInfo; -import org.onap.vid.model.mso.RequestParameters; -import org.onap.vid.model.workflow.GetVnfWorkflowRelationRequest; -import org.onap.vid.model.workflow.GetWorkflowsResponse; -import org.onap.vid.model.workflow.VnfDetails; -import org.onap.vid.model.workflow.VnfDetailsWithWorkflows; -import org.onap.vid.model.workflow.VnfWorkflowRelationAllResponse; -import org.onap.vid.model.workflow.VnfWorkflowRelationRequest; -import org.onap.vid.model.workflow.VnfWorkflowRelationResponse; -import org.onap.vid.model.workflow.WorkflowsDetail; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; +import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoChangeManagementBase; +import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfInPlaceSoftwareUpdate; +import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfReplace; +import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfUpdate; +import org.onap.simulator.presetGenerator.presets.aaf.*; import org.onap.vid.model.mso.*; import org.onap.vid.model.workflow.*; import org.springframework.http.HttpStatus; import org.springframework.util.StopWatch; import org.testng.Assert; +import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import vid.automation.test.services.SimulatorApi; import vid.automation.test.services.SimulatorApi.RegistrationStrategy; +import vid.automation.test.utils.ReadFile; import javax.ws.rs.HttpMethod; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; @@ -51,6 +43,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.onap.vid.api.TestUtils.getNestedPropertyInMap; +import static org.testng.AssertJUnit.assertEquals; //This is integration test that require running tomcat @@ -139,6 +132,30 @@ public class ChangeManagementApiTest extends BaseApiTest { }; } + @DataProvider + public static Object[][] credentialsFilterTestData(Method test) { + return new Object[][]{ + {AAFGetBasicAuthPreset.VALID_AUTH_VALUE, 200}, +// {null, 401}, // No auth header TODO: Uncomment when the bug in epsdk will be fixed. Currently If there is no auth header then no credentials validation. + {"xyz", 401}, //undecodable value + {"YUBiLmM6ZGVm", 401} //decodable value but not that expected by cadi filter (simulator) + + }; + } + + @BeforeClass + public static void commonSimulatorRegistration() { + SimulatorApi.registerExpectationFromPreset( + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MDT1_TO_ATT_NC, + RegistrationStrategy.CLEAR_THEN_SET); + SimulatorApi.registerExpectationFromPreset( + new AAFGetUrlServicePreset(), + RegistrationStrategy.APPEND); + SimulatorApi.registerExpectationFromPreset( + new AAFGetBasicAuthPreset(), + RegistrationStrategy.APPEND); + } + // IN_PLACE_SOFTWARE_UPDATE @Test public void testInPlaceSoftwareUpdateHappyPath() throws IOException { @@ -199,6 +216,12 @@ public class ChangeManagementApiTest extends BaseApiTest { "mso_in_place_software_update_ok.json", ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND); + SimulatorApi.registerExpectationFromPreset( + new AAFGetUrlServicePreset(), + RegistrationStrategy.APPEND); + SimulatorApi.registerExpectationFromPreset( + new AAFGetBasicAuthPreset(), + RegistrationStrategy.APPEND); return null; })) .collect(Collectors.toList()); @@ -216,9 +239,8 @@ public class ChangeManagementApiTest extends BaseApiTest { stopWatch.start("init requests"); List<ChangeManagementRequest> requestsList = vnfList.stream().map(vnfIds -> this.createChangeManagementRequest(vnfIds, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)).collect(Collectors.toList()); - WebTarget webTarget = client.target(uri). - path(CHANGE_MANAGEMENT+WORKFLOW).resolveTemplate("vnfname","VidVnf"); - List<Callable<Response>> callables = requestsList.stream().map(request->((Callable<Response>) () -> webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic 123==").post(Entity.json(request)))).collect(Collectors.toList()); + WebTarget webTarget = buildWebTarget("VidVnf"); + List<Callable<Response>> callables = requestsList.stream().map(request->((Callable<Response>) () -> webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(Entity.json(request)))).collect(Collectors.toList()); stopWatch.stop(); stopWatch.start("invoke calling to vid"); @@ -286,16 +308,54 @@ public class ChangeManagementApiTest extends BaseApiTest { testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE); } - @Test - public void testClientCredentialsFilter_expect401() + @Test(dataProvider = "credentialsFilterTestData") + public void testCadiCredentialsFilter(String authValue, int expectedStatusCode) { VnfIds vnfIds = new VnfIds(); ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfIds); changeManagementRequest.setRequestType(ChangeManagementRequest.REPLACE); - WebTarget webTarget = client.target(uri). - path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfIds.vnfName); + WebTarget webTarget = buildWebTarget(vnfIds.vnfName); Entity entity = Entity.json(changeManagementRequest); - Assert.assertEquals(401, webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(entity).getStatus()); + Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE); + if (authValue != null) { + invocationBuilder.header("Authorization", "Basic " + authValue); + } + Response response = invocationBuilder.post(entity); + String body = response.readEntity(String.class); + Assert.assertEquals(response.getStatus(), expectedStatusCode, "Full response: " + body); + } + + @DataProvider + public static Object[][] requestFromSchedulerDataProvider(Method test) { + return new Object[][]{ + { + "e9181708-f105-4dfd-9a36-0e089faa72ba", + new PresetMsoVnfReplace("254583ad-b38c-498b-bdbd-b8de5e07541b", "e9181708-f105-4dfd-9a36-0e089faa72ba"), + "changeManagement/vnfReplaceRequest.json" + }, + { + "c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1", + new PresetMsoVnfUpdate("d0c59d4a-cc9d-11e8-a8d5-f2801f1b9fd1","c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1"), + "changeManagement/vnfUpdateRequest.json" + }, + { + "e5403738-da34-4090-8864-ba9cf1bcdd88", + new PresetMsoVnfInPlaceSoftwareUpdate("12709275-787c-4be7-8c9c-fce64ab7ca8c","e5403738-da34-4090-8864-ba9cf1bcdd88"), + "changeManagement/vnfInPlaceSoftwareUpdate.json" + } + }; + } + + @Test(dataProvider = "requestFromSchedulerDataProvider") + public void whenGetFromSchedulerRequest_sendAsExpectedToMso(String vnfInstanceId, PresetMsoChangeManagementBase preset, String requestPath) { + SimulatorApi.registerExpectationFromPreset( + preset, + RegistrationStrategy.APPEND); + String schedulerRequest = ReadFile.loadResourceAsString(requestPath); + Response response = callChangeManagement("VidVnf", Entity.json(schedulerRequest)); + MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class); + assertEquals(202, body.getStatus()); + assertEquals(vnfInstanceId, getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId")); } @@ -308,7 +368,7 @@ public class ChangeManagementApiTest extends BaseApiTest { private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) { Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status"); Assert.assertEquals( - TestUtils.getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"), + getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"), vnfIds.serviceInstanceId, String.format("Failed to find instanceId: %s in " + requestType + " response. Actual body:%s", vnfIds.serviceInstanceId, body.getEntity())); @@ -317,18 +377,25 @@ public class ChangeManagementApiTest extends BaseApiTest { private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) { SimulatorApi.registerExpectation( expectationPath, - ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.CLEAR_THEN_SET); + ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND); ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType); Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest); return response.readEntity(responseClass); } private Response callChangeManagementUpdate(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest) { - WebTarget webTarget = client.target(uri). - path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfIds.vnfName); Entity entity = Entity.json(changeManagementRequest); - Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic 123==").post(entity); - return response; + return callChangeManagement(vnfIds.vnfName, entity); + } + + private Response callChangeManagement(String vnfName, Entity entity) { + WebTarget webTarget = buildWebTarget(vnfName); + return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(entity); + } + + private WebTarget buildWebTarget(String vnfName) { + return client.target(uri). + path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfName); } private void testChangeManagement409Error(String expectationPath, String requestType) throws IOException { @@ -336,13 +403,13 @@ public class ChangeManagementApiTest extends BaseApiTest { MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType); Assert.assertEquals(body.getStatus(), 409, requestType + " failed with wrong http status"); Assert.assertEquals( - TestUtils.getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"), + getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"), "SVC2000", String.format("Failed to find messageId: %s in " + requestType + " response. Actual body:%s", "SVC2000", body.getEntity())); - assertThat(TestUtils.getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId)); + assertThat(getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId)); } private void testChangeManagement404Error(String expectationPath, String requestType) throws IOException { @@ -398,7 +465,7 @@ public class ChangeManagementApiTest extends BaseApiTest { VnfIds vnfIds = new VnfIds(); SimulatorApi.registerExpectation( expectationFileName, - ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.CLEAR_THEN_SET); + ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND); ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType); changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload); Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest); diff --git a/vid-automation/src/test/java/org/onap/vid/api/OperationalEnvironmentControllerApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/OperationalEnvironmentControllerApiTest.java index e5df2d3b9..222b0f5fb 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/OperationalEnvironmentControllerApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/OperationalEnvironmentControllerApiTest.java @@ -22,8 +22,8 @@ import java.util.LinkedList; import java.util.stream.Collectors; import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.METHOD_NOT_ALLOWED; diff --git a/vid-automation/src/test/java/org/onap/vid/api/ProbeApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ProbeApiTest.java index 931f0004a..e38617b39 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/ProbeApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/ProbeApiTest.java @@ -1,12 +1,31 @@ package org.onap.vid.api; +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.both; +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; + +import com.google.common.collect.ImmutableList; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import org.hamcrest.MatcherAssert; import org.junit.Assert; import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGetInvalidResponse; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestsManyStatusesGet; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestsManyStatusesInvalidResponseGet; +import org.onap.simulator.presetGenerator.presets.scheduler.PresetGetSchedulerChangeManagementInvalidResponse; +import org.onap.simulator.presetGenerator.presets.scheduler.PresetGetSchedulerChangeManagements; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGetEmptyResult; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGetInvalidResponse; import org.onap.vid.model.probe.ExternalComponentStatus; import org.onap.vid.model.probe.HttpRequestMetadata; import org.springframework.core.ParameterizedTypeReference; @@ -17,14 +36,13 @@ import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import vid.automation.test.services.SimulatorApi; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Optional; +public class ProbeApiTest extends BaseApiTest { -import static org.hamcrest.CoreMatchers.*; -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; + private static final String MSO_QUERY_PARAMS = "filter=requestExecutionDate:EQUALS:01-01-2100"; + private static final String AAI_QUERY_PARMAS = "business/customers?subscriber-type=INFRA&depth=0"; + private static final String SDC_PATH_PARAMS = "46401eec-35bd-4e96-ad0d-0356ff6b8c8d/toscaModel"; + private static final String SCHEDULER_PATH = "http://localhost:1080/scheduler/v1/ChangeManagement/schedules/scheduleDetails/"; -public class ProbeApiTest extends BaseApiTest { @BeforeClass public void login() { @@ -35,70 +53,183 @@ public class ProbeApiTest extends BaseApiTest { public static Object[][] probePresetAndResponse(Method test) { return new Object[][]{ { - new PresetAAIGetSubscribersGet(), - new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, - true, - new HttpRequestMetadata(HttpMethod.GET, - 200, - "business/customers?subscriber-type=INFRA&depth=0", - "{\"customer\":[{\"global-customer-id\":\"MSO_1610_ST\",\"subscriber-name\":\"MSO_1610_ST\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1494001902987\"},{\"global-customer-id\":\"21014aa2-526b-11e6-beb8-9e71128cae77\",\"subscriber-name\":\"PACKET CORE\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1494001776295\"},{\"global-customer-id\":\"DHV1707-TestSubscriber-2\",\"subscriber-name\":\"ICORE CORE\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1498751754450\"},{\"global-customer-id\":\"DHV1707-TestSubscriber-1\",\"subscriber", - "OK" + "all good", + ImmutableList.of( + new PresetAAIGetSubscribersGet(), + new PresetMSOOrchestrationRequestsManyStatusesGet(), + new PresetSDCGetServiceToscaModelGet("46401eec-35bd-4e96-ad0d-0356ff6b8c8d", "serviceCreationTest.zip"), + new PresetGetSchedulerChangeManagements() + ), + ImmutableList.of(new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, + true, + new HttpRequestMetadata(HttpMethod.GET, + 200, + AAI_QUERY_PARMAS, + "{\"customer\":[{\"global-customer-id\":\"CAR_2020_ER\",\"subscriber-name\":\"CAR_2020_ER\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1494001902987\",\"relationship-list\":null},{\"global-customer-id\":\"21014aa2-526b-11e6-beb8-9e71128cae77\",\"subscriber-name\":\"JULIO ERICKSON\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1494001776295\",\"relationship-list\":null},{\"global-customer-id\":\"DHV1707-TestSubscriber-2\",\"subscriber-name\":\"DALE BRIDGES\",\"subscriber-type\":\"INFRA\",\"resource-version\":\"1498751754450\",\"relationsh", + "OK" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, + true, + new HttpRequestMetadata(HttpMethod.GET, + 200, + MSO_QUERY_PARAMS, + "{ " + + " \"requestList\": [{ " + + " \"request\": { " + + " \"requestId\": \"rq1234d1-5a33-55df-13ab-12abad84e333\", " + + " \"startTime\": \"Thu, 04 Jun 2009 02:51:59 GMT\", " + + " \"instanceReferences\": { " + + " \"serviceInstanceId\": \"bc305d54-75b4-431b-adb2-eb6b9e546014\" " + + " }, " + + " \"requestScope\": \"vnf\", " + + " \"requestType\": \"updateInstance\", " + + " \"requestDetails\": { " + + " \"modelInfo\": { " + + " \"modelType\": \"service\", " + + " \"modelInvariantId\": \"sn5256d1-5a33-55df-13ab-12abad84e764\", " + + " \"modelVersionId\": \"ab6478e4-ea33-3346-ac12-ab1", + "OK" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SDC, + true, + new HttpRequestMetadata(HttpMethod.GET, + 200, + SDC_PATH_PARAMS, + "", + "OK" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SCHEDULER, + true, + new HttpRequestMetadata(HttpMethod.GET, + 200, + SCHEDULER_PATH, + StringUtils.substring(new PresetGetSchedulerChangeManagements().getResponseBody().toString(), 0, 500), + "OK" ) - ) + )) }, { - new PresetAAIGetSubscribersGetInvalidResponse(200), - new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, + "invalid json", + ImmutableList.of( + new PresetAAIGetSubscribersGetInvalidResponse(200), + new PresetMSOOrchestrationRequestsManyStatusesInvalidResponseGet(200), + new PresetSDCGetServiceToscaModelGetEmptyResult("46401eec-35bd-4e96-ad0d-0356ff6b8c8d"), + new PresetGetSchedulerChangeManagementInvalidResponse(200) + ), + ImmutableList.of(new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, + false, + new HttpRequestMetadata(HttpMethod.GET, + 200, + AAI_QUERY_PARMAS, + "this payload is an invalid json", + "com.fasterxml.jackson.core.JsonParseException" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, + false, + new HttpRequestMetadata(HttpMethod.GET, + 200, + MSO_QUERY_PARAMS, + "this payload is an invalid json", + "com.fasterxml.jackson.core.JsonParseException" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SDC, false, new HttpRequestMetadata(HttpMethod.GET, 200, - "business/customers?subscriber-type=INFRA&depth=0", + SDC_PATH_PARAMS, + "", + "error reading model 46401eec-35bd-4e96-ad0d-0356ff6b8c8d from SDC" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SCHEDULER, + false, + new HttpRequestMetadata(HttpMethod.GET, + 200, + SCHEDULER_PATH, "this payload is an invalid json", - "org.codehaus.jackson.JsonParseException" + "javax.ws.rs.ProcessingException" ) - ) + )) }, { - new PresetAAIGetSubscribersGetInvalidResponse(500), - new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, + "bad http code", + ImmutableList.of( + new PresetAAIGetSubscribersGetInvalidResponse(500), + new PresetMSOOrchestrationRequestsManyStatusesInvalidResponseGet(406), + new PresetSDCGetServiceToscaModelGetInvalidResponse("46401eec-35bd-4e96-ad0d-0356ff6b8c8d", 404), + new PresetGetSchedulerChangeManagementInvalidResponse(400) + ), + ImmutableList.of(new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, false, new HttpRequestMetadata(HttpMethod.GET, 500, - "business/customers?subscriber-type=INFRA&depth=0", + AAI_QUERY_PARMAS, "this payload is an invalid json", "No subscriber received" ) - ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.MSO, + false, + new HttpRequestMetadata(HttpMethod.GET, + 406, + MSO_QUERY_PARAMS, + "this payload is an invalid json", + "org.apache.http.HttpException: Get with status=406 (200 or 202 expected), url= http" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SDC, + false, + new HttpRequestMetadata(HttpMethod.GET, + 404, + SDC_PATH_PARAMS, + "simulated error description from sdc", + "model 46401eec-35bd-4e96-ad0d-0356ff6b8c8d not found in SDC" + + " (consider updating vid probe configuration 'probe.sdc.model.uuid')" + ) + ), new ExternalComponentStatus(ExternalComponentStatus.Component.SCHEDULER, + false, + new HttpRequestMetadata(HttpMethod.GET, + 400, + SCHEDULER_PATH, + "this payload is an invalid json", + "org.apache.http.HttpException: Get with status = 400, url = " + SCHEDULER_PATH + ) + )) } }; } @Test(dataProvider = "probePresetAndResponse") - public void probeRequest_returnsResponseAsExpected(BasePreset preset, ExternalComponentStatus expectedStatus ){ - SimulatorApi.registerExpectationFromPreset(preset, CLEAR_THEN_SET); + public void probeRequest_returnsResponseAsExpected(String desc, Collection<BasePreset> presets, Collection<ExternalComponentStatus> expectedStatuses) { + SimulatorApi.registerExpectationFromPresets(presets, CLEAR_THEN_SET); ResponseEntity<List<ExternalComponentStatus>> response = restTemplate.exchange( uri + "/probe", org.springframework.http.HttpMethod.GET, null, - new ParameterizedTypeReference<List<ExternalComponentStatus>>() {}); + new ParameterizedTypeReference<List<ExternalComponentStatus>>() { + }); List<ExternalComponentStatus> probeResults = response.getBody(); - Assert.assertEquals(probeResults.size(),1); - assertAaiGetAllSubscribersAsExpected(probeResults,expectedStatus); - + Assert.assertEquals(4, probeResults.size()); + assertResultAsExpected(ExternalComponentStatus.Component.AAI, probeResults, expectedStatuses); + assertResultAsExpected(ExternalComponentStatus.Component.SDC, probeResults, expectedStatuses); + assertResultAsExpected(ExternalComponentStatus.Component.MSO, probeResults, expectedStatuses); + assertResultAsExpected(ExternalComponentStatus.Component.SCHEDULER, probeResults, expectedStatuses); } - private void assertAaiGetAllSubscribersAsExpected(List<ExternalComponentStatus> probeResults,ExternalComponentStatus expectedStatus){ - Optional<ExternalComponentStatus> aaiGetAllSubscribersResult = probeResults.stream().filter(x -> x.getComponent()== ExternalComponentStatus.Component.AAI).findFirst(); - Assert.assertTrue(aaiGetAllSubscribersResult.isPresent()); - ExternalComponentStatus aaiGetAllSubscribersStatus = aaiGetAllSubscribersResult.get(); - Assert.assertEquals(aaiGetAllSubscribersStatus.isAvailable(),expectedStatus.isAvailable()); + private void assertResultAsExpected(ExternalComponentStatus.Component component, List<ExternalComponentStatus> probeResults, Collection<ExternalComponentStatus> expectedStatuses) { + ExternalComponentStatus expectedStatus = expectedStatuses.stream().filter(x -> x.getComponent() == component) + .findFirst().orElseThrow(() -> new AssertionError("Missing setup for " + component + " expected result")); + ExternalComponentStatus componentStatus = probeResults.stream().filter(x -> x.getComponent() == component) + .findFirst().orElseThrow(() -> new AssertionError(component.name()+" result not found in response")); + + Assert.assertThat("wrong metadata for " + component, requestMetadataReflected(componentStatus.getMetadata()), + is(requestMetadataReflected(expectedStatus.getMetadata()))); - MatcherAssert.assertThat(requestMetadataReflected(aaiGetAllSubscribersStatus.getMetadata()),is(requestMetadataReflected(expectedStatus.getMetadata()))); - MatcherAssert.assertThat(aaiGetAllSubscribersStatus.getMetadata().getUrl(), both(endsWith(expectedStatus.getMetadata().getUrl())).and(startsWith("http"))); + Assert.assertThat("wrong url for " + component, componentStatus.getMetadata().getUrl(), + both(endsWith(expectedStatus.getMetadata().getUrl())).and(startsWith("http"))); - MatcherAssert.assertThat(aaiGetAllSubscribersStatus.getMetadata().getDescription(), + Assert.assertThat("wrong description for " + component, componentStatus.getMetadata().getDescription(), anyOf(equalTo(expectedStatus.getMetadata().getDescription()), startsWith(expectedStatus.getMetadata().getDescription()))); + + Assert.assertThat("wrong status for " + component, componentStatus.isAvailable(), is(expectedStatus.isAvailable())); } //serialize fields except of fields we cannot know ahead of time diff --git a/vid-automation/src/test/java/org/onap/vid/api/SampleApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/SampleApiTest.java index 2b78cdb91..9d7a08120 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/SampleApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/SampleApiTest.java @@ -11,8 +11,9 @@ import vid.automation.test.services.SimulatorApi; import java.io.IOException; -import static org.hamcrest.MatcherAssert.assertThat; +import static java.util.Collections.singletonList; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; public class SampleApiTest extends BaseApiTest { diff --git a/vid-automation/src/test/java/org/onap/vid/api/SdcApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/SdcApiTest.java index 0441da1d2..7735d59af 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/SdcApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/SdcApiTest.java @@ -1,5 +1,16 @@ package org.onap.vid.api; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonStringEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.testng.Assert.assertFalse; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; +import static vid.automation.test.services.SimulatorApi.registerExpectation; +import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets; +import static vid.automation.test.utils.ReadFile.loadResourceAsString; + import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableList; import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset; @@ -11,22 +22,9 @@ import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import vid.automation.test.infra.FeatureTogglingTest; import vid.automation.test.infra.Features; -import java.io.IOException; -import java.net.URISyntaxException; - -import static net.javacrumbs.jsonunit.JsonMatchers.jsonStringEquals; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.either; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; -import static org.testng.Assert.assertFalse; -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND; -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; -import static vid.automation.test.services.SimulatorApi.registerExpectation; -import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets; - public class SdcApiTest extends BaseApiTest { private static final String SDC_GET_SERVICE_MODEL = "/rest/models/services/"; @@ -35,17 +33,17 @@ public class SdcApiTest extends BaseApiTest { private static final String A_LA_CARTE_INSTANTIATION_TYPE_UUID = "4d71990b-d8ad-4510-ac61-496288d9078e"; private static final String A_LA_CARTE_INSTANTIATION_TYPE_INVARIANT_UUID = "d27e42cf-087e-4d31-88ac-6c4b7585f800"; private static final String A_LA_CARTE_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeAlacarte_invariantUUIDMacro.zip"; - private static final String A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "{\"service\":{\"uuid\":\"4d71990b-d8ad-4510-ac61-496288d9078e\",\"invariantUuid\":\"d27e42cf-087e-4d31-88ac-6c4b7585f800\",\"name\":\"vidmacrofalsenaming\",\"version\":\"1.0\",\"toscaModelURL\":null,\"category\":\"Network L1-3\",\"serviceType\":\"\",\"serviceRole\":\"\",\"description\":\"vidmacrofalsenaming\",\"serviceEcompNaming\":\"false\",\"instantiationType\":\"A-La-Carte\",\"inputs\":{}},\"vnfs\":{},\"networks\":{\"MULTI_PROVIDER_PORT_GROUP 0\":{\"uuid\":\"e5d235de-2188-4f9f-a28c-fe38967883f2\",\"invariantUuid\":\"b0303003-0abb-454c-9119-8cbe2e09e003\",\"description\":\"Creates a neutron multi-provider VLAN network with dummy subnet\",\"name\":\"MULTI_PROVIDER_PORT_GROUP\",\"version\":\"1.0\",\"customizationUuid\":\"0fde4286-ee4c-439d-9556-74b6be6bbc42\",\"inputs\":{},\"commands\":{},\"properties\":{\"network_assignments\":\"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}\",\"network_flows\":\"{is_network_policy=false, is_bound_to_vpn=false}\",\"network_scope\":\"GLOBAL\",\"network_ecomp_naming\":\"{ecomp_generated_naming=true}\",\"network_type\":\"MULTI_PROVIDER_PORT_GROUP\",\"network_technology\":\"MULTI_GROUP\",\"network_homing\":\"{ecomp_selected_instance_node_target=false}\"},\"type\":\"VL\",\"modelCustomizationName\":\"MULTI_PROVIDER_PORT_GROUP 0\"}},\"collectionResource\":{},\"configurations\":{},\"serviceProxies\":{},\"vfModules\":{},\"volumeGroups\":{},\"pnfs\":{}}"; + private static final String A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/aLaCarteInstantiationTypeResponse.json"; private static final String MACRO_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeMacro_invariantUUIDAlacarte.zip"; private static final String MACRO_INSTANTIATION_TYPE_UUID = "4d71990b-d8ad-4510-ac61-496288d9078e"; private static final String MACRO_INSTANTIATION_TYPE_INVARIANT_UUID = "a8dcd72d-d44d-44f2-aa85-53aa9ca99cba"; - private static final String MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "{\"service\":{\"uuid\":\"4d71990b-d8ad-4510-ac61-496288d9078e\",\"invariantUuid\":\"a8dcd72d-d44d-44f2-aa85-53aa9ca99cba\",\"name\":\"vidmacrofalsenaming\",\"version\":\"1.0\",\"toscaModelURL\":null,\"category\":\"Network L1-3\",\"serviceType\":\"\",\"serviceRole\":\"\",\"description\":\"vidmacrofalsenaming\",\"serviceEcompNaming\":\"false\",\"instantiationType\":\"Macro\",\"inputs\":{}},\"vnfs\":{},\"networks\":{\"MULTI_PROVIDER_PORT_GROUP 0\":{\"uuid\":\"e5d235de-2188-4f9f-a28c-fe38967883f2\",\"invariantUuid\":\"b0303003-0abb-454c-9119-8cbe2e09e003\",\"description\":\"Creates a neutron multi-provider VLAN network with dummy subnet\",\"name\":\"MULTI_PROVIDER_PORT_GROUP\",\"version\":\"1.0\",\"customizationUuid\":\"0fde4286-ee4c-439d-9556-74b6be6bbc42\",\"inputs\":{},\"commands\":{},\"properties\":{\"network_assignments\":\"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}\",\"network_flows\":\"{is_network_policy=false, is_bound_to_vpn=false}\",\"network_scope\":\"GLOBAL\",\"network_ecomp_naming\":\"{ecomp_generated_naming=true}\",\"network_type\":\"MULTI_PROVIDER_PORT_GROUP\",\"network_technology\":\"MULTI_GROUP\",\"network_homing\":\"{ecomp_selected_instance_node_target=false}\"},\"type\":\"VL\",\"modelCustomizationName\":\"MULTI_PROVIDER_PORT_GROUP 0\"}},\"collectionResource\":{},\"configurations\":{},\"serviceProxies\":{},\"vfModules\":{},\"volumeGroups\":{},\"pnfs\":{}}"; + private static final String MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/macroInstantiationTypeResponse.json"; private static final String EMPTY_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeEmpty_invariantUUIDAlacarte.zip"; - private static final String EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "{\"service\":{\"uuid\":\"4d71990b-d8ad-4510-ac61-496288d9078e\",\"invariantUuid\":\"a8dcd72d-d44d-44f2-aa85-53aa9ca99cba\",\"name\":\"vidmacrofalsenaming\",\"version\":\"1.0\",\"toscaModelURL\":null,\"category\":\"Network L1-3\",\"serviceType\":\"\",\"serviceRole\":\"\",\"description\":\"vidmacrofalsenaming\",\"serviceEcompNaming\":\"false\",\"instantiationType\":\"ClientConfig\",\"inputs\":{}},\"vnfs\":{},\"networks\":{\"MULTI_PROVIDER_PORT_GROUP 0\":{\"uuid\":\"e5d235de-2188-4f9f-a28c-fe38967883f2\",\"invariantUuid\":\"b0303003-0abb-454c-9119-8cbe2e09e003\",\"description\":\"Creates a neutron multi-provider VLAN network with dummy subnet\",\"name\":\"MULTI_PROVIDER_PORT_GROUP\",\"version\":\"1.0\",\"customizationUuid\":\"0fde4286-ee4c-439d-9556-74b6be6bbc42\",\"inputs\":{},\"commands\":{},\"properties\":{\"network_assignments\":\"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}\",\"network_flows\":\"{is_network_policy=false, is_bound_to_vpn=false}\",\"network_scope\":\"GLOBAL\",\"network_ecomp_naming\":\"{ecomp_generated_naming=true}\",\"network_type\":\"MULTI_PROVIDER_PORT_GROUP\",\"network_technology\":\"MULTI_GROUP\",\"network_homing\":\"{ecomp_selected_instance_node_target=false}\"},\"type\":\"VL\",\"modelCustomizationName\":\"MULTI_PROVIDER_PORT_GROUP 0\"}},\"collectionResource\":{},\"configurations\":{},\"serviceProxies\":{},\"vfModules\":{},\"volumeGroups\":{},\"pnfs\":{}}"; + private static final String EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE = "sdcApiTest/emptyInstantiationTypeResponse.json"; private static final String BOTH_INSTANTIATION_TYPE_FILE_PATH = "csar15782222_instantiationTypeBoth_invariantUUIDAlacarte.zip"; @@ -53,13 +51,15 @@ public class SdcApiTest extends BaseApiTest { private static final String MIN_MAX_INITIAL_UUID = "43f13072-fe50-496b-b673-7af075d10143"; private static final String MIN_MAX_INITIAL_INVARIANT_UUID = "35fb95d8-d1f0-4e46-99ac-e01b423e8e3f"; private static final String MIN_MAX_INITIAL_FILE_PATH = "min_max_initial_vfModule_csar_v4.0.zip"; - private static final String MIN_MAX_INITIAL_EXPECTED_RESPONSE = "{\"service\":{\"uuid\":\"43f13072-fe50-496b-b673-7af075d10143\",\"invariantUuid\":\"35fb95d8-d1f0-4e46-99ac-e01b423e8e3f\",\"name\":\"ADIOD vMX VPE BV Service 488 test\",\"version\":\"1.0\",\"toscaModelURL\":null,\"category\":\"Network L1-3\",\"serviceType\":\"\",\"serviceRole\":\"\",\"description\":\"Model Creation for PID 291247b . OAM Network Service Name : ADIOD vPE Tenant OAM Network 1 SRIOV Network Service Name : vPE ADIOD Provider Net 1\",\"serviceEcompNaming\":\"true\",\"instantiationType\":\"ClientConfig\",\"inputs\":{\"2017488adiodvpe20_ASN\":{\"type\":\"string\",\"description\":\"AV/PE\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"AV_vPE\"},\"2017488adiodvpe20_bandwidth\":{\"type\":\"string\",\"description\":\"Requested VPE bandwidth\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"10\"},\"2017488adiodvpe20_bandwidth_units\":{\"type\":\"string\",\"description\":\"Units of bandwidth\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"Gbps\"},\"2017488adiodvpe20_AIC_CLLI\":{\"type\":\"string\",\"description\":\"AIC Site CLLI\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"ATLMY8GA\"},\"2017488adiodvpe20_vnf_config_template_version\":{\"type\":\"string\",\"description\":\"VPE Software Version\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"17.2\"},\"2017488adiodvpe20_vnf_instance_name\":{\"type\":\"string\",\"description\":\"The hostname assigned to the vpe.\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"mtnj309me6\"}}},\"vnfs\":{\"2017 488 ADIOD vPE 2 0\":{\"uuid\":\"079266b1-fcf5-44ae-bc04-cc3215b28737\",\"invariantUuid\":\"e2dcd546-e647-4854-9ed9-e0a4d6880636\",\"description\":\"Name ADIOD vPE Description The Provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release code 17.2 Owners Mary Fragale Updated 9-25-17 for version 8.0 of the VLM \",\"name\":\"2017 488 ADIOD vPE 2\",\"version\":\"4.0\",\"customizationUuid\":\"2b4e9125-b607-49a3-81c7-9260f8ca32f4\",\"inputs\":{\"vnf_config_template_version\":{\"type\":\"string\",\"description\":\"VPE Software Version\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"17.2\"},\"bandwidth_units\":{\"type\":\"string\",\"description\":\"Units of bandwidth\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"Gbps\"},\"bandwidth\":{\"type\":\"string\",\"description\":\"Requested VPE bandwidth\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"10\"},\"AIC_CLLI\":{\"type\":\"string\",\"description\":\"AIC Site CLLI\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"ATLMY8GA\"},\"ASN\":{\"type\":\"string\",\"description\":\"AV/PE\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"AV_vPE\"},\"vnf_instance_name\":{\"type\":\"string\",\"description\":\"The hostname assigned to the vpe.\",\"entry_schema\":null,\"inputProperties\":null,\"constraints\":[],\"required\":true,\"default\":\"mtnj309me6\"}},\"commands\":{\"vnf_config_template_version\":{\"displayName\":\"vnf_config_template_version\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_vnf_config_template_version\"},\"bandwidth_units\":{\"displayName\":\"bandwidth_units\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_bandwidth_units\"},\"bandwidth\":{\"displayName\":\"bandwidth\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_bandwidth\"},\"AIC_CLLI\":{\"displayName\":\"AIC_CLLI\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_AIC_CLLI\"},\"ASN\":{\"displayName\":\"ASN\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_ASN\"},\"vnf_instance_name\":{\"displayName\":\"vnf_instance_name\",\"command\":\"get_input\",\"inputName\":\"2017488adiodvpe20_vnf_instance_name\"}},\"properties\":{\"vmxvre_retype\":\"RE-VMX\",\"vnf_config_template_version\":\"get_input:2017488adiodvpe20_vnf_config_template_version\",\"sriov44_net_id\":\"48d399b3-11ee-48a8-94d2-f0ea94d6be8d\",\"int_ctl_net_id\":\"2f323477-6936-4d01-ac53-d849430281d9\",\"vmxvpfe_sriov41_0_port_mac\":\"00:11:22:EF:AC:DF\",\"int_ctl_net_name\":\"VMX-INTXI\",\"vmx_int_ctl_prefix\":\"128.0.0.0\",\"sriov43_net_id\":\"da349ca1-6de9-4548-be88-2d88e99bfef5\",\"sriov42_net_id\":\"760669ba-013d-4d9b-b0e7-4151fe2e6279\",\"sriov41_net_id\":\"25ad52d5-c165-40f8-b3b0-ddfc2373280a\",\"nf_type\":\"vPE\",\"vmxvpfe_int_ctl_ip_1\":\"128.0.0.16\",\"is_AVPN_service\":\"false\",\"vmx_RSG_name\":\"vREXI-affinity\",\"vmx_int_ctl_forwarding\":\"l2\",\"vmxvre_oam_ip_0\":\"10.40.123.5\",\"vmxvpfe_sriov44_0_port_mac\":\"00:11:22:EF:AC:DF\",\"vmxvpfe_sriov41_0_port_vlanstrip\":\"false\",\"vmxvpfe_sriov42_0_port_vlanfilter\":\"4001\",\"vmxvpfe_sriov44_0_port_unknownunicastallow\":\"true\",\"vmxvre_image_name_0\":\"VRE-ENGINE_17.2-S2.1.qcow2\",\"vmxvre_instance\":\"0\",\"vmxvpfe_sriov43_0_port_mac\":\"00:11:22:EF:AC:DF\",\"vmxvre_flavor_name\":\"ns.c1r16d32.v5\",\"vmxvpfe_volume_size_0\":\"40.0\",\"vmxvpfe_sriov43_0_port_vlanfilter\":\"4001\",\"nf_naming\":\"{ecomp_generated_naming=true}\",\"multi_stage_design\":\"false\",\"nf_naming_code\":\"tvpr\",\"vmxvre_name_0\":\"vREXI\",\"vmxvpfe_sriov42_0_port_vlanstrip\":\"false\",\"vmxvpfe_volume_name_0\":\"vPFEXI_FBVolume\",\"vmx_RSG_id\":\"bd89a33c-13c3-4a04-8fde-1a57eb123141\",\"vmxvpfe_image_name_0\":\"VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2\",\"vmxvpfe_sriov43_0_port_unknownunicastallow\":\"true\",\"vmxvpfe_sriov44_0_port_unknownmulticastallow\":\"true\",\"vmxvre_console\":\"vidconsole\",\"vmxvpfe_sriov44_0_port_vlanfilter\":\"4001\",\"vmxvpfe_sriov42_0_port_mac\":\"00:11:22:EF:AC:DF\",\"vmxvpfe_volume_id_0\":\"47cede15-da2f-4397-a101-aa683220aff3\",\"vmxvpfe_sriov42_0_port_unknownmulticastallow\":\"true\",\"vmxvpfe_sriov44_0_port_vlanstrip\":\"false\",\"vf_module_id\":\"123\",\"nf_function\":\"Firewall\",\"vmxvpfe_sriov43_0_port_unknownmulticastallow\":\"true\",\"vmxvre_int_ctl_ip_0\":\"128.0.0.1\",\"ecomp_generated_naming\":\"true\",\"AIC_CLLI\":\"get_input:2017488adiodvpe20_AIC_CLLI\",\"vnf_name\":\"mtnj309me6vre\",\"vmxvpfe_sriov41_0_port_unknownunicastallow\":\"true\",\"vmxvre_volume_type_1\":\"HITACHI\",\"vmxvpfe_sriov44_0_port_broadcastallow\":\"true\",\"vmxvre_volume_type_0\":\"HITACHI\",\"vmxvpfe_volume_type_0\":\"HITACHI\",\"vmxvpfe_sriov43_0_port_broadcastallow\":\"true\",\"bandwidth_units\":\"get_input:2017488adiodvpe20_bandwidth_units\",\"vnf_id\":\"123\",\"vmxvre_oam_prefix\":\"24\",\"availability_zone_0\":\"mtpocfo-kvm-az01\",\"ASN\":\"get_input:2017488adiodvpe20_ASN\",\"vmxvre_chassis_i2cid\":\"161\",\"vmxvpfe_name_0\":\"vPFEXI\",\"bandwidth\":\"get_input:2017488adiodvpe20_bandwidth\",\"availability_zone_max_count\":\"1\",\"vmxvre_volume_size_0\":\"45.0\",\"vmxvre_volume_size_1\":\"50.0\",\"vmxvpfe_sriov42_0_port_broadcastallow\":\"true\",\"vmxvre_oam_gateway\":\"10.40.123.1\",\"vmxvre_volume_name_1\":\"vREXI_FAVolume\",\"vmxvre_ore_present\":\"0\",\"vmxvre_volume_name_0\":\"vREXI_FBVolume\",\"vmxvre_type\":\"0\",\"vnf_instance_name\":\"get_input:2017488adiodvpe20_vnf_instance_name\",\"vmxvpfe_sriov41_0_port_unknownmulticastallow\":\"true\",\"oam_net_id\":\"b95eeb1d-d55d-4827-abb4-8ebb94941429\",\"vmx_int_ctl_len\":\"24\",\"vmxvpfe_sriov43_0_port_vlanstrip\":\"false\",\"vmxvpfe_sriov41_0_port_broadcastallow\":\"true\",\"vmxvre_volume_id_1\":\"6e86797e-03cd-4fdc-ba72-2957119c746d\",\"vmxvpfe_sriov41_0_port_vlanfilter\":\"4001\",\"nf_role\":\"MIS\",\"vmxvre_volume_id_0\":\"f4eacb79-f687-4e9d-b760-21847c8bb15a\",\"vmxvpfe_sriov42_0_port_unknownunicastallow\":\"true\",\"vmxvpfe_flavor_name\":\"ns.c20r16d25.v5\"},\"type\":\"VF\",\"modelCustomizationName\":\"2017 488 ADIOD vPE 2 0\",\"vfModules\":{\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\":{\"uuid\":\"13bea14d-9405-43c6-920b-97bab64b6a01\",\"invariantUuid\":\"83dc51de-a337-498e-9fee-763603a057b4\",\"customizationUuid\":\"a90865d5-6de0-4ef8-bf53-d45fa3edddfc\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"properties\":{\"minCountInstances\":null,\"maxCountInstances\":null,\"initialCount\":null,\"vfModuleLabel\":\"ADIOD_vPFE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":true},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vRE_BV..module-1\":{\"uuid\":\"3f6d5e51-a9a0-4c53-bb6d-be836767d96f\",\"invariantUuid\":\"54466b6d-e33c-4f4d-87e2-32bc5b103589\",\"customizationUuid\":\"dba1d1ff-77e2-4f4d-b1b4-1bed564f13b1\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":\"ADIOD_vRE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":true},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\":{\"uuid\":\"0a45a870-3a19-4238-a72a-eadfc583d4fe\",\"invariantUuid\":\"c636b302-fba2-4ed7-9f3b-c99715b6bb2e\",\"customizationUuid\":\"a0b634e6-514e-4977-91dd-3b8c295e6bc8\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\",\"properties\":{\"minCountInstances\":1,\"maxCountInstances\":1,\"initialCount\":1,\"vfModuleLabel\":\"ADIOD_base_vPE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":false}},\"volumeGroups\":{\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\":{\"uuid\":\"13bea14d-9405-43c6-920b-97bab64b6a01\",\"invariantUuid\":\"83dc51de-a337-498e-9fee-763603a057b4\",\"customizationUuid\":\"a90865d5-6de0-4ef8-bf53-d45fa3edddfc\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"properties\":{\"minCountInstances\":null,\"maxCountInstances\":null,\"initialCount\":null,\"vfModuleLabel\":\"ADIOD_vPFE_BV\"},\"inputs\":{}},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vRE_BV..module-1\":{\"uuid\":\"3f6d5e51-a9a0-4c53-bb6d-be836767d96f\",\"invariantUuid\":\"54466b6d-e33c-4f4d-87e2-32bc5b103589\",\"customizationUuid\":\"dba1d1ff-77e2-4f4d-b1b4-1bed564f13b1\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":\"ADIOD_vRE_BV\"},\"inputs\":{}}},\"vfcInstanceGroups\":{}}},\"networks\":{},\"collectionResource\":{},\"configurations\":{},\"serviceProxies\":{},\"vfModules\":{\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\":{\"uuid\":\"13bea14d-9405-43c6-920b-97bab64b6a01\",\"invariantUuid\":\"83dc51de-a337-498e-9fee-763603a057b4\",\"customizationUuid\":\"a90865d5-6de0-4ef8-bf53-d45fa3edddfc\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"properties\":{\"minCountInstances\":null,\"maxCountInstances\":null,\"initialCount\":null,\"vfModuleLabel\":\"ADIOD_vPFE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":true},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\":{\"uuid\":\"0a45a870-3a19-4238-a72a-eadfc583d4fe\",\"invariantUuid\":\"c636b302-fba2-4ed7-9f3b-c99715b6bb2e\",\"customizationUuid\":\"a0b634e6-514e-4977-91dd-3b8c295e6bc8\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_base_vPE_BV..module-0\",\"properties\":{\"minCountInstances\":1,\"maxCountInstances\":1,\"initialCount\":1,\"vfModuleLabel\":\"ADIOD_base_vPE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":false},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vRE_BV..module-1\":{\"uuid\":\"3f6d5e51-a9a0-4c53-bb6d-be836767d96f\",\"invariantUuid\":\"54466b6d-e33c-4f4d-87e2-32bc5b103589\",\"customizationUuid\":\"dba1d1ff-77e2-4f4d-b1b4-1bed564f13b1\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":\"ADIOD_vRE_BV\"},\"inputs\":{},\"volumeGroupAllowed\":true}},\"volumeGroups\":{\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\":{\"uuid\":\"13bea14d-9405-43c6-920b-97bab64b6a01\",\"invariantUuid\":\"83dc51de-a337-498e-9fee-763603a057b4\",\"customizationUuid\":\"a90865d5-6de0-4ef8-bf53-d45fa3edddfc\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vPFE_BV..module-2\",\"properties\":{\"minCountInstances\":null,\"maxCountInstances\":null,\"initialCount\":null,\"vfModuleLabel\":\"ADIOD_vPFE_BV\"},\"inputs\":{}},\"2017488adiodvpe20..2017488AdiodVpe2..ADIOD_vRE_BV..module-1\":{\"uuid\":\"3f6d5e51-a9a0-4c53-bb6d-be836767d96f\",\"invariantUuid\":\"54466b6d-e33c-4f4d-87e2-32bc5b103589\",\"customizationUuid\":\"dba1d1ff-77e2-4f4d-b1b4-1bed564f13b1\",\"description\":null,\"name\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"2017488AdiodVpe2..ADIOD_vRE_BV..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":\"ADIOD_vRE_BV\"},\"inputs\":{}}},\"pnfs\":{}}"; - private static final String MIN_MAX_INITIAL_UUID_OLD_CSAR = "245562de-3984-49ef-a708-6c9d7cfcabd1"; private static final String MIN_MAX_INITIAL_INVARIANT_UUID_OLD_CSAR = "24216d6-71d0-41c8-ac81-0c5acfee514a"; - private static final String MIN_MAX_INITIAL_FILE_PATH_OLD_CSAR = "service-VmmeRvpmsFeAic3011217Svc-csar.csar.zip"; - private static final String MIN_MAX_INITIAL_EXPECTED_RESPONSE_OLD_CSAR = "{\"service\":{\"uuid\":\"281b5f7d-c7ac-4ea9-92fb-2c1d625ca681\",\"invariantUuid\":\"a977af77-db15-4375-a637-e9b994ecd569\",\"name\":\"vMME_rVPMS_FE AIC3.0-11.2.1.7_SVC\",\"version\":\"1.0\",\"toscaModelURL\":null,\"category\":\"Mobility\",\"serviceType\":null,\"serviceRole\":null,\"description\":\"New service for vMME vProbe Front End AIC3.0 VPMS Radcom 11.2.1.7. Front End includes Qrouter, vProbe aff, vLB Agent aff and vLB.\",\"serviceEcompNaming\":\"true\",\"instantiationType\":null,\"inputs\":{}},\"vnfs\":{\"vMMEvProbe_FE_AIC3-11.2.1_VF 1\":{\"uuid\":\"245562de-3984-49ef-a708-6c9d7cfcabd1\",\"invariantUuid\":\"124216d6-71d0-41c8-ac81-0c5acfee514a\",\"description\":\" New service for vMME vProbe Front End AIC3.0 VPMS Radcom 11.2.1.7. Front End includes Qrouter, vProbe aff, vLB Agent aff and vLB. \",\"name\":\"vMMEvProbe_FE_AIC3-11.2.1_VF\",\"version\":\"1.0\",\"customizationUuid\":\"8293273d-0e76-4661-926f-06a01ad2e683\",\"inputs\":{},\"commands\":{},\"properties\":{},\"type\":null,\"modelCustomizationName\":\"vMMEvProbe_FE_AIC3-11.2.1_VF 1\",\"vfModules\":{\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\":{\"uuid\":\"e67e5b39-1f3b-4692-beec-eda94a0375a5\",\"invariantUuid\":\"21c1b57d-a618-4397-a7f4-9c37169ea09b\",\"customizationUuid\":\"a7d59494-3710-4b05-b4cd-e45dadbdc7ac\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\":{\"uuid\":\"59bb7d14-278f-4ff5-bd5a-1a720c8b0d19\",\"invariantUuid\":\"9b5589c2-e4d1-4456-a23b-e0001c349155\",\"customizationUuid\":\"b9d6f6e8-e24a-4ad9-b863-1c3f6757bfe7\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\",\"properties\":{\"minCountInstances\":1,\"maxCountInstances\":1,\"initialCount\":1,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":false},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\":{\"uuid\":\"530e5e9f-2e82-4946-bf59-630f4d7ef4de\",\"invariantUuid\":\"d1fb14d9-0fa8-4ead-b5cc-be311c7a95bd\",\"customizationUuid\":\"c1f95365-716c-4f6c-9477-a8f760a2edce\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\":{\"uuid\":\"064385f9-795b-4fcb-9e3b-51d7d0ccad80\",\"invariantUuid\":\"603e8f71-88ad-4bbf-9992-2e9a72a91e29\",\"customizationUuid\":\"3b5efcd3-d14d-4b0e-91cf-937db5aa65b5\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\":{\"uuid\":\"85b712e0-af62-4255-aeb6-ec9ae0f4eb13\",\"invariantUuid\":\"cba59330-855a-460b-8856-f6bff0dac6c2\",\"customizationUuid\":\"962479d7-b5b7-4129-bf9f-bfe4775e7921\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true}},\"volumeGroups\":{\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\":{\"uuid\":\"e67e5b39-1f3b-4692-beec-eda94a0375a5\",\"invariantUuid\":\"21c1b57d-a618-4397-a7f4-9c37169ea09b\",\"customizationUuid\":\"a7d59494-3710-4b05-b4cd-e45dadbdc7ac\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\":{\"uuid\":\"530e5e9f-2e82-4946-bf59-630f4d7ef4de\",\"invariantUuid\":\"d1fb14d9-0fa8-4ead-b5cc-be311c7a95bd\",\"customizationUuid\":\"c1f95365-716c-4f6c-9477-a8f760a2edce\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\":{\"uuid\":\"064385f9-795b-4fcb-9e3b-51d7d0ccad80\",\"invariantUuid\":\"603e8f71-88ad-4bbf-9992-2e9a72a91e29\",\"customizationUuid\":\"3b5efcd3-d14d-4b0e-91cf-937db5aa65b5\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\":{\"uuid\":\"85b712e0-af62-4255-aeb6-ec9ae0f4eb13\",\"invariantUuid\":\"cba59330-855a-460b-8856-f6bff0dac6c2\",\"customizationUuid\":\"962479d7-b5b7-4129-bf9f-bfe4775e7921\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null}},\"vfcInstanceGroups\":{}}},\"networks\":{},\"collectionResource\":null,\"configurations\":null,\"serviceProxies\":null,\"vfModules\":{\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\":{\"uuid\":\"e67e5b39-1f3b-4692-beec-eda94a0375a5\",\"invariantUuid\":\"21c1b57d-a618-4397-a7f4-9c37169ea09b\",\"customizationUuid\":\"a7d59494-3710-4b05-b4cd-e45dadbdc7ac\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\":{\"uuid\":\"59bb7d14-278f-4ff5-bd5a-1a720c8b0d19\",\"invariantUuid\":\"9b5589c2-e4d1-4456-a23b-e0001c349155\",\"customizationUuid\":\"b9d6f6e8-e24a-4ad9-b863-1c3f6757bfe7\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Base_Module..module-0\",\"properties\":{\"minCountInstances\":1,\"maxCountInstances\":1,\"initialCount\":1,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":false},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\":{\"uuid\":\"530e5e9f-2e82-4946-bf59-630f4d7ef4de\",\"invariantUuid\":\"d1fb14d9-0fa8-4ead-b5cc-be311c7a95bd\",\"customizationUuid\":\"c1f95365-716c-4f6c-9477-a8f760a2edce\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\":{\"uuid\":\"064385f9-795b-4fcb-9e3b-51d7d0ccad80\",\"invariantUuid\":\"603e8f71-88ad-4bbf-9992-2e9a72a91e29\",\"customizationUuid\":\"3b5efcd3-d14d-4b0e-91cf-937db5aa65b5\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\":{\"uuid\":\"85b712e0-af62-4255-aeb6-ec9ae0f4eb13\",\"invariantUuid\":\"cba59330-855a-460b-8856-f6bff0dac6c2\",\"customizationUuid\":\"962479d7-b5b7-4129-bf9f-bfe4775e7921\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null,\"volumeGroupAllowed\":true}},\"volumeGroups\":{\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\":{\"uuid\":\"e67e5b39-1f3b-4692-beec-eda94a0375a5\",\"invariantUuid\":\"21c1b57d-a618-4397-a7f4-9c37169ea09b\",\"customizationUuid\":\"a7d59494-3710-4b05-b4cd-e45dadbdc7ac\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vprobe_eph..module-1\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\":{\"uuid\":\"530e5e9f-2e82-4946-bf59-630f4d7ef4de\",\"invariantUuid\":\"d1fb14d9-0fa8-4ead-b5cc-be311c7a95bd\",\"customizationUuid\":\"c1f95365-716c-4f6c-9477-a8f760a2edce\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlbagent_aff..module-2\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\":{\"uuid\":\"064385f9-795b-4fcb-9e3b-51d7d0ccad80\",\"invariantUuid\":\"603e8f71-88ad-4bbf-9992-2e9a72a91e29\",\"customizationUuid\":\"3b5efcd3-d14d-4b0e-91cf-937db5aa65b5\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_qrouter..module-4\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null},\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\":{\"uuid\":\"85b712e0-af62-4255-aeb6-ec9ae0f4eb13\",\"invariantUuid\":\"cba59330-855a-460b-8856-f6bff0dac6c2\",\"customizationUuid\":\"962479d7-b5b7-4129-bf9f-bfe4775e7921\",\"description\":null,\"name\":\"VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"version\":\"1\",\"modelCustomizationName\":\"vmmevprobe_fe_aic31121_vf1..VmmevprobeFeAic31121Vf..FE_Add_On_Module_vlb..module-3\",\"properties\":{\"minCountInstances\":0,\"maxCountInstances\":null,\"initialCount\":0,\"vfModuleLabel\":null},\"inputs\":null}},\"pnfs\":null}"; + private static final String MIN_MAX_INITIAL_FILE_PATH_OLD_CSAR = "service-VflorenceRvpmsFeAic3011217Svc-csar.csar.zip"; + + private static final String GROUPING_SERVICE_ROLE_FILE_PATH = "csar15782222_instantiationTypeAlacarte_VnfGrouping.zip"; + private static final String GROUPING_SERVICE_ROLE_UUID = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc"; + private static final String GROUPING_SERVICE_ROLE_INVARIANT_UUID = "7ee41ce4-4827-44b0-a48e-2707a59905d2"; + private static final String GROUPING_SERVICE_ROLE_EXPECTED_RESPONSE = "VnfGroup/groupingServiceRoleResponse.json"; @BeforeClass public void login() { @@ -74,20 +74,22 @@ public class SdcApiTest extends BaseApiTest { } @Test - public void getServiceModelALaCarteInstantiation() throws IOException, URISyntaxException { + public void getServiceModelALaCarteInstantiation() { registerToSimulatorWithPresets(A_LA_CARTE_INSTANTIATION_TYPE_UUID, A_LA_CARTE_INSTANTIATION_TYPE_INVARIANT_UUID, A_LA_CARTE_INSTANTIATION_TYPE_FILE_PATH); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + A_LA_CARTE_INSTANTIATION_TYPE_UUID), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE)).or(jsonStringEquals(A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE))); + String aLaCarteInstantiationTypeExpectedResponse = loadResourceAsString(A_LA_CARTE_INSTANTIATION_TYPE_EXPECTED_RESPONSE); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(turnOffInstantiationUI(aLaCarteInstantiationTypeExpectedResponse)))); } @Test - public void getServiceModelMacroInstantiation() throws IOException, URISyntaxException { + public void getServiceModelMacroInstantiation() { registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, MACRO_INSTANTIATION_TYPE_FILE_PATH); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE)).or(jsonStringEquals(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE))); + String macroInstantiationTypeExpectedResponse = loadResourceAsString(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(turnOffInstantiationUI(macroInstantiationTypeExpectedResponse)))); } @@ -96,8 +98,8 @@ public class SdcApiTest extends BaseApiTest { registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, EMPTY_INSTANTIATION_TYPE_FILE_PATH); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE)).or(jsonStringEquals(EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE))); - + String emptyInstantiationTypeExpectedResponse = loadResourceAsString(EMPTY_INSTANTIATION_TYPE_EXPECTED_RESPONSE); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(turnOffInstantiationUI(emptyInstantiationTypeExpectedResponse)))); } @Test @@ -105,7 +107,8 @@ public class SdcApiTest extends BaseApiTest { registerToSimulatorWithPresets(MACRO_INSTANTIATION_TYPE_UUID, MACRO_INSTANTIATION_TYPE_INVARIANT_UUID, BOTH_INSTANTIATION_TYPE_FILE_PATH); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MACRO_INSTANTIATION_TYPE_UUID), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE)).or(jsonStringEquals(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE))); + String macroInstantiationTypeExpectedResponse = loadResourceAsString(MACRO_INSTANTIATION_TYPE_EXPECTED_RESPONSE); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(turnOffInstantiationUI(macroInstantiationTypeExpectedResponse)))); } @Test @@ -113,7 +116,8 @@ public class SdcApiTest extends BaseApiTest { registerToSimulatorWithPresets(MIN_MAX_INITIAL_UUID, MIN_MAX_INITIAL_INVARIANT_UUID, MIN_MAX_INITIAL_FILE_PATH); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MIN_MAX_INITIAL_UUID), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(MIN_MAX_INITIAL_EXPECTED_RESPONSE)).or(jsonStringEquals(MIN_MAX_INITIAL_EXPECTED_RESPONSE))); + String minMaxInitialExpectedResponse = loadResourceAsString("sdcApiTest/minMaxInitialExpectedResponse.json"); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(turnOffInstantiationUI(minMaxInitialExpectedResponse)))); } @Test @@ -121,7 +125,18 @@ public class SdcApiTest extends BaseApiTest { registerToSimulatorWithPresets(MIN_MAX_INITIAL_UUID_OLD_CSAR, MIN_MAX_INITIAL_INVARIANT_UUID_OLD_CSAR, MIN_MAX_INITIAL_FILE_PATH_OLD_CSAR); ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + MIN_MAX_INITIAL_UUID_OLD_CSAR), String.class); Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); - assertThat("The response is in the format of JSON", response.getBody(), either(is(MIN_MAX_INITIAL_EXPECTED_RESPONSE_OLD_CSAR)).or(jsonStringEquals(MIN_MAX_INITIAL_EXPECTED_RESPONSE_OLD_CSAR))); + String minMaxInitialExpectedResponseOldCsar = loadResourceAsString("sdcApiTest/minMaxInitialExpectedResponseOldCsar.json"); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(minMaxInitialExpectedResponseOldCsar))); + } + + @Test + @FeatureTogglingTest(Features.FLAG_1902_VNF_GROUPING) + public void getServiceModelWithServiceRoleGrouping(){ + registerToSimulatorWithPresets(GROUPING_SERVICE_ROLE_UUID, GROUPING_SERVICE_ROLE_INVARIANT_UUID, GROUPING_SERVICE_ROLE_FILE_PATH); + ResponseEntity<String> response = restTemplate.getForEntity(buildUri(SDC_GET_SERVICE_MODEL + GROUPING_SERVICE_ROLE_UUID), String.class); + Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); + String groupingServiceRoleExpectedResponse = loadResourceAsString(GROUPING_SERVICE_ROLE_EXPECTED_RESPONSE); + assertThat("The response is in the format of JSON", response.getBody(), is(jsonStringEquals(groupingServiceRoleExpectedResponse))); } private void registerToSimulatorWithPresets(String uuid, String invariantUuid, String pathPath){ @@ -131,6 +146,15 @@ public class SdcApiTest extends BaseApiTest { registerExpectationFromPresets(presets, CLEAR_THEN_SET); } + private String turnOffInstantiationUI(String expectedJson) { + if (!Features.FLAG_5G_IN_NEW_INSTANTIATION_UI.isActive()) { + // replaces the instantiationUI field-value with "legacy", whatever it was + return expectedJson.replaceFirst("(\"instantiationUI\": *\")[^\"]*(\",)", "$1legacy$2"); + } else { + return expectedJson; + } + } + @Test public void withModelFromE2eWithToscaParserButNewFlow_requestModels_expectVnfRelatedVfModulesNotNull() { @@ -139,8 +163,8 @@ public class SdcApiTest extends BaseApiTest { volumeGroups, because a 'isNewFlow' value in org.onap.vid.asdc.parser.ToscaParserImpl was always false because a coding error. */ - registerExpectation("get_sdc_catalog_services_VmmeRvpmsFeAic3011217Svc.json", CLEAR_THEN_SET); - registerExpectation("aai_get_full_subscribers.json", APPEND); + registerExpectation("get_sdc_catalog_services_VflorenceRvpmsFeAic3011217Svc.json", CLEAR_THEN_SET); + registerExpectation("create_new_instance/aai_get_full_subscribers.json", APPEND); final JsonNode response = restTemplate.getForObject(uri + "/rest/models/services/" + "245562de-3984-49ef-a708-6c9d7cfcabd1", JsonNode.class); diff --git a/vid-automation/src/test/java/org/onap/vid/api/ServiceInstanceMsoApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ServiceInstanceMsoApiTest.java index ce290c89f..40ce80ba6 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/ServiceInstanceMsoApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/ServiceInstanceMsoApiTest.java @@ -1,16 +1,21 @@ package org.onap.vid.api; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import java.io.IOException; +import java.net.URISyntaxException; import org.apache.commons.text.StringEscapeUtils; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOActivateFabricConfiguration; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSOActivateFabricConfigurationErrorResponse; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeactivateAndCloudDelete; +import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeactivateAndCloudDeleteErrorResponse; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.testng.annotations.Test; import vid.automation.test.infra.FeatureTogglingTest; import vid.automation.test.infra.Features; -import java.io.IOException; -import java.net.URISyntaxException; - public class ServiceInstanceMsoApiTest extends BaseMsoApiTest{ //Urls @@ -18,11 +23,15 @@ public class ServiceInstanceMsoApiTest extends BaseMsoApiTest{ public static final String MSO_DEACTIVATE_SERVICE_INSTANCE = "mso/mso_deactivate_service_instance/f36f5734-e9df-4fbf-9f35-61be13f028a1"; public static final String MSO_DELETE_SERVICE_INSTANCE = "mso/mso_delete_svc_instance/f36f5734-e9df-4fbf-9f35-61be13f028a1?serviceStatus=active"; public static final String MSO_UNASSIGN_SERVICE_INSTANCE = "mso/mso_delete_svc_instance/f36f5734-e9df-4fbf-9f35-61be13f028a1?serviceStatus=created"; + public static final String MSO_ACTIVATE_FABRIC_CONFIGURATION = "mso/mso_activate_fabric_configuration/f36f5734-e9df-4fbf-9f35-61be13f028a1"; + public static final String MSO_DEACTIVATE_AND_CLOUD_DELETE = "mso/mso_vfmodule_soft_delete/f36f5734-e9df-4fbf-9f35-61be13f028a1/vnfId/vfModuleId"; //Request Details private static final String ACTIVATE_SERVICE_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_activate_service_instance.json"; private static final String DEACTIVATE_SERVICE_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_deactivate_service_instance.json"; private static final String DELETE_AND_UNASSIGN_SERVICE_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_delete_or_unassign_service_instance.json"; + private static final String ACTIVATE_FABRIC_CONFIGURATION_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_activate_fabric_configuration.json"; + private static final String DEACTIVATE_AND_CLOUD_DELETE_DATA = "registration_to_simulator/body_jsons/mso_request_deactivate_and_cloud_delete.json"; //Jsons private static final String ACTIVATE_OK_JSON = "activate_service_instance.json"; @@ -35,7 +44,8 @@ public class ServiceInstanceMsoApiTest extends BaseMsoApiTest{ //Expected Responses private static final String EXPECTED_SUCCESS_MSO_RESPONSE = "{\"requestReferences\": {\"instanceId\": \"f36f5734-e9df-4fbf-9f35-61be13f028a1\", \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"}}"; - private static final String EXPECTED_ERROR_MSO_RESPONSE = "{\"error\":\"222\",\"message\":\"error message\"}"; + private static final String EXPECTED_ERROR_MSO_RESPONSE = "{\"message\":\"error message\",\"error\":\"222\"}"; + @Test public void testActivateServiceInstanceSucceed() throws Exception { @@ -118,4 +128,37 @@ public class ServiceInstanceMsoApiTest extends BaseMsoApiTest{ buildUri(MSO_DEACTIVATE_SERVICE_INSTANCE), requestBody, errorCode, EXPECTED_ERROR_MSO_RESPONSE, HttpMethod.POST); } + + @Test + public void testActivateFabricConfigurationSucceed() throws Exception { + String requestBody = TestUtils.convertRequest(objectMapper, ACTIVATE_FABRIC_CONFIGURATION_REQUEST_DETAILS); + callMsoWithFineRequest(new PresetMSOActivateFabricConfiguration("f36f5734-e9df-4fbf-9f35-61be13f028a1", "b6dc9806-b094-42f7-9386-a48de8218ce8"), buildUri(MSO_ACTIVATE_FABRIC_CONFIGURATION), requestBody, + HttpStatus.ACCEPTED.value(), EXPECTED_SUCCESS_MSO_RESPONSE, HttpMethod.POST); + } + + @Test(dataProvider = "errorCodes") + public void testActivateFabricConfigurationFailed(int errorCode) throws IOException, URISyntaxException { + String requestBody = TestUtils.convertRequest(objectMapper, ACTIVATE_FABRIC_CONFIGURATION_REQUEST_DETAILS); + callMsoWithSimulatedErrorResponse(new PresetMSOActivateFabricConfigurationErrorResponse("f36f5734-e9df-4fbf-9f35-61be13f028a1", errorCode), + buildUri(MSO_ACTIVATE_FABRIC_CONFIGURATION), requestBody, errorCode, EXPECTED_ERROR_MSO_RESPONSE, HttpMethod.POST); + } + + @Test + public void testDeactivateAndCloudDeleteSucceed() throws Exception { + String requestBody = TestUtils.convertRequest(objectMapper, DEACTIVATE_AND_CLOUD_DELETE_DATA); + callMsoWithFineRequest(ImmutableList.of( + new PresetMSODeactivateAndCloudDelete("f36f5734-e9df-4fbf-9f35-61be13f028a1", "vnfId", "vfModuleId", "b6dc9806-b094-42f7-9386-a48de8218ce8", "irma-aic"), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC), + buildUri(MSO_DEACTIVATE_AND_CLOUD_DELETE), requestBody, + HttpStatus.ACCEPTED.value(), EXPECTED_SUCCESS_MSO_RESPONSE, HttpMethod.POST); + } + + @Test(dataProvider = "errorCodes") + public void testDeactivateAndCloudDeleteFailed(int errorCode) throws IOException, URISyntaxException { + String requestBody = TestUtils.convertRequest(objectMapper, DEACTIVATE_AND_CLOUD_DELETE_DATA); + callMsoWithSimulatedErrorResponse(ImmutableList.of( + new PresetMSODeactivateAndCloudDeleteErrorResponse("f36f5734-e9df-4fbf-9f35-61be13f028a1", "vnfId", "vfModuleId", errorCode, "irma-aic"), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC), + buildUri(MSO_DEACTIVATE_AND_CLOUD_DELETE), requestBody, errorCode, EXPECTED_ERROR_MSO_RESPONSE, HttpMethod.POST); + } } diff --git a/vid-automation/src/test/java/org/onap/vid/api/ServicePermissionsApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ServicePermissionsApiTest.java new file mode 100644 index 000000000..385ec9b0d --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/ServicePermissionsApiTest.java @@ -0,0 +1,63 @@ +package org.onap.vid.api; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import org.onap.sdc.ci.tests.datatypes.UserCredentials; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import vid.automation.test.Constants; +import vid.automation.test.model.User; +import vid.automation.test.services.SimulatorApi; + +public class ServicePermissionsApiTest extends BaseApiTest { + + private final String emanuelSubscriberId = "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb"; + private final String uspVoiceSubscriberId = "e433710f-9217-458d-a79d-1c7aff376d89"; + + @BeforeClass + public void setAaiSubscribers() { + SimulatorApi.registerExpectationFromPreset(new PresetAAIGetSubscribersGet(), SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET); + } + + @Test + public void servicePermissions_loginWithPermissions_1IsPermitted1NotPermitted() { + login(userCredentials(Constants.Users.EMANUEL_vWINIFRED)); + assertPermissions(emanuelSubscriberId, "vRichardson", true); + assertPermissions(emanuelSubscriberId, "someNonexistent", false); + } + + @Test + public void servicePermissions_loginPermissionsWithTenant_IsPermittedRegardlessOfTenant() { + login(userCredentials("Emanuel_with_tenant")); + assertPermissions(emanuelSubscriberId, "vWINIFRED", true); + } + + @Test + public void servicePermissions_loginWithNoPermissionsAtAll_nothingIsPermitted() { + login(userCredentials(Constants.Users.READONLY)); + assertPermissions(emanuelSubscriberId, "vRichardson", false); + assertPermissions(emanuelSubscriberId, "someNonexistent", false); + } + + @Test + public void servicePermissions_serviceTypeWithSpace_isPermitted() { + login(userCredentials(Constants.Users.SILVIA_ROBBINS_TYLER_SILVIA)); + assertPermissions(uspVoiceSubscriberId, "TYLER SILVIA", true); + } + + private UserCredentials userCredentials(String userName) { + User user = usersService.getUser(userName); + return new UserCredentials(user.credentials.userId, user.credentials.password, userName, "", ""); + } + + private void assertPermissions(final String subscriberId, final String serviceType, boolean isEditPermitted) { + final Map response = restTemplate.getForObject(uri + "/roles/service_permissions?subscriberId=" + subscriberId + "&serviceType=" + serviceType, Map.class); + assertThat(response, is(ImmutableMap.of( + "isEditPermitted", isEditPermitted + ))); + } +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java new file mode 100644 index 000000000..52aa2e388 --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/ServiceTreeApiTest.java @@ -0,0 +1,370 @@ +package org.onap.vid.api; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.onap.simulator.presetGenerator.presets.aai.*; +import org.onap.simulator.presetGenerator.presets.ecompportal_att.PresetGetSessionSlotCheckIntervalGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet; +import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import vid.automation.test.services.SimulatorApi; + +import java.util.UUID; + +import static org.apache.commons.text.StringEscapeUtils.escapeJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET; + +public class ServiceTreeApiTest extends BaseApiTest { + + private static final String API_URL = "/aai_get_service_instance_topology/{subscriberId}/{serviceType}/{serviceInstanceId}"; + + @BeforeClass + public void login() { + super.login(); + } + + @Test + public void serviceWithNoChildren_requestDoesSomething() { + final PresetAAIStandardQueryGet serviceInstance = + PresetAAIStandardQueryGet.ofServiceInstance("service-instance-id", "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "service-instance-model-invariant-id", "global-customer-id", "service-instance-type", ImmutableMultimap.of()); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, + new PresetAAIModelsByInvariantIdGet(ImmutableList.of("service-instance-model-invariant-id")), + new PresetSDCGetServiceMetadataGet("7a6ee536-f052-46fa-aa7e-2fca9d674c44", "service-instance-model-invariant-id", "csar15782222_instantiationTypeMacroWithNetwork.zip"), + new PresetSDCGetServiceToscaModelGet("7a6ee536-f052-46fa-aa7e-2fca9d674c44", "csar15782222_instantiationTypeMacroWithNetwork.zip") + ), CLEAR_THEN_SET); + final String response = restTemplate.getForObject(buildUri(API_URL), String.class, "global-customer-id", "service-instance-type", "service-instance-id"); + + assertJsonEquals(response, "" + + "{" + + " \"instanceName\": \"" + escapeJson(serviceInstance.getInstanceName()) + "\"," + + " \"action\": \"None\"," + + " \"instanceId\": \"service-instance-id\"," + + " \"orchStatus\": \"GARBAGE DATA\"," + + " \"globalSubscriberId\": \"global-customer-id\"," + + " \"subscriptionServiceType\": \"service-instance-type\"," + + " \"owningEntityId\": null," + + " \"owningEntityName\": null," + + " \"productFamilyId\": null," + + " \"lcpCloudRegionId\": null," + + " \"tenantId\": null," + + " \"tenantName\": null," + + " \"aicZoneId\": null," + + " \"aicZoneName\": null," + + " \"projectName\": null," + + " \"rollbackOnFailure\": null," + + " \"modelInfo\": {" + + " \"modelInvariantId\": \"service-instance-model-invariant-id\"," + + " \"modelVersionId\": \"7a6ee536-f052-46fa-aa7e-2fca9d674c44\"," + + " \"modelName\": \"vf_vEPDG\"," + + " \"modelType\": \"service\"," + + " \"modelVersion\": \"2.0\"" + + " }," + + " \"vnfs\": {}," + + " \"networks\": {}," + + " \"vnfGroups\": {}," + + " \"validationCounter\": 0," + + " \"existingVNFCounterMap\": {}," + + " \"existingNetworksCounterMap\": {}," + + " \"existingVnfGroupCounterMap\": {}," + + " \"isALaCarte\": false" + + "}"); + } + + @Test + public void searchGroupMembers_expected4vnfs() { + PresetAAIStandardQueryGet instanceGroup1 = PresetAAIStandardQueryGet.ofInstanceGroup("L3-NETWORK", "SUB_INTERFACE", ImmutableMultimap.of()); + PresetAAIStandardQueryGet instanceGroup2 = PresetAAIStandardQueryGet.ofInstanceGroup("LOAD-GROUP", "SERVICE-ACCESS", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet vnfPreset1 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "", + ImmutableMultimap.of("instance-group", instanceGroup1.getReqPath())); + + PresetAAIStandardQueryGet vnfPreset2 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "eb5f56bf-5855-4e61-bd00-3e19a953bf02", + "\"in-maint\": true,", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet vnfPreset3 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "", + ImmutableMultimap.of("instance-group", instanceGroup1.getReqPath())); + + PresetAAIStandardQueryGet vnfPreset4 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "b7f2e8fb-ac71-4ea0-a801-06ef1479ea84", + "\"in-maint\": true,", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet vnfPreset5 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "b7f2e8fb-ac71-4ea0-a801-06ef1479ea84", + "\"in-maint\": true,", ImmutableMultimap.of("instance-group", instanceGroup2.getReqPath())); + + Multimap<String, String> serviceInstance1 = ImmutableMultimap.<String, String>builder() + .putAll("generic-vnf", vnfPreset1.getReqPath()) + .putAll("generic-vnf", vnfPreset3.getReqPath()) + .build(); + + Multimap<String, String> serviceInstance2 = ImmutableMultimap.<String, String>builder() + .putAll("generic-vnf", vnfPreset2.getReqPath()) + .putAll("generic-vnf", vnfPreset4.getReqPath()) + .putAll("generic-vnf", vnfPreset5.getReqPath()) + .build(); + + PresetAAIGetServiceInstancesByInvariantId serviceInstancesList = new PresetAAIGetServiceInstancesByInvariantId( + "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", + ImmutableMap.of("service-instance-id1", serviceInstance1, + "service-instance-id2", serviceInstance2)); + + + SimulatorApi.registerExpectationFromPresets( + ImmutableList.of(serviceInstancesList, + vnfPreset1, instanceGroup1, + vnfPreset2, + vnfPreset3, + vnfPreset4, + vnfPreset5, instanceGroup2, //this vnf should be filtered out + new PresetAAIModelsByInvariantIdGet(ImmutableList.of("vnf-instance-model-invariant-id")), + new PresetAAIGetCloudRegionFromVnf(vnfPreset1.getInstanceId()), + new PresetAAIGetCloudRegionFromVnf(vnfPreset2.getInstanceId()), + new PresetAAIGetCloudRegionFromVnf(vnfPreset3.getInstanceId()), + new PresetAAIGetCloudRegionFromVnf(vnfPreset4.getInstanceId()) + ), CLEAR_THEN_SET); + + String api_url = "aai_search_group_members?subscriberId={subscriberId}&serviceType={serviceType}&serviceInvariantId={serviceInvariantId}" + + "&groupType={groupType}&groupRole={groupRole}"; + + final String response = restTemplate.getForObject(buildUri(api_url), String.class, "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", "LOAD-GROUP", "SERVICE-ACCESS"); + + LOGGER.info(response); + + String expected = TestUtils.convertRequest(objectMapper, "VnfGroup/searchMembersResponse.json"); + expected = expected + .replace("VNF1_INSTANCE_NAME", vnfPreset1.getInstanceName()) + .replace("VNF1_INSTANCE_ID", vnfPreset1.getInstanceId()) + .replace("VNF1_INSTANCE_TYPE", vnfPreset1.getInstanceType()) + .replace("VNF2_INSTANCE_NAME", vnfPreset2.getInstanceName()) + .replace("VNF2_INSTANCE_ID", vnfPreset2.getInstanceId()) + .replace("VNF2_INSTANCE_TYPE", vnfPreset2.getInstanceType()) + .replace("VNF3_INSTANCE_NAME", vnfPreset3.getInstanceName()) + .replace("VNF3_INSTANCE_ID", vnfPreset3.getInstanceId()) + .replace("VNF3_INSTANCE_TYPE", vnfPreset3.getInstanceType()) + .replace("VNF4_INSTANCE_NAME", vnfPreset4.getInstanceName()) + .replace("VNF4_INSTANCE_ID", vnfPreset4.getInstanceId()) + .replace("VNF4_INSTANCE_TYPE", vnfPreset4.getInstanceType()); + + assertJsonEquals(response, expected); + } + + @Test + public void searchGroupMembers_expectedNoResult() { + PresetAAIGetServiceInstancesByInvariantId serviceInstancesList = new PresetAAIGetServiceInstancesByInvariantId( + "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", + ImmutableMap.of("service-instance-id1", ImmutableMultimap.of(), + "service-instance-id2", ImmutableMultimap.of())); + + + SimulatorApi.registerExpectationFromPreset(serviceInstancesList, CLEAR_THEN_SET); + + String api_url = "aai_search_group_members?subscriberId={subscriberId}&serviceType={serviceType}&serviceInvariantId={serviceInvariantId}" + + "&groupType={groupType}&groupRole={groupRole}"; + + final String response = restTemplate.getForObject(buildUri(api_url), String.class, "global-customer-id", "service-instance-type", "24632e6b-584b-4f45-80d4-fefd75fd9f14", "LOAD-GROUP", "SERVICE-ACCESS"); + + assertJsonEquals(response, "[]"); + } + + @Test + public void serviceWithMultiplePlys_responseIsReasonable() { + + PresetAAIStandardQueryGet l3NetworkPreset1 = + PresetAAIStandardQueryGet.ofL3Network("CONTRAIL30_BASIC", "Assigned", + ImmutableMultimap.of()); + + PresetAAIStandardQueryGet vlanTag1 = PresetAAIStandardQueryGet.ofVlanTag(44); + + PresetAAIStandardQueryGet l3NetworkPreset2 = + + PresetAAIStandardQueryGet.ofL3Network("CONTRAIL30_BASIC", "Created", + ImmutableMultimap.of("vlan-tag", vlanTag1.getReqPath())); + + PresetAAIStandardQueryGet l3NetworkPreset3 = + PresetAAIStandardQueryGet.ofL3Network("CONTRAIL30_BASIC", "Assigned", "nvtprov", "ddc3f20c-08b5-40fd-af72-c6d14636b986","94fdd893-4a36-4d70-b16a-ec29c54c184f", + ImmutableMultimap.of()); + + PresetAAIStandardQueryGet l3NetworkPreset4 = + PresetAAIStandardQueryGet.ofL3Network("CONTRAIL30_HIMELGUARD", "Created", "preprov", "ddc3f20c-08b5-40fd-af72-c6d14636b986","94fdd893-4a36-4d70-b16a-ec29c54c184f", + ImmutableMultimap.of()); + + PresetAAIStandardQueryGet volumeGroup1 = + PresetAAIStandardQueryGet.ofVolumeGroup("vSON_test", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet instanceGroup1 = PresetAAIStandardQueryGet.ofInstanceGroup("L3-NETWORK", "Ruby Figueroa", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet collection1 = + PresetAAIStandardQueryGet.ofCollectionResource("Assigned", + ImmutableMultimap.of("instance-group", instanceGroup1.getReqPath())); + + PresetAAIStandardQueryGet vnfPreset1 = + PresetAAIStandardQueryGet.ofVnf(randUuid(), + ImmutableMultimap.of("l3-network", l3NetworkPreset1.getReqPath(), "l3-network", l3NetworkPreset2.getReqPath())); + + PresetAAIStandardQueryGet vnfPreset2 = + PresetAAIStandardQueryGet.ofVnf(randUuid(), "d6557200-ecf2-4641-8094-5393ae3aae60","91415b44-753d-494c-926a-456a9172bbb9", + "\"in-maint\": true,", ImmutableMultimap.of("volume-group", volumeGroup1.getReqPath())); + + PresetAAIGetVfModulesByVnf vfModules2 = new PresetAAIGetVfModulesByVnf(vnfPreset2.getInstanceId()); + + final PresetAAIStandardQueryGet serviceInstance = + PresetAAIStandardQueryGet.ofServiceInstance("service-instance-id", "6e59c5de-f052-46fa-aa7e-2fca9d674c44", "d27e42cf-087e-4d31-88ac-6c4b7585f800", "global-customer-id", "service-instance-type", + ImmutableMultimap.<String, String>builder() + .putAll("l3-network", l3NetworkPreset3.getReqPath(), l3NetworkPreset4.getReqPath()) + .putAll("collection", collection1.getReqPath()) + .putAll("generic-vnf", vnfPreset1.getReqPath(), vnfPreset2.getReqPath()) + .build() + ); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, + l3NetworkPreset3, l3NetworkPreset4, vnfPreset1, vnfPreset2, collection1, + volumeGroup1, l3NetworkPreset1, l3NetworkPreset2, instanceGroup1, + vlanTag1, vfModules2, + new PresetAAIModelsByInvariantIdGet(ImmutableList.of("d27e42cf-087e-4d31-88ac-6c4b7585f800")), + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet(), + new PresetSDCGetServiceMetadataGet("6e59c5de-f052-46fa-aa7e-2fca9d674c44", "d27e42cf-087e-4d31-88ac-6c4b7585f800", "csar15782222_instantiationTypeMacroWithNetwork.zip"), + new PresetSDCGetServiceToscaModelGet("6e59c5de-f052-46fa-aa7e-2fca9d674c44", "csar15782222_instantiationTypeMacroWithNetwork.zip") + ), CLEAR_THEN_SET); + + String expected = TestUtils.convertRequest(objectMapper, "aaiGetInstanceTopology/ServiceTreeWithMultipleChildren_serviceInstance.json"); + expected = expected + .replace("SERVICE_INSTANCE_NAME", serviceInstance.getInstanceName()) + .replace("VNF1_INSTANCE_NAME", vnfPreset1.getInstanceName()) + .replace("VNF1_INSTANCE_ID", vnfPreset1.getInstanceId()) + .replace("VNF1_INSTANCE_TYPE", vnfPreset1.getInstanceType()) + .replace("VNF2_INSTANCE_NAME", vnfPreset2.getInstanceName()) + .replace("VNF2_INSTANCE_ID", vnfPreset2.getInstanceId()) + .replace("VNF2_INSTANCE_TYPE", vnfPreset2.getInstanceType()) + .replace("NETWORK1_INSTANCE_NAME", l3NetworkPreset1.getInstanceName()) + .replace("NETWORK1_INSTANCE_ID", l3NetworkPreset1.getInstanceId()) + .replace("NETWORK2_INSTANCE_NAME", l3NetworkPreset2.getInstanceName()) + .replace("NETWORK2_INSTANCE_ID", l3NetworkPreset2.getInstanceId()) + .replace("NETWORK3_INSTANCE_NAME", l3NetworkPreset3.getInstanceName()) + .replace("NETWORK3_INSTANCE_ID", l3NetworkPreset3.getInstanceId()) + .replace("NETWORK4_INSTANCE_NAME", l3NetworkPreset4.getInstanceName()) + .replace("NETWORK4_INSTANCE_ID", l3NetworkPreset4.getInstanceId()); + + String response = restTemplate.getForObject(buildUri(API_URL), String.class, "global-customer-id", "service-instance-type", "service-instance-id"); + + assertJsonEquals(response, expected); + } + + @Test + public void serviceWithVnfGotError_exceptionIsThrown() { + + PresetAAIStandardQueryGet vnfPreset = + PresetAAIStandardQueryGet.ofVnf(randUuid(), + ImmutableMultimap.of("l3-network", "/aai/v../I'm a wrong path")); + + final PresetAAIStandardQueryGet serviceInstance = + PresetAAIStandardQueryGet.ofServiceInstance("service-instance-id", "7a6ee536-f052-46fa-aa7e-2fca9d674c44", "service-instance-model-invariant-id", "global-customer-id", "service-instance-type", + ImmutableMultimap.<String, String>builder() + .putAll("generic-vnf", vnfPreset.getReqPath()) + .build() + ); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, + vnfPreset, + new PresetAAIModelsByInvariantIdGet(ImmutableList.of("service-instance-model-invariant-id")), + new PresetSDCGetServiceMetadataGet("7a6ee536-f052-46fa-aa7e-2fca9d674c44", "service-instance-model-invariant-id", "csar15782222_instantiationTypeMacroWithNetwork.zip"), + new PresetSDCGetServiceToscaModelGet("7a6ee536-f052-46fa-aa7e-2fca9d674c44", "csar15782222_instantiationTypeMacroWithNetwork.zip"), + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet() + ), CLEAR_THEN_SET); + + final ResponseEntity<String> response = restTemplateErrorAgnostic.getForEntity(buildUri(API_URL), String.class, "global-customer-id", "service-instance-type", "service-instance-id"); + assertThat(response.getBody(),containsString("AAI node fetching failed")); + assertThat(response.getStatusCode(), is(HttpStatus.INTERNAL_SERVER_ERROR)); + } + + @Test + public void serviceWithTwoVnfGroupsAndRelatedVnfs() { + PresetAAIStandardQueryGet relatedVnf1 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "7a6ee536-f052-46fa-aa7e-2fca9d674c44", + "", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet relatedVnf2 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "d6557200-ecf2-4641-8094-5393ae3aae60", + "", ImmutableMultimap.of()); + + PresetAAIStandardQueryGet relatedVnf3 = + PresetAAIStandardQueryGet.ofRelatedVnf(randUuid(), "d6557200-ecf2-4641-8094-5393ae3aae60", + "", ImmutableMultimap.of()); + + final PresetAAIStandardQueryGet vnfGroup1 = + PresetAAIStandardQueryGet.ofInstanceGroup("vnfGroup-type", "Teresa Bradley", + ImmutableMultimap.<String, String>builder() + .putAll("generic-vnf", relatedVnf1.getReqPath(), relatedVnf2.getReqPath(), relatedVnf3.getReqPath()) + .build() + ); + + final PresetAAIStandardQueryGet vnfGroup2 = + PresetAAIStandardQueryGet.ofInstanceGroup("vnfGroup-type", "Stanley Mccarthy", ImmutableMultimap.of()); + + final PresetAAIStandardQueryGet serviceInstance = + PresetAAIStandardQueryGet.ofServiceInstance("service-instance-id", "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "7ee41ce4-4827-44b0-a48e-2707a59905d2", "global-customer-id", "service-instance-type", + ImmutableMultimap.<String, String>builder() + .putAll("instance-group", vnfGroup1.getReqPath(),vnfGroup2.getReqPath()) + .build() + ); + + SimulatorApi.registerExpectationFromPresets(ImmutableList.of( + serviceInstance, + vnfGroup1,vnfGroup2, relatedVnf1, relatedVnf2, relatedVnf3, + new PresetAAIModelsByInvariantIdGet(ImmutableList.of("7ee41ce4-4827-44b0-a48e-2707a59905d2", "vnf-instance-model-invariant-id")), + new PresetGetSessionSlotCheckIntervalGet(), + new PresetAAIGetSubscribersGet(), + new PresetSDCGetServiceMetadataGet("4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "7ee41ce4-4827-44b0-a48e-2707a59905d2", "service-vnf-grouping-csar.zip"), + new PresetSDCGetServiceToscaModelGet("4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "service-vnf-grouping-csar.zip") + ), CLEAR_THEN_SET); + + String expected = TestUtils.convertRequest(objectMapper, "VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json"); + expected = expected + .replace("SERVICE_INSTANCE_NAME", serviceInstance.getInstanceName()) + .replace("VNF_GROUP1_INSTANCE_ID", vnfGroup1.getInstanceId()) + .replace("VNF_GROUP1_INSTANCE_NAME", vnfGroup1.getInstanceName()) + .replace("VNF_GROUP1_INSTANCE_TYPE", vnfGroup1.getInstanceType()) + .replace("VNF_GROUP1_INSTANCE_ROLE", vnfGroup1.getInstanceRole()) + + .replace("RELATED_VNF1_INSTANCE_ID", relatedVnf1.getInstanceId()) + .replace("RELATED_VNF1_INSTANCE_NAME", relatedVnf1.getInstanceName()) + .replace("RELATED_VNF1_INSTANCE_TYPE", relatedVnf1.getInstanceType()) + + .replace("RELATED_VNF2_INSTANCE_ID", relatedVnf2.getInstanceId()) + .replace("RELATED_VNF2_INSTANCE_NAME", relatedVnf2.getInstanceName()) + .replace("RELATED_VNF2_INSTANCE_TYPE", relatedVnf2.getInstanceType()) + + .replace("RELATED_VNF3_INSTANCE_ID", relatedVnf3.getInstanceId()) + .replace("RELATED_VNF3_INSTANCE_NAME", relatedVnf3.getInstanceName()) + .replace("RELATED_VNF3_INSTANCE_TYPE", relatedVnf3.getInstanceType()) + + .replace("VNF_GROUP2_INSTANCE_ID", vnfGroup2.getInstanceId()) + .replace("VNF_GROUP2_INSTANCE_NAME", vnfGroup2.getInstanceName()) + .replace("VNF_GROUP2_INSTANCE_TYPE", vnfGroup2.getInstanceType()) + .replace("VNF_GROUP2_INSTANCE_ROLE", vnfGroup2.getInstanceRole()); + + final String response = restTemplate.getForObject(buildUri(API_URL), String.class, "global-customer-id", "service-instance-type", "service-instance-id"); + + assertJsonEquals(response, expected); + } + + private String randUuid() { + return UUID.randomUUID().toString(); + } +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/TestUtils.java b/vid-automation/src/test/java/org/onap/vid/api/TestUtils.java deleted file mode 100644 index 76c122c48..000000000 --- a/vid-automation/src/test/java/org/onap/vid/api/TestUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.onap.vid.api; - -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.SerializationConfig; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.http.HttpStatus; - -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; -import java.io.File; -import java.io.IOException; -import java.util.Map; -import java.util.Scanner; - -/** - * Created by Oren on 6/7/17. - */ -public class TestUtils { - - protected static ObjectMapper objectMapper = new ObjectMapper(); - - public static void assertStatusOK(Object request, WebTarget webTarget, Response response) throws IOException { - assertHttpStatus(request, webTarget, response, HttpStatus.OK); - } - - public static void assertHttpStatus(Object request, WebTarget webTarget, Response response, HttpStatus exceptedHttpStatus) throws IOException { - objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); - - org.testng.Assert.assertEquals(response.getStatus(), exceptedHttpStatus.value(), - String.format("Failed post URI: %s with request %s. Got Status:%d and body: %s", - webTarget.getUri(), - objectMapper.writeValueAsString(request), - response.getStatus(), - objectMapper.writeValueAsString(response.getEntity()))); - } - - public static String convertRequest(ObjectMapper objectMapper, String msoRequestDetailsFileName) { - - ClassLoader cl = pProbeMsoApiTest.class.getClassLoader(); - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); - Resource[] resources; - try { - resources = resolver.getResources(msoRequestDetailsFileName); - String content; - File file = resources[0].getFile(); - content = new Scanner(file).useDelimiter("\\Z").next(); - objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); - return objectMapper.writeValueAsString(objectMapper.readValue(content, Object.class)); - } - catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static String getNestedPropertyInMap(Object item, String path) { - return getNestedPropertyInMap(item, path, String.class, "/"); - } - - public static <T> T getNestedPropertyInMap(Object item, String path, Class<T> valueType) { - return getNestedPropertyInMap(item, path, valueType, "/"); - } - - /* - Use this method to extract item from Map that represent Json hierarchy (Map<String,Map>) - */ - public static <T> T getNestedPropertyInMap(Object item, String path, Class<T> valueType, String delimeter) { - String[] pathes = path.split(delimeter); - return valueType.cast(getNestedPropertyInMap(item,pathes,0)); - } - - private static Object getNestedPropertyInMap(Object item, String[] pathes, int index) { - if (index==pathes.length) { - return item; - } - return getNestedPropertyInMap(((Map<String,Object>)item).get(pathes[index]), pathes, ++index); - } -} diff --git a/vid-automation/src/test/java/org/onap/vid/api/VersionControllerApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/VersionControllerApiTest.java new file mode 100644 index 000000000..4dc799193 --- /dev/null +++ b/vid-automation/src/test/java/org/onap/vid/api/VersionControllerApiTest.java @@ -0,0 +1,26 @@ +package org.onap.vid.api; + +import org.junit.Assert; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.Test; + +import java.util.HashMap; + +public class VersionControllerApiTest extends BaseApiTest { + + @Test + public void probeRequest_returnsResponseAsExpected() { + // without log-in + ResponseEntity<HashMap<String, String>> response = new RestTemplate().exchange( + uri + "/version", + org.springframework.http.HttpMethod.GET, + null, + new ParameterizedTypeReference<HashMap<String, String>>() { + }); + HashMap<String,String> versionResults = response.getBody(); + Assert.assertNotNull(versionResults.get("features")); + Assert.assertNotNull(versionResults.get("build")); + } +} diff --git a/vid-automation/src/test/java/org/onap/vid/api/VidConfigurationApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/VidConfigurationApiTest.java index 38ce8613d..ec479d900 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/VidConfigurationApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/VidConfigurationApiTest.java @@ -4,6 +4,7 @@ import org.springframework.http.ResponseEntity; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; diff --git a/vid-automation/src/test/java/org/onap/vid/api/pProbeAaiApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/pProbeAaiApiTest.java index 1765645af..db10fdc57 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/pProbeAaiApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/pProbeAaiApiTest.java @@ -1,6 +1,13 @@ package org.onap.vid.api; +import static vid.automation.test.services.SimulatorApi.RegistrationStrategy; +import static vid.automation.test.services.SimulatorApi.registerExpectation; + import com.google.common.collect.ImmutableMap; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.util.ArrayList; import org.apache.commons.text.StringEscapeUtils; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; @@ -9,14 +16,6 @@ import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; -import java.io.IOException; -import java.lang.reflect.Method; -import java.net.URISyntaxException; -import java.util.ArrayList; - -import static vid.automation.test.services.SimulatorApi.RegistrationStrategy; -import static vid.automation.test.services.SimulatorApi.registerExpectation; - public class pProbeAaiApiTest extends BaseApiAaiTest { @@ -36,7 +35,7 @@ public class pProbeAaiApiTest extends BaseApiAaiTest { //URIs private static final String GET_SERVICE_INSTANCE_PNFS = "aai_get_service_instance_pnfs/31739f3e-526b-11e6-beb8-9e71128cae77/AIM Transport/f36f5734-e9df-4fbf-9f35-61be13f028a1"; private static final String GET_SPECIFIC_PNF_URI = "aai_get_pnfs/pnf/DEAAI78"; - private static final String GET_PNF_BY_REGION = "aai_get_pnf_instances/e433710f-9217-458d-a79d-1c7aff376d89/VIRTUAL USP/8a84e59b-45fe-4851-8ff1-34225a0b32c3/83b458fd-5dd3-419b-a9e3-7335814a0911/AAIAIC25/Cisco/Nexus 3048-TP"; + private static final String GET_PNF_BY_REGION = "aai_get_pnf_instances/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/8a84e59b-45fe-4851-8ff1-34225a0b32c3/83b458fd-5dd3-419b-a9e3-7335814a0911/JANET25/Cisco/Nexus 3048-TP"; @@ -109,7 +108,7 @@ public class pProbeAaiApiTest extends BaseApiAaiTest { @Test public void testGetPnfDataByRegion() throws Exception { - String expected = "{\"results\":[{\"id\":\"901128280\",\"url\":\"/aai/v12/network/pnfs/pnf/AS-pnf2-10219--as988q\",\"properties\":{\"pnfName\":\"AS-pnf2-10219--as988q\",\"equipType\":\"Switch\",\"equipVendor\":\"Cisco\",\"equipModel\":\"Nexus3048-TP\",\"inMaint\":false,\"resourceVersion\":\"1508776538192\"},\"nodeType\":\"pnf\",\"relatedTo\":[{\"id\":\"532488360\",\"url\":\"/aai/v12/business/customers/customer/customer-10219-as988q/service-subscriptions/service-subscription/serviceSub2-test-10219-as988q/service-instances/service-instance/serviceIns2-test-10219-as988q\",\"nodeType\":\"service-instance\",\"relationshipLabel\":\"uses\"},{\"id\":\"860164248\",\"url\":\"/aai/v12/cloud-infrastructure/complexes/complex/complex-10219--as988q\",\"nodeType\":\"complex\",\"relationshipLabel\":\"locatedIn\"}]}],\"additionalProperties\":{}}"; + String expected = "{\"results\":[{\"id\":\"901128280\",\"url\":\"/aai/v12/network/pnfs/pnf/AS-pnf2-10219--as988q\",\"properties\":{\"pnfName\":\"AS-pnf2-10219--as988q\",\"equipType\":\"Switch\",\"equipVendor\":\"Cisco\",\"equipModel\":\"Nexus3048-TP\",\"inMaint\":false,\"resourceVersion\":\"1508776538192\"},\"nodeType\":\"pnf\",\"relatedTo\":[{\"id\":\"532488360\",\"url\":\"/aai/v12/business/customers/customer/customer-10219-as988q/service-subscriptions/service-subscription/serviceSub2-test-10219-as988q/service-instances/service-instance/serviceIns2-test-10219-as988q\",\"node-type\":\"service-instance\",\"relationship-label\":\"uses\"},{\"id\":\"860164248\",\"url\":\"/aai/v12/cloud-infrastructure/complexes/complex/complex-10219--as988q\",\"node-type\":\"complex\",\"relationship-label\":\"locatedIn\"}]}]}"; callAaiWithSimulatedErrorResponse(GET_PNF_BY_REGION_RESPONSE, ImmutableMap.of(), buildUri(GET_PNF_BY_REGION), "",200,expected, HttpMethod.GET); @@ -136,7 +135,7 @@ public class pProbeAaiApiTest extends BaseApiAaiTest { @Test public void testGetPnfDataByRegionNoResults() throws IOException, URISyntaxException { final String registratedResult = "{\"results\":[]}"; - final String expectedResult ="{\"results\":[],\"additionalProperties\":{}}"; + final String expectedResult ="{\"results\":[]}"; final int expectedResponseCode = 200; callAaiWithSimulatedErrorResponse(GET_PNF_BY_REGION_RESPONSE_EMPTY, ImmutableMap.of("500", Integer.toString(expectedResponseCode),"\"ERROR_PAYLOAD\"", StringEscapeUtils.escapeJson(registratedResult)), diff --git a/vid-automation/src/test/java/org/onap/vid/api/pProbeMsoApiTest.java b/vid-automation/src/test/java/org/onap/vid/api/pProbeMsoApiTest.java index c082ef95a..534dc6934 100644 --- a/vid-automation/src/test/java/org/onap/vid/api/pProbeMsoApiTest.java +++ b/vid-automation/src/test/java/org/onap/vid/api/pProbeMsoApiTest.java @@ -1,7 +1,11 @@ package org.onap.vid.api; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.apache.commons.text.StringEscapeUtils; +import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId; +import org.onap.simulator.presetGenerator.presets.mso.configuration.PresetMSOActOnConfiguration; +import org.onap.simulator.presetGenerator.presets.mso.configuration.PresetMSOCreateConfiguration; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.testng.annotations.Test; @@ -15,7 +19,7 @@ public class pProbeMsoApiTest extends BaseMsoApiTest{ private static final String MSO_REMOVE_RELATIONSHIP = "/mso/mso_remove_relationship/f36f5734-e9df-4fbf-9f35-61be13f028a1"; private static final String MSO_ADD_RELATIONSHIP = "/mso/mso_add_relationship/f36f5734-e9df-4fbf-9f35-61be13f028a1"; public static final String MSO_CREATE_CONFIGURATION = "mso/mso_create_configuration_instance/f36f5734-e9df-4fbf-9f35-61be13f028a1/configurations/"; - public static final String MSO_ACTIVATE_CONFIGURATION = "mso/mso_activate_configuration/f36f5734-e9df-4fbf-9f35-61be13f028a1/configurations/a53c9ca8-8986-44da-9e5e-9e4179e6c78a"; + public static final String MSO_ACTIVATE_CONFIGURATION = "mso/mso_activate_configuration/c187e9fe-40c3-4862-b73e-84ff056205f6/configurations/9533-config-LB1113"; @@ -24,15 +28,12 @@ public class pProbeMsoApiTest extends BaseMsoApiTest{ //Request Details private static final String CREATE_CONFIGURATION_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_create_configuration.json"; - + private static final String ACTIVATE_CONFIGURATION_REQUEST_DETAILS = "registration_to_simulator/body_jsons/mso_request_activate_configuration.json"; //Jsons private static final String DISSOCIATE_OK_JSON = "dissociate_pnf_from_service_instance.json"; private static final String DISSOCIATE_FAILED_JSON = "dissociate_pnf_from_service_instance_error.json"; private static final String ASSOCIATE_OK_JSON = "mso_add_relationships.json"; private static final String ASSOCIATE_FAILED_JSON = "mso_add_relationships_error.json"; - private static final String CREATE_CONFIGURATION_OK_JSON = "mso_create_configurations.json"; - private static final String CREATE_CONFIGURATION_FAILED_JSON = "mso_create_configurations_error.json"; - private static final String ACTIVATE_CONFIGURATION_OK_JSON = "mso_activate_configurations.json"; //Expected Responses private static final String EXPECTED_SUCCESS_MSO_RESPONSE = "{\"requestReferences\": {\"instanceId\": \"f36f5734-e9df-4fbf-9f35-61be13f028a1\", \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"}}"; @@ -73,25 +74,31 @@ public class pProbeMsoApiTest extends BaseMsoApiTest{ @Test public void testCreateConfigurationSucceed() throws Exception { String requestBody = TestUtils.convertRequest(objectMapper, CREATE_CONFIGURATION_REQUEST_DETAILS); - callMsoWithFineRequest(CREATE_CONFIGURATION_OK_JSON, ImmutableMap.of(), buildUri(MSO_CREATE_CONFIGURATION), - requestBody, HttpStatus.ACCEPTED.value(),EXPECTED_SUCCESS_MSO_RESPONSE , HttpMethod.POST); + callMsoWithFineRequest(ImmutableList.of( + new PresetMSOCreateConfiguration("f36f5734-e9df-4fbf-9f35-61be13f028a1"), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AAIAIC25_TO_ATT_AIC + ), + buildUri(MSO_CREATE_CONFIGURATION), requestBody, + HttpStatus.ACCEPTED.value(), EXPECTED_SUCCESS_MSO_RESPONSE, HttpMethod.POST); } @Test public void testActivateConfigurationSucceed() throws Exception { - String requestBody = "" + - "{" + - " \"val\": \"dummy payload\"" + - "}"; - callMsoWithFineRequest(ACTIVATE_CONFIGURATION_OK_JSON, ImmutableMap.of(), buildUri(MSO_ACTIVATE_CONFIGURATION), - requestBody, HttpStatus.ACCEPTED.value(),EXPECTED_SUCCESS_MSO_RESPONSE , HttpMethod.POST); + String requestBody = TestUtils.convertRequest(objectMapper, ACTIVATE_CONFIGURATION_REQUEST_DETAILS); + callMsoWithFineRequest(ImmutableList.of( + new PresetMSOActOnConfiguration("activate", "b6dc9806-b094-42f7-9386-a48de8218ce8", "f36f5734-e9df-4fbf-9f35-61be13f028a1"), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MDT1_TO_ATT_NC + ), + buildUri(MSO_ACTIVATE_CONFIGURATION), + requestBody, HttpStatus.ACCEPTED.value(), EXPECTED_SUCCESS_MSO_RESPONSE, HttpMethod.POST); } @Test(dataProvider = "errorCodes") public void testCreateConfigurationError(int errorCode) throws IOException, URISyntaxException { String requestBody = TestUtils.convertRequest(objectMapper, CREATE_CONFIGURATION_REQUEST_DETAILS); - callMsoWithSimulatedErrorResponse(CREATE_CONFIGURATION_FAILED_JSON, - ImmutableMap.of("\"<ERROR_CODE>\"", Integer.toString(errorCode),"\"<ERROR_PAYLOAD>\"", StringEscapeUtils.escapeJson(EXPECTED_ERROR_MSO_RESPONSE)), + callMsoWithSimulatedErrorResponse(ImmutableList.of( + new PresetMSOCreateConfiguration("f36f5734-e9df-4fbf-9f35-61be13f028a1", errorCode, EXPECTED_ERROR_MSO_RESPONSE), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AAIAIC25_TO_ATT_AIC), buildUri(MSO_CREATE_CONFIGURATION), requestBody,errorCode,EXPECTED_ERROR_MSO_RESPONSE,HttpMethod.POST); } @@ -99,8 +106,9 @@ public class pProbeMsoApiTest extends BaseMsoApiTest{ @Test public void testCreateConfigurationFail() throws Exception { String requestBody = "498/*ht5ru7 mjhnb"; - callMsoWithSimulatedErrorResponse(CREATE_CONFIGURATION_FAILED_JSON, - ImmutableMap.of("\"<ERROR_CODE>\"", 500), + callMsoWithSimulatedErrorResponse(ImmutableList.of( + new PresetMSOCreateConfiguration("f36f5734-e9df-4fbf-9f35-61be13f028a1", 500, EXPECTED_ERROR_MSO_RESPONSE), + PresetAAIGetCloudOwnersByCloudRegionId.PRESET_AAIAIC25_TO_ATT_AIC), buildUri(MSO_CREATE_CONFIGURATION), requestBody,500,EXPECTED_ERROR_MSO_RESPONSE,HttpMethod.POST); } |