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.infra.rest.validators.RequestValidatorListenerRunner;
55 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
56 import org.onap.so.constants.Status;
57 import org.onap.so.db.catalog.beans.NetworkResource;
58 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
59 import org.onap.so.db.catalog.beans.Recipe;
60 import org.onap.so.db.catalog.beans.ServiceRecipe;
61 import org.onap.so.db.catalog.beans.VfModule;
62 import org.onap.so.db.catalog.beans.VfModuleCustomization;
63 import org.onap.so.db.catalog.beans.VnfRecipe;
64 import org.onap.so.db.catalog.beans.VnfResource;
65 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
66 import org.onap.so.db.catalog.client.CatalogDbClient;
67 import org.onap.so.db.request.beans.InfraActiveRequests;
68 import org.onap.so.db.request.client.RequestsDbClient;
69 import org.onap.so.exceptions.ValidationException;
70 import org.onap.so.logger.ErrorCode;
71 import org.onap.so.logger.MessageEnum;
72 import org.onap.so.serviceinstancebeans.CloudConfiguration;
73 import org.onap.so.serviceinstancebeans.ModelInfo;
74 import org.onap.so.serviceinstancebeans.ModelType;
75 import org.onap.so.serviceinstancebeans.Networks;
76 import org.onap.so.serviceinstancebeans.RelatedInstance;
77 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
78 import org.onap.so.serviceinstancebeans.RequestDetails;
79 import org.onap.so.serviceinstancebeans.RequestParameters;
80 import org.onap.so.serviceinstancebeans.RequestReferences;
81 import org.onap.so.serviceinstancebeans.Service;
82 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
83 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
84 import org.onap.so.serviceinstancebeans.VfModules;
85 import org.onap.so.serviceinstancebeans.Vnfs;
86 import org.slf4j.Logger;
87 import org.slf4j.LoggerFactory;
88 import org.springframework.beans.factory.annotation.Autowired;
89 import org.springframework.core.env.Environment;
90 import org.springframework.stereotype.Component;
91 import org.springframework.web.client.RestTemplate;
92 import com.fasterxml.jackson.databind.ObjectMapper;
93 import io.swagger.annotations.Api;
94 import io.swagger.annotations.ApiOperation;
97 @Path("/onap/so/infra/serviceInstantiation")
98 @Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
99 public class ServiceInstances extends AbstractRestHandler {
101 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
102 private static String NAME = "name";
103 private static String VALUE = "value";
104 private static String uriPrefix = "/serviceInstantiation/";
105 private static final String SAVE_TO_DB = "save instance to db";
108 private Environment env;
111 private RestTemplate restTemplate;
114 private CatalogDbClient catalogDbClient;
117 private RequestsDbClient infraActiveRequestsClient;
120 private MsoRequest msoRequest;
123 private RequestHandlerUtils requestHandlerUtils;
126 private RequestValidatorListenerRunner requestValidatorListenerRunner;
129 @Path("/{version:[vV][5-7]}/serviceInstances")
130 @Consumes(MediaType.APPLICATION_JSON)
131 @Produces(MediaType.APPLICATION_JSON)
132 @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
134 public Response createServiceInstance(String request, @PathParam("version") String version,
135 @Context ContainerRequestContext requestContext) throws ApiException {
136 String requestId = requestHandlerUtils.getRequestId(requestContext);
137 return serviceInstances(request, Action.createInstance, null, version, requestId,
138 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
142 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
143 @Consumes(MediaType.APPLICATION_JSON)
144 @Produces(MediaType.APPLICATION_JSON)
145 @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
147 public Response activateServiceInstance(String request, @PathParam("version") String version,
148 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
149 throws ApiException {
150 String requestId = requestHandlerUtils.getRequestId(requestContext);
151 HashMap<String, String> instanceIdMap = new HashMap<>();
152 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
153 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
154 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
158 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
159 @Consumes(MediaType.APPLICATION_JSON)
160 @Produces(MediaType.APPLICATION_JSON)
161 @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
163 public Response deactivateServiceInstance(String request, @PathParam("version") String version,
164 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
165 throws ApiException {
166 String requestId = requestHandlerUtils.getRequestId(requestContext);
167 HashMap<String, String> instanceIdMap = new HashMap<>();
168 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
169 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
170 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
174 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
175 @Consumes(MediaType.APPLICATION_JSON)
176 @Produces(MediaType.APPLICATION_JSON)
177 @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
179 public Response deleteServiceInstance(String request, @PathParam("version") String version,
180 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
181 throws ApiException {
182 String requestId = requestHandlerUtils.getRequestId(requestContext);
183 HashMap<String, String> instanceIdMap = new HashMap<>();
184 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
185 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
186 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
190 @Path("/{version:[vV][7]}/serviceInstances/assign")
191 @Consumes(MediaType.APPLICATION_JSON)
192 @Produces(MediaType.APPLICATION_JSON)
193 @ApiOperation(value = "Assign Service Instance", response = Response.class)
195 public Response assignServiceInstance(String request, @PathParam("version") String version,
196 @Context ContainerRequestContext requestContext) throws ApiException {
197 String requestId = requestHandlerUtils.getRequestId(requestContext);
198 return serviceInstances(request, Action.assignInstance, null, version, requestId,
199 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
203 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
204 @Consumes(MediaType.APPLICATION_JSON)
205 @Produces(MediaType.APPLICATION_JSON)
206 @ApiOperation(value = "Unassign Service Instance", response = Response.class)
208 public Response unassignServiceInstance(String request, @PathParam("version") String version,
209 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
210 throws ApiException {
211 String requestId = requestHandlerUtils.getRequestId(requestContext);
212 HashMap<String, String> instanceIdMap = new HashMap<>();
213 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
214 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
215 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
219 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
220 @Consumes(MediaType.APPLICATION_JSON)
221 @Produces(MediaType.APPLICATION_JSON)
222 @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
224 public Response createPortConfiguration(String request, @PathParam("version") String version,
225 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
226 throws ApiException {
227 String requestId = requestHandlerUtils.getRequestId(requestContext);
228 HashMap<String, String> instanceIdMap = new HashMap<>();
229 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
230 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
231 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
235 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
236 @Consumes(MediaType.APPLICATION_JSON)
237 @Produces(MediaType.APPLICATION_JSON)
238 @ApiOperation(value = "Delete provided Port", response = Response.class)
240 public Response deletePortConfiguration(String request, @PathParam("version") String version,
241 @PathParam("serviceInstanceId") String serviceInstanceId,
242 @PathParam("configurationInstanceId") String configurationInstanceId,
243 @Context ContainerRequestContext requestContext) throws ApiException {
244 String requestId = requestHandlerUtils.getRequestId(requestContext);
245 HashMap<String, String> instanceIdMap = new HashMap<>();
246 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
247 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
248 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
249 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
253 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
254 @Consumes(MediaType.APPLICATION_JSON)
255 @Produces(MediaType.APPLICATION_JSON)
256 @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
258 public Response enablePort(String request, @PathParam("version") String version,
259 @PathParam("serviceInstanceId") String serviceInstanceId,
260 @PathParam("configurationInstanceId") String configurationInstanceId,
261 @Context ContainerRequestContext requestContext) throws ApiException {
262 String requestId = requestHandlerUtils.getRequestId(requestContext);
263 HashMap<String, String> instanceIdMap = new HashMap<>();
264 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
265 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
266 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
267 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
271 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
272 @Consumes(MediaType.APPLICATION_JSON)
273 @Produces(MediaType.APPLICATION_JSON)
274 @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
276 public Response disablePort(String request, @PathParam("version") String version,
277 @PathParam("serviceInstanceId") String serviceInstanceId,
278 @PathParam("configurationInstanceId") String configurationInstanceId,
279 @Context ContainerRequestContext requestContext) throws ApiException {
280 String requestId = requestHandlerUtils.getRequestId(requestContext);
281 HashMap<String, String> instanceIdMap = new HashMap<>();
282 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
283 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
284 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
285 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
289 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
290 @Consumes(MediaType.APPLICATION_JSON)
291 @Produces(MediaType.APPLICATION_JSON)
292 @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
294 public Response activatePort(String request, @PathParam("version") String version,
295 @PathParam("serviceInstanceId") String serviceInstanceId,
296 @PathParam("configurationInstanceId") String configurationInstanceId,
297 @Context ContainerRequestContext requestContext) throws ApiException {
298 String requestId = requestHandlerUtils.getRequestId(requestContext);
299 HashMap<String, String> instanceIdMap = new HashMap<>();
300 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
301 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
302 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
303 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
307 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
308 @Consumes(MediaType.APPLICATION_JSON)
309 @Produces(MediaType.APPLICATION_JSON)
310 @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
312 public Response deactivatePort(String request, @PathParam("version") String version,
313 @PathParam("serviceInstanceId") String serviceInstanceId,
314 @PathParam("configurationInstanceId") String configurationInstanceId,
315 @Context ContainerRequestContext requestContext) throws ApiException {
316 String requestId = requestHandlerUtils.getRequestId(requestContext);
317 HashMap<String, String> instanceIdMap = new HashMap<>();
318 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
320 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
321 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
325 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
326 @Consumes(MediaType.APPLICATION_JSON)
327 @Produces(MediaType.APPLICATION_JSON)
328 @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
330 public Response addRelationships(String request, @PathParam("version") String version,
331 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
332 throws ApiException {
333 String requestId = requestHandlerUtils.getRequestId(requestContext);
334 HashMap<String, String> instanceIdMap = new HashMap<>();
335 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
336 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
337 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
341 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
342 @Consumes(MediaType.APPLICATION_JSON)
343 @Produces(MediaType.APPLICATION_JSON)
344 @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
346 public Response removeRelationships(String request, @PathParam("version") String version,
347 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
348 throws ApiException {
349 String requestId = requestHandlerUtils.getRequestId(requestContext);
350 HashMap<String, String> instanceIdMap = new HashMap<>();
351 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
352 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
353 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
357 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
358 @Consumes(MediaType.APPLICATION_JSON)
359 @Produces(MediaType.APPLICATION_JSON)
360 @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
362 public Response createVnfInstance(String request, @PathParam("version") String version,
363 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
364 throws ApiException {
365 String requestId = requestHandlerUtils.getRequestId(requestContext);
366 HashMap<String, String> instanceIdMap = new HashMap<>();
367 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
369 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
370 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
371 } catch (Exception e) {
372 logger.error("Error in vnf", e);
378 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
379 @Consumes(MediaType.APPLICATION_JSON)
380 @Produces(MediaType.APPLICATION_JSON)
381 @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
383 public Response replaceVnfInstance(String request, @PathParam("version") String version,
384 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
385 @Context ContainerRequestContext requestContext) throws ApiException {
386 String requestId = requestHandlerUtils.getRequestId(requestContext);
387 HashMap<String, String> instanceIdMap = new HashMap<>();
388 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
389 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
390 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
391 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
395 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
396 @Consumes(MediaType.APPLICATION_JSON)
397 @Produces(MediaType.APPLICATION_JSON)
398 @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
399 response = Response.class)
401 public Response updateVnfInstance(String request, @PathParam("version") String version,
402 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
403 @Context ContainerRequestContext requestContext) throws ApiException {
404 String requestId = requestHandlerUtils.getRequestId(requestContext);
405 HashMap<String, String> instanceIdMap = new HashMap<>();
406 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
407 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
408 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
409 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
413 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
414 @Consumes(MediaType.APPLICATION_JSON)
415 @Produces(MediaType.APPLICATION_JSON)
416 @ApiOperation(value = "Apply updated configuration", response = Response.class)
417 public Response applyUpdatedConfig(String request, @PathParam("version") String version,
418 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
419 @Context ContainerRequestContext requestContext) throws ApiException {
420 String requestId = requestHandlerUtils.getRequestId(requestContext);
421 HashMap<String, String> instanceIdMap = new HashMap<>();
422 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
423 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
424 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
425 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
429 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
430 @Consumes(MediaType.APPLICATION_JSON)
431 @Produces(MediaType.APPLICATION_JSON)
432 @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
433 public Response recreateVnfInstance(String request, @PathParam("version") String version,
434 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
435 @Context ContainerRequestContext requestContext) throws ApiException {
436 String requestId = requestHandlerUtils.getRequestId(requestContext);
437 HashMap<String, String> instanceIdMap = new HashMap<>();
438 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
439 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
440 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
441 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));
593 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
594 @Consumes(MediaType.APPLICATION_JSON)
595 @Produces(MediaType.APPLICATION_JSON)
596 @ApiOperation(value = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
597 response = Response.class)
599 public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
600 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
601 @Context ContainerRequestContext requestContext) throws ApiException {
602 String requestId = requestHandlerUtils.getRequestId(requestContext);
603 HashMap<String, String> instanceIdMap = new HashMap<>();
604 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
605 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
606 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
607 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
611 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
612 @Consumes(MediaType.APPLICATION_JSON)
613 @Produces(MediaType.APPLICATION_JSON)
614 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
615 response = Response.class)
617 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
618 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
619 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
620 @Context ContainerRequestContext requestContext) throws ApiException {
621 String requestId = requestHandlerUtils.getRequestId(requestContext);
622 HashMap<String, String> instanceIdMap = new HashMap<>();
623 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
624 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
625 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
626 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
627 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
631 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
632 @Consumes(MediaType.APPLICATION_JSON)
633 @Produces(MediaType.APPLICATION_JSON)
634 @ApiOperation(value = "Delete provided VolumeGroup instance", response = Response.class)
636 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
637 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
638 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
639 @Context ContainerRequestContext requestContext) throws ApiException {
640 String requestId = requestHandlerUtils.getRequestId(requestContext);
641 HashMap<String, String> instanceIdMap = new HashMap<>();
642 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
643 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
644 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
645 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
646 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
650 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
651 @Consumes(MediaType.APPLICATION_JSON)
652 @Produces(MediaType.APPLICATION_JSON)
653 @ApiOperation(value = "Create NetworkInstance on a specified version and serviceInstance ",
654 response = Response.class)
656 public Response createNetworkInstance(String request, @PathParam("version") String version,
657 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
658 throws ApiException {
659 String requestId = requestHandlerUtils.getRequestId(requestContext);
660 HashMap<String, String> instanceIdMap = new HashMap<>();
661 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
662 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
663 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
667 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
668 @Consumes(MediaType.APPLICATION_JSON)
669 @Produces(MediaType.APPLICATION_JSON)
670 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
671 response = Response.class)
673 public Response updateNetworkInstance(String request, @PathParam("version") String version,
674 @PathParam("serviceInstanceId") String serviceInstanceId,
675 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
676 throws ApiException {
677 String requestId = requestHandlerUtils.getRequestId(requestContext);
678 HashMap<String, String> instanceIdMap = new HashMap<>();
679 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
680 instanceIdMap.put("networkInstanceId", networkInstanceId);
681 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
682 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
686 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
687 @Consumes(MediaType.APPLICATION_JSON)
688 @Produces(MediaType.APPLICATION_JSON)
689 @ApiOperation(value = "Delete provided Network instance", response = Response.class)
691 public Response deleteNetworkInstance(String request, @PathParam("version") String version,
692 @PathParam("serviceInstanceId") String serviceInstanceId,
693 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
694 throws ApiException {
695 String requestId = requestHandlerUtils.getRequestId(requestContext);
696 HashMap<String, String> instanceIdMap = new HashMap<>();
697 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
698 instanceIdMap.put("networkInstanceId", networkInstanceId);
699 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
700 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
704 @Path("/{version:[vV][7]}/instanceGroups")
705 @Consumes(MediaType.APPLICATION_JSON)
706 @Produces(MediaType.APPLICATION_JSON)
707 @ApiOperation(value = "Create instanceGroups", response = Response.class)
709 public Response createInstanceGroups(String request, @PathParam("version") String version,
710 @Context ContainerRequestContext requestContext) throws ApiException {
711 String requestId = requestHandlerUtils.getRequestId(requestContext);
712 return serviceInstances(request, Action.createInstance, null, version, requestId,
713 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
717 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
718 @Consumes(MediaType.APPLICATION_JSON)
719 @Produces(MediaType.APPLICATION_JSON)
720 @ApiOperation(value = "Delete instanceGroup", response = Response.class)
722 public Response deleteInstanceGroups(@PathParam("version") String version,
723 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
724 throws ApiException {
725 String requestId = requestHandlerUtils.getRequestId(requestContext);
726 HashMap<String, String> instanceIdMap = new HashMap<>();
727 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
728 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
729 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
733 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
734 @Consumes(MediaType.APPLICATION_JSON)
735 @Produces(MediaType.APPLICATION_JSON)
736 @ApiOperation(value = "Add instanceGroup members", response = Response.class)
738 public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
739 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
740 throws ApiException {
741 String requestId = requestHandlerUtils.getRequestId(requestContext);
742 HashMap<String, String> instanceIdMap = new HashMap<>();
743 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
744 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
745 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
749 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
750 @Consumes(MediaType.APPLICATION_JSON)
751 @Produces(MediaType.APPLICATION_JSON)
752 @ApiOperation(value = "Remove instanceGroup members", response = Response.class)
754 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
755 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
756 throws ApiException {
757 String requestId = requestHandlerUtils.getRequestId(requestContext);
758 HashMap<String, String> instanceIdMap = new HashMap<>();
759 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
760 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
761 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
765 * This method is used for POST a request to the BPEL client (BPMN).
767 * Convert the requestJson to ServiceInstanceRequest(sir), create the msoRequest object, check whether this request
768 * is already being processed in requestdb for duplicate check.
770 * Based on the alacarte flag, sir and msoRequest will do the recipe lookup from the service and servicerecipe table
771 * of catalogdb, and get the OrchestrationURI.
773 * If the present request is not the duplicate request then this request will be saved in the requestdb. and will
774 * POST a request to the BPMN engine at the OrchestrationURI fetched.
776 * @param requestJSON Json fetched as body in the API call
777 * @param action Type of action to be performed
778 * @param instanceIdMap Map of instance ids of service/vnf/vf/configuration etc..
779 * @param version Supported version of API
780 * @param requestId Unique id for the request
782 * @return response object
783 * @throws ApiException
785 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
786 String version, String requestId, String requestUri) throws ApiException {
787 return serviceInstances(requestJSON, action, instanceIdMap, version, requestId, requestUri, null);
791 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
792 String version, String requestId, String requestUri, HashMap<String, String> queryParams)
793 throws ApiException {
794 String serviceInstanceId;
795 Boolean aLaCarte = null;
796 ServiceInstancesRequest sir;
797 String apiVersion = version.substring(1);
799 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
800 action = handleReplaceInstance(action, sir);
801 requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams);
803 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
804 InfraActiveRequests currentActiveReq =
805 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
806 if (sir.getRequestDetails().getRequestParameters() != null) {
807 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
809 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
811 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
813 int requestVersion = Integer.parseInt(version.substring(1));
814 String instanceName = null;
815 if (sir.getRequestDetails().getRequestInfo() != null) {
816 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
818 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
819 String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
820 String networkType = msoRequest.getNetworkType(sir, requestScope);
821 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
822 String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
824 if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
825 currentActiveReq.setVnfType(vnfType);
826 } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
827 currentActiveReq.setNetworkType(networkType);
830 InfraActiveRequests dup = null;
831 boolean inProgress = false;
833 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
836 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
839 if (dup != null && inProgress) {
840 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
843 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
845 RequestReferences referencesResponse = new RequestReferences();
847 referencesResponse.setRequestId(requestId);
849 serviceResponse.setRequestReferences(referencesResponse);
850 RecipeLookupResult recipeLookupResult =
851 getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
852 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
854 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
855 ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
857 Boolean isBaseVfModule = false;
859 if (modelType.equals(ModelType.vfModule)) {
860 isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
864 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
866 String vfModuleId = "";
867 String volumeGroupId = "";
868 String networkId = "";
869 String pnfCorrelationId = "";
870 String instanceGroupId = null;
872 if (sir.getVnfInstanceId() != null) {
873 vnfId = sir.getVnfInstanceId();
876 if (sir.getVfModuleInstanceId() != null) {
877 vfModuleId = sir.getVfModuleInstanceId();
880 if (sir.getVolumeGroupInstanceId() != null) {
881 volumeGroupId = sir.getVolumeGroupInstanceId();
884 if (sir.getNetworkInstanceId() != null) {
885 networkId = sir.getNetworkInstanceId();
887 if (sir.getInstanceGroupId() != null) {
888 instanceGroupId = sir.getInstanceGroupId();
891 pnfCorrelationId = getPnfCorrelationId(sir);
894 infraActiveRequestsClient.save(currentActiveReq);
895 } catch (Exception e) {
896 logger.error("Exception occurred", e);
897 ErrorLoggerInfo errorLoggerInfo =
898 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
899 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
900 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
901 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
904 if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
906 } else if (aLaCarte == null) {
911 RequestClientParameter requestClientParameter = null;
913 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
914 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
915 .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
916 .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
917 .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
918 .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
919 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
920 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
921 .setInstanceGroupId(instanceGroupId).build();
922 } catch (IOException e) {
923 logger.error("Exception occurred", e);
924 ErrorLoggerInfo errorLoggerInfo =
925 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
926 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
927 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
928 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
931 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
932 recipeLookupResult.getOrchestrationURI(), requestScope);
940 protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
941 if (action != null && action.equals(Action.replaceInstance)
942 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
943 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
944 action = Action.replaceInstanceRetainAssignments;
950 * This method deletes the Instance Groups.
952 * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
953 * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
956 * @param instanceIdMap
960 * @param requestContext
962 * @throws ApiException
964 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
965 String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
966 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
967 Boolean aLaCarte = true;
968 String apiVersion = version.substring(1);
969 ServiceInstancesRequest sir = new ServiceInstancesRequest();
970 sir.setInstanceGroupId(instanceGroupId);
972 String requestScope = ModelType.instanceGroup.toString();
973 InfraActiveRequests currentActiveReq =
974 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
975 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
977 requestHandlerUtils.validateHeaders(requestContext);
978 } catch (ValidationException e) {
979 logger.error("Exception occurred", e);
980 ErrorLoggerInfo errorLoggerInfo =
981 new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
982 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
983 ValidateException validateException =
984 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
985 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
986 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
987 throw validateException;
990 InfraActiveRequests dup =
991 requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
992 boolean inProgress = false;
995 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
998 if (dup != null && inProgress) {
999 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
1003 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1005 RequestReferences referencesResponse = new RequestReferences();
1007 referencesResponse.setRequestId(requestId);
1009 serviceResponse.setRequestReferences(referencesResponse);
1010 Boolean isBaseVfModule = false;
1012 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1015 infraActiveRequestsClient.save(currentActiveReq);
1016 } catch (Exception e) {
1017 logger.error("Exception occurred", e);
1018 ErrorLoggerInfo errorLoggerInfo =
1019 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1020 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1021 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1022 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1025 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1026 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1027 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1028 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1031 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1032 recipeLookupResult.getOrchestrationURI(), requestScope);
1035 protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1036 return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1037 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1041 protected RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
1042 boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
1043 RecipeLookupResult recipeLookupResult = null;
1044 // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT
1045 // recipe for the requested action
1046 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1047 // Query MSO Catalog DB
1049 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1050 recipeLookupResult = getDefaultVnfUri(sir, action);
1051 } else if (action == Action.addMembers || action == Action.removeMembers) {
1052 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1053 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1055 recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
1056 } catch (IOException e) {
1057 ErrorLoggerInfo errorLoggerInfo =
1058 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1059 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1061 ValidateException validateException =
1062 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1063 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1065 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1067 throw validateException;
1069 } else if (modelInfo.getModelType().equals(ModelType.vfModule)
1070 || modelInfo.getModelType().equals(ModelType.volumeGroup)
1071 || modelInfo.getModelType().equals(ModelType.vnf)) {
1073 recipeLookupResult = getVnfOrVfModuleUri(sir, action);
1074 } catch (ValidationException e) {
1075 ErrorLoggerInfo errorLoggerInfo =
1076 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1077 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1079 ValidateException validateException =
1080 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1081 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1083 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1085 throw validateException;
1087 } else if (modelInfo.getModelType().equals(ModelType.network)) {
1089 recipeLookupResult = getNetworkUri(sir, action);
1090 } catch (ValidationException e) {
1092 ErrorLoggerInfo errorLoggerInfo =
1093 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1094 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1096 ValidateException validateException =
1097 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1098 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1099 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1101 throw validateException;
1103 } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
1104 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1107 if (recipeLookupResult == null) {
1108 ErrorLoggerInfo errorLoggerInfo =
1109 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1110 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1112 RecipeNotFoundException recipeNotFoundExceptionException =
1113 new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
1114 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
1117 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
1118 recipeNotFoundExceptionException.getMessage());
1119 throw recipeNotFoundExceptionException;
1121 return recipeLookupResult;
1124 protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
1125 boolean alaCarteFlag) throws IOException {
1127 // Construct the default service name
1128 // TODO need to make this a configurable property
1129 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
1130 RequestDetails requestDetails = servInstReq.getRequestDetails();
1131 ModelInfo modelInfo = requestDetails.getModelInfo();
1132 org.onap.so.db.catalog.beans.Service serviceRecord;
1133 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1134 ServiceRecipe recipe = null;
1137 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1138 if (serviceRecord != null) {
1139 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1143 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1144 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
1146 if (recipe == null) {
1147 serviceRecordList = catalogDbClient
1148 .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1149 if (!serviceRecordList.isEmpty()) {
1150 for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
1151 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
1153 if (recipe != null) {
1161 // if an aLaCarte flag was sent in the request, throw an error if the recipe was
1163 RequestParameters reqParam = requestDetails.getRequestParameters();
1164 if (reqParam != null && alaCarteFlag && recipe == null) {
1166 } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1167 mapToLegacyRequest(requestDetails);
1168 } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
1169 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1170 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1173 if (modelInfo.getModelVersionId() == null) {
1174 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1176 if (recipe == null) {
1179 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1182 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1183 RequestParameters reqParam;
1184 if (requestDetails.getRequestParameters() == null) {
1185 reqParam = new RequestParameters();
1187 reqParam = requestDetails.getRequestParameters();
1189 if (requestDetails.getCloudConfiguration() == null) {
1190 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1191 if (cloudConfig != null) {
1192 requestDetails.setCloudConfiguration(cloudConfig);
1196 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1197 if (!userParams.isEmpty()) {
1198 if (reqParam == null) {
1199 requestDetails.setRequestParameters(new RequestParameters());
1201 requestDetails.getRequestParameters().setUserParams(userParams);
1205 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1207 for (Map<String, Object> params : reqParams.getUserParams()) {
1208 if (params.containsKey("service")) {
1209 Service service = serviceMapper(params);
1211 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1213 if (targetConfiguration.isPresent()) {
1214 return targetConfiguration.get();
1216 for (Networks network : service.getResources().getNetworks()) {
1217 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1218 if (targetConfiguration.isPresent()) {
1219 return targetConfiguration.get();
1223 for (Vnfs vnf : service.getResources().getVnfs()) {
1224 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1226 if (targetConfiguration.isPresent()) {
1227 return targetConfiguration.get();
1230 for (VfModules vfModule : vnf.getVfModules()) {
1231 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1233 if (targetConfiguration.isPresent()) {
1234 return targetConfiguration.get();
1245 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1246 CloudConfiguration targetConfiguration = new CloudConfiguration();
1247 if (sourceCloudConfiguration != null) {
1248 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1249 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1250 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1251 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1252 return Optional.of(targetConfiguration);
1254 return Optional.empty();
1257 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1258 logger.debug("Configuring UserParams for Macro Request");
1259 Map<String, Object> userParams = new HashMap<>();
1261 for (Map<String, Object> params : reqParams.getUserParams()) {
1262 if (params.containsKey("service")) {
1263 Service service = serviceMapper(params);
1265 addUserParams(userParams, service.getInstanceParams());
1267 for (Networks network : service.getResources().getNetworks()) {
1268 addUserParams(userParams, network.getInstanceParams());
1271 for (Vnfs vnf : service.getResources().getVnfs()) {
1272 addUserParams(userParams, vnf.getInstanceParams());
1274 for (VfModules vfModule : vnf.getVfModules()) {
1275 addUserParams(userParams, vfModule.getInstanceParams());
1281 return mapFlatMapToNameValue(userParams);
1284 private Service serviceMapper(Map<String, Object> params) throws IOException {
1285 ObjectMapper obj = new ObjectMapper();
1286 String input = obj.writeValueAsString(params.get("service"));
1287 return obj.readValue(input, Service.class);
1290 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1291 for (Map<String, String> map : sourceUserParams) {
1292 for (Map.Entry<String, String> entry : map.entrySet()) {
1293 targetUserParams.put(entry.getKey(), entry.getValue());
1298 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1299 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1301 for (Map.Entry<String, Object> map : flatMap.entrySet()) {
1302 Map<String, Object> targetMap = new HashMap<>();
1303 targetMap.put(NAME, map.getKey());
1304 targetMap.put(VALUE, map.getValue());
1305 targetUserParams.add(targetMap);
1307 return targetUserParams;
1310 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
1311 throws ValidationException {
1313 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1314 String vnfComponentType = modelInfo.getModelType().name();
1316 RelatedInstanceList[] instanceList = null;
1317 if (servInstReq.getRequestDetails() != null) {
1318 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1322 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1323 String modelCustomizationId = modelInfo.getModelCustomizationId();
1324 String modelCustomizationName = modelInfo.getModelCustomizationName();
1325 String relatedInstanceModelVersionId = null;
1326 String relatedInstanceModelInvariantId = null;
1327 String relatedInstanceVersion = null;
1328 String relatedInstanceModelCustomizationName = null;
1330 if (instanceList != null) {
1332 for (RelatedInstanceList relatedInstanceList : instanceList) {
1334 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1335 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1336 if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
1337 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1338 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1341 if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
1342 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1343 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1344 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1345 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1349 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1350 // a. For a vnf request (only create, no update currently):
1351 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate
1352 // catalog DB has record in
1353 // vnf_resource_customization.model_customization_uuid.
1354 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is
1355 // a pre-1702 ASDC model or
1356 // pre-v3), then modelInfo.modelCustomizationName must have
1357 // been provided (else create request should be rejected). APIH should use the
1358 // relatedInstance.modelInfo[service].modelVersionId** +
1359 // modelInfo[vnf].modelCustomizationName
1360 // to “join�? service_to_resource_customizations with
1361 // vnf_resource_customization to confirm a
1362 // vnf_resource_customization.model_customization_uuid record exists.
1363 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
1364 // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to
1365 // lookup modelVersionId
1366 // (MODEL_UUID) in SERVICE table.
1367 // iii. Regardless of how the value was provided/obtained above, APIH must
1369 // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO
1371 // during 1707 data migration if VID did not provide it originally on request.
1372 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN
1373 // (must still be populated
1375 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use
1376 // modelCustomizationId to
1377 // look it up in our catalog to construct vnf-type value to pass to BPMN.
1379 VnfResource vnfResource = null;
1380 VnfResourceCustomization vrc = null;
1381 // Validation for vnfResource
1383 if (modelCustomizationId != null) {
1384 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1386 vnfResource = vrc.getVnfResources();
1389 org.onap.so.db.catalog.beans.Service service =
1390 catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1391 if (service == null) {
1392 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
1393 relatedInstanceModelInvariantId);
1396 if (service == null) {
1397 throw new ValidationException("service in relatedInstance");
1399 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1400 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1401 vrc = vnfResourceCustom;
1406 vnfResource = vrc.getVnfResources();
1407 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1408 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1412 if (vnfResource == null) {
1413 throw new ValidationException("vnfResource");
1415 if (modelInfo.getModelVersionId() == null) {
1416 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1420 VnfRecipe vnfRecipe = null;
1423 String nfRole = vrc.getNfRole();
1424 if (nfRole != null) {
1426 catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1430 if (vnfRecipe == null) {
1431 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1434 if (vnfRecipe == null) {
1438 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1441 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1442 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
1443 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
1444 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
1445 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
1446 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
1447 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
1448 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
1449 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
1450 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
1451 * the request). This means taking each record found // in vf_module_customization and looking up in
1452 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
1453 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
1455 VfModuleCustomization vfmc = null;
1457 VnfResourceCustomization vnfrc;
1458 VfModule vfModule = null;
1460 if (modelInfo.getModelCustomizationId() != null) {
1461 vfmc = catalogDbClient
1462 .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1464 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1466 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
1467 relatedInstanceModelInvariantId, relatedInstanceVersion);
1469 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
1470 relatedInstanceModelCustomizationName, vnfr);
1472 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1474 String vfModuleModelUUID = modelInfo.getModelVersionId();
1475 for (VfModuleCustomization vf : list) {
1476 VfModuleCustomization vfmCustom;
1477 if (vfModuleModelUUID != null) {
1478 vfmCustom = catalogDbClient
1479 .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
1480 vf.getModelCustomizationUUID(), vfModuleModelUUID);
1481 if (vfmCustom != null) {
1482 vfModule = vfmCustom.getVfModule();
1485 vfmCustom = catalogDbClient
1486 .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1487 if (vfmCustom != null) {
1488 vfModule = vfmCustom.getVfModule();
1490 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
1491 relatedInstanceModelInvariantId, relatedInstanceVersion);
1495 if (vfModule != null) {
1496 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1497 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1503 if (vfmc == null && vfModule == null) {
1504 throw new ValidationException("vfModuleCustomization");
1505 } else if (vfModule == null && vfmc != null) {
1506 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
1507 // VfModuleCustomization table
1510 if (modelInfo.getModelVersionId() == null) {
1511 modelInfo.setModelVersionId(vfModule.getModelUUID());
1514 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1515 vfModule.getModelUUID(), vnfComponentType, action.toString());
1516 if (recipe == null) {
1517 List<VfModule> vfModuleRecords = catalogDbClient
1518 .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1519 if (!vfModuleRecords.isEmpty()) {
1520 for (VfModule record : vfModuleRecords) {
1521 recipe = catalogDbClient
1522 .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1523 record.getModelUUID(), vnfComponentType, action.toString());
1524 if (recipe != null) {
1530 if (recipe == null) {
1531 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1532 defaultSource, vnfComponentType, action.toString());
1533 if (recipe == null) {
1534 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
1535 vnfComponentType, action.toString());
1538 if (recipe == null) {
1545 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1546 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1547 if (recipe == null) {
1551 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1552 defaultSource, vnfComponentType, action.toString());
1554 if (recipe == null) {
1560 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1563 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1565 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1567 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1569 if (vnfRecipe == null) {
1573 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1576 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1578 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1580 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1581 String modelName = modelInfo.getModelName();
1582 Recipe recipe = null;
1584 if (modelInfo.getModelCustomizationId() != null) {
1585 NetworkResourceCustomization networkResourceCustomization = catalogDbClient
1586 .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1587 if (networkResourceCustomization != null) {
1588 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1589 if (networkResource != null) {
1590 if (modelInfo.getModelVersionId() == null) {
1591 modelInfo.setModelVersionId(networkResource.getModelUUID());
1593 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
1596 throw new ValidationException("no catalog entry found");
1598 } else if (action != Action.deleteInstance) {
1599 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1602 // ok for version < 3 and action delete
1603 if (modelName != null) {
1604 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1608 if (recipe == null) {
1609 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1612 return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1615 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1616 String version, String requestId, String requestUri) throws ApiException {
1617 String serviceInstanceId;
1618 Boolean aLaCarte = null;
1619 String apiVersion = version.substring(1);
1620 boolean inProgress = false;
1621 ServiceInstancesRequest sir;
1623 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1624 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1625 InfraActiveRequests currentActiveReq =
1626 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1627 if (sir.getRequestDetails().getRequestParameters() != null) {
1628 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1630 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1632 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1633 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1635 InfraActiveRequests dup = null;
1637 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
1640 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1643 if (instanceIdMap != null && dup != null && inProgress) {
1644 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
1648 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1649 RequestReferences referencesResponse = new RequestReferences();
1650 referencesResponse.setRequestId(requestId);
1651 serviceResponse.setRequestReferences(referencesResponse);
1653 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1654 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1656 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1657 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1658 : "ALaCarte Recipe Timeout not found in properties";
1660 ErrorLoggerInfo errorLoggerInfo =
1661 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1662 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1664 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1665 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1667 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1669 throw validateException;
1673 serviceInstanceId = "";
1674 String configurationId = "";
1675 String pnfCorrelationId = "";
1677 if (sir.getServiceInstanceId() != null) {
1678 serviceInstanceId = sir.getServiceInstanceId();
1681 if (sir.getConfigurationId() != null) {
1682 configurationId = sir.getConfigurationId();
1685 pnfCorrelationId = getPnfCorrelationId(sir);
1688 infraActiveRequestsClient.save(currentActiveReq);
1689 } catch (Exception e) {
1690 ErrorLoggerInfo errorLoggerInfo =
1691 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1692 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1693 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1694 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1697 if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1699 } else if (aLaCarte == null) {
1702 RequestClientParameter requestClientParameter = null;
1704 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1705 .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1706 .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1707 .setConfigurationId(configurationId)
1708 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1709 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1710 } catch (IOException e) {
1711 ErrorLoggerInfo errorLoggerInfo =
1712 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1713 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1714 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1715 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1719 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,