287b0ad81299b86ce6f48344e3756f2d5d04eb25
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21 package org.openecomp.mso.apihandlerinfra;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26
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;
36
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;
68
69 import com.wordnik.swagger.annotations.Api;
70 import com.wordnik.swagger.annotations.ApiOperation;
71
72 @Path("/serviceInstances")
73 @Api(value="/serviceInstances",description="API Requests for Service Instances")
74 public class ServiceInstances {
75
76         private HashMap<String, String> instanceIdMap = new HashMap<>();
77         private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
78         private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
79         public static final  String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
80
81         @POST
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) {
87
88                 Response response = serviceInstances(request, Action.createInstance, null, version);
89
90                 return response;
91         }
92         
93         @POST
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) {
99
100                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
101                 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
102
103                 return response;
104         }
105         
106         @POST
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) {
112
113                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
114                 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
115
116                 return response;
117         }
118         
119
120         @DELETE
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) {
126
127                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
128                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
129                 return response;
130         }
131
132         @POST
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);
141
142                 return response;
143         }
144         
145         @POST
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);
156
157                 return response;
158         }
159         
160         @PUT
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) {                     
167
168                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
169                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
170                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
171
172                 return response;
173         }
174
175
176         @DELETE
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) {
183
184                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
185                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
186                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
187
188                 return response;
189         }
190
191         @POST
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);
202
203                 return response;
204         }
205         
206         @POST
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) {
214                 
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);
220
221                 return response;
222         }
223
224         @PUT
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) {
232
233                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
234                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
235                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
236                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
237
238                 return response;
239         }
240
241         @DELETE
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) {
249
250
251                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
252                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
253                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
254                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
255
256                 return response;
257         }
258
259
260         @POST
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) {
267
268                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
269                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
270                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
271
272                 return response;
273         }
274
275         @PUT
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) {
283
284
285                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
286                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
287                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
288                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
289
290                 return response;
291         }
292
293         @DELETE
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) {
301
302
303                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
304                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
305                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
306                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
307
308                 return response;
309         }
310
311         @POST
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) {
317
318                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
320
321                 return response;
322         }
323
324         @PUT
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) {
331
332                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
333                 instanceIdMap.put("networkInstanceId", networkInstanceId);
334                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
335
336                 return response;
337         }
338
339         @DELETE
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) {
346
347                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
348                 instanceIdMap.put("networkInstanceId", networkInstanceId);
349                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
350
351                 return response;
352         }
353
354
355
356         private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
357
358                 String requestId = UUIDChecker.generateUUID(msoLogger);
359                 long startTime = System.currentTimeMillis ();
360                 msoLogger.debug ("requestId is: " + requestId);
361                 ServiceInstancesRequest sir = null;
362
363                 MsoRequest msoRequest = new MsoRequest (requestId);
364
365
366                 try{
367                         ObjectMapper mapper = new ObjectMapper();
368                         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
369
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);
378                         }
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 ());
382                         return response;
383                 }
384
385
386                 try{
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);
396                         }
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 ());
400                         return response;
401                 }
402
403                 InfraActiveRequests dup = null;
404                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
405                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
406                 try {
407                         if(!(instanceName==null && "service".equals(requestScope) && (action == Action.createInstance || action == Action.activateInstance))){
408                                 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
409                         }
410                 } catch (Exception e) {
411                         msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
412
413                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
414                                         e.getMessage(),
415                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
416                                         null) ;
417
418
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 ());
421                         return response;
422                 }
423
424                 if (dup != null) {
425                         // Found the duplicate record. Return the appropriate error.
426                         String instance;
427                         if(instanceName != null){
428                                 instance = instanceName;
429                         }else{
430                                 instance = instanceIdMap.get(requestScope + "InstanceId");
431                         }
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());
435
436                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
437                                         dupMessage,
438                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
439                                         null) ;
440
441
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 ());
446                         return response;
447                 }
448
449
450                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
451
452                 RequestReferences referencesResponse = new RequestReferences();
453
454                 referencesResponse.setRequestId(requestId);
455
456                 serviceResponse.setRequestReferences(referencesResponse);
457
458                 CatalogDatabase db = null;
459                 try {
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,
468                                         null);
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 ());
475                         return response;
476                 }
477
478
479
480                 RecipeLookupResult recipeLookupResult = null;
481                 try {
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);
491                         }
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 ());
495                         return response;
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,
503                                         null);
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 ());
510                         db.close();
511                         return response;
512                 }
513
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,
521                                         null);
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 ());
525                         db.close();
526                         return response;
527                 }
528
529
530                 Boolean isBaseVfModule = false;
531
532                 if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
533                         String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
534
535                         // Get VF Module-specific base module indicator
536                         VfModule vfm;
537
538                         String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
539
540                         if(modelVersionId != null) {
541                                 vfm = db.getVfModuleByModelUuid(modelVersionId);
542                         } else {
543                                 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
544                         }
545
546                         if (vfm != null) {
547                                 if (vfm.getIsBase() == 1) {
548                                         isBaseVfModule = true;
549                                 }
550                         }
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;
559                                 }
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,
564                                                 null);
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 ());
568                                 db.close();
569                                 return response;
570                         }
571                 }
572
573                 db.close();
574
575                 String serviceInstanceId = "";
576                 String vnfId = "";
577                 String vfModuleId = "";
578                 String volumeGroupId = "";
579                 String networkId = "";
580                 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
581
582                 if(siReq.getServiceInstanceId () != null){
583                         serviceInstanceId = siReq.getServiceInstanceId ();
584                 }
585
586                 if(siReq.getVnfInstanceId () != null){
587                         vnfId = siReq.getVnfInstanceId ();
588                 }
589
590                 if(siReq.getVfModuleInstanceId () != null){
591                         vfModuleId = siReq.getVfModuleInstanceId ();
592                 }
593
594                 if(siReq.getVolumeGroupInstanceId () != null){
595                         volumeGroupId = siReq.getVolumeGroupInstanceId ();
596                 }
597
598                 if(siReq.getNetworkInstanceId () != null){
599                         networkId = siReq.getNetworkInstanceId ();
600                 }
601
602
603                 requestId = msoRequest.getRequestId ();
604                 msoLogger.debug ("requestId is: " + requestId);
605                 msoLogger.debug ("About to insert a record");
606
607                 try {
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,
616                                         null);
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 ());
619                         return response;
620                 }
621
622                 RequestClient requestClient = null;
623                 HttpResponse response = null;
624                 long subStartTime = System.currentTimeMillis();
625                 try {
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 ());
629
630                         msoLogger.debug ("URL : " + requestClient.getUrl ());
631
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(), null);
637
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,
646                                         null);
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);
654                         return resp;
655                 }
656
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,
663                                         null);
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 ());
668                         return resp;
669                 }
670
671                 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
672                 int bpelStatus = respHandler.getStatus ();
673
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 ();
686                 } else {
687                         List<String> variables = new ArrayList<>();
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,
696                                                 variables);
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 ());
701                                 return resp;
702                         } else {
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,
708                                                 variables);
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 ());
713                                 return resp;
714                         }
715                 }
716
717                 //return Response.status (HttpStatus.SC_ACCEPTED).entity (serviceResponse).build ();
718                 // return serviceResponse;
719         }
720
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
724
725                 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
726                 // Query MSO Catalog DB
727
728                 if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
729                         recipeLookupResult = getServiceURI(db, msoRequest, action);
730                 }
731                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
732                                 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
733
734                         recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
735
736                 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
737
738                         recipeLookupResult = getNetworkUri(db, msoRequest, action);
739                 }
740
741                 if (recipeLookupResult != null) {
742                         msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
743                 }
744                 else {
745                         msoLogger.debug("No matching recipe record found");
746                 }
747                 return recipeLookupResult;
748         }
749
750
751         private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
752                 // SERVICE REQUEST
753                 // Construct the default service name
754                 // if no source is provided then make it as VID 
755 //              if (null == msoRequest.getRequestInfo().getSource() || msoRequest.getRequestInfo().getSource().isEmpty()){
756 //                                      msoRequest.getRequestInfo().setSource("VID");
757 //              }
758                                 
759                 // TODO need to make this a configurable property
760                 String defaultServiceModelName = "*";
761                 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
762
763                 Service serviceRecord;
764                 ModelInfo modelInfo = msoRequest.getModelInfo();
765                 if(msoRequest.getALaCarteFlag()){
766                         serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
767                         if (serviceRecord == null) {
768                                 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
769                         }
770                 }else{
771                         serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
772                         if(serviceRecord == null) {
773                                 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
774                         }
775                 }
776
777                 ServiceRecipe recipe = null;
778                 if(serviceRecord !=null){
779                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
780                 }
781                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
782                 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
783                 if(reqParam!=null && reqParam.isaLaCarteSet() && recipe==null){
784                         return null;
785                 }
786
787                 //aLaCarte wasn't sent, so we'll try the default
788                 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
789                 if (serviceRecord == null) {
790                         serviceRecord = db.getServiceByModelName(defaultServiceModelName);
791                 }
792
793                 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
794                 if(modelInfo.getModelVersionId() == null) {
795                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
796                 }
797                 if(recipe==null){
798                         return null;
799                 }
800                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
801         }
802
803
804         private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
805
806                 ModelInfo modelInfo = msoRequest.getModelInfo();
807                 String vnfComponentType = modelInfo.getModelType().name();
808
809                 RelatedInstanceList[] instanceList = null;
810                 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
811                         instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
812                 }
813
814                 Recipe recipe = null;
815                 String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
816                 String modelCustomizationId = modelInfo.getModelCustomizationId();
817                 String modelCustomizationName = modelInfo.getModelCustomizationName();
818                 String relatedInstanceModelVersionId = null;
819                 String relatedInstanceModelInvariantId = null;
820                 String relatedInstanceVersion = null;
821                 String relatedInstanceModelCustomizationName = null;
822
823                 if (instanceList != null) {
824
825                         for(RelatedInstanceList relatedInstanceList : instanceList){
826
827                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
828                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
829                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
830                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
831                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
832                                 }
833
834                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
835                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
836                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
837                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
838                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
839                                 }
840                         }
841
842                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
843                                 //                      a.      For a vnf request (only create, no update currently): 
844                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
845                                 //                              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 
846                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
847                                 //                                      to â€œjoinâ€\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists. 
848                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
849                                 //                                      (MODEL_UUID) in SERVICE table.
850                                 //                              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 
851                                 //                                      during 1707 data migration if VID did not provide it originally on request.
852                                 //                              iv.     Note: continue to construct the â€œvnf-typeâ€\9d value and pass to BPMN (must still be populated in A&AI).  
853                                 //                              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.
854
855                                 VnfResource vnfResource = null;
856                                 VnfResourceCustomization vrc;
857                                 // Validation for vnfResource
858
859                                 if(modelCustomizationId!=null) {
860                                         vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
861                                 } else {
862                                         Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
863                                         if(service == null) {
864                                                 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
865                                         }
866
867                                 if(service == null) {
868                                         throw new ValidationException("service in relatedInstance");
869                                 }
870
871                                         vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
872                                         if(vrc != null) {
873                                                 vnfResource = vrc.getVnfResource();
874                                                 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
875                                                 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
876                                         }
877                                 }
878
879                                 if(vnfResource==null){
880                                         throw new ValidationException("catalog entry");
881                                 } else {
882                                         if(modelInfo.getModelVersionId() == null) {
883                                                 modelInfo.setModelVersionId(vnfResource.getModelUuid());
884                                         }
885                                 }
886
887                                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultVnfType, action.name());
888
889                                 if (vnfRecipe == null) {
890                                         return null;
891                                 }
892
893                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
894                         } else {
895                                 //                      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 
896                                 //                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName 
897                                 //                      to â€œjoinâ€\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists. 
898                                 //                      **If relatedInstance.modelInfo[vnf].modelVersionId  was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead 
899                                 //                      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 
900                                 //                      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, 
901                                 //                      use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data 
902                                 //                      (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not 
903                                 //                      provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found 
904                                 //                      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) 
905                                 //                      and MODEL_VERSION (modelVersion).
906
907                                 if(!msoRequest.getALaCarteFlag()) {
908                                         VfModuleCustomization vfmc = null;
909                                         VnfResourceCustomization vnfrc;
910                                         VfModule vfModule = null;
911
912                                         if( modelInfo.getModelCustomizationId() != null) {
913                                                 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
914                                         } else {
915                                                 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
916                                                 if(vnfrc == null) {
917                                                         vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
918                                                 } 
919
920                                                 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
921
922                                                 String vfModuleModelUUID = modelInfo.getModelVersionId();
923                                                 for(VfModuleCustomization vf : list) {
924                                                         if(vfModuleModelUUID != null) {
925                                                                 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
926                                                         } else {
927                                                                 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
928                                                         }
929
930                                                         if(vfModule != null) {
931                                                                 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
932                                                                 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
933                                                                 break;
934                                                         }
935                                                 }
936                                         }
937
938                                         if(vfmc == null && vfModule == null) {
939                                                 throw new ValidationException("no catalog entry found");
940                                         } else if (vfModule == null && vfmc != null) {
941                                                 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
942                                         }
943
944                                         if(modelInfo.getModelVersionId() == null) {
945                                                 modelInfo.setModelVersionId(vfModule.getModelUUID());
946                                         }
947                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
948                                 } 
949
950                                 if(recipe == null) {
951                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultVnfType, vnfComponentType, action.name());
952                                         if (recipe == null) { 
953                                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
954                                         }
955
956                                         if(recipe == null) {
957                                                 return null;
958                                         }
959                                 }
960                         }
961                 } else {
962                         msoLogger.debug("recipe is null, getting default");
963
964                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
965                                 recipe = db.getVnfRecipe(defaultVnfType, action.name());
966                                 if (recipe == null) {
967                                         return null;
968                                 }
969                         } else {
970                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("VID_DEFAULT", vnfComponentType, action.name());
971
972                                 if (recipe == null) {
973                                         return null;
974                                 }
975                         }
976                 }
977
978                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
979         }
980
981         private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
982
983                 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
984
985                 ModelInfo modelInfo = msoRequest.getModelInfo();
986                 String modelName = modelInfo.getModelName();
987                 Recipe recipe;
988                 if(msoRequest.getALaCarteFlag()){
989                         recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
990                 }else{
991                         if(modelInfo.getModelCustomizationId()!=null){
992                                 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
993                                 if(networkResource!=null){
994                                         if(modelInfo.getModelVersionId() == null) {
995                                                 modelInfo.setModelVersionId(networkResource.getModelUUID());
996                                         }
997                                         recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
998                                 }else{
999                                         throw new ValidationException("no catalog entry found");
1000                                 }
1001                         }else{
1002                                 //ok for version < 3 and action delete
1003                                 recipe = db.getNetworkRecipe(modelName, action.name());
1004                         }
1005                         if(recipe == null){
1006                                 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1007                         }
1008                 }
1009                 if (recipe == null) {
1010                         return null;
1011                 }
1012                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1013         }
1014 }