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