2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  21 package org.openecomp.mso.apihandlerinfra;
 
  23 import java.util.ArrayList;
 
  24 import java.util.HashMap;
 
  25 import java.util.List;
 
  27 import javax.ws.rs.Consumes;
 
  28 import javax.ws.rs.DELETE;
 
  29 import javax.ws.rs.POST;
 
  30 import javax.ws.rs.PUT;
 
  31 import javax.ws.rs.Path;
 
  32 import javax.ws.rs.PathParam;
 
  33 import javax.ws.rs.Produces;
 
  34 import javax.ws.rs.core.MediaType;
 
  35 import javax.ws.rs.core.Response;
 
  37 import org.apache.http.HttpResponse;
 
  38 import org.apache.http.HttpStatus;
 
  39 import org.codehaus.jackson.map.ObjectMapper;
 
  40 import org.openecomp.mso.apihandler.common.ErrorNumbers;
 
  41 import org.openecomp.mso.apihandler.common.RequestClient;
 
  42 import org.openecomp.mso.apihandler.common.RequestClientFactory;
 
  43 import org.openecomp.mso.apihandler.common.ResponseHandler;
 
  44 import org.openecomp.mso.apihandler.common.ValidationException;
 
  45 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
 
  46 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
 
  47 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
 
  48 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
 
  49 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestReferences;
 
  50 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
 
  51 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesResponse;
 
  52 import org.openecomp.mso.db.catalog.CatalogDatabase;
 
  53 import org.openecomp.mso.db.catalog.beans.NetworkResource;
 
  54 import org.openecomp.mso.db.catalog.beans.Recipe;
 
  55 import org.openecomp.mso.db.catalog.beans.Service;
 
  56 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
 
  57 import org.openecomp.mso.db.catalog.beans.VfModule;
 
  58 import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
 
  59 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
 
  60 import org.openecomp.mso.db.catalog.beans.VnfResource;
 
  61 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
 
  62 import org.openecomp.mso.logger.MessageEnum;
 
  63 import org.openecomp.mso.logger.MsoAlarmLogger;
 
  64 import org.openecomp.mso.logger.MsoLogger;
 
  65 import org.openecomp.mso.requestsdb.InfraActiveRequests;
 
  66 import org.openecomp.mso.requestsdb.RequestsDatabase;
 
  67 import org.openecomp.mso.utils.UUIDChecker;
 
  69 import com.wordnik.swagger.annotations.Api;
 
  70 import com.wordnik.swagger.annotations.ApiOperation;
 
  72 @Path("/serviceInstances")
 
  73 @Api(value="/serviceInstances",description="API Requests for Service Instances")
 
  74 public class ServiceInstances {
 
  76         private HashMap<String, String> instanceIdMap = new HashMap<String,String>();
 
  77         private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
 
  78         private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
 
  79         public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
 
  82         @Path("/{version:[vV][3-5]}")
 
  83         @Consumes(MediaType.APPLICATION_JSON)
 
  84         @Produces(MediaType.APPLICATION_JSON)
 
  85         @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
 
  86         public Response createServiceInstance(String request, @PathParam("version") String version) {
 
  88                 Response response = serviceInstances(request, Action.createInstance, null, version);
 
  94         @Path("/{version:[vV][5]}/{serviceInstanceId}/activate")
 
  95         @Consumes(MediaType.APPLICATION_JSON)
 
  96         @Produces(MediaType.APPLICATION_JSON)
 
  97         @ApiOperation(value="Activate provided Service Instance",response=Response.class)
 
  98         public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
 
 100                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 101                 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
 
 107         @Path("/{version:[vV][5]}/{serviceInstanceId}/deactivate")
 
 108         @Consumes(MediaType.APPLICATION_JSON)
 
 109         @Produces(MediaType.APPLICATION_JSON)
 
 110         @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
 
 111         public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
 
 113                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 114                 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
 
 121         @Path("/{version:[vV][3-5]}/{serviceInstanceId}")
 
 122         @Consumes(MediaType.APPLICATION_JSON)
 
 123         @Produces(MediaType.APPLICATION_JSON)
 
 124         @ApiOperation(value="Delete provided Service Instance",response=Response.class)
 
 125         public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
 
 127                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 128                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
 
 133         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs")
 
 134         @Consumes(MediaType.APPLICATION_JSON)
 
 135         @Produces(MediaType.APPLICATION_JSON)
 
 136         @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
 
 137         public Response createVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
 
 138                 msoLogger.debug ("version is: " + version);
 
 139                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 140                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
 
 146         @Path("/{version:[vV][5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
 
 147         @Consumes(MediaType.APPLICATION_JSON)
 
 148         @Produces(MediaType.APPLICATION_JSON)
 
 149         @ApiOperation(value="Replace provided VNF instance",response=Response.class)
 
 150         public Response replaceVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 151                         @PathParam("vnfInstanceId") String vnfInstanceId) {
 
 152                 msoLogger.debug ("version is: " + version);
 
 153                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 154                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 155                 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
 
 161         @Path("/{version:[vV][5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
 
 162         @Consumes(MediaType.APPLICATION_JSON)
 
 163         @Produces(MediaType.APPLICATION_JSON)
 
 164         @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
 
 165         public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 166                         @PathParam("vnfInstanceId") String vnfInstanceId) {                     
 
 168                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 169                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
 
 170                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
 
 177         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
 
 178         @Consumes(MediaType.APPLICATION_JSON)
 
 179         @Produces(MediaType.APPLICATION_JSON)
 
 180         @ApiOperation(value="Delete provided VNF instance",response=Response.class)
 
 181         public Response deleteVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 182                         @PathParam("vnfInstanceId") String vnfInstanceId) {
 
 184                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 185                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 186                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
 
 192         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
 
 193         @Consumes(MediaType.APPLICATION_JSON)
 
 194         @Produces(MediaType.APPLICATION_JSON)
 
 195         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
 
 196         public Response createVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 197                         @PathParam("vnfInstanceId") String vnfInstanceId) {
 
 198                 msoLogger.debug ("version is: " + version);
 
 199                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 200                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 201                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
 
 207         @Path("/{version:[vV][5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
 
 208         @Consumes(MediaType.APPLICATION_JSON)
 
 209         @Produces(MediaType.APPLICATION_JSON)
 
 210         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
 
 211         public Response replaceVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 212                         @PathParam("vnfInstanceId") String vnfInstanceId,
 
 213                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
 
 215                 msoLogger.debug ("version is: " + version);
 
 216                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 217                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 218                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
 
 219                 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
 
 225         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
 
 226         @Consumes(MediaType.APPLICATION_JSON)
 
 227         @Produces(MediaType.APPLICATION_JSON)
 
 228         @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
 
 229         public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 230                         @PathParam("vnfInstanceId") String vnfInstanceId,
 
 231                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
 
 233                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 234                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 235                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
 
 236                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
 
 242         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
 
 243         @Consumes(MediaType.APPLICATION_JSON)
 
 244         @Produces(MediaType.APPLICATION_JSON)
 
 245         @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
 
 246         public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 247                         @PathParam("vnfInstanceId") String vnfInstanceId,
 
 248                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
 
 251                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 252                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 253                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
 
 254                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
 
 261         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
 
 262         @Consumes(MediaType.APPLICATION_JSON)
 
 263         @Produces(MediaType.APPLICATION_JSON)
 
 264         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
 
 265         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 266                         @PathParam("vnfInstanceId") String vnfInstanceId) {
 
 268                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 269                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 270                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
 
 276         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
 
 277         @Consumes(MediaType.APPLICATION_JSON)
 
 278         @Produces(MediaType.APPLICATION_JSON)
 
 279         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
 
 280         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 281                         @PathParam("vnfInstanceId") String vnfInstanceId,
 
 282                         @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
 
 285                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 286                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 287                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
 
 288                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
 
 294         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
 
 295         @Consumes(MediaType.APPLICATION_JSON)
 
 296         @Produces(MediaType.APPLICATION_JSON)
 
 297         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
 
 298         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 299                         @PathParam("vnfInstanceId") String vnfInstanceId,
 
 300                         @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
 
 303                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 304                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
 
 305                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
 
 306                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
 
 312         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/networks")
 
 313         @Consumes(MediaType.APPLICATION_JSON)
 
 314         @Produces(MediaType.APPLICATION_JSON)
 
 315         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
 
 316         public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
 
 318                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 319                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
 
 325         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/networks/{networkInstanceId}")
 
 326         @Consumes(MediaType.APPLICATION_JSON)
 
 327         @Produces(MediaType.APPLICATION_JSON)
 
 328         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
 
 329         public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 330                         @PathParam("networkInstanceId") String networkInstanceId) {
 
 332                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 333                 instanceIdMap.put("networkInstanceId", networkInstanceId);
 
 334                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
 
 340         @Path("/{version:[vV][3-5]}/{serviceInstanceId}/networks/{networkInstanceId}")
 
 341         @Consumes(MediaType.APPLICATION_JSON)
 
 342         @Produces(MediaType.APPLICATION_JSON)
 
 343         @ApiOperation(value="Delete provided Network instance",response=Response.class)
 
 344         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
 
 345                         @PathParam("networkInstanceId") String networkInstanceId) {
 
 347                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
 
 348                 instanceIdMap.put("networkInstanceId", networkInstanceId);
 
 349                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
 
 356         private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
 
 358                 String requestId = UUIDChecker.generateUUID(msoLogger);
 
 359                 long startTime = System.currentTimeMillis ();
 
 360                 msoLogger.debug ("requestId is: " + requestId);
 
 361                 ServiceInstancesRequest sir = null;
 
 363                 MsoRequest msoRequest = new MsoRequest (requestId);
 
 367                         ObjectMapper mapper = new ObjectMapper();
 
 368                         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
 
 370                 } catch(Exception e){
 
 371                         msoLogger.debug ("Mapping of request to JSON object failed : ", e);
 
 372                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
 
 373                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
 
 374                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
 
 375                         if (msoRequest.getRequestId () != null) {
 
 376                                 msoLogger.debug ("Mapping of request to JSON object failed");
 
 377                                 msoRequest.createRequestRecord (Status.FAILED, action);
 
 379                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
 
 380                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
 
 381                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 387                         msoRequest.parse(sir, instanceIdMap, action, version);
 
 388                 } catch (Exception e) {
 
 389                         msoLogger.debug ("Validation failed: ", e);
 
 390                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
 
 391                                         "Error parsing request.  " + e.getMessage(),
 
 392                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
 
 393                         if (msoRequest.getRequestId () != null) {
 
 394                                 msoLogger.debug ("Logging failed message to the database");
 
 395                                 msoRequest.createRequestRecord (Status.FAILED, action);
 
 397                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
 
 398                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
 
 399                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 403                 InfraActiveRequests dup = null;
 
 404                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
 
 405                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
 
 407                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
 
 408                                 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
 
 410                 } catch (Exception e) {
 
 411                         msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
 
 413                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
 
 415                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
 
 419                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
 
 420                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 425                         // Found the duplicate record. Return the appropriate error.
 
 426                         String instance = null;
 
 427                         if(instanceName != null){
 
 428                                 instance = instanceName;
 
 430                                 instance = instanceIdMap.get(requestScope + "InstanceId");
 
 432                         String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") " + "already has a request being worked with a status of " + dup.getRequestStatus() + " (RequestId - " + dup.getRequestId() + "). The existing request must finish or be cleaned up before proceeding.";
 
 433                         //List<String> variables = new ArrayList<String>();
 
 434                         //variables.add(dup.getRequestStatus());
 
 436                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
 
 438                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
 
 442                         msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
 
 443                         msoRequest.createRequestRecord (Status.FAILED, action);
 
 444                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
 
 445                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 450                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
 
 452                 RequestReferences referencesResponse = new RequestReferences();
 
 454                 referencesResponse.setRequestId(requestId);
 
 456                 serviceResponse.setRequestReferences(referencesResponse);
 
 458                 CatalogDatabase db = null;
 
 460                         db = CatalogDatabase.getInstance();
 
 461                 } catch (Exception e) {
 
 462                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
 
 463                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 464                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
 
 465                                         MsoException.ServiceException,
 
 466                                         "No communication to catalog DB " + e.getMessage (),
 
 467                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
 
 469                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
 
 470                                         MsoAlarmLogger.CRITICAL,
 
 471                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
 
 472                         msoRequest.createRequestRecord (Status.FAILED,action);
 
 473                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
 
 474                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 480                 RecipeLookupResult recipeLookupResult = null;
 
 482                         recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
 
 483                 } catch (ValidationException e) {
 
 484                         msoLogger.debug ("Validation failed: ", e);
 
 485                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
 
 486                                         "Error validating request.  " + e.getMessage(),
 
 487                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
 
 488                         if (msoRequest.getRequestId () != null) {
 
 489                                 msoLogger.debug ("Logging failed message to the database");
 
 490                                 msoRequest.createRequestRecord (Status.FAILED, action);
 
 492                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
 
 493                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
 
 494                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 496                 } catch (Exception e) {
 
 497                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
 
 498                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 499                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
 
 500                                         MsoException.ServiceException,
 
 501                                         "Recipe could not be retrieved from catalog DB " + e.getMessage (),
 
 502                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
 
 504                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
 
 505                                         MsoAlarmLogger.CRITICAL,
 
 506                                         Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
 
 507                         msoRequest.createRequestRecord (Status.FAILED,action);
 
 508                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
 
 509                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 514                 if (recipeLookupResult == null) {
 
 515                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
 
 516                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 517                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
 
 518                                         MsoException.ServiceException,
 
 519                                         "Recipe does not exist in catalog DB",
 
 520                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
 
 522                         msoRequest.createRequestRecord (Status.FAILED, action);
 
 523                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
 
 524                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 530                 Boolean isBaseVfModule = false;
 
 532                 if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
 
 533                         String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
 
 535                         // Get VF Module-specific base module indicator
 
 538                         String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
 
 540                         if(modelVersionId != null) {
 
 541                                 vfm = db.getVfModuleByModelUuid(modelVersionId);
 
 543                                 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
 
 547                                 if (vfm.getIsBase() == 1) {
 
 548                                         isBaseVfModule = true;
 
 551                         else if (action == Action.createInstance || action == Action.updateInstance){
 
 552                                 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
 
 553                                 // This request cannot proceed
 
 554                                 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
 
 555                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 556                                 String serviceVersionText = "";
 
 557                                 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
 
 558                                         serviceVersionText = " with version " + asdcServiceModelVersion;
 
 560                                 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
 
 561                                                 MsoException.ServiceException,
 
 562                                                 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
 
 563                                                 ErrorNumbers.SVC_BAD_PARAMETER,
 
 565                                 msoRequest.createRequestRecord (Status.FAILED, action);
 
 566                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
 
 567                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 575                 String serviceInstanceId = "";
 
 577                 String vfModuleId = "";
 
 578                 String volumeGroupId = "";
 
 579                 String networkId = "";
 
 580                 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
 
 582                 if(siReq.getServiceInstanceId () != null){
 
 583                         serviceInstanceId = siReq.getServiceInstanceId ();
 
 586                 if(siReq.getVnfInstanceId () != null){
 
 587                         vnfId = siReq.getVnfInstanceId ();
 
 590                 if(siReq.getVfModuleInstanceId () != null){
 
 591                         vfModuleId = siReq.getVfModuleInstanceId ();
 
 594                 if(siReq.getVolumeGroupInstanceId () != null){
 
 595                         volumeGroupId = siReq.getVolumeGroupInstanceId ();
 
 598                 if(siReq.getNetworkInstanceId () != null){
 
 599                         networkId = siReq.getNetworkInstanceId ();
 
 603                 requestId = msoRequest.getRequestId ();
 
 604                 msoLogger.debug ("requestId is: " + requestId);
 
 605                 msoLogger.debug ("About to insert a record");
 
 608                         msoRequest.createRequestRecord (Status.PENDING, action);
 
 609                 } catch (Exception e) {
 
 610                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
 
 611                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 612                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
 
 613                                         MsoException.ServiceException,
 
 614                                         "Exception while creating record in DB " + e.getMessage(),
 
 615                                         ErrorNumbers.SVC_BAD_PARAMETER,
 
 617                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
 
 618                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
 
 622                 RequestClient requestClient = null;
 
 623                 HttpResponse response = null;
 
 624                 long subStartTime = System.currentTimeMillis();
 
 626                         requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), MsoPropertiesUtils.loadMsoProperties ());
 
 627                         // Capture audit event
 
 628                         msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
 
 630                         System.out.println("URL : " + requestClient.getUrl ());
 
 632                         response = requestClient.post(requestId, isBaseVfModule, recipeLookupResult.getRecipeTimeout (), action.name (),
 
 633                                         serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId,
 
 634                                         msoRequest.getServiceInstanceType (),
 
 635                                         msoRequest.getVnfType (), msoRequest.getVfModuleType (),
 
 636                                         msoRequest.getNetworkType (), msoRequest.getRequestJSON());
 
 638                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
 
 639                 } catch (Exception e) {
 
 640                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
 
 641                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 642                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
 
 643                                         MsoException.ServiceException,
 
 644                                         "Failed calling bpmn " + e.getMessage (),
 
 645                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
 
 647                         alarmLogger.sendAlarm ("MsoConfigurationError",
 
 648                                         MsoAlarmLogger.CRITICAL,
 
 649                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
 
 650                         msoRequest.updateFinalStatus (Status.FAILED);
 
 651                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
 
 652                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
 
 653                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
 
 657                 if (response == null) {
 
 658                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 659                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
 
 660                                         MsoException.ServiceException,
 
 661                                         "bpelResponse is null",
 
 662                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
 
 664                         msoRequest.updateFinalStatus (Status.FAILED);
 
 665                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
 
 666                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
 
 667                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
 
 671                 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
 
 672                 int bpelStatus = respHandler.getStatus ();
 
 674                 // BPEL accepted the request, the request is in progress
 
 675                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
 
 676                         String camundaJSONResponseBody = respHandler.getResponseBody ();
 
 677                         msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
 
 678                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
 
 679                         (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
 
 680                                         Status.IN_PROGRESS.toString (),
 
 681                                         Constants.PROGRESS_REQUEST_IN_PROGRESS,
 
 682                                         Constants.MODIFIED_BY_APIHANDLER);
 
 683                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
 
 684                         msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
 
 685                         return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
 
 687                         List<String> variables = new ArrayList<String>();
 
 688                         variables.add(bpelStatus + "");
 
 689                         String camundaJSONResponseBody = respHandler.getResponseBody ();
 
 690                         if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
 
 691                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 692                                 Response resp =  msoRequest.buildServiceErrorResponse(bpelStatus,
 
 693                                                 MsoException.ServiceException,
 
 694                                                 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
 
 695                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
 
 697                                 msoRequest.updateFinalStatus (Status.FAILED);
 
 698                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
 
 699                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
 
 700                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
 
 703                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
 
 704                                 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
 
 705                                                 MsoException.ServiceException,
 
 706                                                 "Request Failed due to BPEL error with HTTP Status= %1" ,
 
 707                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
 
 709                                 msoRequest.updateFinalStatus (Status.FAILED);
 
 710                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
 
 711                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
 
 712                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
 
 717                 //return Response.status (HttpStatus.SC_ACCEPTED).entity (serviceResponse).build ();
 
 718                 // return serviceResponse;
 
 721         private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
 
 722                 RecipeLookupResult recipeLookupResult = null;
 
 723                 //if the aLaCarte flag is set to TRUE, the API-H should choose the â€œVID_DEFAULTâ€
\9d recipe for the requested action
 
 725                 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
 
 726                 // Query MSO Catalog DB
 
 728                 if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
 
 729                         recipeLookupResult = getServiceURI(db, msoRequest, action);
 
 731                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
 
 732                                 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
 
 734                         recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
 
 736                 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
 
 738                         recipeLookupResult = getNetworkUri(db, msoRequest, action);
 
 741                 if (recipeLookupResult != null) {
 
 742                         msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
 
 745                         msoLogger.debug("No matching recipe record found");
 
 747                 return recipeLookupResult;
 
 751         private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
 
 753                 // Construct the default service name
 
 754                 // TODO need to make this a configurable property
 
 755                 String defaultServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
 
 757                 Service serviceRecord = null;
 
 758                 ModelInfo modelInfo = msoRequest.getModelInfo();
 
 759                 if(msoRequest.getALaCarteFlag()){
 
 760                         serviceRecord = db.getServiceByModelName(defaultServiceModelName);
 
 762                         serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
 
 763                         if(serviceRecord == null) {
 
 764                                 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
 
 768                 ServiceRecipe recipe = null;
 
 769                 if(serviceRecord !=null){
 
 770                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
 
 772                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
 
 773                 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
 
 774                 if(reqParam!=null && reqParam.isALaCarteSet() && recipe==null){
 
 776                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
 
 777                         serviceRecord = db.getServiceByModelName(defaultServiceModelName);
 
 778                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
 
 781                 if(modelInfo.getModelVersionId() == null) {     
 
 782                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
 
 787                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
 
 791         private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
 
 793                 ModelInfo modelInfo = msoRequest.getModelInfo();
 
 794                 String vnfComponentType = modelInfo.getModelType().name();
 
 796                 RelatedInstanceList[] instanceList = null;
 
 797                 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
 
 798                         instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
 
 801                 Recipe recipe = null;
 
 802                 String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
 
 803                 String modelCustomizationId = modelInfo.getModelCustomizationId();
 
 804                 String modelCustomizationName = modelInfo.getModelCustomizationName();
 
 805                 String relatedInstanceModelVersionId = null;
 
 806                 String relatedInstanceModelInvariantId = null;
 
 807                 String relatedInstanceVersion = null;
 
 808                 String relatedInstanceModelCustomizationName = null;
 
 810                 if (instanceList != null) {
 
 812                         for(RelatedInstanceList relatedInstanceList : instanceList){
 
 814                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
 
 815                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
 
 816                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
 
 817                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
 
 818                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
 
 821                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
 
 822                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
 
 823                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
 
 824                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
 
 825                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
 
 829                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
 
 830                                 //                      a.      For a vnf request (only create, no update currently): 
 
 831                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
 
 832                                 //                              ii.     (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
 
 833                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
 
 834                                 //                                      to â€œjoinâ€
\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists. 
 
 835                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
 
 836                                 //                                      (MODEL_UUID) in SERVICE table.
 
 837                                 //                              iii.    Regardless of how the value was provided/obtained above, APIH must always populate vnfModelCustomizationId in bpmnRequest.  It would be assumed it was MSO generated 
 
 838                                 //                                      during 1707 data migration if VID did not provide it originally on request.
 
 839                                 //                              iv.     Note: continue to construct the â€œvnf-typeâ€
\9d value and pass to BPMN (must still be populated in A&AI).  
 
 840                                 //                              1.      If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to look it up in our catalog to construct vnf-type value to pass to BPMN.
 
 842                                 VnfResource vnfResource = null;
 
 843                                 VnfResourceCustomization vrc = null;
 
 844                                 // Validation for vnfResource
 
 846                                 if(modelCustomizationId!=null) {
 
 847                                         vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
 
 849                                         Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
 
 850                                         if(service == null) {
 
 851                                                 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
 
 854                                 if(service == null) {
 
 855                                         throw new ValidationException("service in relatedInstance");
 
 858                                         vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
 
 860                                                 vnfResource = vrc.getVnfResource();
 
 861                                                 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
 
 862                                                 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
 
 866                                 if(vnfResource==null){
 
 867                                         throw new ValidationException("catalog entry");
 
 869                                         if(modelInfo.getModelVersionId() == null) {
 
 870                                                 modelInfo.setModelVersionId(vnfResource.getModelUuid());
 
 874                                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultVnfType, action.name());
 
 876                                 if (vnfRecipe == null) {
 
 880                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
 
 882                                 //                      ii.     (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
 
 883                                 //                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName 
 
 884                                 //                      to â€œjoinâ€
\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists. 
 
 885                                 //                      **If relatedInstance.modelInfo[vnf].modelVersionId  was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead 
 
 886                                 //                      to lookup modelVersionId (MODEL_UUID) in vnf_resource table. Once the vnf’s model_customization_uuid has been obtained, use it to find all vfModule customizations 
 
 887                                 //                      for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. For each vf_module_cust_model_customization_uuid value returned, 
 
 888                                 //                      use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data 
 
 889                                 //                      (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not 
 
 890                                 //                      provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found 
 
 891                                 //                      in vf_module_customization and looking up in vf_module (using vf_module_customization’s FK into vf_module) to find a match on MODEL_INVARIANT_UUID (modelInvariantId) 
 
 892                                 //                      and MODEL_VERSION (modelVersion).
 
 894                                 if(!msoRequest.getALaCarteFlag()) {
 
 895                                         VfModuleCustomization vfmc = null;
 
 896                                         VnfResourceCustomization vnfrc = null;
 
 897                                         VfModule vfModule = null;
 
 899                                         if( modelInfo.getModelCustomizationId() != null) {
 
 900                                                 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
 
 902                                                 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
 
 904                                                         vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
 
 907                                                 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
 
 909                                                 String vfModuleModelUUID = modelInfo.getModelVersionId();
 
 910                                                 for(VfModuleCustomization vf : list) {
 
 911                                                         if(vfModuleModelUUID != null) {
 
 912                                                                 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
 
 914                                                                 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
 
 917                                                         if(vfModule != null) {
 
 918                                                                 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
 
 919                                                                 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
 
 925                                         if(vfmc == null && vfModule == null) {
 
 926                                                 throw new ValidationException("no catalog entry found");
 
 927                                         } else if (vfModule == null && vfmc != null) {
 
 928                                                 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
 
 931                                         if(modelInfo.getModelVersionId() == null) {
 
 932                                                 modelInfo.setModelVersionId(vfModule.getModelUUID());
 
 934                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
 
 938                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultVnfType, vnfComponentType, action.name());
 
 939                                         if (recipe == null) { 
 
 940                                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
 
 949                         msoLogger.debug("recipe is null, getting default");
 
 951                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
 
 952                                 recipe = db.getVnfRecipe(defaultVnfType, action.name());
 
 953                                 if (recipe == null) {
 
 957                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("VID_DEFAULT", vnfComponentType, action.name());
 
 959                                 if (recipe == null) {
 
 965                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
 
 968         private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
 
 970                 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
 
 972                 ModelInfo modelInfo = msoRequest.getModelInfo();
 
 973                 String modelName = modelInfo.getModelName();
 
 974                 Recipe recipe = null;
 
 975                 if(msoRequest.getALaCarteFlag()){
 
 976                         recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
 
 978                         if(modelInfo.getModelCustomizationId()!=null){
 
 979                                 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
 
 980                                 if(networkResource!=null){
 
 981                                         if(modelInfo.getModelVersionId() == null) {
 
 982                                                 modelInfo.setModelVersionId(networkResource.getModelUUID());
 
 984                                         recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
 
 986                                         throw new ValidationException("no catalog entry found");
 
 989                                 //ok for version < 3 and action delete
 
 990                                 recipe = db.getNetworkRecipe(modelName, action.name());
 
 993                                 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
 
 996                 if (recipe == null) {
 
 999                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());