2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.so.apihandlerinfra.infra.rest;
 
  23 import java.util.HashMap;
 
  24 import java.util.List;
 
  26 import java.util.Optional;
 
  27 import org.onap.aai.domain.yang.GenericVnf;
 
  28 import org.onap.aai.domain.yang.L3Network;
 
  29 import org.onap.aai.domain.yang.ServiceInstance;
 
  30 import org.onap.aai.domain.yang.VfModule;
 
  31 import org.onap.aai.domain.yang.VolumeGroup;
 
  32 import org.onap.aaiclient.client.aai.AAIObjectType;
 
  33 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper;
 
  34 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
 
  35 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 
  36 import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound;
 
  37 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
 
  38 import org.onap.so.constants.Status;
 
  39 import org.onap.so.db.request.beans.InfraActiveRequests;
 
  40 import org.onap.so.db.request.client.RequestsDbClient;
 
  41 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 
  42 import org.onap.so.serviceinstancebeans.ModelInfo;
 
  43 import org.onap.so.serviceinstancebeans.ModelType;
 
  44 import org.onap.so.serviceinstancebeans.RequestDetails;
 
  45 import org.onap.so.serviceinstancebeans.RequestInfo;
 
  46 import org.onap.so.serviceinstancebeans.RequestParameters;
 
  47 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 
  48 import org.slf4j.Logger;
 
  49 import org.slf4j.LoggerFactory;
 
  51 import org.springframework.beans.factory.annotation.Autowired;
 
  52 import org.springframework.stereotype.Component;
 
  53 import com.fasterxml.jackson.databind.ObjectMapper;
 
  56 public class BpmnRequestBuilder {
 
  58     private static final String CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND = "Cloud Configuration could not be found";
 
  60     private static final String GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID =
 
  61             "Generic Vnf Not Found In Inventory, VnfId: ";
 
  63     private static final String VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID = "VF Module Not Found In Inventory, VnfId: ";
 
  65     private static final Logger logger = LoggerFactory.getLogger(BpmnRequestBuilder.class);
 
  68     private RequestsDbClient infraActiveRequestsClient;
 
  71     private AAIDataRetrieval aaiDataRet;
 
  73     private ObjectMapper mapper = new ObjectMapper();
 
  76     public ServiceInstancesRequest buildVFModuleDeleteRequest(String vnfId, String vfModuleId, ModelType modelType)
 
  77             throws AAIEntityNotFound {
 
  78         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
  80             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
  82         VfModule vfModule = aaiDataRet.getAAIVfModule(vnfId, vfModuleId);
 
  83         if (vfModule == null) {
 
  84             throw new AAIEntityNotFound(VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " vfModuleId: " + vfModuleId);
 
  86         return createServiceInstancesRequest(vnf, vfModule, modelType);
 
  89     public CloudConfiguration getCloudConfigurationVfModuleReplace(String vnfId, String vfModuleId)
 
  90             throws AAIEntityNotFound {
 
  91         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
  93             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
  96         return mapCloudConfiguration(vnf, vfModuleId);
 
  99     public ServiceInstancesRequest buildVolumeGroupDeleteRequest(String vnfId, String volumeGroupId)
 
 100             throws AAIEntityNotFound {
 
 101         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
 103             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
 105         VolumeGroup volumeGroup = aaiDataRet.getVolumeGroup(vnfId, volumeGroupId);
 
 106         if (volumeGroup == null) {
 
 107             throw new AAIEntityNotFound(
 
 108                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
 
 110         return createServiceInstancesRequest(vnf, volumeGroup);
 
 113     public ServiceInstancesRequest buildServiceDeleteRequest(String serviceInstanceId) throws AAIEntityNotFound {
 
 114         ServiceInstance serviceInstance = aaiDataRet.getServiceInstance(serviceInstanceId);
 
 115         if (serviceInstance == null) {
 
 116             throw new AAIEntityNotFound(
 
 117                     "ServiceInstance Not Found In Inventory, ServiceInstanceId: " + serviceInstanceId);
 
 119         return createServiceInstancesRequest(serviceInstance);
 
 122     public ServiceInstancesRequest buildVnfDeleteRequest(String vnfId) throws AAIEntityNotFound {
 
 123         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
 125             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
 127         return createServiceInstancesRequest(vnf);
 
 130     public ServiceInstancesRequest buildNetworkDeleteRequest(String networkId) throws AAIEntityNotFound {
 
 131         L3Network network = aaiDataRet.getNetwork(networkId);
 
 132         if (network == null) {
 
 133             throw new AAIEntityNotFound("Network Not Found In Inventory, NetworkId: " + networkId);
 
 135         return createServiceInstancesRequest(network);
 
 138     protected ServiceInstancesRequest createServiceInstancesRequest(ServiceInstance serviceInstance) {
 
 139         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 140         RequestDetails requestDetails = mapServiceRequestDetails(serviceInstance);
 
 141         request.setRequestDetails(requestDetails);
 
 145     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf) {
 
 146         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 147         RequestDetails requestDetails = mapVnfRequestDetails(vnf);
 
 148         request.setRequestDetails(requestDetails);
 
 152     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VfModule vfModule,
 
 153             ModelType modelType) {
 
 154         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 155         RequestDetails requestDetails = mapRequestDetails(vnf, vfModule, modelType);
 
 156         request.setRequestDetails(requestDetails);
 
 160     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 161         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 162         RequestDetails requestDetails = mapRequestDetails(vnf, volumeGroup);
 
 163         request.setRequestDetails(requestDetails);
 
 167     protected ServiceInstancesRequest createServiceInstancesRequest(L3Network network) {
 
 168         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 169         RequestDetails requestDetails = mapNetworkRequestDetails(network);
 
 170         request.setRequestDetails(requestDetails);
 
 174     protected RequestDetails mapRequestDetails(GenericVnf vnf, VfModule vfModule, ModelType modelType) {
 
 175         RequestDetails requestDetails = new RequestDetails();
 
 176         requestDetails.setRequestInfo(createRequestInfo());
 
 177         if (vfModule.getVfModuleName() != null) {
 
 178             requestDetails.getRequestInfo().setInstanceName(vfModule.getVfModuleName());
 
 180         requestDetails.setModelInfo(mapVfModuleModelInformation(vfModule, modelType));
 
 182         requestDetails.setCloudConfiguration(mapCloudConfiguration(vnf, vfModule.getVfModuleId()));
 
 183         requestDetails.setRequestParameters(createRequestParameters());
 
 184         return requestDetails;
 
 187     protected RequestDetails mapRequestDetails(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 188         RequestDetails requestDetails = new RequestDetails();
 
 189         requestDetails.setRequestInfo(createRequestInfo());
 
 190         if (volumeGroup.getVolumeGroupName() != null) {
 
 191             requestDetails.getRequestInfo().setInstanceName(volumeGroup.getVolumeGroupName());
 
 193         requestDetails.setModelInfo(mapVolumeGroupModelInformation(volumeGroup));
 
 194         requestDetails.setCloudConfiguration(mapCloudConfigurationVolume(vnf, volumeGroup));
 
 195         requestDetails.setRequestParameters(createRequestParameters());
 
 196         return requestDetails;
 
 199     protected RequestDetails mapVnfRequestDetails(GenericVnf vnf) {
 
 200         RequestDetails requestDetails = new RequestDetails();
 
 201         requestDetails.setRequestInfo(createRequestInfo());
 
 202         if (vnf.getVnfName() != null) {
 
 203             requestDetails.getRequestInfo().setInstanceName(vnf.getVnfName());
 
 205         requestDetails.setModelInfo(mapVnfModelInformation(vnf));
 
 206         requestDetails.setRequestParameters(createRequestParameters());
 
 207         return requestDetails;
 
 210     protected RequestDetails mapServiceRequestDetails(ServiceInstance serviceInstance) {
 
 211         RequestDetails requestDetails = new RequestDetails();
 
 212         requestDetails.setRequestInfo(createRequestInfo());
 
 213         if (serviceInstance.getServiceInstanceName() != null) {
 
 214             requestDetails.getRequestInfo().setInstanceName(serviceInstance.getServiceInstanceName());
 
 216         requestDetails.setModelInfo(mapServiceModelInformation(serviceInstance));
 
 217         requestDetails.setRequestParameters(createRequestParameters());
 
 218         return requestDetails;
 
 221     protected RequestDetails mapNetworkRequestDetails(L3Network network) {
 
 222         RequestDetails requestDetails = new RequestDetails();
 
 223         requestDetails.setRequestInfo(createRequestInfo());
 
 224         if (network.getNetworkName() != null) {
 
 225             requestDetails.getRequestInfo().setInstanceName(network.getNetworkName());
 
 227         requestDetails.setCloudConfiguration(mapCloudConfigurationNetwork(network));
 
 228         requestDetails.setModelInfo(mapNetworkModelInformation(network));
 
 229         requestDetails.setRequestParameters(createRequestParameters());
 
 230         return requestDetails;
 
 233     protected ModelInfo mapVfModuleModelInformation(VfModule vfModule, ModelType modelType) {
 
 234         ModelInfo modelInfo = new ModelInfo();
 
 235         modelInfo.setModelCustomizationId(vfModule.getModelCustomizationId());
 
 236         modelInfo.setModelCustomizationUuid(vfModule.getModelCustomizationId());
 
 237         modelInfo.setModelType(modelType);
 
 241     protected ModelInfo mapVolumeGroupModelInformation(VolumeGroup volumeGroup) {
 
 242         ModelInfo modelInfo = new ModelInfo();
 
 243         modelInfo.setModelCustomizationId(volumeGroup.getModelCustomizationId());
 
 244         modelInfo.setModelCustomizationUuid(volumeGroup.getModelCustomizationId());
 
 245         modelInfo.setModelType(ModelType.volumeGroup);
 
 249     protected ModelInfo mapServiceModelInformation(ServiceInstance serviceInstance) {
 
 250         ModelInfo modelInfo = new ModelInfo();
 
 251         modelInfo.setModelVersionId(serviceInstance.getModelVersionId());
 
 252         modelInfo.setModelType(ModelType.service);
 
 256     protected ModelInfo mapVnfModelInformation(GenericVnf vnf) {
 
 257         ModelInfo modelInfo = new ModelInfo();
 
 258         modelInfo.setModelCustomizationId(vnf.getModelCustomizationId());
 
 259         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
 
 260         modelInfo.setModelType(ModelType.vnf);
 
 264     protected ModelInfo mapNetworkModelInformation(L3Network network) {
 
 265         ModelInfo modelInfo = new ModelInfo();
 
 266         modelInfo.setModelType(ModelType.network);
 
 267         modelInfo.setModelCustomizationId(network.getModelCustomizationId());
 
 268         modelInfo.setModelCustomizationUuid(network.getModelCustomizationId());
 
 272     public CloudConfiguration mapCloudConfiguration(GenericVnf vnf, String vfModuleId) {
 
 273         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 274         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
 
 275         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
 
 276         String tenantId = null;
 
 277         String cloudOwner = null;
 
 278         String lcpRegionId = null;
 
 279         if (relationshipsOpt.isPresent()) {
 
 280             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
 
 281                     .map(item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.TENANT.getUriParams().tenantId))
 
 283             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 284                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudOwner))
 
 286             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 287                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudRegionId))
 
 291         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
 
 292             Map<String, String[]> filters = createQueryRequest("vfModuleId", vfModuleId);
 
 293             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 294             if (request.isPresent()) {
 
 295                 if (request.get().getRequestDetails() != null
 
 296                         && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 297                     if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 298                         tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 300                     if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 301                         cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 303                     if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 304                         lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 308                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 311         cloudConfig.setTenantId(tenantId);
 
 312         cloudConfig.setCloudOwner(cloudOwner);
 
 313         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 317     public CloudConfiguration mapCloudConfigurationVolume(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 318         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 319         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
 
 320         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
 
 321         String tenantId = null;
 
 322         String cloudOwner = null;
 
 323         String lcpRegionId = null;
 
 324         if (relationshipsOpt.isPresent()) {
 
 325             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
 
 326                     .map(item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.TENANT.getUriParams().tenantId))
 
 328             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 329                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudOwner))
 
 331             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 332                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudRegionId))
 
 336         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
 
 337             Map<String, String[]> filters = createQueryRequest("volumeGroupId", volumeGroup.getVolumeGroupId());
 
 338             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 339             if (request.isPresent()) {
 
 340                 tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 341                 cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 342                 lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 344                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 347         cloudConfig.setTenantId(tenantId);
 
 348         cloudConfig.setCloudOwner(cloudOwner);
 
 349         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 353     public CloudConfiguration mapCloudConfigurationNetwork(L3Network network) {
 
 354         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 355         String tenantId = null;
 
 356         String cloudOwner = null;
 
 357         String lcpRegionId = null;
 
 359         Map<String, String[]> filters = createQueryRequest("networkId", network.getNetworkId());
 
 360         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 361         if (request.isPresent()) {
 
 362             if (request.get().getRequestDetails() != null
 
 363                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 364                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 365                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 367                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 368                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 370                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 371                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 375             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 378         cloudConfig.setTenantId(tenantId);
 
 379         cloudConfig.setCloudOwner(cloudOwner);
 
 380         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 384     public CloudConfiguration mapCloudConfigurationVnf(String vnfId) {
 
 385         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 386         String tenantId = null;
 
 387         String cloudOwner = null;
 
 388         String lcpRegionId = null;
 
 390         Map<String, String[]> filters = createQueryRequest("vnfId", vnfId);
 
 391         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 392         if (request.isPresent()) {
 
 393             if (request.get().getRequestDetails() != null
 
 394                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 395                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 396                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 398                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 399                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 401                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 402                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 406             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 408         cloudConfig.setTenantId(tenantId);
 
 409         cloudConfig.setCloudOwner(cloudOwner);
 
 410         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 414     public Optional<ServiceInstancesRequest> findServiceInstanceRequest(Map<String, String[]> filters) {
 
 415         List<InfraActiveRequests> completeRequests = infraActiveRequestsClient.getRequest(filters);
 
 416         InfraActiveRequests foundRequest = completeRequests.get(0);
 
 417         ServiceInstancesRequest siRequest;
 
 419             siRequest = mapper.readValue(foundRequest.getRequestBody(), ServiceInstancesRequest.class);
 
 420             return Optional.of(siRequest);
 
 421         } catch (Exception e) {
 
 422             logger.error("Could not read Create Instance Request", e);
 
 424         return Optional.empty();
 
 427     public Map<String, String[]> createQueryRequest(String name, String instanceId) {
 
 428         Map<String, String[]> filters = new HashMap<>();
 
 429         filters.put(name, new String[] {"EQ", instanceId});
 
 430         filters.put("requestStatus", new String[] {"EQ", Status.COMPLETE.toString()});
 
 431         filters.put("action", new String[] {"EQ", "createInstance"});
 
 435     public RequestInfo createRequestInfo() {
 
 436         RequestInfo requestInfo = new RequestInfo();
 
 437         requestInfo.setSuppressRollback(false);
 
 438         requestInfo.setSource(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
 
 439         requestInfo.setRequestorId(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
 
 443     public RequestParameters createRequestParameters() {
 
 444         RequestParameters requestParams = new RequestParameters();
 
 445         requestParams.setaLaCarte(true);
 
 446         requestParams.setTestApi("GR_API");
 
 447         return requestParams;