Merge "Fix App Yamls"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.so.apihandlerinfra;
23
24
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
26 import com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.logging.ref.slf4j.ONAPLogConstants;
36 import org.onap.so.apihandler.camundabeans.CamundaResponse;
37 import org.onap.so.apihandler.common.CommonConstants;
38 import org.onap.so.apihandler.common.ErrorNumbers;
39 import org.onap.so.apihandler.common.RequestClient;
40 import org.onap.so.apihandler.common.RequestClientFactory;
41 import org.onap.so.apihandler.common.RequestClientParameter;
42 import org.onap.so.apihandler.common.ResponseBuilder;
43 import org.onap.so.apihandler.common.ResponseHandler;
44 import org.onap.so.apihandlerinfra.exceptions.ApiException;
45 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
46 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
47 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
48 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
49 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
50 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
51 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
52 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
53 import org.onap.so.db.catalog.beans.NetworkResource;
54 import org.onap.so.db.catalog.beans.Recipe;
55 import org.onap.so.db.catalog.beans.ServiceRecipe;
56 import org.onap.so.db.catalog.beans.VfModule;
57 import org.onap.so.db.catalog.beans.VfModuleCustomization;
58 import org.onap.so.db.catalog.beans.VnfRecipe;
59 import org.onap.so.db.catalog.beans.VnfResource;
60 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
61 import org.onap.so.db.catalog.client.CatalogDbClient;
62 import org.onap.so.db.request.beans.InfraActiveRequests;
63 import org.onap.so.db.request.client.RequestsDbClient;
64 import org.onap.so.exceptions.ValidationException;
65 import org.onap.so.logger.MessageEnum;
66 import org.onap.so.logger.MsoLogger;
67 import org.onap.so.serviceinstancebeans.CloudConfiguration;
68 import org.onap.so.serviceinstancebeans.ModelInfo;
69 import org.onap.so.serviceinstancebeans.ModelType;
70 import org.onap.so.serviceinstancebeans.Networks;
71 import org.onap.so.serviceinstancebeans.RelatedInstance;
72 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
73 import org.onap.so.serviceinstancebeans.RequestDetails;
74 import org.onap.so.serviceinstancebeans.RequestParameters;
75 import org.onap.so.serviceinstancebeans.RequestReferences;
76 import org.onap.so.serviceinstancebeans.Service;
77 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
78 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
79 import org.onap.so.serviceinstancebeans.VfModules;
80 import org.onap.so.serviceinstancebeans.Vnfs;
81 import org.onap.so.utils.UUIDChecker;
82 import org.springframework.beans.factory.annotation.Autowired;
83 import org.springframework.core.env.Environment;
84 import org.springframework.stereotype.Component;
85
86 import javax.transaction.Transactional;
87 import javax.ws.rs.Consumes;
88 import javax.ws.rs.DELETE;
89 import javax.ws.rs.POST;
90 import javax.ws.rs.PUT;
91 import javax.ws.rs.Path;
92 import javax.ws.rs.PathParam;
93 import javax.ws.rs.Produces;
94 import javax.ws.rs.container.ContainerRequestContext;
95 import javax.ws.rs.core.Context;
96 import javax.ws.rs.core.MediaType;
97 import javax.ws.rs.core.MultivaluedMap;
98 import javax.ws.rs.core.Response;
99 import java.io.IOException;
100 import java.net.URL;
101 import java.sql.Timestamp;
102 import java.util.ArrayList;
103 import java.util.HashMap;
104 import java.util.List;
105 import java.util.Map;
106 import java.util.Optional;
107
108 @Component
109 @Path("/onap/so/infra/serviceInstantiation")
110 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
111 public class ServiceInstances {
112
113         private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
114         private static String NAME = "name";
115         private static String VALUE = "value";
116         private static final String SAVE_TO_DB = "save instance to db";
117
118         @Autowired
119         private Environment env;
120         
121         @Autowired
122         private RequestClientFactory reqClientFactory;
123         
124         @Autowired
125         private CatalogDbClient catalogDbClient;
126
127         @Autowired
128         private RequestsDbClient infraActiveRequestsClient;
129         
130         @Autowired
131         private ResponseBuilder builder;
132         
133         @Autowired
134         private MsoRequest msoRequest;
135         
136         @POST
137     @Path("/{version:[vV][5-7]}/serviceInstances")
138         @Consumes(MediaType.APPLICATION_JSON)
139         @Produces(MediaType.APPLICATION_JSON)
140         @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
141         @Transactional
142     public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
143                 String requestId = getRequestId(requestContext);
144                 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
145         }
146         
147         @POST
148         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
149         @Consumes(MediaType.APPLICATION_JSON)
150         @Produces(MediaType.APPLICATION_JSON)
151         @ApiOperation(value="Activate provided Service Instance",response=Response.class)
152         @Transactional
153     public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
154                 String requestId = getRequestId(requestContext);
155                 HashMap<String, String> instanceIdMap = new HashMap<>();
156                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
157                 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
158         }
159         
160         @POST
161         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
162         @Consumes(MediaType.APPLICATION_JSON)
163         @Produces(MediaType.APPLICATION_JSON)
164         @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
165         @Transactional
166     public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
167                 String requestId = getRequestId(requestContext);
168                 HashMap<String, String> instanceIdMap = new HashMap<>();
169                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
170                 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
171         }
172         
173         @DELETE
174         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
175         @Consumes(MediaType.APPLICATION_JSON)
176         @Produces(MediaType.APPLICATION_JSON)
177         @ApiOperation(value="Delete provided Service Instance",response=Response.class)
178         @Transactional
179     public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
180                 String requestId = getRequestId(requestContext);
181                 HashMap<String, String> instanceIdMap = new HashMap<>();
182                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
183                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
184         }
185         
186         @POST
187         @Path("/{version:[vV][7]}/serviceInstances/assign")
188         @Consumes(MediaType.APPLICATION_JSON)
189         @Produces(MediaType.APPLICATION_JSON)
190         @ApiOperation(value="Assign Service Instance", response=Response.class)
191         @Transactional
192         public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
193                 String requestId = getRequestId(requestContext);
194                 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
195         }
196
197         @POST
198         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
199         @Consumes(MediaType.APPLICATION_JSON)
200         @Produces(MediaType.APPLICATION_JSON)
201         @ApiOperation(value="Unassign Service Instance", response=Response.class)
202         @Transactional
203         public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
204                 String requestId = getRequestId(requestContext);
205                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
206                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
207                 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
208         }
209         
210         @POST
211         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
212         @Consumes(MediaType.APPLICATION_JSON)
213         @Produces(MediaType.APPLICATION_JSON)
214         @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
215         @Transactional
216     public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
217                 String requestId = getRequestId(requestContext);
218                 HashMap<String, String> instanceIdMap = new HashMap<>();
219                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
220                 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
221         }
222         
223         @DELETE
224         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
225         @Consumes(MediaType.APPLICATION_JSON)
226         @Produces(MediaType.APPLICATION_JSON)
227         @ApiOperation(value="Delete provided Port",response=Response.class)
228         @Transactional
229         public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
230                                             @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
231                 String requestId = getRequestId(requestContext);
232                 HashMap<String, String> instanceIdMap = new HashMap<>();
233                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
234                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
235                 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
236         }
237         
238         @POST
239         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
240         @Consumes(MediaType.APPLICATION_JSON)
241         @Produces(MediaType.APPLICATION_JSON)
242         @ApiOperation(value="Enable Port Mirroring",response=Response.class)
243         @Transactional
244         public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
245                                @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
246                 String requestId = getRequestId(requestContext);
247                 HashMap<String, String> instanceIdMap = new HashMap<>();
248                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
249                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
250                 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
251         }
252         
253         @POST
254         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
255         @Consumes(MediaType.APPLICATION_JSON)
256         @Produces(MediaType.APPLICATION_JSON)
257         @ApiOperation(value="Disable Port Mirroring",response=Response.class)
258         @Transactional
259         public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
260                                 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
261                 String requestId = getRequestId(requestContext);
262                 HashMap<String, String> instanceIdMap = new HashMap<>();
263                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
264                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
265                 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
266         }
267         
268         @POST
269         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
270         @Consumes(MediaType.APPLICATION_JSON)
271         @Produces(MediaType.APPLICATION_JSON)
272         @ApiOperation(value="Activate Port Mirroring",response=Response.class)
273         @Transactional
274         public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
275                                  @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
276                 String requestId = getRequestId(requestContext);
277                 HashMap<String, String> instanceIdMap = new HashMap<>();
278                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
279                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
280                 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
281         }
282         
283         @POST
284         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
285         @Consumes(MediaType.APPLICATION_JSON)
286         @Produces(MediaType.APPLICATION_JSON)
287         @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
288         @Transactional
289         public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
290                                    @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
291                 String requestId = getRequestId(requestContext);
292                 HashMap<String, String> instanceIdMap = new HashMap<>();
293                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
294                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
295                 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
296         }
297
298         @POST
299         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
300         @Consumes(MediaType.APPLICATION_JSON)
301         @Produces(MediaType.APPLICATION_JSON)
302         @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
303         @Transactional
304     public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
305                 String requestId = getRequestId(requestContext);
306                 HashMap<String, String> instanceIdMap = new HashMap<>();
307                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
308                 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
309         }
310         
311         @POST
312         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
313         @Consumes(MediaType.APPLICATION_JSON)
314         @Produces(MediaType.APPLICATION_JSON)
315         @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
316         @Transactional
317     public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
318                 String requestId = getRequestId(requestContext);
319                 HashMap<String, String> instanceIdMap = new HashMap<>();
320                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
321                 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
322         }
323         
324         @POST
325         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
326         @Consumes(MediaType.APPLICATION_JSON)
327         @Produces(MediaType.APPLICATION_JSON)
328         @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
329         @Transactional
330     public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
331                 String requestId = getRequestId(requestContext);
332                 HashMap<String, String> instanceIdMap = new HashMap<>();
333                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
334                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
335         }
336         
337         @POST
338         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
339         @Consumes(MediaType.APPLICATION_JSON)
340         @Produces(MediaType.APPLICATION_JSON)
341         @ApiOperation(value="Replace provided VNF instance",response=Response.class)
342         @Transactional
343         public Response replaceVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
344                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
345                 String requestId = getRequestId(requestContext);
346                 HashMap<String, String> instanceIdMap = new HashMap<>();
347                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
348                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
349                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
350         }
351         
352         @PUT
353         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
354         @Consumes(MediaType.APPLICATION_JSON)
355         @Produces(MediaType.APPLICATION_JSON)
356         @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
357         @Transactional
358         public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
359                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
360                 String requestId = getRequestId(requestContext);
361                 HashMap<String, String> instanceIdMap = new HashMap<>();
362                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
363                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
364                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
365         }
366         
367         @POST
368         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
369         @Consumes(MediaType.APPLICATION_JSON)
370         @Produces(MediaType.APPLICATION_JSON)
371         @ApiOperation(value="Apply updated configuration",response=Response.class)
372         public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
373                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
374                 String requestId = getRequestId(requestContext);
375                 HashMap<String, String> instanceIdMap = new HashMap<>();
376                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
377                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
378                 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
379         }
380         
381         @POST
382         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
383         @Consumes(MediaType.APPLICATION_JSON)
384         @Produces(MediaType.APPLICATION_JSON)
385         @ApiOperation(value="Recreate VNF Instance",response=Response.class)
386         public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
387                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
388                 String requestId = getRequestId(requestContext);
389                 HashMap<String, String> instanceIdMap = new HashMap<>();
390                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
391                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
392                 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
393         }
394
395
396         @DELETE
397         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
398         @Consumes(MediaType.APPLICATION_JSON)
399         @Produces(MediaType.APPLICATION_JSON)
400         @ApiOperation(value="Delete provided VNF instance",response=Response.class)
401         @Transactional
402         public Response deleteVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
403                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
404                 String requestId = getRequestId(requestContext);
405                 HashMap<String, String> instanceIdMap = new HashMap<>();
406                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
407                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
408                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
409         }
410
411         @POST
412         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
413         @Consumes(MediaType.APPLICATION_JSON)
414         @Produces(MediaType.APPLICATION_JSON)
415         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
416         @Transactional
417         public Response createVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
418                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
419                 String requestId = getRequestId(requestContext);
420                 HashMap<String, String> instanceIdMap = new HashMap<>();
421                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
422                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
423                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
424         }
425         
426         @POST
427         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
428         @Consumes(MediaType.APPLICATION_JSON)
429         @Produces(MediaType.APPLICATION_JSON)
430         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
431         @Transactional
432         public Response replaceVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
433                         @PathParam("vnfInstanceId") String vnfInstanceId,
434                                             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
435                 String requestId = getRequestId(requestContext);
436                 HashMap<String, String> instanceIdMap = new HashMap<>();
437                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
438                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
439                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
440                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
441         }
442
443         @PUT
444         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
445         @Consumes(MediaType.APPLICATION_JSON)
446         @Produces(MediaType.APPLICATION_JSON)
447         @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
448         @Transactional
449         public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
450                         @PathParam("vnfInstanceId") String vnfInstanceId,
451                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
452                 String requestId = getRequestId(requestContext);
453                 HashMap<String, String> instanceIdMap = new HashMap<>();
454                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
455                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
456                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
457                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
458         }
459         
460         @POST
461         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
462         @Consumes(MediaType.APPLICATION_JSON)
463         @Produces(MediaType.APPLICATION_JSON)
464         @ApiOperation(value="Perform VNF software update",response=Response.class)
465         @Transactional
466         public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
467                                           @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
468                 String requestId = getRequestId(requestContext);
469                 HashMap<String, String> instanceIdMap = new HashMap<>();
470                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
471                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
472                 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
473         }
474         
475         @DELETE
476         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
477         @Consumes(MediaType.APPLICATION_JSON)
478         @Produces(MediaType.APPLICATION_JSON)
479         @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
480         @Transactional
481         public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
482                         @PathParam("vnfInstanceId") String vnfInstanceId,
483                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
484                 String requestId = getRequestId(requestContext);
485                 HashMap<String, String> instanceIdMap = new HashMap<>();
486                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
487                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
488                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
489                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
490         }
491         
492         @POST
493         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
494         @Consumes(MediaType.APPLICATION_JSON)
495         @Produces(MediaType.APPLICATION_JSON)
496         @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
497         @Transactional
498         public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
499                         @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
500                 String requestId = getRequestId(requestContext);
501                 HashMap<String, String> instanceIdMap = new HashMap<>();
502                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
503                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
504                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
505                 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
506                 return response;
507         }
508         
509         @POST
510         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
511         @Consumes(MediaType.APPLICATION_JSON)
512         @Produces(MediaType.APPLICATION_JSON)
513         @ApiOperation(value="VF Auto Scale Out",response=Response.class)
514         @Transactional
515         public Response scaleOutVfModule(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
516                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
517                 String requestId = getRequestId(requestContext);
518                 HashMap<String, String> instanceIdMap = new HashMap<>();
519                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
520                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
521                 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
522         }
523
524
525         @POST
526         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
527         @Consumes(MediaType.APPLICATION_JSON)
528         @Produces(MediaType.APPLICATION_JSON)
529         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
530         @Transactional
531         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
532                                               @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
533                 String requestId = getRequestId(requestContext);
534                 HashMap<String, String> instanceIdMap = new HashMap<>();
535                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
536                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
537                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
538         }
539
540         @PUT
541         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
542         @Consumes(MediaType.APPLICATION_JSON)
543         @Produces(MediaType.APPLICATION_JSON)
544         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
545         @Transactional
546         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
547                         @PathParam("vnfInstanceId") String vnfInstanceId,
548                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
549                 String requestId = getRequestId(requestContext);
550                 HashMap<String, String> instanceIdMap = new HashMap<>();
551                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
552                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
553                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
554                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
555         }
556
557         @DELETE
558         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
559         @Consumes(MediaType.APPLICATION_JSON)
560         @Produces(MediaType.APPLICATION_JSON)
561         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
562         @Transactional
563         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
564                         @PathParam("vnfInstanceId") String vnfInstanceId,
565                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
566                 String requestId = getRequestId(requestContext);
567                 HashMap<String, String> instanceIdMap = new HashMap<>();
568                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
569                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
570                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
571                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
572         }
573
574         @POST
575         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
576         @Consumes(MediaType.APPLICATION_JSON)
577         @Produces(MediaType.APPLICATION_JSON)
578         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
579         @Transactional
580     public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
581                 String requestId = getRequestId(requestContext);
582                 HashMap<String, String> instanceIdMap = new HashMap<>();
583                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
584                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
585         }
586
587         @PUT
588         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
589         @Consumes(MediaType.APPLICATION_JSON)
590         @Produces(MediaType.APPLICATION_JSON)
591         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
592         @Transactional
593         public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
594                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
595                 String requestId = getRequestId(requestContext);
596                 HashMap<String, String> instanceIdMap = new HashMap<>();
597                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
598                 instanceIdMap.put("networkInstanceId", networkInstanceId);
599                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
600         }
601
602         @DELETE
603         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
604         @Consumes(MediaType.APPLICATION_JSON)
605         @Produces(MediaType.APPLICATION_JSON)
606         @ApiOperation(value="Delete provided Network instance",response=Response.class)
607         @Transactional
608         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
609                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
610                 String requestId = getRequestId(requestContext);
611                 HashMap<String, String> instanceIdMap = new HashMap<>();
612                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
613                 instanceIdMap.put("networkInstanceId", networkInstanceId);
614                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
615         }
616         
617         @POST
618     @Path("/{version:[vV][7]}/instanceGroups")
619         @Consumes(MediaType.APPLICATION_JSON)
620         @Produces(MediaType.APPLICATION_JSON)
621         @ApiOperation(value="Create instanceGroups",response=Response.class)
622         @Transactional
623     public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
624                 String requestId = getRequestId(requestContext);
625                 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
626         }
627         
628         @DELETE
629         @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
630         @Consumes(MediaType.APPLICATION_JSON)
631         @Produces(MediaType.APPLICATION_JSON)
632         @ApiOperation(value="Delete instanceGroup",response=Response.class)
633         @Transactional
634         public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
635                 String requestId = getRequestId(requestContext);
636                 HashMap<String, String> instanceIdMap = new HashMap<>();
637                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
638                 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
639         }
640         
641         @POST
642     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
643         @Consumes(MediaType.APPLICATION_JSON)
644         @Produces(MediaType.APPLICATION_JSON)
645         @ApiOperation(value="Add instanceGroup members",response=Response.class)
646         @Transactional
647     public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
648                 String requestId = getRequestId(requestContext);
649                 HashMap<String, String> instanceIdMap = new HashMap<>();
650                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
651                 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
652         }
653         
654         @POST
655     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
656         @Consumes(MediaType.APPLICATION_JSON)
657         @Produces(MediaType.APPLICATION_JSON)
658         @ApiOperation(value="Remove instanceGroup members",response=Response.class)
659         @Transactional
660     public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
661                 String requestId = getRequestId(requestContext);
662                 HashMap<String, String> instanceIdMap = new HashMap<>();
663                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
664                 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
665         }
666
667         public String getRequestUri(ContainerRequestContext context){
668                 String requestUri = context.getUriInfo().getPath();
669                 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
670                 return requestUri;
671         }
672         
673         public void validateHeaders(ContainerRequestContext context) throws ValidationException{
674                 MultivaluedMap<String, String> headers = context.getHeaders();
675                 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
676                          throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
677                 }
678                 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
679                         throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
680                 }
681                 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
682                         throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
683                 }
684         }
685     
686         public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
687                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
688                 Boolean aLaCarte = null;
689                 long startTime = System.currentTimeMillis ();
690                 ServiceInstancesRequest sir = null;
691                 String apiVersion = version.substring(1);
692                 
693                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
694                 String requestScope = deriveRequestScope(action, sir, requestUri);
695                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, requestJSON, requestScope);
696                 if(sir.getRequestDetails().getRequestParameters() != null){
697                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
698                 }
699                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
700                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
701                  
702                 int requestVersion = Integer.parseInt(version.substring(1));
703                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
704                 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
705                 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
706                 String networkType = msoRequest.getNetworkType(sir,requestScope);
707                 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
708                 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
709                 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
710                 
711                 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
712                         currentActiveReq.setVnfType(vnfType);
713                 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
714                         currentActiveReq.setNetworkType(networkType);
715                 }
716                 
717                 InfraActiveRequests dup = null;
718                                 
719
720                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
721
722                 if (dup != null) {
723             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
724                 }
725                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
726
727                 RequestReferences referencesResponse = new RequestReferences();
728
729                 referencesResponse.setRequestId(requestId);
730
731                 serviceResponse.setRequestReferences(referencesResponse);
732                 Boolean isBaseVfModule = false;
733
734         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
735                                                                 
736                         ModelType modelType;
737                         ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
738                         if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
739                                 modelType = ModelType.vnf;
740                         }else if(action == Action.addMembers || action == Action.removeMembers){
741                                 modelType = ModelType.instanceGroup;
742                         }else {
743                                 modelType =modelInfo.getModelType();
744                         }
745
746                         if (modelType.equals(ModelType.vfModule)) {
747                                 
748
749                                 // Get VF Module-specific base module indicator
750                                 VfModule vfm = null;
751
752                                 String modelVersionId = modelInfo.getModelVersionId();
753
754                                 if(modelVersionId != null) {
755                                         vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
756                                 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
757                                         vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
758                                 }
759
760                                 if (vfm != null) {
761                                         if (vfm.getIsBase()) {
762                                                 isBaseVfModule = true;
763                                         }
764             } else if (action == Action.createInstance || action == Action.updateInstance) {
765                                         // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
766                                         // This request cannot proceed
767                                         
768                                         String serviceVersionText = "";
769                                         if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
770                                                 serviceVersionText = " with version " + sdcServiceModelVersion;
771                                         }
772
773                 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
774                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
775                 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
776                 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
777
778                 throw vfModuleException;
779                 }
780                 }
781                 
782                 
783                 serviceInstanceId = "";
784                 String vnfId = "";
785                 String vfModuleId = "";
786                 String volumeGroupId = "";
787                 String networkId = "";
788                 String correlationId = "";
789                 String instanceGroupId = null;
790                 if(sir.getServiceInstanceId () != null){
791                         serviceInstanceId = sir.getServiceInstanceId ();
792                 }
793
794                 if(sir.getVnfInstanceId () != null){
795                         vnfId = sir.getVnfInstanceId ();
796                 }
797
798                 if(sir.getVfModuleInstanceId () != null){
799                         vfModuleId = sir.getVfModuleInstanceId ();
800                 }
801
802                 if(sir.getVolumeGroupInstanceId () != null){
803                         volumeGroupId = sir.getVolumeGroupInstanceId ();
804                 }
805
806                 if(sir.getNetworkInstanceId () != null){
807                         networkId = sir.getNetworkInstanceId ();
808                 }
809                 if(sir.getInstanceGroupId() != null){
810                         instanceGroupId = sir.getInstanceGroupId();
811                 }
812
813         correlationId = getCorrelationId(sir);
814
815         try{
816             infraActiveRequestsClient.save(currentActiveReq);
817         }catch(Exception e){
818             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
819             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
820                     .errorInfo(errorLoggerInfo).build();
821         }
822                 
823                 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
824                         aLaCarte = true;
825                 }else if(aLaCarte == null){
826                         aLaCarte = false;
827                 }
828                 
829                 RequestClientParameter requestClientParameter = null;
830                 try {
831                         requestClientParameter = new RequestClientParameter.Builder()
832                                                 .setRequestId(requestId)
833                                                 .setBaseVfModule(isBaseVfModule)
834                                                 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
835                                                 .setRequestAction(action.toString())
836                                                 .setServiceInstanceId(serviceInstanceId)
837                                                 .setCorrelationId(correlationId)
838                                                 .setVnfId(vnfId)
839                                                 .setVfModuleId(vfModuleId)
840                                                 .setVolumeGroupId(volumeGroupId)
841                                                 .setNetworkId(networkId)
842                                                 .setServiceType(serviceInstanceType)
843                                                 .setVnfType(vnfType)
844                                                 .setVfModuleType(vfModuleType)
845                                                 .setNetworkType(networkType)
846                                                 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
847                                                 .setApiVersion(apiVersion)
848                                                 .setALaCarte(aLaCarte)
849                                                 .setRequestUri(requestUri)
850                                                 .setInstanceGroupId(instanceGroupId).build();
851                 } catch (IOException e) {
852                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
853                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
854                           .errorInfo(errorLoggerInfo).build();
855                 }
856                 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
857         }
858         public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
859                 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
860                 Boolean aLaCarte = true;
861                 long startTime = System.currentTimeMillis ();
862                 String apiVersion = version.substring(1);
863                 ServiceInstancesRequest sir = new ServiceInstancesRequest();
864                 sir.setInstanceGroupId(instanceGroupId);
865         
866                 String requestScope = ModelType.instanceGroup.toString();
867                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, null, requestScope);
868                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
869                 try {
870                         validateHeaders(requestContext);
871                 } catch (ValidationException e) {
872                         msoLogger.error(e);
873             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
874             ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
875                         .errorInfo(errorLoggerInfo).build();
876             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
877             throw validateException;
878                 }
879                 
880                 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
881
882                 if (dup != null) {
883             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
884                 }
885                 
886                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
887
888                 RequestReferences referencesResponse = new RequestReferences();
889
890                 referencesResponse.setRequestId(requestId);
891
892                 serviceResponse.setRequestReferences(referencesResponse);
893                 Boolean isBaseVfModule = false;
894
895         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
896                                                                 
897         try{
898             infraActiveRequestsClient.save(currentActiveReq);
899         }catch(Exception e){
900             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
901             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
902                     .errorInfo(errorLoggerInfo).build();
903         }
904         
905                 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
906                                         .setRequestId(requestId)
907                                         .setBaseVfModule(isBaseVfModule)
908                                         .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
909                                         .setRequestAction(action.toString())
910                                         .setApiVersion(apiVersion)
911                                         .setALaCarte(aLaCarte)
912                                         .setRequestUri(requestUri)
913                                         .setInstanceGroupId(instanceGroupId).build();
914                 
915                 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
916         }
917
918         private String getCorrelationId(ServiceInstancesRequest sir) {
919                 return Optional.of(sir)
920                                 .map(ServiceInstancesRequest::getRequestDetails)
921                                 .map(RequestDetails::getRequestParameters)
922                                 .map(parameters -> parameters.getUserParamValue("pnfId"))
923                                 .orElse("");
924         }
925
926         private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
927                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
928                         return (ModelType.vnf.name());
929                 }else if(action == Action.addMembers || action == Action.removeMembers){
930                         return(ModelType.instanceGroup.toString());
931                 }else{
932                         String requestScope;
933                         if(sir.getRequestDetails().getModelInfo().getModelType() == null){
934                                 requestScope = requestScopeFromUri(requestUri);
935                         }else{
936                                 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name(); 
937                         }
938                         return requestScope; 
939                 }
940         }
941         private String requestScopeFromUri(String requestUri){
942                 String requestScope;
943                 if(requestUri.contains(ModelType.network.name())){
944                         requestScope = ModelType.network.name();
945                 }else if(requestUri.contains(ModelType.vfModule.name())){
946                         requestScope = ModelType.vfModule.name();
947                 }else if(requestUri.contains(ModelType.volumeGroup.name())){
948                         requestScope = ModelType.volumeGroup.name();
949                 }else if(requestUri.contains(ModelType.configuration.name())){
950                         requestScope = ModelType.configuration.name();
951                 }else if(requestUri.contains(ModelType.vnf.name())){
952                         requestScope = ModelType.vnf.name();
953                 }else{
954                         requestScope = ModelType.service.name();
955                 }
956                 return requestScope;
957         }
958         private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
959                 RequestClient requestClient = null;
960                 HttpResponse response = null;
961                 try {
962                         requestClient = reqClientFactory.getRequestClient (orchestrationUri);
963                         response = requestClient.post(requestClientParameter);
964                 } catch (Exception e) {
965                         
966             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
967             String url = requestClient != null ? requestClient.getUrl() : "";
968             ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
969             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
970
971             throw clientException;
972                 }
973
974                 if (response == null) {
975                         
976             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
977             ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
978
979             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
980
981             throw clientException;
982                 }
983
984                 ResponseHandler respHandler = null;
985         int bpelStatus = 500;
986         try {
987             respHandler = new ResponseHandler (response, requestClient.getType ());
988             bpelStatus = respHandler.getStatus ();
989         } catch (ApiException e) {
990             msoLogger.error(e);
991             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
992             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
993                         .errorInfo(errorLoggerInfo).build();
994             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
995             throw validateException;
996         }
997
998                 // BPEL accepted the request, the request is in progress
999                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1000                         ServiceInstancesResponse jsonResponse;
1001                         CamundaResponse camundaResp = respHandler.getResponse();
1002                         
1003                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1004                                 try {
1005                                         ObjectMapper mapper = new ObjectMapper();
1006                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1007                                         jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1008                                         Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1009                                         if(selfLinkUrl.isPresent()){
1010                                                 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1011                                         } else {
1012                                             jsonResponse.getRequestReferences().setRequestSelfLink(null);
1013                                         }    
1014                                 } catch (IOException e) {
1015                                         msoLogger.error(e);
1016                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1017                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1018                                             .errorInfo(errorLoggerInfo).build();
1019                                         updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1020                                         throw validateException;
1021                                 }
1022                         
1023                                 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
1024                                 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
1025                                 
1026                                 try{
1027                                         infraActiveRequestsClient.save(currentActiveReq);
1028                                 }catch(Exception e){
1029                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1030                             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1031                                     .errorInfo(errorLoggerInfo).build();
1032                                 }
1033                                 
1034                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1035                         } 
1036                 }
1037                         
1038                 List<String> variables = new ArrayList<>();
1039                 variables.add(bpelStatus + "");
1040                 String camundaJSONResponseBody = respHandler.getResponseBody ();
1041                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1042                         
1043                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1044                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1045                             .errorInfo(errorLoggerInfo).build();
1046
1047                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1048
1049                     throw bpmnException;
1050                 } else {
1051                 
1052                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1053
1054
1055                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1056                             .errorInfo(errorLoggerInfo).build();
1057                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1058
1059                     throw servException;
1060                 }
1061         }
1062
1063         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1064                 if(StringUtils.isNotBlank(instanceId)) {
1065                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1066                                 currentActiveReq.setServiceInstanceId(instanceId);
1067                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1068                                 currentActiveReq.setVnfId(instanceId);
1069                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1070                                 currentActiveReq.setVfModuleId(instanceId);
1071                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1072                                 currentActiveReq.setVolumeGroupId(instanceId);
1073                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1074                                 currentActiveReq.setNetworkId(instanceId);
1075                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1076                                 currentActiveReq.setConfigurationId(instanceId);
1077                         }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1078                                 currentActiveReq.setInstanceGroupId(instanceId);
1079                         }
1080                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1081                         if(instanceIdMap.get("serviceInstanceId") != null){
1082                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1083                 }
1084                 if(instanceIdMap.get("vnfInstanceId") != null){
1085                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1086                 }
1087                 if(instanceIdMap.get("vfModuleInstanceId") != null){
1088                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1089                 }
1090                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1091                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1092                 }
1093                 if(instanceIdMap.get("networkInstanceId") != null){
1094                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1095                 }
1096                 if(instanceIdMap.get("configurationInstanceId") != null){
1097                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1098                 }
1099                 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1100                         currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1101                 }
1102                 }
1103         }
1104
1105     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1106         ObjectMapper mapper = new ObjectMapper();       
1107         mapper.setSerializationInclusion(Include.NON_NULL);     
1108         if(msoRawRequest != null){
1109                 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
1110                 if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
1111                         serviceInstRequest.getRequestDetails() != null && 
1112                         serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1113                         sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1114                         sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1115                 }
1116                 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
1117                 return mapper.writeValueAsString(sir);
1118         }
1119         return null;
1120         }
1121
1122     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1123                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1124
1125                 // Found the duplicate record. Return the appropriate error.
1126                 String instance = null;
1127                 if(instanceName != null){
1128                         instance = instanceName;
1129                 }else{
1130                         instance = instanceIdMap.get(requestScope + "InstanceId");
1131                 }
1132                 //List<String> variables = new ArrayList<String>();
1133                 //variables.add(dup.getRequestStatus());
1134         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1135
1136
1137         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1138             .errorInfo(errorLoggerInfo).build();
1139
1140         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1141
1142         throw dupException;
1143         }
1144
1145         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1146                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1147                 InfraActiveRequests dup = null;
1148                 try {
1149                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1150                                 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1151                         }
1152                 } catch (Exception e) {
1153             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1154             RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1155                     .errorInfo(errorLoggerInfo).build();
1156             updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1157             throw requestDbFailureException;
1158                 }
1159                 return dup;
1160         }
1161
1162         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1163                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1164                 try{
1165                         ObjectMapper mapper = new ObjectMapper();
1166                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1167
1168         } catch (IOException e) {
1169
1170             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1171
1172             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1173                     .errorInfo(errorLoggerInfo).build();
1174             String requestScope = requestScopeFromUri(requestUri);
1175
1176             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1177
1178             throw validateException;
1179                 }
1180         }
1181         
1182         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1183                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1184                 int reqVersion = Integer.parseInt(version.substring(1));
1185                 try {
1186                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1187                 } catch (Exception e) {
1188                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1189                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1190                  .errorInfo(errorLoggerInfo).build();
1191
1192                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1193
1194                 throw validateException;
1195                 }
1196         }
1197
1198     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1199                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1200                 RecipeLookupResult recipeLookupResult = null;
1201         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1202                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1203                 // Query MSO Catalog DB
1204                 
1205                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1206                         recipeLookupResult = getDefaultVnfUri(sir, action);
1207         }else if(action == Action.addMembers || action == Action.removeMembers){
1208                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1209         }else if (modelInfo.getModelType().equals(ModelType.service)) {
1210                         try {
1211                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1212                         } catch (IOException e) {
1213                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1214
1215
1216                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1217                         .errorInfo(errorLoggerInfo).build();
1218
1219                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1220
1221                 throw validateException;
1222                         }
1223         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1224                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1225             try {
1226                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1227             } catch (ValidationException e) {
1228                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1229
1230
1231                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1232                         .errorInfo(errorLoggerInfo).build();
1233
1234                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1235
1236                 throw validateException;
1237             }
1238                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1239             try {
1240                         recipeLookupResult = getNetworkUri( sir, action);
1241             } catch (ValidationException e) {
1242
1243                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1244
1245
1246                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1247                         .errorInfo(errorLoggerInfo).build();
1248                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1249
1250                 throw validateException;
1251             }
1252         }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1253                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1254         }
1255
1256         if (recipeLookupResult == null) {
1257             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1258
1259
1260             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1261                     .errorInfo(errorLoggerInfo).build();
1262
1263             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1264             throw recipeNotFoundExceptionException;
1265                 }
1266                 return recipeLookupResult;
1267         }
1268         
1269     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1270                 // SERVICE REQUEST
1271                 // Construct the default service name
1272                 // TODO need to make this a configurable property
1273                 String defaultServiceModelName = getDefaultModel(servInstReq);
1274                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1275                 ModelInfo modelInfo = requestDetails.getModelInfo();
1276                 org.onap.so.db.catalog.beans.Service serviceRecord;
1277                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1278                 ServiceRecipe recipe = null;
1279                 
1280                 if(alaCarteFlag){
1281                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1282                         if(serviceRecord !=null){                                       
1283                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1284                         }
1285                 }else{
1286                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1287                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1288                         if (recipe == null){
1289                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1290                                 if(!serviceRecordList.isEmpty()){
1291                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1292                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1293                                                 if(recipe != null){
1294                                                         break;
1295                                                 }
1296                                         }
1297                                 }
1298                         }
1299                 }
1300                 
1301                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1302                 RequestParameters reqParam = requestDetails.getRequestParameters();
1303                 if(reqParam!=null && alaCarteFlag && recipe==null){
1304                         return null;
1305                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1306                         mapToLegacyRequest(requestDetails);
1307                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1308                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1309                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1310                 }
1311                 if(modelInfo.getModelVersionId() == null) {
1312                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1313                 }
1314                 if(recipe==null){
1315                         return null;
1316                 }
1317                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1318         }
1319
1320         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1321                 RequestParameters reqParam;
1322                 if (requestDetails.getRequestParameters() == null) {
1323                         reqParam = new RequestParameters();
1324                 } else {
1325                         reqParam = requestDetails.getRequestParameters();
1326                 }
1327                 if(requestDetails.getCloudConfiguration() == null) {
1328                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1329                         if(cloudConfig != null) {
1330                                 requestDetails.setCloudConfiguration(cloudConfig);
1331                         }
1332                 }
1333                 
1334                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1335                 if(!userParams.isEmpty()) {
1336                         if (reqParam == null) {
1337                                 requestDetails.setRequestParameters(new RequestParameters());
1338                         }
1339                         requestDetails.getRequestParameters().setUserParams(userParams);
1340                 }
1341         }
1342
1343         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1344
1345                 for(Map<String, Object> params : reqParams.getUserParams()){
1346                         if(params.containsKey("service")){
1347                                 Service service = serviceMapper(params);
1348                                 
1349                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1350                                 
1351                                 if (targetConfiguration.isPresent()) {
1352                                         return targetConfiguration.get();
1353                                 } else {
1354                                         for(Networks network : service.getResources().getNetworks()) {
1355                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1356                                                 if(targetConfiguration.isPresent()) {
1357                                                         return targetConfiguration.get();
1358                                                 }
1359                                         }
1360                                 
1361                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1362                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1363                                                 
1364                                                 if(targetConfiguration.isPresent()) {
1365                                                         return targetConfiguration.get();
1366                                                 }
1367                                                 
1368                                                 for(VfModules vfModule : vnf.getVfModules()) {
1369                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1370                                                         
1371                                                         if(targetConfiguration.isPresent()) {
1372                                                                 return targetConfiguration.get();
1373                                                         }
1374                                                 }
1375                                         }
1376                                 }
1377                         }
1378         }
1379         
1380         return null;
1381         }
1382
1383         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1384                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1385                 if(sourceCloudConfiguration != null) {
1386                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1387                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1388                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1389                         targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1390                         return Optional.of(targetConfiguration);
1391                 }
1392                 return Optional.empty();
1393         }
1394
1395         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1396         msoLogger.debug("Configuring UserParams for Macro Request");
1397         Map<String, Object> userParams = new HashMap<>();
1398         
1399         for(Map<String, Object> params : reqParams.getUserParams()){
1400                 if(params.containsKey("service")){
1401                         Service service = serviceMapper(params);
1402                                 
1403                                 addUserParams(userParams, service.getInstanceParams());
1404                                 
1405                                 for(Networks network : service.getResources().getNetworks()) {
1406                                         addUserParams(userParams, network.getInstanceParams());
1407                                 }
1408                                 
1409                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1410                                         addUserParams(userParams, vnf.getInstanceParams());
1411                                         
1412                                         for(VfModules vfModule: vnf.getVfModules()) {
1413                                                 addUserParams(userParams, vfModule.getInstanceParams());
1414                                         }
1415                                 }
1416                 }
1417         }
1418         
1419         return mapFlatMapToNameValue(userParams);
1420     }
1421
1422         private Service serviceMapper(Map<String, Object> params)
1423                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1424                 ObjectMapper obj = new ObjectMapper();
1425                 String input = obj.writeValueAsString(params.get("service"));
1426                 return obj.readValue(input, Service.class);
1427         }
1428
1429         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1430                 for(Map<String, String> map : sourceUserParams) {
1431                         for (Map.Entry<String, String> entry : map.entrySet()) {
1432                                 targetUserParams.put(entry.getKey(), entry.getValue());
1433                         }
1434                 }
1435         }
1436         
1437         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1438                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1439                 
1440                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1441                         Map<String, Object> targetMap = new HashMap<>();
1442                         targetMap.put(NAME, map.getKey());
1443                         targetMap.put(VALUE, map.getValue());
1444                         targetUserParams.add(targetMap);
1445                 }
1446                 return targetUserParams;
1447         }
1448
1449     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1450
1451                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1452                 String vnfComponentType = modelInfo.getModelType().name();
1453
1454                 RelatedInstanceList[] instanceList = null;
1455                 if (servInstReq.getRequestDetails() != null) {
1456                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1457                 }
1458
1459                 Recipe recipe = null;
1460                 String defaultSource = getDefaultModel(servInstReq);
1461                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1462                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1463                 String relatedInstanceModelVersionId = null;
1464                 String relatedInstanceModelInvariantId = null;
1465                 String relatedInstanceVersion = null;
1466                 String relatedInstanceModelCustomizationName = null;
1467
1468                 if (instanceList != null) {
1469
1470                         for(RelatedInstanceList relatedInstanceList : instanceList){
1471
1472                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1473                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1474                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1475                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1476                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1477                                 }
1478
1479                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1480                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1481                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1482                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1483                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1484                                 }
1485                         }
1486
1487                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1488                                 //                      a.      For a vnf request (only create, no update currently): 
1489                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1490                                 //                              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 
1491                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1492                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1493                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1494                                 //                                      (MODEL_UUID) in SERVICE table.
1495                                 //                              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 
1496                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1497                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1498                                 //                              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.
1499
1500                                 VnfResource vnfResource = null;
1501                                 VnfResourceCustomization vrc=null;
1502                                 // Validation for vnfResource
1503
1504                                 if(modelCustomizationId!=null) {
1505                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1506                     if(vrc != null){
1507                         vnfResource = vrc.getVnfResources();
1508                     }
1509                                 } else {
1510                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1511                                         if(service == null) {
1512                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1513                                         }
1514
1515                                 if(service == null) {
1516                                         throw new ValidationException("service in relatedInstance");
1517                                 }
1518                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1519                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1520                                                 vrc=vnfResourceCustom;
1521                         }
1522                     }
1523                                         
1524                                         if(vrc != null) {
1525                                                 vnfResource = vrc.getVnfResources();
1526                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1527                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1528                                         }
1529                                 }
1530
1531                                 if(vnfResource==null){
1532                                         throw new ValidationException("vnfResource");
1533                                 } else {
1534                                         if(modelInfo.getModelVersionId() == null) {
1535                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1536                                         }
1537                                 }
1538
1539                                 VnfRecipe vnfRecipe = null;
1540                                 
1541                                 if(vrc != null) {
1542                                         String nfRole = vrc.getNfRole();
1543                                         if(nfRole != null) {
1544                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1545                                         }
1546                                 }
1547
1548                                 if(vnfRecipe == null) {
1549                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1550                                 }
1551
1552                                 if (vnfRecipe == null) {
1553                                         return null;
1554                                 }
1555
1556                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1557                         } else {
1558                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1559                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1560                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1561                                 //                              Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. 
1562                                 //                              For each vf_module_cust_model_customization_uuid value returned, use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to 
1563                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1564                                 //                      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) 
1565                                 //                              and MODEL_VERSION (modelVersion).
1566                                 */
1567                                 VfModuleCustomization vfmc = null;
1568                                 VnfResource vnfr;
1569                                 VnfResourceCustomization vnfrc;
1570                                 VfModule vfModule = null;
1571
1572                                 if(modelInfo.getModelCustomizationId() != null) {
1573                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1574                                 } else {
1575                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1576                                         if(vnfr == null){
1577                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1578                                         }
1579                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1580                                         
1581                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1582                                                         
1583                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1584                                         for(VfModuleCustomization vf : list) {
1585                                                 VfModuleCustomization vfmCustom;
1586                                                 if(vfModuleModelUUID != null){
1587                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1588                                                         if(vfmCustom != null){
1589                                                                 vfModule = vfmCustom.getVfModule();
1590                                                         }
1591                                                 }else{ 
1592                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1593                                                         if(vfmCustom != null){
1594                                                                 vfModule = vfmCustom.getVfModule();
1595                                                         }else{
1596                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1597                                                         }
1598                                                 }
1599                                                 
1600                                                 if(vfModule != null) {
1601                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1602                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1603                                                         break;
1604                                                 }
1605                                         }
1606                                 }
1607
1608                                 if(vfmc == null && vfModule == null) {
1609                                         throw new ValidationException("vfModuleCustomization");
1610                                 } else if (vfModule == null && vfmc != null) {
1611                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1612                                 }
1613
1614                                 if(modelInfo.getModelVersionId() == null) {
1615                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1616                                 }
1617                                 
1618                                 
1619                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1620                                 if(recipe == null){
1621                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1622                                         if(!vfModuleRecords.isEmpty()){
1623                                                 for(VfModule record : vfModuleRecords){
1624                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1625                                                         if(recipe != null){
1626                                                                 break;
1627                                                         }
1628                                                 }
1629                                         }
1630                                 }
1631                                 if(recipe == null) {
1632                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1633                                         if (recipe == null) { 
1634                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1635                                         }
1636
1637                                         if(recipe == null) {
1638                                                 return null;
1639                                         }
1640                                 }
1641                         }
1642                 } else {
1643
1644                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1645                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1646                                 if (recipe == null) {
1647                                         return null;
1648                                 }
1649                         } else {
1650                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1651
1652                                 if (recipe == null) {
1653                                         return null;
1654                                 }
1655                         }
1656                 }
1657
1658                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1659         }
1660         
1661     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1662         
1663                 String defaultSource = getDefaultModel(sir);
1664
1665                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1666
1667                 if (vnfRecipe == null) {
1668                         return null;
1669                 }
1670
1671                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1672         }
1673
1674
1675     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1676
1677                 String defaultNetworkType = getDefaultModel(sir);
1678
1679                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1680                 String modelName = modelInfo.getModelName();
1681                 Recipe recipe = null;
1682
1683                 if(modelInfo.getModelCustomizationId()!=null){
1684             NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1685                         if(networkResource!=null){
1686                                 if(modelInfo.getModelVersionId() == null) {
1687                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1688                                 }
1689                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1690                         }else{
1691                                 throw new ValidationException("no catalog entry found");
1692                         }
1693                 }else{
1694                         //ok for version < 3 and action delete
1695                         if(modelName != null){
1696                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1697                         }
1698                 }
1699
1700                 if(recipe == null){
1701                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1702                 }
1703                 
1704                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1705         }
1706     
1707     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1708         String requestTestApi = null;
1709         TestApi testApi = null;
1710         
1711         if (requestParams != null) {
1712                 requestTestApi = requestParams.getTestApi();
1713         }
1714         
1715         if (requestTestApi == null) {
1716                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1717                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1718                 } else {
1719                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1720                 }
1721         }
1722         
1723                 try {
1724                         testApi = TestApi.valueOf(requestTestApi);
1725                         return Optional.of(testApi.getModelName());
1726                 } catch (Exception e) {
1727                         msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1728                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1729                 }
1730     }
1731     
1732     private String getDefaultModel(ServiceInstancesRequest sir) {
1733         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1734         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1735                 if (oModelName.isPresent()) {
1736                         defaultModel = oModelName.get();
1737                 }
1738                 return defaultModel;
1739     }
1740         
1741     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1742                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1743                 Boolean aLaCarte = null;
1744                 String apiVersion = version.substring(1);
1745                 
1746                 long startTime = System.currentTimeMillis ();
1747                 ServiceInstancesRequest sir = null;             
1748
1749                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1750                 String requestScope = deriveRequestScope(action,sir, requestUri);
1751                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1752                 if(sir.getRequestDetails().getRequestParameters() != null){
1753                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1754                 }
1755                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1756                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1757                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1758
1759                 InfraActiveRequests dup = null;
1760                 
1761                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1762
1763                 if (instanceIdMap != null && dup != null) {
1764             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1765                 }
1766                 
1767                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1768                 RequestReferences referencesResponse = new RequestReferences();
1769                 referencesResponse.setRequestId(requestId);
1770                 serviceResponse.setRequestReferences(referencesResponse);
1771                 
1772                 
1773                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1774                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1775                 
1776                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1777                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1778                         
1779             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1780
1781
1782             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1783                     .errorInfo(errorLoggerInfo).build();
1784
1785             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1786
1787             throw validateException;
1788                         
1789                 }
1790                 
1791                 serviceInstanceId = "";
1792                 String configurationId = "";
1793                 String correlationId = "";
1794
1795                 if(sir.getServiceInstanceId () != null){
1796                         serviceInstanceId = sir.getServiceInstanceId ();
1797                 }
1798
1799                 if(sir.getConfigurationId() != null){
1800             configurationId = sir.getConfigurationId();
1801         }
1802
1803         correlationId = getCorrelationId(sir);
1804
1805                 try{
1806                         infraActiveRequestsClient.save(currentActiveReq);
1807                 }catch(Exception e){
1808                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1809             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1810                     .errorInfo(errorLoggerInfo).build();
1811                 }
1812                 
1813                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1814                         aLaCarte = true;
1815                 }else if(aLaCarte == null){
1816                         aLaCarte = false;
1817                 }
1818                 RequestClientParameter requestClientParameter = null;
1819                 try {
1820                         requestClientParameter = new RequestClientParameter.Builder()
1821                                 .setRequestId(requestId)
1822                                 .setBaseVfModule(false)
1823                                 .setRecipeTimeout(Integer.parseInt(timeOut))
1824                                 .setRequestAction(action.toString())
1825                                 .setServiceInstanceId(serviceInstanceId)
1826                                 .setCorrelationId(correlationId)
1827                                 .setConfigurationId(configurationId)
1828                                 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1829                                 .setApiVersion(apiVersion)
1830                                 .setALaCarte(aLaCarte)
1831                                 .setRequestUri(requestUri).build();
1832                 } catch (IOException e) {
1833                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1834                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1835                             .errorInfo(errorLoggerInfo).build();
1836                 }
1837                                 
1838                         return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1839         }
1840
1841     public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1842         String requestId = null;
1843         if (requestContext.getProperty("requestId") != null) {
1844                 requestId = requestContext.getProperty("requestId").toString();
1845         }
1846         if (UUIDChecker.isValidUUID(requestId)) {
1847                 return requestId;
1848         } else {
1849                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1850                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1851                             .errorInfo(errorLoggerInfo).build();
1852                         
1853                         throw validateException;
1854         }
1855     }
1856         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1857                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1858                         aq.setStatusMessage (errorMessage);
1859                         aq.setProgress(new Long(100));
1860                         aq.setRequestStatus(status.toString());
1861                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1862                         aq.setEndTime (endTimeStamp);
1863                         try{
1864                                 infraActiveRequestsClient.save(aq);
1865                         }catch(Exception e){
1866                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1867                     throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1868                             .errorInfo(errorLoggerInfo).build();
1869                         }
1870                 }
1871         }
1872 }