Initial OpenECOMP MSO commit
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.mso.apihandlerinfra;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25
26 import javax.ws.rs.Consumes;
27 import javax.ws.rs.DELETE;
28 import javax.ws.rs.POST;
29 import javax.ws.rs.PUT;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.Produces;
33 import javax.ws.rs.core.MediaType;
34 import javax.ws.rs.core.Response;
35
36 import org.apache.http.HttpResponse;
37 import org.apache.http.HttpStatus;
38 import org.codehaus.jackson.map.ObjectMapper;
39
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.apihandlerinfra.serviceinstancebeans.RelatedInstance;
45 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
46 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestReferences;
47 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
48 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesResponse;
49 import org.openecomp.mso.db.catalog.CatalogDatabase;
50 import org.openecomp.mso.db.catalog.beans.Recipe;
51 import org.openecomp.mso.db.catalog.beans.Service;
52 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
53 import org.openecomp.mso.db.catalog.beans.VfModule;
54 import org.openecomp.mso.db.catalog.beans.VnfComponentsRecipe;
55 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
56 import org.openecomp.mso.logger.MessageEnum;
57 import org.openecomp.mso.logger.MsoAlarmLogger;
58 import org.openecomp.mso.logger.MsoLogger;
59 import org.openecomp.mso.properties.MsoJavaProperties;
60 import org.openecomp.mso.properties.MsoPropertiesFactory;
61 import org.openecomp.mso.requestsdb.InfraActiveRequests;
62 import org.openecomp.mso.requestsdb.RequestsDatabase;
63 import org.openecomp.mso.utils.UUIDChecker;
64
65 @Path("/serviceInstances/v2")
66 public class ServiceInstances {
67
68     private HashMap<String, String> instanceIdMap = new HashMap<String,String>();
69
70     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
71
72     private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
73
74     public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
75
76     private static MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
77
78     /**
79          * 
80          */
81         public ServiceInstances() {
82                 // TODO Auto-generated constructor stub
83         }
84
85         @POST
86         @Path("/")
87         @Consumes(MediaType.APPLICATION_JSON)
88         @Produces(MediaType.APPLICATION_JSON)
89         public Response createServiceInstance(String request) {
90                                 
91                 Response response = serviceInstances(request, Action.createInstance, null);
92                 
93                 return response;
94         }
95         
96         @DELETE
97         @Path("/{serviceInstanceId}")
98         @Consumes(MediaType.APPLICATION_JSON)
99         @Produces(MediaType.APPLICATION_JSON)
100         public Response deleteServiceInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
101                 
102                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
103                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
104                 return response;
105         }
106         
107         @POST
108         @Path("/{serviceInstanceId}/vnfs")
109         @Consumes(MediaType.APPLICATION_JSON)
110         @Produces(MediaType.APPLICATION_JSON)
111         public Response createVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
112                 
113                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
114                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
115                 
116                 return response;
117         }
118         
119         @DELETE
120         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}")
121         @Consumes(MediaType.APPLICATION_JSON)
122         @Produces(MediaType.APPLICATION_JSON)
123         public Response deleteVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
124                                                                                                           @PathParam("vnfInstanceId") String vnfInstanceId) {
125                 
126                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
127                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
128                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
129                 
130                 return response;
131         }
132         
133         @POST
134         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
135         @Consumes(MediaType.APPLICATION_JSON)
136         @Produces(MediaType.APPLICATION_JSON)
137         public Response createVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId, 
138                                                                                                                    @PathParam("vnfInstanceId") String vnfInstanceId) {
139                 
140                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
141                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
142                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
143                 
144                 return response;
145         }
146         
147         @PUT
148         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
149         @Consumes(MediaType.APPLICATION_JSON)
150         @Produces(MediaType.APPLICATION_JSON)
151         public Response updateVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId, 
152                                                                                                                    @PathParam("vnfInstanceId") String vnfInstanceId,
153                                                                                                                    @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
154                 
155                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
156                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
157                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
158                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
159                 
160                 return response;
161         }
162         
163         @DELETE
164         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
165         @Consumes(MediaType.APPLICATION_JSON)
166         @Produces(MediaType.APPLICATION_JSON)
167         public Response deleteVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
168                                                                                                                                                 @PathParam("vnfInstanceId") String vnfInstanceId,
169                                                                                                                                                 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
170                 
171                 
172                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
173                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
174                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
175                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
176                 
177                 return response;
178         }
179         
180         
181         @POST
182         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
183         @Consumes(MediaType.APPLICATION_JSON)
184         @Produces(MediaType.APPLICATION_JSON)
185         public Response createVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
186                                                                                        @PathParam("vnfInstanceId") String vnfInstanceId) {
187                 
188                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
189                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
190                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
191                 
192                 return response;
193         }
194         
195         @PUT
196         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
197         @Consumes(MediaType.APPLICATION_JSON)
198         @Produces(MediaType.APPLICATION_JSON)
199         public Response updateVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
200                                                                                                                                                    @PathParam("vnfInstanceId") String vnfInstanceId,
201                                                                                                                                                    @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
202                 
203                 
204                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
205                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
206                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
207                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
208                 
209                 return response;
210         }
211         
212         @DELETE
213         @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
214         @Consumes(MediaType.APPLICATION_JSON)
215         @Produces(MediaType.APPLICATION_JSON)
216         public Response deleteVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
217                                                                                                                                                    @PathParam("vnfInstanceId") String vnfInstanceId,
218                                                                                                                                                    @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
219                 
220                 
221                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
222                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
223                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
224                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
225                 
226                 return response;
227         }
228         
229         @POST
230         @Path("/{serviceInstanceId}/networks")
231         @Consumes(MediaType.APPLICATION_JSON)
232         @Produces(MediaType.APPLICATION_JSON)
233         public Response createNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
234                 
235                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
237                 
238                 return response;
239         }
240         
241         @PUT
242         @Path("/{serviceInstanceId}/networks/{networkInstanceId}")
243         @Consumes(MediaType.APPLICATION_JSON)
244         @Produces(MediaType.APPLICATION_JSON)
245         public Response updateNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
246                                                                                                                                            @PathParam("networkInstanceId") String networkInstanceId) {
247                 
248                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
249                 instanceIdMap.put("networkInstanceId", networkInstanceId);
250                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
251                 
252                 return response;
253         } 
254         
255         @DELETE
256         @Path("/{serviceInstanceId}/networks/{networkInstanceId}")
257         @Consumes(MediaType.APPLICATION_JSON)
258         @Produces(MediaType.APPLICATION_JSON)
259         public Response deleteNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
260                                                                                                                                            @PathParam("networkInstanceId") String networkInstanceId) {
261                 
262                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
263                 instanceIdMap.put("networkInstanceId", networkInstanceId);
264                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
265                 
266                 return response;
267         } 
268     
269     
270         
271         private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap) {
272                 
273            String requestId = UUIDChecker.generateUUID(msoLogger);
274            long startTime = System.currentTimeMillis ();
275            msoLogger.debug ("requestId is: " + requestId);
276            ServiceInstancesRequest sir = null;
277            
278            MsoRequest msoRequest = new MsoRequest (requestId);
279            
280            
281            try{
282         ObjectMapper mapper = new ObjectMapper();
283         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
284         
285        } catch(Exception e){
286            msoLogger.debug ("Mapping of request to JSON object failed : ", e);
287            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException, 
288                    "Mapping of request to JSON object failed.  " + e.getMessage(), 
289                    ErrorNumbers.SVC_BAD_PARAMETER, null);
290            if (msoRequest.getRequestId () != null) {
291                msoLogger.debug ("Mapping of request to JSON object failed");
292                msoRequest.createRequestRecord (Status.FAILED, action);
293            }
294            msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
295            msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
296            msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
297            return response;
298        } 
299            
300           
301            try{
302                    msoRequest.parse(sir, instanceIdMap, action);
303        } catch (Exception e) {
304            msoLogger.debug ("Validation failed: ", e);
305            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException, 
306                    "Error parsing request.  " + e.getMessage(), 
307                    ErrorNumbers.SVC_BAD_PARAMETER, null);
308            if (msoRequest.getRequestId () != null) {
309                msoLogger.debug ("Logging failed message to the database");
310                msoRequest.createRequestRecord (Status.FAILED, action);
311            }
312            msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
313            msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
314            msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
315            return response;
316        }
317            
318            InfraActiveRequests dup = null;
319            String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
320            String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
321        try {
322                  dup = RequestsDatabase.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
323                                  
324           } catch (Exception e) {
325            msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
326                        
327           Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException, 
328                                                                  e.getMessage(), 
329                                                                  ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
330                                                                  null) ;
331           
332           
333           msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
334           msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
335           return response;
336        }
337               
338        if (dup != null) {
339                  // Found the duplicate record. Return the appropriate error.
340                    String instance = null;
341                    if(instanceName != null){
342                            instance = instanceName;
343                    }else{
344                            instance = instanceIdMap.get(requestScope + "InstanceId");
345                    }
346                    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.";
347            //List<String> variables = new ArrayList<String>();
348            //variables.add(dup.getRequestStatus());
349            
350            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException, 
351                    dupMessage, 
352                    ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
353                    null) ;
354            
355            
356            msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
357            msoRequest.createRequestRecord (Status.FAILED, action);
358            msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
359            msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
360            return response;
361        }
362            
363            
364            ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
365            
366            RequestReferences referencesResponse = new RequestReferences();
367            
368            referencesResponse.setRequestId(requestId);
369            
370            serviceResponse.setRequestReferences(referencesResponse);    
371                    
372        try (CatalogDatabase db = new CatalogDatabase()){
373
374            RecipeLookupResult recipeLookupResult = null;
375            try {
376                recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
377            } catch (Exception e) {
378                msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
379                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
380                Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
381                        MsoException.ServiceException,
382                        "Recipe could not be retrieved from catalog DB " + e.getMessage (),
383                        ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
384                        null);
385                alarmLogger.sendAlarm ("MsoDatabaseAccessError",
386                        MsoAlarmLogger.CRITICAL,
387                        Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
388                msoRequest.createRequestRecord (Status.FAILED,action);
389                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
390                msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
391                db.close();
392                return response;
393            }
394
395            if (recipeLookupResult == null) {
396                msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
397                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
398                Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
399                        MsoException.ServiceException,
400                        "Recipe does not exist in catalog DB",
401                        ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
402                        null);
403                msoRequest.createRequestRecord (Status.FAILED, action);
404                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
405                msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
406                db.close();
407                return response;
408            }
409
410
411            Boolean isBaseVfModule = false;
412
413            if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
414                String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
415
416                // Get VF Module-specific base module indicator
417                VfModule vfm = null;
418
419                if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
420                    vfm = db.getVfModuleType (msoRequest.getVfModuleType (), asdcServiceModelVersion);
421                }
422                else {
423                    vfm = db.getVfModuleType (msoRequest.getVfModuleType ());
424                }
425
426                if (vfm != null) {
427                    if (vfm.getIsBase() == 1) {
428                        isBaseVfModule = true;
429                    }
430                }
431                else if (action == Action.createInstance || action == Action.updateInstance){
432                    // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
433                    // This request cannot proceed
434                    msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
435                    msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
436                    String serviceVersionText = "";
437                    if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
438                        serviceVersionText = " with version " + asdcServiceModelVersion;
439                    }
440                    Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
441                            MsoException.ServiceException,
442                            "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
443                            ErrorNumbers.SVC_BAD_PARAMETER,
444                            null);
445                    msoRequest.createRequestRecord (Status.FAILED, action);
446                    msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
447                    msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
448                    db.close();
449                    return response;
450                }
451            }
452
453            db.close();
454
455            String serviceInstanceId = "";
456            String vnfId = "";
457            String vfModuleId = "";
458            String volumeGroupId = "";
459            String networkId = "";
460            ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
461
462            if(siReq.getServiceInstanceId () != null){
463                serviceInstanceId = siReq.getServiceInstanceId ();
464            }
465
466            if(siReq.getVnfInstanceId () != null){
467                vnfId = siReq.getVnfInstanceId ();
468            }
469
470            if(siReq.getVfModuleInstanceId () != null){
471                vfModuleId = siReq.getVfModuleInstanceId ();
472            }
473
474            if(siReq.getVolumeGroupInstanceId () != null){
475                volumeGroupId = siReq.getVolumeGroupInstanceId ();
476            }
477
478            if(siReq.getNetworkInstanceId () != null){
479                networkId = siReq.getNetworkInstanceId ();
480            }
481
482
483            requestId = msoRequest.getRequestId ();
484            msoLogger.debug ("requestId is: " + requestId);
485            msoLogger.debug ("About to insert a record");
486
487            try {
488                msoRequest.createRequestRecord (Status.PENDING, action);
489            } catch (Exception e) {
490                msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
491                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
492                Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
493                        MsoException.ServiceException,
494                        "Exception while creating record in DB " + e.getMessage(),
495                        ErrorNumbers.SVC_BAD_PARAMETER,
496                        null);
497                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
498                msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
499                return response;
500            }
501
502            RequestClient requestClient = null;
503            HttpResponse response = null;
504            long subStartTime = System.currentTimeMillis();
505            try {
506                requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), props);
507                // Capture audit event
508                msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
509
510                System.out.println("URL : " + requestClient.getUrl ());
511
512                response = requestClient.post(requestId, isBaseVfModule, recipeLookupResult.getRecipeTimeout (), action.name (),
513                        serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId,
514                        msoRequest.getServiceInstanceType (),
515                        msoRequest.getVnfType (), msoRequest.getVfModuleType (),
516                        msoRequest.getNetworkType (), requestJSON);
517
518                msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
519            } catch (Exception e) {
520                msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
521                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
522                Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
523                        MsoException.ServiceException,
524                        "Failed calling bpmn " + e.getMessage (),
525                        ErrorNumbers.SVC_NO_SERVER_RESOURCES,
526                        null);
527                alarmLogger.sendAlarm ("MsoConfigurationError",
528                        MsoAlarmLogger.CRITICAL,
529                        Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
530                msoRequest.updateFinalStatus (Status.FAILED);
531                msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
532                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
533                msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
534                return resp;
535            }
536
537            if (response == null) {
538                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
539                Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
540                        MsoException.ServiceException,
541                        "bpelResponse is null",
542                        ErrorNumbers.SVC_NO_SERVER_RESOURCES,
543                        null);
544                msoRequest.updateFinalStatus (Status.FAILED);
545                msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
546                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
547                msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
548                return resp;
549            }
550
551            ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
552            int bpelStatus = respHandler.getStatus ();
553
554            // BPEL accepted the request, the request is in progress
555            if (bpelStatus == HttpStatus.SC_ACCEPTED) {
556                String camundaJSONResponseBody = respHandler.getResponseBody ();
557                msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
558                msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
559                RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
560                        Status.IN_PROGRESS.toString (),
561                        Constants.PROGRESS_REQUEST_IN_PROGRESS,
562                        Constants.MODIFIED_BY_APIHANDLER);
563                msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
564                msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
565                return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
566            } else {
567                List<String> variables = new ArrayList<String>();
568                variables.add(bpelStatus + "");
569                String camundaJSONResponseBody = respHandler.getResponseBody ();
570                if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
571                    msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
572                    Response resp =  msoRequest.buildServiceErrorResponse(bpelStatus,
573                            MsoException.ServiceException,
574                            "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
575                            ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
576                            variables);
577                    msoRequest.updateFinalStatus (Status.FAILED);
578                    msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
579                    msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
580                    msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
581                    return resp;
582                } else {
583                    msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
584                    Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
585                            MsoException.ServiceException,
586                            "Request Failed due to BPEL error with HTTP Status= %1" ,
587                            ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
588                            variables);
589                    msoRequest.updateFinalStatus (Status.FAILED);
590                    msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
591                    msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
592                    msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
593                    return resp;
594                }
595            }
596
597            //return Response.status (HttpStatus.SC_ACCEPTED).entity (serviceResponse).build ();
598            // return serviceResponse;
599        } catch (Exception e) {
600            msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
601            msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
602            Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
603                                                                                                                                   MsoException.ServiceException,
604                                                                                       "No communication to catalog DB " + e.getMessage (),
605                                                                   ErrorNumbers.SVC_NO_SERVER_RESOURCES,
606                                                                   null);
607            alarmLogger.sendAlarm ("MsoDatabaseAccessError",
608                                   MsoAlarmLogger.CRITICAL,
609                                   Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
610            msoRequest.createRequestRecord (Status.FAILED,action);
611            msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
612            msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
613            return response;
614        }
615         }
616         
617     private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
618
619         RecipeLookupResult recipeLookupResult = null;
620         // Query MSO Catalog DB
621                
622         if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
623                 
624         // SERVICE REQUEST
625                 // Construct the default service name
626             // TODO need to make this a configurable property
627             
628             String defaultServiceName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
629                 Service serviceRecord = db.getServiceByName(defaultServiceName);
630                 int serviceId = serviceRecord.getId();
631                 ServiceRecipe recipe = db.getServiceRecipe(serviceId, action.name());
632                 
633                 if (recipe == null) {                 
634                 return null;
635             }   
636                 
637                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());                
638         }
639         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
640                         msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
641                 
642                 String vnfComponentType = msoRequest.getModelInfo().getModelType().name();
643                 VnfComponentsRecipe recipe = null;
644                 
645                 if (action != Action.deleteInstance) {
646                         RelatedInstanceList[] instanceList = null;
647                         if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
648                                 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
649                         }
650                         
651                         String serviceModelName = null;
652                         String vnfModelName = null;
653                         String vfModuleModelName = null;
654                         String asdcServiceModelVersion = null;
655                         String modelVersion = null;
656                         
657                         if (instanceList != null) {
658                         
659                                 for(RelatedInstanceList relatedInstanceList : instanceList){
660                                         
661                                         RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
662                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
663                                                 serviceModelName = relatedInstance.getModelInfo().getModelName();
664                                                 asdcServiceModelVersion = relatedInstance.getModelInfo().getModelVersion();
665                                         }
666                                         
667                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)){
668                                                 vnfModelName = relatedInstance.getModelInfo().getModelCustomizationName();
669                                         }
670                                         
671                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vfModule) ||
672                                                         relatedInstance.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
673                                                 vfModuleModelName = relatedInstance.getModelInfo().getModelName();
674                                                 modelVersion = relatedInstance.getModelInfo().getModelVersion();
675                                         }                       
676                                 }
677                         }
678                         
679                         String vnfType = serviceModelName + "/" + vnfModelName;
680                         
681                         // Try to find a recipe for a custom flow first
682                         recipe = db.getVnfComponentsRecipe(vnfType, vfModuleModelName, asdcServiceModelVersion, modelVersion, action.name());
683                 }
684                 
685                 if (recipe == null) {
686                         // Find the default recipe record
687                         recipe = db.getVnfComponentsRecipeByVfModuleId("VID_DEFAULT", vnfComponentType, action.name());
688                         
689                         if (recipe == null) {                              
690                                 return null;
691                         }
692             }                   
693                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());                
694                 
695         }
696         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
697                 // VNF REQUEST
698                 // Construct the default vnf type
699             // TODO need to make this a configurable property
700             
701             String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
702                 
703                 VnfRecipe recipe = db.getVnfRecipe(defaultVnfType, action.name());
704                 
705                 if (recipe == null) {               
706                 return null;
707             }                   
708                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());        
709         }
710         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
711                 // NETWORK REQUEST
712                 // Construct the default network type
713             // TODO need to make this a configurable property
714             
715             String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
716                 
717                 Recipe recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
718                 
719                 if (recipe == null) {                
720                 return null;
721             }                   
722                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());   
723         }       
724         
725         if (recipeLookupResult != null) {
726                 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
727         }
728         else {
729                 msoLogger.debug("No matching recipe record found");
730         }
731         return recipeLookupResult;
732     }
733
734 }