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<>();
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";
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 && "service".equals(requestScope) && (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.
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 msoLogger.debug ("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(), null);
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<>();
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 // 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");
759 // TODO need to make this a configurable property
760 String defaultServiceModelName = "*";
761 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
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);
771 serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
772 if(serviceRecord == null) {
773 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
777 ServiceRecipe recipe = null;
778 if(serviceRecord !=null){
779 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
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){
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);
793 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
794 if(modelInfo.getModelVersionId() == null) {
795 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
800 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
804 private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
806 ModelInfo modelInfo = msoRequest.getModelInfo();
807 String vnfComponentType = modelInfo.getModelType().name();
809 RelatedInstanceList[] instanceList = null;
810 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
811 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
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;
823 if (instanceList != null) {
825 for(RelatedInstanceList relatedInstanceList : instanceList){
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();
834 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
835 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
836 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
837 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
838 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
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.
855 VnfResource vnfResource = null;
856 VnfResourceCustomization vrc;
857 // Validation for vnfResource
859 if(modelCustomizationId!=null) {
860 vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
862 Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
863 if(service == null) {
864 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
867 if(service == null) {
868 throw new ValidationException("service in relatedInstance");
871 vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
873 vnfResource = vrc.getVnfResource();
874 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
875 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
879 if(vnfResource==null){
880 throw new ValidationException("catalog entry");
882 if(modelInfo.getModelVersionId() == null) {
883 modelInfo.setModelVersionId(vnfResource.getModelUuid());
887 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultVnfType, action.name());
889 if (vnfRecipe == null) {
893 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
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).
907 if(!msoRequest.getALaCarteFlag()) {
908 VfModuleCustomization vfmc = null;
909 VnfResourceCustomization vnfrc;
910 VfModule vfModule = null;
912 if( modelInfo.getModelCustomizationId() != null) {
913 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
915 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
917 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
920 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
922 String vfModuleModelUUID = modelInfo.getModelVersionId();
923 for(VfModuleCustomization vf : list) {
924 if(vfModuleModelUUID != null) {
925 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
927 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
930 if(vfModule != null) {
931 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
932 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
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
944 if(modelInfo.getModelVersionId() == null) {
945 modelInfo.setModelVersionId(vfModule.getModelUUID());
947 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
951 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultVnfType, vnfComponentType, action.name());
952 if (recipe == null) {
953 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
962 msoLogger.debug("recipe is null, getting default");
964 if(modelInfo.getModelType().equals(ModelType.vnf)) {
965 recipe = db.getVnfRecipe(defaultVnfType, action.name());
966 if (recipe == null) {
970 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("VID_DEFAULT", vnfComponentType, action.name());
972 if (recipe == null) {
978 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
981 private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
983 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
985 ModelInfo modelInfo = msoRequest.getModelInfo();
986 String modelName = modelInfo.getModelName();
988 if(msoRequest.getALaCarteFlag()){
989 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
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());
997 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
999 throw new ValidationException("no catalog entry found");
1002 //ok for version < 3 and action delete
1003 recipe = db.getNetworkRecipe(modelName, action.name());
1006 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1009 if (recipe == null) {
1012 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());