2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Modifications Copyright (c) 2019 Samsung
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
24 package org.onap.so.apihandlerinfra;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
31 import java.util.Optional;
32 import javax.transaction.Transactional;
33 import javax.ws.rs.Consumes;
34 import javax.ws.rs.DELETE;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.PUT;
37 import javax.ws.rs.Path;
38 import javax.ws.rs.PathParam;
39 import javax.ws.rs.Produces;
40 import javax.ws.rs.container.ContainerRequestContext;
41 import javax.ws.rs.core.Context;
42 import javax.ws.rs.core.MediaType;
43 import javax.ws.rs.core.Response;
44 import org.apache.commons.lang.StringUtils;
45 import org.apache.http.HttpStatus;
46 import org.onap.so.apihandler.common.CommonConstants;
47 import org.onap.so.apihandler.common.ErrorNumbers;
48 import org.onap.so.apihandler.common.RequestClientParameter;
49 import org.onap.so.apihandlerinfra.exceptions.ApiException;
50 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
51 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
52 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
53 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
54 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
55 import org.onap.so.constants.Status;
56 import org.onap.so.db.catalog.beans.NetworkResource;
57 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
58 import org.onap.so.db.catalog.beans.Recipe;
59 import org.onap.so.db.catalog.beans.ServiceRecipe;
60 import org.onap.so.db.catalog.beans.VfModule;
61 import org.onap.so.db.catalog.beans.VfModuleCustomization;
62 import org.onap.so.db.catalog.beans.VnfRecipe;
63 import org.onap.so.db.catalog.beans.VnfResource;
64 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
65 import org.onap.so.db.catalog.client.CatalogDbClient;
66 import org.onap.so.db.request.beans.InfraActiveRequests;
67 import org.onap.so.db.request.client.RequestsDbClient;
68 import org.onap.so.exceptions.ValidationException;
69 import org.onap.so.logger.ErrorCode;
70 import org.onap.so.logger.MessageEnum;
71 import org.onap.so.serviceinstancebeans.CloudConfiguration;
72 import org.onap.so.serviceinstancebeans.ModelInfo;
73 import org.onap.so.serviceinstancebeans.ModelType;
74 import org.onap.so.serviceinstancebeans.Networks;
75 import org.onap.so.serviceinstancebeans.RelatedInstance;
76 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
77 import org.onap.so.serviceinstancebeans.RequestDetails;
78 import org.onap.so.serviceinstancebeans.RequestParameters;
79 import org.onap.so.serviceinstancebeans.RequestReferences;
80 import org.onap.so.serviceinstancebeans.Service;
81 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
82 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
83 import org.onap.so.serviceinstancebeans.VfModules;
84 import org.onap.so.serviceinstancebeans.Vnfs;
85 import org.slf4j.Logger;
86 import org.slf4j.LoggerFactory;
87 import org.springframework.beans.factory.annotation.Autowired;
88 import org.springframework.core.env.Environment;
89 import org.springframework.stereotype.Component;
90 import org.springframework.web.client.RestTemplate;
91 import com.fasterxml.jackson.core.JsonParseException;
92 import com.fasterxml.jackson.core.JsonProcessingException;
93 import com.fasterxml.jackson.databind.JsonMappingException;
94 import com.fasterxml.jackson.databind.ObjectMapper;
95 import io.swagger.annotations.Api;
96 import io.swagger.annotations.ApiOperation;
99 @Path("/onap/so/infra/serviceInstantiation")
100 @Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
101 public class ServiceInstances extends AbstractRestHandler {
103 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
104 private static String NAME = "name";
105 private static String VALUE = "value";
106 private static String uriPrefix = "/serviceInstantiation/";
107 private static final String SAVE_TO_DB = "save instance to db";
110 private Environment env;
113 private RestTemplate restTemplate;
116 private CatalogDbClient catalogDbClient;
119 private RequestsDbClient infraActiveRequestsClient;
122 private MsoRequest msoRequest;
125 private RequestHandlerUtils requestHandlerUtils;
128 @Path("/{version:[vV][5-7]}/serviceInstances")
129 @Consumes(MediaType.APPLICATION_JSON)
130 @Produces(MediaType.APPLICATION_JSON)
131 @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
133 public Response createServiceInstance(String request, @PathParam("version") String version,
134 @Context ContainerRequestContext requestContext) throws ApiException {
135 String requestId = requestHandlerUtils.getRequestId(requestContext);
136 return serviceInstances(request, Action.createInstance, null, version, requestId,
137 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
141 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
142 @Consumes(MediaType.APPLICATION_JSON)
143 @Produces(MediaType.APPLICATION_JSON)
144 @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
146 public Response activateServiceInstance(String request, @PathParam("version") String version,
147 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
148 throws ApiException {
149 String requestId = requestHandlerUtils.getRequestId(requestContext);
150 HashMap<String, String> instanceIdMap = new HashMap<>();
151 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
152 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
153 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
157 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
158 @Consumes(MediaType.APPLICATION_JSON)
159 @Produces(MediaType.APPLICATION_JSON)
160 @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
162 public Response deactivateServiceInstance(String request, @PathParam("version") String version,
163 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
164 throws ApiException {
165 String requestId = requestHandlerUtils.getRequestId(requestContext);
166 HashMap<String, String> instanceIdMap = new HashMap<>();
167 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
168 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
169 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
173 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
174 @Consumes(MediaType.APPLICATION_JSON)
175 @Produces(MediaType.APPLICATION_JSON)
176 @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
178 public Response deleteServiceInstance(String request, @PathParam("version") String version,
179 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
180 throws ApiException {
181 String requestId = requestHandlerUtils.getRequestId(requestContext);
182 HashMap<String, String> instanceIdMap = new HashMap<>();
183 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
184 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
185 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
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)
194 public Response assignServiceInstance(String request, @PathParam("version") String version,
195 @Context ContainerRequestContext requestContext) throws ApiException {
196 String requestId = requestHandlerUtils.getRequestId(requestContext);
197 return serviceInstances(request, Action.assignInstance, null, version, requestId,
198 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
202 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
203 @Consumes(MediaType.APPLICATION_JSON)
204 @Produces(MediaType.APPLICATION_JSON)
205 @ApiOperation(value = "Unassign Service Instance", response = Response.class)
207 public Response unassignServiceInstance(String request, @PathParam("version") String version,
208 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
209 throws ApiException {
210 String requestId = requestHandlerUtils.getRequestId(requestContext);
211 HashMap<String, String> instanceIdMap = new HashMap<>();
212 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
213 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
214 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
218 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
219 @Consumes(MediaType.APPLICATION_JSON)
220 @Produces(MediaType.APPLICATION_JSON)
221 @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
223 public Response createPortConfiguration(String request, @PathParam("version") String version,
224 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
225 throws ApiException {
226 String requestId = requestHandlerUtils.getRequestId(requestContext);
227 HashMap<String, String> instanceIdMap = new HashMap<>();
228 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
229 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
230 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
234 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
235 @Consumes(MediaType.APPLICATION_JSON)
236 @Produces(MediaType.APPLICATION_JSON)
237 @ApiOperation(value = "Delete provided Port", response = Response.class)
239 public Response deletePortConfiguration(String request, @PathParam("version") String version,
240 @PathParam("serviceInstanceId") String serviceInstanceId,
241 @PathParam("configurationInstanceId") String configurationInstanceId,
242 @Context ContainerRequestContext requestContext) throws ApiException {
243 String requestId = requestHandlerUtils.getRequestId(requestContext);
244 HashMap<String, String> instanceIdMap = new HashMap<>();
245 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
246 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
247 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
248 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
252 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
253 @Consumes(MediaType.APPLICATION_JSON)
254 @Produces(MediaType.APPLICATION_JSON)
255 @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
257 public Response enablePort(String request, @PathParam("version") String version,
258 @PathParam("serviceInstanceId") String serviceInstanceId,
259 @PathParam("configurationInstanceId") String configurationInstanceId,
260 @Context ContainerRequestContext requestContext) throws ApiException {
261 String requestId = requestHandlerUtils.getRequestId(requestContext);
262 HashMap<String, String> instanceIdMap = new HashMap<>();
263 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
264 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
265 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
266 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
270 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
271 @Consumes(MediaType.APPLICATION_JSON)
272 @Produces(MediaType.APPLICATION_JSON)
273 @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
275 public Response disablePort(String request, @PathParam("version") String version,
276 @PathParam("serviceInstanceId") String serviceInstanceId,
277 @PathParam("configurationInstanceId") String configurationInstanceId,
278 @Context ContainerRequestContext requestContext) throws ApiException {
279 String requestId = requestHandlerUtils.getRequestId(requestContext);
280 HashMap<String, String> instanceIdMap = new HashMap<>();
281 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
282 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
283 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
284 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
288 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
289 @Consumes(MediaType.APPLICATION_JSON)
290 @Produces(MediaType.APPLICATION_JSON)
291 @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
293 public Response activatePort(String request, @PathParam("version") String version,
294 @PathParam("serviceInstanceId") String serviceInstanceId,
295 @PathParam("configurationInstanceId") String configurationInstanceId,
296 @Context ContainerRequestContext requestContext) throws ApiException {
297 String requestId = requestHandlerUtils.getRequestId(requestContext);
298 HashMap<String, String> instanceIdMap = new HashMap<>();
299 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
300 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
301 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
302 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
306 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
307 @Consumes(MediaType.APPLICATION_JSON)
308 @Produces(MediaType.APPLICATION_JSON)
309 @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
311 public Response deactivatePort(String request, @PathParam("version") String version,
312 @PathParam("serviceInstanceId") String serviceInstanceId,
313 @PathParam("configurationInstanceId") String configurationInstanceId,
314 @Context ContainerRequestContext requestContext) throws ApiException {
315 String requestId = requestHandlerUtils.getRequestId(requestContext);
316 HashMap<String, String> instanceIdMap = new HashMap<>();
317 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
318 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
319 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
320 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
324 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
325 @Consumes(MediaType.APPLICATION_JSON)
326 @Produces(MediaType.APPLICATION_JSON)
327 @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
329 public Response addRelationships(String request, @PathParam("version") String version,
330 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
331 throws ApiException {
332 String requestId = requestHandlerUtils.getRequestId(requestContext);
333 HashMap<String, String> instanceIdMap = new HashMap<>();
334 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
335 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
336 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
340 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
341 @Consumes(MediaType.APPLICATION_JSON)
342 @Produces(MediaType.APPLICATION_JSON)
343 @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
345 public Response removeRelationships(String request, @PathParam("version") String version,
346 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
347 throws ApiException {
348 String requestId = requestHandlerUtils.getRequestId(requestContext);
349 HashMap<String, String> instanceIdMap = new HashMap<>();
350 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
351 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
352 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
356 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
357 @Consumes(MediaType.APPLICATION_JSON)
358 @Produces(MediaType.APPLICATION_JSON)
359 @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
361 public Response createVnfInstance(String request, @PathParam("version") String version,
362 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
363 throws ApiException {
364 String requestId = requestHandlerUtils.getRequestId(requestContext);
365 HashMap<String, String> instanceIdMap = new HashMap<>();
366 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
368 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
369 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
370 } catch (Exception e) {
371 logger.error("Error in vnf", e);
377 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
378 @Consumes(MediaType.APPLICATION_JSON)
379 @Produces(MediaType.APPLICATION_JSON)
380 @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
382 public Response replaceVnfInstance(String request, @PathParam("version") String version,
383 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
384 @Context ContainerRequestContext requestContext) throws ApiException {
385 String requestId = requestHandlerUtils.getRequestId(requestContext);
386 HashMap<String, String> instanceIdMap = new HashMap<>();
387 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
388 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
389 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
390 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
394 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
395 @Consumes(MediaType.APPLICATION_JSON)
396 @Produces(MediaType.APPLICATION_JSON)
397 @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
398 response = Response.class)
400 public Response updateVnfInstance(String request, @PathParam("version") String version,
401 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
402 @Context ContainerRequestContext requestContext) throws ApiException {
403 String requestId = requestHandlerUtils.getRequestId(requestContext);
404 HashMap<String, String> instanceIdMap = new HashMap<>();
405 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
406 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
407 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
408 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
412 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
413 @Consumes(MediaType.APPLICATION_JSON)
414 @Produces(MediaType.APPLICATION_JSON)
415 @ApiOperation(value = "Apply updated configuration", response = Response.class)
416 public Response applyUpdatedConfig(String request, @PathParam("version") String version,
417 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
418 @Context ContainerRequestContext requestContext) throws ApiException {
419 String requestId = requestHandlerUtils.getRequestId(requestContext);
420 HashMap<String, String> instanceIdMap = new HashMap<>();
421 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
422 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
423 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
424 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
428 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
429 @Consumes(MediaType.APPLICATION_JSON)
430 @Produces(MediaType.APPLICATION_JSON)
431 @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
432 public Response recreateVnfInstance(String request, @PathParam("version") String version,
433 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
434 @Context ContainerRequestContext requestContext) throws ApiException {
435 String requestId = requestHandlerUtils.getRequestId(requestContext);
436 HashMap<String, String> instanceIdMap = new HashMap<>();
437 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
438 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
439 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
440 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
445 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
446 @Consumes(MediaType.APPLICATION_JSON)
447 @Produces(MediaType.APPLICATION_JSON)
448 @ApiOperation(value = "Delete provided VNF instance", response = Response.class)
450 public Response deleteVnfInstance(String request, @PathParam("version") String version,
451 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
452 @Context ContainerRequestContext requestContext) throws ApiException {
453 String requestId = requestHandlerUtils.getRequestId(requestContext);
454 HashMap<String, String> instanceIdMap = new HashMap<>();
455 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
456 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
457 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
458 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
462 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
463 @Consumes(MediaType.APPLICATION_JSON)
464 @Produces(MediaType.APPLICATION_JSON)
465 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
466 response = Response.class)
468 public Response createVfModuleInstance(String request, @PathParam("version") String version,
469 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
470 @Context ContainerRequestContext requestContext) throws ApiException {
471 String requestId = requestHandlerUtils.getRequestId(requestContext);
472 HashMap<String, String> instanceIdMap = new HashMap<>();
473 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
474 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
475 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
476 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
480 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
481 @Consumes(MediaType.APPLICATION_JSON)
482 @Produces(MediaType.APPLICATION_JSON)
483 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
484 response = Response.class)
486 public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
487 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
488 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
489 throws ApiException {
490 String requestId = requestHandlerUtils.getRequestId(requestContext);
491 HashMap<String, String> instanceIdMap = new HashMap<>();
492 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
493 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
494 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
495 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
496 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
500 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
501 @Consumes(MediaType.APPLICATION_JSON)
502 @Produces(MediaType.APPLICATION_JSON)
503 @ApiOperation(value = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
504 response = Response.class)
506 public Response updateVfModuleInstance(String request, @PathParam("version") String version,
507 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
508 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
509 throws ApiException {
510 String requestId = requestHandlerUtils.getRequestId(requestContext);
511 HashMap<String, String> instanceIdMap = new HashMap<>();
512 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
513 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
514 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
515 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
516 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
520 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
521 @Consumes(MediaType.APPLICATION_JSON)
522 @Produces(MediaType.APPLICATION_JSON)
523 @ApiOperation(value = "Perform VNF software update", response = Response.class)
525 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
526 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
527 @Context ContainerRequestContext requestContext) throws ApiException {
528 String requestId = requestHandlerUtils.getRequestId(requestContext);
529 HashMap<String, String> instanceIdMap = new HashMap<>();
530 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
531 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
532 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
533 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
537 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
538 @Consumes(MediaType.APPLICATION_JSON)
539 @Produces(MediaType.APPLICATION_JSON)
540 @ApiOperation(value = "Delete provided VfModule instance", response = Response.class)
542 public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
543 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
544 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
545 throws ApiException {
546 String requestId = requestHandlerUtils.getRequestId(requestContext);
547 HashMap<String, String> instanceIdMap = new HashMap<>();
548 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
549 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
550 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
551 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
552 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
556 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
557 @Consumes(MediaType.APPLICATION_JSON)
558 @Produces(MediaType.APPLICATION_JSON)
559 @ApiOperation(value = "Deactivate and Cloud Delete VfModule instance", response = Response.class)
561 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
562 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
563 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
564 throws ApiException {
565 String requestId = requestHandlerUtils.getRequestId(requestContext);
566 HashMap<String, String> instanceIdMap = new HashMap<>();
567 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
568 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
569 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
570 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
571 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
576 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
577 @Consumes(MediaType.APPLICATION_JSON)
578 @Produces(MediaType.APPLICATION_JSON)
579 @ApiOperation(value = "VF Auto Scale Out", response = Response.class)
581 public Response scaleOutVfModule(String request, @PathParam("version") String version,
582 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
583 @Context ContainerRequestContext requestContext) throws ApiException {
584 String requestId = requestHandlerUtils.getRequestId(requestContext);
585 HashMap<String, String> instanceIdMap = new HashMap<>();
586 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
587 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
588 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
589 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
594 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
595 @Consumes(MediaType.APPLICATION_JSON)
596 @Produces(MediaType.APPLICATION_JSON)
597 @ApiOperation(value = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
598 response = Response.class)
600 public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
601 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
602 @Context ContainerRequestContext requestContext) throws ApiException {
603 String requestId = requestHandlerUtils.getRequestId(requestContext);
604 HashMap<String, String> instanceIdMap = new HashMap<>();
605 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
606 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
607 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
608 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
612 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
613 @Consumes(MediaType.APPLICATION_JSON)
614 @Produces(MediaType.APPLICATION_JSON)
615 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
616 response = Response.class)
618 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
619 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
620 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
621 @Context ContainerRequestContext requestContext) throws ApiException {
622 String requestId = requestHandlerUtils.getRequestId(requestContext);
623 HashMap<String, String> instanceIdMap = new HashMap<>();
624 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
625 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
626 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
627 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
628 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
632 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
633 @Consumes(MediaType.APPLICATION_JSON)
634 @Produces(MediaType.APPLICATION_JSON)
635 @ApiOperation(value = "Delete provided VolumeGroup instance", response = Response.class)
637 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
638 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
639 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
640 @Context ContainerRequestContext requestContext) throws ApiException {
641 String requestId = requestHandlerUtils.getRequestId(requestContext);
642 HashMap<String, String> instanceIdMap = new HashMap<>();
643 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
644 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
645 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
646 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
647 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
651 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
652 @Consumes(MediaType.APPLICATION_JSON)
653 @Produces(MediaType.APPLICATION_JSON)
654 @ApiOperation(value = "Create NetworkInstance on a specified version and serviceInstance ",
655 response = Response.class)
657 public Response createNetworkInstance(String request, @PathParam("version") String version,
658 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
659 throws ApiException {
660 String requestId = requestHandlerUtils.getRequestId(requestContext);
661 HashMap<String, String> instanceIdMap = new HashMap<>();
662 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
663 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
664 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
668 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
669 @Consumes(MediaType.APPLICATION_JSON)
670 @Produces(MediaType.APPLICATION_JSON)
671 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
672 response = Response.class)
674 public Response updateNetworkInstance(String request, @PathParam("version") String version,
675 @PathParam("serviceInstanceId") String serviceInstanceId,
676 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
677 throws ApiException {
678 String requestId = requestHandlerUtils.getRequestId(requestContext);
679 HashMap<String, String> instanceIdMap = new HashMap<>();
680 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
681 instanceIdMap.put("networkInstanceId", networkInstanceId);
682 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
683 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
687 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
688 @Consumes(MediaType.APPLICATION_JSON)
689 @Produces(MediaType.APPLICATION_JSON)
690 @ApiOperation(value = "Delete provided Network instance", response = Response.class)
692 public Response deleteNetworkInstance(String request, @PathParam("version") String version,
693 @PathParam("serviceInstanceId") String serviceInstanceId,
694 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
695 throws ApiException {
696 String requestId = requestHandlerUtils.getRequestId(requestContext);
697 HashMap<String, String> instanceIdMap = new HashMap<>();
698 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
699 instanceIdMap.put("networkInstanceId", networkInstanceId);
700 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
701 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
705 @Path("/{version:[vV][7]}/instanceGroups")
706 @Consumes(MediaType.APPLICATION_JSON)
707 @Produces(MediaType.APPLICATION_JSON)
708 @ApiOperation(value = "Create instanceGroups", response = Response.class)
710 public Response createInstanceGroups(String request, @PathParam("version") String version,
711 @Context ContainerRequestContext requestContext) throws ApiException {
712 String requestId = requestHandlerUtils.getRequestId(requestContext);
713 return serviceInstances(request, Action.createInstance, null, version, requestId,
714 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
718 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
719 @Consumes(MediaType.APPLICATION_JSON)
720 @Produces(MediaType.APPLICATION_JSON)
721 @ApiOperation(value = "Delete instanceGroup", response = Response.class)
723 public Response deleteInstanceGroups(@PathParam("version") String version,
724 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
725 throws ApiException {
726 String requestId = requestHandlerUtils.getRequestId(requestContext);
727 HashMap<String, String> instanceIdMap = new HashMap<>();
728 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
729 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
730 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
734 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
735 @Consumes(MediaType.APPLICATION_JSON)
736 @Produces(MediaType.APPLICATION_JSON)
737 @ApiOperation(value = "Add instanceGroup members", response = Response.class)
739 public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
740 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
741 throws ApiException {
742 String requestId = requestHandlerUtils.getRequestId(requestContext);
743 HashMap<String, String> instanceIdMap = new HashMap<>();
744 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
745 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
746 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
750 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
751 @Consumes(MediaType.APPLICATION_JSON)
752 @Produces(MediaType.APPLICATION_JSON)
753 @ApiOperation(value = "Remove instanceGroup members", response = Response.class)
755 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
756 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
757 throws ApiException {
758 String requestId = requestHandlerUtils.getRequestId(requestContext);
759 HashMap<String, String> instanceIdMap = new HashMap<>();
760 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
761 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
762 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
765 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
766 String version, String requestId, String requestUri) throws ApiException {
767 String serviceInstanceId;
768 Boolean aLaCarte = null;
769 ServiceInstancesRequest sir;
770 String apiVersion = version.substring(1);
772 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
773 action = handleReplaceInstance(action, sir);
774 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
775 InfraActiveRequests currentActiveReq =
776 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
777 if (sir.getRequestDetails().getRequestParameters() != null) {
778 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
780 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
782 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
784 int requestVersion = Integer.parseInt(version.substring(1));
785 String instanceName = null;
786 if (sir.getRequestDetails().getRequestInfo() != null) {
787 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
789 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
790 String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
791 String networkType = msoRequest.getNetworkType(sir, requestScope);
792 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
793 String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
795 if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
796 currentActiveReq.setVnfType(vnfType);
797 } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
798 currentActiveReq.setNetworkType(networkType);
801 InfraActiveRequests dup = null;
802 boolean inProgress = false;
804 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
807 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
810 if (dup != null && inProgress) {
811 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
814 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
816 RequestReferences referencesResponse = new RequestReferences();
818 referencesResponse.setRequestId(requestId);
820 serviceResponse.setRequestReferences(referencesResponse);
821 RecipeLookupResult recipeLookupResult =
822 getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
823 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
825 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
826 ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
828 Boolean isBaseVfModule = false;
830 if (modelType.equals(ModelType.vfModule)) {
831 isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
835 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
837 String vfModuleId = "";
838 String volumeGroupId = "";
839 String networkId = "";
840 String pnfCorrelationId = "";
841 String instanceGroupId = null;
843 if (sir.getVnfInstanceId() != null) {
844 vnfId = sir.getVnfInstanceId();
847 if (sir.getVfModuleInstanceId() != null) {
848 vfModuleId = sir.getVfModuleInstanceId();
851 if (sir.getVolumeGroupInstanceId() != null) {
852 volumeGroupId = sir.getVolumeGroupInstanceId();
855 if (sir.getNetworkInstanceId() != null) {
856 networkId = sir.getNetworkInstanceId();
858 if (sir.getInstanceGroupId() != null) {
859 instanceGroupId = sir.getInstanceGroupId();
862 pnfCorrelationId = getPnfCorrelationId(sir);
865 infraActiveRequestsClient.save(currentActiveReq);
866 } catch (Exception e) {
867 ErrorLoggerInfo errorLoggerInfo =
868 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
869 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
870 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
871 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
874 if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
876 } else if (aLaCarte == null) {
880 RequestClientParameter requestClientParameter = null;
882 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
883 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
884 .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
885 .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
886 .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
887 .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
888 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
889 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
890 .setInstanceGroupId(instanceGroupId).build();
891 } catch (IOException e) {
892 ErrorLoggerInfo errorLoggerInfo =
893 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
894 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
895 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
896 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
899 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
900 recipeLookupResult.getOrchestrationURI(), requestScope);
908 protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
909 if (action != null && action.equals(Action.replaceInstance)
910 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
911 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
912 action = Action.replaceInstanceRetainAssignments;
917 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
918 String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
919 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
920 Boolean aLaCarte = true;
921 String apiVersion = version.substring(1);
922 ServiceInstancesRequest sir = new ServiceInstancesRequest();
923 sir.setInstanceGroupId(instanceGroupId);
925 String requestScope = ModelType.instanceGroup.toString();
926 InfraActiveRequests currentActiveReq =
927 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
928 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
930 requestHandlerUtils.validateHeaders(requestContext);
931 } catch (ValidationException e) {
932 logger.error("Exception occurred", e);
933 ErrorLoggerInfo errorLoggerInfo =
934 new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
935 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
936 ValidateException validateException =
937 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
938 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
939 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
940 throw validateException;
943 InfraActiveRequests dup =
944 requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
945 boolean inProgress = false;
948 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
951 if (dup != null && inProgress) {
952 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
956 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
958 RequestReferences referencesResponse = new RequestReferences();
960 referencesResponse.setRequestId(requestId);
962 serviceResponse.setRequestReferences(referencesResponse);
963 Boolean isBaseVfModule = false;
965 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
968 infraActiveRequestsClient.save(currentActiveReq);
969 } catch (Exception e) {
970 ErrorLoggerInfo errorLoggerInfo =
971 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
972 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
973 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
974 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
977 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
978 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
979 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
980 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
982 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
983 recipeLookupResult.getOrchestrationURI(), requestScope);
986 protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
987 return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
988 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
992 protected RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
993 boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
994 RecipeLookupResult recipeLookupResult = null;
995 // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
996 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
997 // Query MSO Catalog DB
999 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1000 recipeLookupResult = getDefaultVnfUri(sir, action);
1001 } else if (action == Action.addMembers || action == Action.removeMembers) {
1002 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1003 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1005 recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
1006 } catch (IOException e) {
1007 ErrorLoggerInfo errorLoggerInfo =
1008 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1009 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1012 ValidateException validateException =
1013 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1014 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1016 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1018 throw validateException;
1020 } else if (modelInfo.getModelType().equals(ModelType.vfModule)
1021 || modelInfo.getModelType().equals(ModelType.volumeGroup)
1022 || modelInfo.getModelType().equals(ModelType.vnf)) {
1024 recipeLookupResult = getVnfOrVfModuleUri(sir, action);
1025 } catch (ValidationException e) {
1026 ErrorLoggerInfo errorLoggerInfo =
1027 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1028 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1031 ValidateException validateException =
1032 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1033 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1035 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1037 throw validateException;
1039 } else if (modelInfo.getModelType().equals(ModelType.network)) {
1041 recipeLookupResult = getNetworkUri(sir, action);
1042 } catch (ValidationException e) {
1044 ErrorLoggerInfo errorLoggerInfo =
1045 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1046 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1049 ValidateException validateException =
1050 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1051 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1052 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1054 throw validateException;
1056 } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
1057 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1060 if (recipeLookupResult == null) {
1061 ErrorLoggerInfo errorLoggerInfo =
1062 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1063 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1066 RecipeNotFoundException recipeNotFoundExceptionException =
1067 new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
1068 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
1071 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
1072 recipeNotFoundExceptionException.getMessage());
1073 throw recipeNotFoundExceptionException;
1075 return recipeLookupResult;
1078 protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
1079 boolean alaCarteFlag) throws IOException {
1081 // Construct the default service name
1082 // TODO need to make this a configurable property
1083 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
1084 RequestDetails requestDetails = servInstReq.getRequestDetails();
1085 ModelInfo modelInfo = requestDetails.getModelInfo();
1086 org.onap.so.db.catalog.beans.Service serviceRecord;
1087 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1088 ServiceRecipe recipe = null;
1091 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1092 if (serviceRecord != null) {
1093 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1097 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1098 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
1100 if (recipe == null) {
1101 serviceRecordList = catalogDbClient
1102 .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1103 if (!serviceRecordList.isEmpty()) {
1104 for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
1105 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
1107 if (recipe != null) {
1115 // if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1116 RequestParameters reqParam = requestDetails.getRequestParameters();
1117 if (reqParam != null && alaCarteFlag && recipe == null) {
1119 } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1120 mapToLegacyRequest(requestDetails);
1121 } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
1122 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1123 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1126 if (modelInfo.getModelVersionId() == null) {
1127 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1129 if (recipe == null) {
1132 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1135 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1136 RequestParameters reqParam;
1137 if (requestDetails.getRequestParameters() == null) {
1138 reqParam = new RequestParameters();
1140 reqParam = requestDetails.getRequestParameters();
1142 if (requestDetails.getCloudConfiguration() == null) {
1143 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1144 if (cloudConfig != null) {
1145 requestDetails.setCloudConfiguration(cloudConfig);
1149 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1150 if (!userParams.isEmpty()) {
1151 if (reqParam == null) {
1152 requestDetails.setRequestParameters(new RequestParameters());
1154 requestDetails.getRequestParameters().setUserParams(userParams);
1158 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1160 for (Map<String, Object> params : reqParams.getUserParams()) {
1161 if (params.containsKey("service")) {
1162 Service service = serviceMapper(params);
1164 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1166 if (targetConfiguration.isPresent()) {
1167 return targetConfiguration.get();
1169 for (Networks network : service.getResources().getNetworks()) {
1170 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1171 if (targetConfiguration.isPresent()) {
1172 return targetConfiguration.get();
1176 for (Vnfs vnf : service.getResources().getVnfs()) {
1177 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1179 if (targetConfiguration.isPresent()) {
1180 return targetConfiguration.get();
1183 for (VfModules vfModule : vnf.getVfModules()) {
1184 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1186 if (targetConfiguration.isPresent()) {
1187 return targetConfiguration.get();
1198 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1199 CloudConfiguration targetConfiguration = new CloudConfiguration();
1200 if (sourceCloudConfiguration != null) {
1201 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1202 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1203 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1204 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1205 return Optional.of(targetConfiguration);
1207 return Optional.empty();
1210 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1211 logger.debug("Configuring UserParams for Macro Request");
1212 Map<String, Object> userParams = new HashMap<>();
1214 for (Map<String, Object> params : reqParams.getUserParams()) {
1215 if (params.containsKey("service")) {
1216 Service service = serviceMapper(params);
1218 addUserParams(userParams, service.getInstanceParams());
1220 for (Networks network : service.getResources().getNetworks()) {
1221 addUserParams(userParams, network.getInstanceParams());
1224 for (Vnfs vnf : service.getResources().getVnfs()) {
1225 addUserParams(userParams, vnf.getInstanceParams());
1227 for (VfModules vfModule : vnf.getVfModules()) {
1228 addUserParams(userParams, vfModule.getInstanceParams());
1234 return mapFlatMapToNameValue(userParams);
1237 private Service serviceMapper(Map<String, Object> params) throws IOException {
1238 ObjectMapper obj = new ObjectMapper();
1239 String input = obj.writeValueAsString(params.get("service"));
1240 return obj.readValue(input, Service.class);
1243 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1244 for (Map<String, String> map : sourceUserParams) {
1245 for (Map.Entry<String, String> entry : map.entrySet()) {
1246 targetUserParams.put(entry.getKey(), entry.getValue());
1251 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1252 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1254 for (Map.Entry<String, Object> map : flatMap.entrySet()) {
1255 Map<String, Object> targetMap = new HashMap<>();
1256 targetMap.put(NAME, map.getKey());
1257 targetMap.put(VALUE, map.getValue());
1258 targetUserParams.add(targetMap);
1260 return targetUserParams;
1263 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
1264 throws ValidationException {
1266 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1267 String vnfComponentType = modelInfo.getModelType().name();
1269 RelatedInstanceList[] instanceList = null;
1270 if (servInstReq.getRequestDetails() != null) {
1271 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1275 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1276 String modelCustomizationId = modelInfo.getModelCustomizationId();
1277 String modelCustomizationName = modelInfo.getModelCustomizationName();
1278 String relatedInstanceModelVersionId = null;
1279 String relatedInstanceModelInvariantId = null;
1280 String relatedInstanceVersion = null;
1281 String relatedInstanceModelCustomizationName = null;
1283 if (instanceList != null) {
1285 for (RelatedInstanceList relatedInstanceList : instanceList) {
1287 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1288 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1289 if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
1290 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1291 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1294 if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
1295 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1296 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1297 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1298 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1302 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1303 // a. For a vnf request (only create, no update currently):
1304 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in
1305 // vnf_resource_customization.model_customization_uuid.
1306 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1307 // pre-v3), then modelInfo.modelCustomizationName must have
1308 // been provided (else create request should be rejected). APIH should use the
1309 // relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1310 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a
1311 // vnf_resource_customization.model_customization_uuid record exists.
1312 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
1313 // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1314 // (MODEL_UUID) in SERVICE table.
1315 // iii. Regardless of how the value was provided/obtained above, APIH must always populate
1316 // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
1317 // during 1707 data migration if VID did not provide it originally on request.
1318 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated
1320 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to
1321 // look it up in our catalog to construct vnf-type value to pass to BPMN.
1323 VnfResource vnfResource = null;
1324 VnfResourceCustomization vrc = null;
1325 // Validation for vnfResource
1327 if (modelCustomizationId != null) {
1328 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1330 vnfResource = vrc.getVnfResources();
1333 org.onap.so.db.catalog.beans.Service service =
1334 catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1335 if (service == null) {
1336 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
1337 relatedInstanceModelInvariantId);
1340 if (service == null) {
1341 throw new ValidationException("service in relatedInstance");
1343 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1344 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1345 vrc = vnfResourceCustom;
1350 vnfResource = vrc.getVnfResources();
1351 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1352 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1356 if (vnfResource == null) {
1357 throw new ValidationException("vnfResource");
1359 if (modelInfo.getModelVersionId() == null) {
1360 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1364 VnfRecipe vnfRecipe = null;
1367 String nfRole = vrc.getNfRole();
1368 if (nfRole != null) {
1370 catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1374 if (vnfRecipe == null) {
1375 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1378 if (vnfRecipe == null) {
1382 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1385 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1386 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
1387 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
1388 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
1389 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
1390 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
1391 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
1392 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
1393 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
1394 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
1395 * the request). This means taking each record found // in vf_module_customization and looking up in
1396 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
1397 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
1399 VfModuleCustomization vfmc = null;
1401 VnfResourceCustomization vnfrc;
1402 VfModule vfModule = null;
1404 if (modelInfo.getModelCustomizationId() != null) {
1405 vfmc = catalogDbClient
1406 .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1408 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1410 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
1411 relatedInstanceModelInvariantId, relatedInstanceVersion);
1413 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
1414 relatedInstanceModelCustomizationName, vnfr);
1416 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1418 String vfModuleModelUUID = modelInfo.getModelVersionId();
1419 for (VfModuleCustomization vf : list) {
1420 VfModuleCustomization vfmCustom;
1421 if (vfModuleModelUUID != null) {
1422 vfmCustom = catalogDbClient
1423 .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
1424 vf.getModelCustomizationUUID(), vfModuleModelUUID);
1425 if (vfmCustom != null) {
1426 vfModule = vfmCustom.getVfModule();
1429 vfmCustom = catalogDbClient
1430 .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1431 if (vfmCustom != null) {
1432 vfModule = vfmCustom.getVfModule();
1434 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
1435 relatedInstanceModelInvariantId, relatedInstanceVersion);
1439 if (vfModule != null) {
1440 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1441 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1447 if (vfmc == null && vfModule == null) {
1448 throw new ValidationException("vfModuleCustomization");
1449 } else if (vfModule == null && vfmc != null) {
1450 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
1451 // VfModuleCustomization table
1454 if (modelInfo.getModelVersionId() == null) {
1455 modelInfo.setModelVersionId(vfModule.getModelUUID());
1459 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1460 vfModule.getModelUUID(), vnfComponentType, action.toString());
1461 if (recipe == null) {
1462 List<VfModule> vfModuleRecords = catalogDbClient
1463 .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1464 if (!vfModuleRecords.isEmpty()) {
1465 for (VfModule record : vfModuleRecords) {
1466 recipe = catalogDbClient
1467 .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1468 record.getModelUUID(), vnfComponentType, action.toString());
1469 if (recipe != null) {
1475 if (recipe == null) {
1476 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1477 defaultSource, vnfComponentType, action.toString());
1478 if (recipe == null) {
1479 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
1480 vnfComponentType, action.toString());
1483 if (recipe == null) {
1490 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1491 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1492 if (recipe == null) {
1496 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1497 defaultSource, vnfComponentType, action.toString());
1499 if (recipe == null) {
1505 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1508 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1510 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1512 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1514 if (vnfRecipe == null) {
1518 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1522 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1524 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1526 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1527 String modelName = modelInfo.getModelName();
1528 Recipe recipe = null;
1530 if (modelInfo.getModelCustomizationId() != null) {
1531 NetworkResourceCustomization networkResourceCustomization = catalogDbClient
1532 .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1533 if (networkResourceCustomization != null) {
1534 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1535 if (networkResource != null) {
1536 if (modelInfo.getModelVersionId() == null) {
1537 modelInfo.setModelVersionId(networkResource.getModelUUID());
1539 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
1542 throw new ValidationException("no catalog entry found");
1544 } else if (action != Action.deleteInstance) {
1545 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1548 // ok for version < 3 and action delete
1549 if (modelName != null) {
1550 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1554 if (recipe == null) {
1555 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1558 return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1562 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1563 String version, String requestId, String requestUri) throws ApiException {
1564 String serviceInstanceId;
1565 Boolean aLaCarte = null;
1566 String apiVersion = version.substring(1);
1567 boolean inProgress = false;
1568 ServiceInstancesRequest sir;
1570 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1571 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1572 InfraActiveRequests currentActiveReq =
1573 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1574 if (sir.getRequestDetails().getRequestParameters() != null) {
1575 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1577 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1579 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1580 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1582 InfraActiveRequests dup = null;
1584 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
1587 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1590 if (instanceIdMap != null && dup != null && inProgress) {
1591 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
1595 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1596 RequestReferences referencesResponse = new RequestReferences();
1597 referencesResponse.setRequestId(requestId);
1598 serviceResponse.setRequestReferences(referencesResponse);
1601 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1602 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1604 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1605 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1606 : "ALaCarte Recipe Timeout not found in properties";
1608 ErrorLoggerInfo errorLoggerInfo =
1609 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1610 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1613 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1614 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1616 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1618 throw validateException;
1622 serviceInstanceId = "";
1623 String configurationId = "";
1624 String pnfCorrelationId = "";
1626 if (sir.getServiceInstanceId() != null) {
1627 serviceInstanceId = sir.getServiceInstanceId();
1630 if (sir.getConfigurationId() != null) {
1631 configurationId = sir.getConfigurationId();
1634 pnfCorrelationId = getPnfCorrelationId(sir);
1637 infraActiveRequestsClient.save(currentActiveReq);
1638 } catch (Exception e) {
1639 ErrorLoggerInfo errorLoggerInfo =
1640 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1641 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1642 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1643 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1646 if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1648 } else if (aLaCarte == null) {
1651 RequestClientParameter requestClientParameter = null;
1653 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1654 .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1655 .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1656 .setConfigurationId(configurationId)
1657 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1658 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1659 } catch (IOException e) {
1660 ErrorLoggerInfo errorLoggerInfo =
1661 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1662 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1663 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1664 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1668 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,