From 088deea64dd65f9de66a38df32e459518983ccbf Mon Sep 17 00:00:00 2001 From: "Kuleshov, Elena" Date: Fri, 21 Feb 2020 10:24:39 -0500 Subject: mso to add tenant name and product family name to Add productFamilyName and tenantName to requests DB and request status results. Add more JUnits, fix JUnit schema files. Robot test adjustments to create service object in AAI when needed. Update robot tests to verify presence of productFamilyName and tenantName in return data. Add missing return of retrieved productFamilyName in robot test Add checking of tenantName on return to another robot test. Update archiving of infra requests for tenantName and productFamilyName. Issue-ID: SO-2674 Signed-off-by: Benjamin, Max (mb388a) Change-Id: I2950b7783ee863dc59360c6124f38bee89cb2140 --- .../org/onap/so/apihandlerinfra/MsoRequest.java | 54 +++++++++++++++++++++- .../so/apihandlerinfra/OrchestrationRequests.java | 7 +++ .../infra/rest/AAIDataRetrieval.java | 21 ++++++++- .../onap/so/apihandlerinfra/MsoRequestTest.java | 51 ++++++++++++++++++++ .../so/apihandlerinfra/ServiceInstancesTest.java | 20 ++++++++ .../test/resources/__files/aai/ServiceFromAAI.json | 4 ++ .../src/test/resources/schema.sql | 2 + 7 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json (limited to 'mso-api-handlers/mso-api-handler-infra/src') diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java index 31e026b332..ce371203ab 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java @@ -42,7 +42,11 @@ import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aai.domain.yang.Tenant; import org.onap.so.apihandler.common.ResponseBuilder; +import org.onap.so.apihandlerinfra.infra.rest.AAIDataRetrieval; import org.onap.so.apihandlerinfra.tasksbeans.TasksRequest; import org.onap.so.apihandlerinfra.validation.ApplyUpdatedConfigValidation; import org.onap.so.apihandlerinfra.validation.CloudConfigurationValidation; @@ -97,7 +101,6 @@ import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; - @Component public class MsoRequest { @@ -107,6 +110,9 @@ public class MsoRequest { @Autowired private ResponseBuilder builder; + @Autowired + private AAIDataRetrieval aaiDataRet; + @Value("${mso.enforceDLP:false}") private boolean enforceDLP; @@ -316,6 +322,25 @@ public class MsoRequest { aq.setPnfName(servInsReq.getPnfName()); } + if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getRequestInfo() != null + && servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId() != null) { + logger.debug("Retrieving productFamilyName to put into requests db"); + + org.onap.aai.domain.yang.Service service = + aaiDataRet.getService(servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId()); + if (service != null) { + logger.debug("Found service by service-id"); + String productFamilyName = service.getServiceDescription(); + if (productFamilyName != null) { + aq.setProductFamilyName(productFamilyName); + } + } + } + + aq.setProductFamilyName(getProductFamilyNameFromAAI(servInsReq)); + + aq.setTenantName(getTenantNameFromAAI(servInsReq)); + if (ModelType.service.name().equalsIgnoreCase(requestScope)) { if (servInsReq.getRequestDetails().getRequestInfo() != null) { if (servInsReq.getRequestDetails().getRequestInfo().getInstanceName() != null) { @@ -683,4 +708,31 @@ public class MsoRequest { return vnfType; } + protected String getTenantNameFromAAI(ServiceInstancesRequest servInsReq) { + String tenantName = null; + if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getCloudConfiguration() != null + && servInsReq.getRequestDetails().getCloudConfiguration().getTenantId() != null) { + Tenant tenant = aaiDataRet.getTenant(servInsReq.getRequestDetails().getCloudConfiguration().getCloudOwner(), + servInsReq.getRequestDetails().getCloudConfiguration().getLcpCloudRegionId(), + servInsReq.getRequestDetails().getCloudConfiguration().getTenantId()); + if (tenant != null) { + tenantName = tenant.getTenantName(); + } + } + return tenantName; + } + + protected String getProductFamilyNameFromAAI(ServiceInstancesRequest servInsReq) { + String productFamilyName = null; + if (servInsReq.getRequestDetails() != null && servInsReq.getRequestDetails().getRequestInfo() != null + && servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId() != null) { + org.onap.aai.domain.yang.Service service = + aaiDataRet.getService(servInsReq.getRequestDetails().getRequestInfo().getProductFamilyId()); + if (service != null) { + productFamilyName = service.getServiceDescription(); + } + } + return productFamilyName; + } + } diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java index ae68cc6032..fec93f72e4 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/OrchestrationRequests.java @@ -347,6 +347,13 @@ public class OrchestrationRequests { } else { requestDetails = mapper.readValue(requestBody, RequestDetails.class); } + if (requestDetails.getRequestInfo() != null && iar.getProductFamilyName() != null) { + requestDetails.getRequestInfo().setProductFamilyName(iar.getProductFamilyName()); + } + if (requestDetails.getCloudConfiguration() != null && iar.getTenantName() != null) { + requestDetails.getCloudConfiguration().setTenantName(iar.getTenantName()); + } + } catch (IOException e) { logger.error("Exception occurred", e); ErrorLoggerInfo errorLoggerInfo = diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java index 344e5438c9..fee7a3a8f4 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/infra/rest/AAIDataRetrieval.java @@ -3,7 +3,9 @@ package org.onap.so.apihandlerinfra.infra.rest; import java.util.Optional; import org.onap.aai.domain.yang.GenericVnf; import org.onap.aai.domain.yang.L3Network; +import org.onap.aai.domain.yang.Service; import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aai.domain.yang.Tenant; import org.onap.aai.domain.yang.VfModule; import org.onap.aai.domain.yang.VolumeGroup; import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound; @@ -34,7 +36,6 @@ public class AAIDataRetrieval { }); } - public VfModule getAAIVfModule(String vnfId, String vfModuleId) { return this.getAaiResourcesClient() .get(VfModule.class, AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId)) @@ -75,6 +76,24 @@ public class AAIDataRetrieval { }); } + public Service getService(String serviceId) { + return this.getAaiResourcesClient() + .get(Service.class, AAIUriFactory.createResourceUri(AAIObjectType.SERVICE, serviceId)).orElseGet(() -> { + logger.debug("No Service found in A&AI ServiceId: {}", serviceId); + return null; + }); + } + + public Tenant getTenant(String cloudOwner, String cloudRegion, String tenantId) { + return this.getAaiResourcesClient() + .get(Tenant.class, + AAIUriFactory.createResourceUri(AAIObjectType.TENANT, cloudOwner, cloudRegion, tenantId)) + .orElseGet(() -> { + logger.debug("No Tenant found in A&AI TenantId: {}", tenantId); + return null; + }); + } + protected AAIResourcesClient getAaiResourcesClient() { if (aaiResourcesClient == null) { aaiResourcesClient = new AAIResourcesClient(); diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java index f1d5a5487f..d1e5dc717e 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java +++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/MsoRequestTest.java @@ -22,6 +22,7 @@ package org.onap.so.apihandlerinfra; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.doReturn; import java.io.IOException; import java.io.StringReader; import java.nio.file.Files; @@ -34,12 +35,19 @@ import javax.ws.rs.core.Response; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.HttpStatus; +import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.onap.aai.domain.yang.Service; +import org.onap.aai.domain.yang.Tenant; import org.onap.so.apihandler.common.ErrorNumbers; +import org.onap.so.apihandlerinfra.infra.rest.AAIDataRetrieval; import org.onap.so.exceptions.ValidationException; import org.onap.so.serviceinstancebeans.ServiceInstancesRequest; import org.springframework.test.context.junit4.rules.SpringClassRule; @@ -75,6 +83,17 @@ public class MsoRequestTest extends BaseTest { @Rule public ExpectedException thrown = ExpectedException.none(); + @Mock + private AAIDataRetrieval aaiDataRet; + + @InjectMocks + private MsoRequest msoRequestMock; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + public String inputStream(String JsonInput) throws IOException { JsonInput = "src/test/resources/MsoRequestTest" + JsonInput; String input = new String(Files.readAllBytes(Paths.get(JsonInput))); @@ -1056,5 +1075,37 @@ public class MsoRequestTest extends BaseTest { assertNotNull(result); } + @Test + public void getTenantNameFromAAITest() throws Exception { + this.sir = mapper.readValue(inputStream("/SuccessfulValidation/ServiceAssign.json"), + ServiceInstancesRequest.class); + String tenantId = "88a6ca3ee0394ade9403f075db23167e"; + String tenantNameFromAAI = "testTenantName"; + String cloudRegion = "mdt1"; + String cloudOwner = "cloudOwner"; + this.sir.getRequestDetails().getCloudConfiguration().setCloudOwner(cloudOwner); + Tenant tenant = new Tenant(); + tenant.setTenantId(tenantId); + tenant.setTenantName(tenantNameFromAAI); + doReturn(tenant).when(aaiDataRet).getTenant(cloudOwner, cloudRegion, tenantId); + String tenantName = msoRequestMock.getTenantNameFromAAI(this.sir); + assertEquals(tenantNameFromAAI, tenantName); + } + + + @Test + public void getProductFamilyNameFromAAITest() throws Exception { + this.sir = mapper.readValue(inputStream("/SuccessfulValidation/ServiceAssign.json"), + ServiceInstancesRequest.class); + String serviceId = "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb"; + String serviceDescription = "testServiceDescription"; + Service service = new Service(); + service.setServiceId(serviceId); + service.setServiceDescription(serviceDescription); + doReturn(service).when(aaiDataRet).getService(serviceId); + String productFamilyName = msoRequestMock.getProductFamilyNameFromAAI(this.sir); + assertEquals(serviceDescription, productFamilyName); + } + } diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java index f566628ee3..1332ffd913 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java +++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java @@ -441,6 +441,10 @@ public class ServiceInstancesTest extends BaseTest { .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*")) + .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service/search/.*")) .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); @@ -483,6 +487,10 @@ public class ServiceInstancesTest extends BaseTest { .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*")) + .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service/search/.*")) .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); @@ -524,6 +532,10 @@ public class ServiceInstancesTest extends BaseTest { .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*")) + .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service/search/.*")) .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); @@ -1939,6 +1951,10 @@ public class ServiceInstancesTest extends BaseTest { .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*")) + .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/serviceRecipe/search.*")) .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(serviceRecipe)).withStatus(HttpStatus.SC_OK))); @@ -2114,6 +2130,10 @@ public class ServiceInstancesTest extends BaseTest { .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(defaultService)).withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/service-design-and-creation/services/service/.*")) + .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .withBodyFile("/aai/ServiceFromAAI.json").withStatus(HttpStatus.SC_OK))); + wireMockServer.stubFor(get(urlMatching(".*/serviceRecipe/search.*")) .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .withBody(mapper.writeValueAsString(serviceRecipe)).withStatus(HttpStatus.SC_OK))); diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json new file mode 100644 index 0000000000..f0d511789f --- /dev/null +++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/__files/aai/ServiceFromAAI.json @@ -0,0 +1,4 @@ +{ + "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "service-description": "testServiceDescription" +} \ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql b/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql index 1a1e9bec79..85a17dd369 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql +++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/schema.sql @@ -1297,6 +1297,8 @@ CREATE TABLE `infra_active_requests` ( `ORIGINAL_REQUEST_ID` varchar(45) DEFAULT NULL, `EXT_SYSTEM_ERROR_SOURCE` varchar(80) DEFAULT NULL, `ROLLBACK_EXT_SYSTEM_ERROR_SOURCE` varchar(80) DEFAULT NULL, + `TENANT_NAME` varchar(200) DEFAULT NULL, + `PRODUCT_FAMILY_NAME` varchar(200) DEFAULT NULL, PRIMARY KEY (`REQUEST_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- cgit 1.2.3-korg