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.logger.HttpHeadersConstants;
 
  42 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 
  43 import org.onap.so.serviceinstancebeans.ModelInfo;
 
  44 import org.onap.so.serviceinstancebeans.ModelType;
 
  45 import org.onap.so.serviceinstancebeans.RequestDetails;
 
  46 import org.onap.so.serviceinstancebeans.RequestInfo;
 
  47 import org.onap.so.serviceinstancebeans.RequestParameters;
 
  48 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 
  49 import org.slf4j.Logger;
 
  50 import org.slf4j.LoggerFactory;
 
  52 import org.springframework.beans.factory.annotation.Autowired;
 
  53 import org.springframework.stereotype.Component;
 
  54 import com.fasterxml.jackson.databind.ObjectMapper;
 
  57 public class BpmnRequestBuilder {
 
  59     private static final String CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND = "Cloud Configuration could not be found";
 
  61     private static final String GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID =
 
  62             "Generic Vnf Not Found In Inventory, VnfId: ";
 
  64     private static final String VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID = "VF Module Not Found In Inventory, VnfId: ";
 
  66     private static final Logger logger = LoggerFactory.getLogger(BpmnRequestBuilder.class);
 
  69     private RequestsDbClient infraActiveRequestsClient;
 
  72     private AAIDataRetrieval aaiDataRet;
 
  74     private ObjectMapper mapper = new ObjectMapper();
 
  77     public ServiceInstancesRequest buildVFModuleDeleteRequest(String vnfId, String vfModuleId, ModelType modelType)
 
  78             throws AAIEntityNotFound {
 
  79         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
  81             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
  83         VfModule vfModule = aaiDataRet.getAAIVfModule(vnfId, vfModuleId);
 
  84         if (vfModule == null) {
 
  85             throw new AAIEntityNotFound(VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " vfModuleId: " + vfModuleId);
 
  87         return createServiceInstancesRequest(vnf, vfModule, modelType);
 
  90     public CloudConfiguration getCloudConfigurationVfModuleReplace(String vnfId, String vfModuleId)
 
  91             throws AAIEntityNotFound {
 
  92         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
  94             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
  97         return mapCloudConfiguration(vnf, vfModuleId);
 
 100     public ServiceInstancesRequest buildVolumeGroupDeleteRequest(String vnfId, String volumeGroupId)
 
 101             throws AAIEntityNotFound {
 
 102         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
 104             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
 106         VolumeGroup volumeGroup = aaiDataRet.getVolumeGroup(vnfId, volumeGroupId);
 
 107         if (volumeGroup == null) {
 
 108             throw new AAIEntityNotFound(
 
 109                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
 
 111         return createServiceInstancesRequest(vnf, volumeGroup);
 
 114     public ServiceInstancesRequest buildServiceDeleteRequest(String serviceInstanceId) throws AAIEntityNotFound {
 
 115         ServiceInstance serviceInstance = aaiDataRet.getServiceInstance(serviceInstanceId);
 
 116         if (serviceInstance == null) {
 
 117             throw new AAIEntityNotFound(
 
 118                     "ServiceInstance Not Found In Inventory, ServiceInstanceId: " + serviceInstanceId);
 
 120         return createServiceInstancesRequest(serviceInstance);
 
 123     public ServiceInstancesRequest buildVnfDeleteRequest(String vnfId) throws AAIEntityNotFound {
 
 124         GenericVnf vnf = aaiDataRet.getGenericVnf(vnfId);
 
 126             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
 
 128         return createServiceInstancesRequest(vnf);
 
 131     public ServiceInstancesRequest buildNetworkDeleteRequest(String networkId) throws AAIEntityNotFound {
 
 132         L3Network network = aaiDataRet.getNetwork(networkId);
 
 133         if (network == null) {
 
 134             throw new AAIEntityNotFound("Network Not Found In Inventory, NetworkId: " + networkId);
 
 136         return createServiceInstancesRequest(network);
 
 139     protected ServiceInstancesRequest createServiceInstancesRequest(ServiceInstance serviceInstance) {
 
 140         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 141         RequestDetails requestDetails = mapServiceRequestDetails(serviceInstance);
 
 142         request.setRequestDetails(requestDetails);
 
 146     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf) {
 
 147         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 148         RequestDetails requestDetails = mapVnfRequestDetails(vnf);
 
 149         request.setRequestDetails(requestDetails);
 
 153     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VfModule vfModule,
 
 154             ModelType modelType) {
 
 155         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 156         RequestDetails requestDetails = mapRequestDetails(vnf, vfModule, modelType);
 
 157         request.setRequestDetails(requestDetails);
 
 161     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 162         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 163         RequestDetails requestDetails = mapRequestDetails(vnf, volumeGroup);
 
 164         request.setRequestDetails(requestDetails);
 
 168     protected ServiceInstancesRequest createServiceInstancesRequest(L3Network network) {
 
 169         ServiceInstancesRequest request = new ServiceInstancesRequest();
 
 170         RequestDetails requestDetails = mapNetworkRequestDetails(network);
 
 171         request.setRequestDetails(requestDetails);
 
 175     protected RequestDetails mapRequestDetails(GenericVnf vnf, VfModule vfModule, ModelType modelType) {
 
 176         RequestDetails requestDetails = new RequestDetails();
 
 177         requestDetails.setRequestInfo(createRequestInfo());
 
 178         if (vfModule.getVfModuleName() != null) {
 
 179             requestDetails.getRequestInfo().setInstanceName(vfModule.getVfModuleName());
 
 181         requestDetails.setModelInfo(mapVfModuleModelInformation(vfModule, modelType));
 
 183         requestDetails.setCloudConfiguration(mapCloudConfiguration(vnf, vfModule.getVfModuleId()));
 
 184         requestDetails.setRequestParameters(createRequestParameters());
 
 185         return requestDetails;
 
 188     protected RequestDetails mapRequestDetails(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 189         RequestDetails requestDetails = new RequestDetails();
 
 190         requestDetails.setRequestInfo(createRequestInfo());
 
 191         if (volumeGroup.getVolumeGroupName() != null) {
 
 192             requestDetails.getRequestInfo().setInstanceName(volumeGroup.getVolumeGroupName());
 
 194         requestDetails.setModelInfo(mapVolumeGroupModelInformation(volumeGroup));
 
 195         requestDetails.setCloudConfiguration(mapCloudConfigurationVolume(vnf, volumeGroup));
 
 196         requestDetails.setRequestParameters(createRequestParameters());
 
 197         return requestDetails;
 
 200     protected RequestDetails mapVnfRequestDetails(GenericVnf vnf) {
 
 201         RequestDetails requestDetails = new RequestDetails();
 
 202         requestDetails.setRequestInfo(createRequestInfo());
 
 203         if (vnf.getVnfName() != null) {
 
 204             requestDetails.getRequestInfo().setInstanceName(vnf.getVnfName());
 
 206         requestDetails.setModelInfo(mapVnfModelInformation(vnf));
 
 207         requestDetails.setRequestParameters(createRequestParameters());
 
 208         return requestDetails;
 
 211     protected RequestDetails mapServiceRequestDetails(ServiceInstance serviceInstance) {
 
 212         RequestDetails requestDetails = new RequestDetails();
 
 213         requestDetails.setRequestInfo(createRequestInfo());
 
 214         if (serviceInstance.getServiceInstanceName() != null) {
 
 215             requestDetails.getRequestInfo().setInstanceName(serviceInstance.getServiceInstanceName());
 
 217         requestDetails.setModelInfo(mapServiceModelInformation(serviceInstance));
 
 218         requestDetails.setRequestParameters(createRequestParameters());
 
 219         return requestDetails;
 
 222     protected RequestDetails mapNetworkRequestDetails(L3Network network) {
 
 223         RequestDetails requestDetails = new RequestDetails();
 
 224         requestDetails.setRequestInfo(createRequestInfo());
 
 225         if (network.getNetworkName() != null) {
 
 226             requestDetails.getRequestInfo().setInstanceName(network.getNetworkName());
 
 228         requestDetails.setCloudConfiguration(mapCloudConfigurationNetwork(network));
 
 229         requestDetails.setModelInfo(mapNetworkModelInformation(network));
 
 230         requestDetails.setRequestParameters(createRequestParameters());
 
 231         return requestDetails;
 
 234     protected ModelInfo mapVfModuleModelInformation(VfModule vfModule, ModelType modelType) {
 
 235         ModelInfo modelInfo = new ModelInfo();
 
 236         modelInfo.setModelCustomizationId(vfModule.getModelCustomizationId());
 
 237         modelInfo.setModelCustomizationUuid(vfModule.getModelCustomizationId());
 
 238         modelInfo.setModelType(modelType);
 
 242     protected ModelInfo mapVolumeGroupModelInformation(VolumeGroup volumeGroup) {
 
 243         ModelInfo modelInfo = new ModelInfo();
 
 244         modelInfo.setModelCustomizationId(volumeGroup.getModelCustomizationId());
 
 245         modelInfo.setModelCustomizationUuid(volumeGroup.getModelCustomizationId());
 
 246         modelInfo.setModelType(ModelType.volumeGroup);
 
 250     protected ModelInfo mapServiceModelInformation(ServiceInstance serviceInstance) {
 
 251         ModelInfo modelInfo = new ModelInfo();
 
 252         modelInfo.setModelVersionId(serviceInstance.getModelVersionId());
 
 253         modelInfo.setModelType(ModelType.service);
 
 257     protected ModelInfo mapVnfModelInformation(GenericVnf vnf) {
 
 258         ModelInfo modelInfo = new ModelInfo();
 
 259         modelInfo.setModelCustomizationId(vnf.getModelCustomizationId());
 
 260         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
 
 261         modelInfo.setModelType(ModelType.vnf);
 
 265     protected ModelInfo mapNetworkModelInformation(L3Network network) {
 
 266         ModelInfo modelInfo = new ModelInfo();
 
 267         modelInfo.setModelType(ModelType.network);
 
 268         modelInfo.setModelCustomizationId(network.getModelCustomizationId());
 
 269         modelInfo.setModelCustomizationUuid(network.getModelCustomizationId());
 
 273     public CloudConfiguration mapCloudConfiguration(GenericVnf vnf, String vfModuleId) {
 
 274         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 275         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
 
 276         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
 
 277         String tenantId = null;
 
 278         String cloudOwner = null;
 
 279         String lcpRegionId = null;
 
 280         if (relationshipsOpt.isPresent()) {
 
 281             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
 
 282                     .map(item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.TENANT.getUriParams().tenantId))
 
 284             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 285                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudOwner))
 
 287             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 288                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudRegionId))
 
 292         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
 
 293             Map<String, String[]> filters = createQueryRequest("vfModuleId", vfModuleId);
 
 294             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 295             if (request.isPresent()) {
 
 296                 if (request.get().getRequestDetails() != null
 
 297                         && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 298                     if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 299                         tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 301                     if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 302                         cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 304                     if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 305                         lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 309                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 312         cloudConfig.setTenantId(tenantId);
 
 313         cloudConfig.setCloudOwner(cloudOwner);
 
 314         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 318     public CloudConfiguration mapCloudConfigurationVolume(GenericVnf vnf, VolumeGroup volumeGroup) {
 
 319         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 320         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
 
 321         Optional<org.onap.aaiclient.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
 
 322         String tenantId = null;
 
 323         String cloudOwner = null;
 
 324         String lcpRegionId = null;
 
 325         if (relationshipsOpt.isPresent()) {
 
 326             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
 
 327                     .map(item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.TENANT.getUriParams().tenantId))
 
 329             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 330                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudOwner))
 
 332             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst().map(
 
 333                     item -> item.getURIKeys().get(AAIFluentTypeBuilder.Types.CLOUD_REGION.getUriParams().cloudRegionId))
 
 337         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
 
 338             Map<String, String[]> filters = createQueryRequest("volumeGroupId", volumeGroup.getVolumeGroupId());
 
 339             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 340             if (request.isPresent()) {
 
 341                 tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 342                 cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 343                 lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 345                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 348         cloudConfig.setTenantId(tenantId);
 
 349         cloudConfig.setCloudOwner(cloudOwner);
 
 350         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 354     public CloudConfiguration mapCloudConfigurationNetwork(L3Network network) {
 
 355         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 356         String tenantId = null;
 
 357         String cloudOwner = null;
 
 358         String lcpRegionId = null;
 
 360         Map<String, String[]> filters = createQueryRequest("networkId", network.getNetworkId());
 
 361         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 362         if (request.isPresent()) {
 
 363             if (request.get().getRequestDetails() != null
 
 364                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 365                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 366                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 368                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 369                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 371                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 372                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 376             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 379         cloudConfig.setTenantId(tenantId);
 
 380         cloudConfig.setCloudOwner(cloudOwner);
 
 381         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 385     public CloudConfiguration mapCloudConfigurationVnf(String vnfId) {
 
 386         CloudConfiguration cloudConfig = new CloudConfiguration();
 
 387         String tenantId = null;
 
 388         String cloudOwner = null;
 
 389         String lcpRegionId = null;
 
 391         Map<String, String[]> filters = createQueryRequest("vnfId", vnfId);
 
 392         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
 
 393         if (request.isPresent()) {
 
 394             if (request.get().getRequestDetails() != null
 
 395                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
 
 396                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
 
 397                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
 
 399                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
 
 400                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
 
 402                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
 
 403                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
 
 407             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
 
 409         cloudConfig.setTenantId(tenantId);
 
 410         cloudConfig.setCloudOwner(cloudOwner);
 
 411         cloudConfig.setLcpCloudRegionId(lcpRegionId);
 
 415     public Optional<ServiceInstancesRequest> findServiceInstanceRequest(Map<String, String[]> filters) {
 
 416         List<InfraActiveRequests> completeRequests = infraActiveRequestsClient.getRequest(filters);
 
 417         InfraActiveRequests foundRequest = completeRequests.get(0);
 
 418         ServiceInstancesRequest siRequest;
 
 420             siRequest = mapper.readValue(foundRequest.getRequestBody(), ServiceInstancesRequest.class);
 
 421             return Optional.of(siRequest);
 
 422         } catch (Exception e) {
 
 423             logger.error("Could not read Create Instance Request", e);
 
 425         return Optional.empty();
 
 428     public Map<String, String[]> createQueryRequest(String name, String instanceId) {
 
 429         Map<String, String[]> filters = new HashMap<>();
 
 430         filters.put(name, new String[] {"EQ", instanceId});
 
 431         filters.put("requestStatus", new String[] {"EQ", Status.COMPLETE.toString()});
 
 432         filters.put("action", new String[] {"EQ", "createInstance"});
 
 436     public RequestInfo createRequestInfo() {
 
 437         RequestInfo requestInfo = new RequestInfo();
 
 438         requestInfo.setSuppressRollback(false);
 
 439         requestInfo.setSource(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
 
 440         requestInfo.setRequestorId(MDC.get(HttpHeadersConstants.REQUESTOR_ID));
 
 444     public RequestParameters createRequestParameters() {
 
 445         RequestParameters requestParams = new RequestParameters();
 
 446         requestParams.setaLaCarte(true);
 
 447         requestParams.setTestApi("GR_API");
 
 448         return requestParams;