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.core.JsonParseException;
93 import com.fasterxml.jackson.core.JsonProcessingException;
94 import com.fasterxml.jackson.databind.JsonMappingException;
95 import com.fasterxml.jackson.databind.ObjectMapper;
96 import io.swagger.annotations.Api;
97 import io.swagger.annotations.ApiOperation;
100 @Path("/onap/so/infra/serviceInstantiation")
101 @Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
102 public class ServiceInstances extends AbstractRestHandler {
104 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
105 private static String NAME = "name";
106 private static String VALUE = "value";
107 private static String uriPrefix = "/serviceInstantiation/";
108 private static final String SAVE_TO_DB = "save instance to db";
111 private Environment env;
114 private RestTemplate restTemplate;
117 private CatalogDbClient catalogDbClient;
120 private RequestsDbClient infraActiveRequestsClient;
123 private MsoRequest msoRequest;
126 private RequestHandlerUtils requestHandlerUtils;
129 private RequestValidatorListenerRunner requestValidatorListenerRunner;
132 @Path("/{version:[vV][5-7]}/serviceInstances")
133 @Consumes(MediaType.APPLICATION_JSON)
134 @Produces(MediaType.APPLICATION_JSON)
135 @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
137 public Response createServiceInstance(String request, @PathParam("version") String version,
138 @Context ContainerRequestContext requestContext) throws ApiException {
139 String requestId = requestHandlerUtils.getRequestId(requestContext);
140 return serviceInstances(request, Action.createInstance, null, version, requestId,
141 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
145 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
146 @Consumes(MediaType.APPLICATION_JSON)
147 @Produces(MediaType.APPLICATION_JSON)
148 @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
150 public Response activateServiceInstance(String request, @PathParam("version") String version,
151 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
152 throws ApiException {
153 String requestId = requestHandlerUtils.getRequestId(requestContext);
154 HashMap<String, String> instanceIdMap = new HashMap<>();
155 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
156 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
157 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
161 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
162 @Consumes(MediaType.APPLICATION_JSON)
163 @Produces(MediaType.APPLICATION_JSON)
164 @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
166 public Response deactivateServiceInstance(String request, @PathParam("version") String version,
167 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
168 throws ApiException {
169 String requestId = requestHandlerUtils.getRequestId(requestContext);
170 HashMap<String, String> instanceIdMap = new HashMap<>();
171 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
172 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
173 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
177 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
178 @Consumes(MediaType.APPLICATION_JSON)
179 @Produces(MediaType.APPLICATION_JSON)
180 @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
182 public Response deleteServiceInstance(String request, @PathParam("version") String version,
183 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
184 throws ApiException {
185 String requestId = requestHandlerUtils.getRequestId(requestContext);
186 HashMap<String, String> instanceIdMap = new HashMap<>();
187 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
188 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
189 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
193 @Path("/{version:[vV][7]}/serviceInstances/assign")
194 @Consumes(MediaType.APPLICATION_JSON)
195 @Produces(MediaType.APPLICATION_JSON)
196 @ApiOperation(value = "Assign Service Instance", response = Response.class)
198 public Response assignServiceInstance(String request, @PathParam("version") String version,
199 @Context ContainerRequestContext requestContext) throws ApiException {
200 String requestId = requestHandlerUtils.getRequestId(requestContext);
201 return serviceInstances(request, Action.assignInstance, null, version, requestId,
202 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
206 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
207 @Consumes(MediaType.APPLICATION_JSON)
208 @Produces(MediaType.APPLICATION_JSON)
209 @ApiOperation(value = "Unassign Service Instance", response = Response.class)
211 public Response unassignServiceInstance(String request, @PathParam("version") String version,
212 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
213 throws ApiException {
214 String requestId = requestHandlerUtils.getRequestId(requestContext);
215 HashMap<String, String> instanceIdMap = new HashMap<>();
216 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
217 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
218 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
222 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
223 @Consumes(MediaType.APPLICATION_JSON)
224 @Produces(MediaType.APPLICATION_JSON)
225 @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
227 public Response createPortConfiguration(String request, @PathParam("version") String version,
228 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
229 throws ApiException {
230 String requestId = requestHandlerUtils.getRequestId(requestContext);
231 HashMap<String, String> instanceIdMap = new HashMap<>();
232 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
233 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
234 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
238 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
239 @Consumes(MediaType.APPLICATION_JSON)
240 @Produces(MediaType.APPLICATION_JSON)
241 @ApiOperation(value = "Delete provided Port", response = Response.class)
243 public Response deletePortConfiguration(String request, @PathParam("version") String version,
244 @PathParam("serviceInstanceId") String serviceInstanceId,
245 @PathParam("configurationInstanceId") String configurationInstanceId,
246 @Context ContainerRequestContext requestContext) throws ApiException {
247 String requestId = requestHandlerUtils.getRequestId(requestContext);
248 HashMap<String, String> instanceIdMap = new HashMap<>();
249 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
250 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
251 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
252 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
256 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
257 @Consumes(MediaType.APPLICATION_JSON)
258 @Produces(MediaType.APPLICATION_JSON)
259 @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
261 public Response enablePort(String request, @PathParam("version") String version,
262 @PathParam("serviceInstanceId") String serviceInstanceId,
263 @PathParam("configurationInstanceId") String configurationInstanceId,
264 @Context ContainerRequestContext requestContext) throws ApiException {
265 String requestId = requestHandlerUtils.getRequestId(requestContext);
266 HashMap<String, String> instanceIdMap = new HashMap<>();
267 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
268 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
269 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
270 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
274 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
275 @Consumes(MediaType.APPLICATION_JSON)
276 @Produces(MediaType.APPLICATION_JSON)
277 @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
279 public Response disablePort(String request, @PathParam("version") String version,
280 @PathParam("serviceInstanceId") String serviceInstanceId,
281 @PathParam("configurationInstanceId") String configurationInstanceId,
282 @Context ContainerRequestContext requestContext) throws ApiException {
283 String requestId = requestHandlerUtils.getRequestId(requestContext);
284 HashMap<String, String> instanceIdMap = new HashMap<>();
285 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
286 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
287 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
288 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
292 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
293 @Consumes(MediaType.APPLICATION_JSON)
294 @Produces(MediaType.APPLICATION_JSON)
295 @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
297 public Response activatePort(String request, @PathParam("version") String version,
298 @PathParam("serviceInstanceId") String serviceInstanceId,
299 @PathParam("configurationInstanceId") String configurationInstanceId,
300 @Context ContainerRequestContext requestContext) throws ApiException {
301 String requestId = requestHandlerUtils.getRequestId(requestContext);
302 HashMap<String, String> instanceIdMap = new HashMap<>();
303 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
304 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
305 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
306 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
310 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
311 @Consumes(MediaType.APPLICATION_JSON)
312 @Produces(MediaType.APPLICATION_JSON)
313 @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
315 public Response deactivatePort(String request, @PathParam("version") String version,
316 @PathParam("serviceInstanceId") String serviceInstanceId,
317 @PathParam("configurationInstanceId") String configurationInstanceId,
318 @Context ContainerRequestContext requestContext) throws ApiException {
319 String requestId = requestHandlerUtils.getRequestId(requestContext);
320 HashMap<String, String> instanceIdMap = new HashMap<>();
321 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
322 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
323 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
324 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
328 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
329 @Consumes(MediaType.APPLICATION_JSON)
330 @Produces(MediaType.APPLICATION_JSON)
331 @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
333 public Response addRelationships(String request, @PathParam("version") String version,
334 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
335 throws ApiException {
336 String requestId = requestHandlerUtils.getRequestId(requestContext);
337 HashMap<String, String> instanceIdMap = new HashMap<>();
338 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
339 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
340 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
344 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
345 @Consumes(MediaType.APPLICATION_JSON)
346 @Produces(MediaType.APPLICATION_JSON)
347 @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
349 public Response removeRelationships(String request, @PathParam("version") String version,
350 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
351 throws ApiException {
352 String requestId = requestHandlerUtils.getRequestId(requestContext);
353 HashMap<String, String> instanceIdMap = new HashMap<>();
354 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
355 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
356 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
360 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
361 @Consumes(MediaType.APPLICATION_JSON)
362 @Produces(MediaType.APPLICATION_JSON)
363 @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
365 public Response createVnfInstance(String request, @PathParam("version") String version,
366 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
367 throws ApiException {
368 String requestId = requestHandlerUtils.getRequestId(requestContext);
369 HashMap<String, String> instanceIdMap = new HashMap<>();
370 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
372 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
373 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
374 } catch (Exception e) {
375 logger.error("Error in vnf", e);
381 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
382 @Consumes(MediaType.APPLICATION_JSON)
383 @Produces(MediaType.APPLICATION_JSON)
384 @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
386 public Response replaceVnfInstance(String request, @PathParam("version") String version,
387 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
388 @Context ContainerRequestContext requestContext) throws ApiException {
389 String requestId = requestHandlerUtils.getRequestId(requestContext);
390 HashMap<String, String> instanceIdMap = new HashMap<>();
391 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
392 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
393 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
394 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
398 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
399 @Consumes(MediaType.APPLICATION_JSON)
400 @Produces(MediaType.APPLICATION_JSON)
401 @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
402 response = Response.class)
404 public Response updateVnfInstance(String request, @PathParam("version") String version,
405 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
406 @Context ContainerRequestContext requestContext) throws ApiException {
407 String requestId = requestHandlerUtils.getRequestId(requestContext);
408 HashMap<String, String> instanceIdMap = new HashMap<>();
409 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
410 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
411 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
412 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
416 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
417 @Consumes(MediaType.APPLICATION_JSON)
418 @Produces(MediaType.APPLICATION_JSON)
419 @ApiOperation(value = "Apply updated configuration", response = Response.class)
420 public Response applyUpdatedConfig(String request, @PathParam("version") String version,
421 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
422 @Context ContainerRequestContext requestContext) throws ApiException {
423 String requestId = requestHandlerUtils.getRequestId(requestContext);
424 HashMap<String, String> instanceIdMap = new HashMap<>();
425 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
426 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
427 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
428 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
432 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
433 @Consumes(MediaType.APPLICATION_JSON)
434 @Produces(MediaType.APPLICATION_JSON)
435 @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
436 public Response recreateVnfInstance(String request, @PathParam("version") String version,
437 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
438 @Context ContainerRequestContext requestContext) throws ApiException {
439 String requestId = requestHandlerUtils.getRequestId(requestContext);
440 HashMap<String, String> instanceIdMap = new HashMap<>();
441 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
442 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
443 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
444 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
448 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
449 @Consumes(MediaType.APPLICATION_JSON)
450 @Produces(MediaType.APPLICATION_JSON)
451 @ApiOperation(value = "Delete provided VNF instance", response = Response.class)
453 public Response deleteVnfInstance(String request, @PathParam("version") String version,
454 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
455 @Context ContainerRequestContext requestContext) throws ApiException {
456 String requestId = requestHandlerUtils.getRequestId(requestContext);
457 HashMap<String, String> instanceIdMap = new HashMap<>();
458 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
459 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
460 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
461 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
465 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
466 @Consumes(MediaType.APPLICATION_JSON)
467 @Produces(MediaType.APPLICATION_JSON)
468 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
469 response = Response.class)
471 public Response createVfModuleInstance(String request, @PathParam("version") String version,
472 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
473 @Context ContainerRequestContext requestContext) throws ApiException {
474 String requestId = requestHandlerUtils.getRequestId(requestContext);
475 HashMap<String, String> instanceIdMap = new HashMap<>();
476 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
477 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
478 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
479 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
483 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
484 @Consumes(MediaType.APPLICATION_JSON)
485 @Produces(MediaType.APPLICATION_JSON)
486 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
487 response = Response.class)
489 public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
490 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
491 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
492 throws ApiException {
493 String requestId = requestHandlerUtils.getRequestId(requestContext);
494 HashMap<String, String> instanceIdMap = new HashMap<>();
495 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
496 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
497 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
498 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
499 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
503 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
504 @Consumes(MediaType.APPLICATION_JSON)
505 @Produces(MediaType.APPLICATION_JSON)
506 @ApiOperation(value = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
507 response = Response.class)
509 public Response updateVfModuleInstance(String request, @PathParam("version") String version,
510 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
511 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
512 throws ApiException {
513 String requestId = requestHandlerUtils.getRequestId(requestContext);
514 HashMap<String, String> instanceIdMap = new HashMap<>();
515 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
516 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
517 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
518 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
519 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
523 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
524 @Consumes(MediaType.APPLICATION_JSON)
525 @Produces(MediaType.APPLICATION_JSON)
526 @ApiOperation(value = "Perform VNF software update", response = Response.class)
528 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
529 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
530 @Context ContainerRequestContext requestContext) throws ApiException {
531 String requestId = requestHandlerUtils.getRequestId(requestContext);
532 HashMap<String, String> instanceIdMap = new HashMap<>();
533 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
534 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
535 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
536 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
540 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
541 @Consumes(MediaType.APPLICATION_JSON)
542 @Produces(MediaType.APPLICATION_JSON)
543 @ApiOperation(value = "Delete provided VfModule instance", response = Response.class)
545 public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
546 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
547 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
548 throws ApiException {
549 String requestId = requestHandlerUtils.getRequestId(requestContext);
550 HashMap<String, String> instanceIdMap = new HashMap<>();
551 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
552 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
553 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
554 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
555 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
559 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
560 @Consumes(MediaType.APPLICATION_JSON)
561 @Produces(MediaType.APPLICATION_JSON)
562 @ApiOperation(value = "Deactivate and Cloud Delete VfModule instance", response = Response.class)
564 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
565 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
566 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
567 throws ApiException {
568 String requestId = requestHandlerUtils.getRequestId(requestContext);
569 HashMap<String, String> instanceIdMap = new HashMap<>();
570 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
571 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
572 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
573 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
574 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
579 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
580 @Consumes(MediaType.APPLICATION_JSON)
581 @Produces(MediaType.APPLICATION_JSON)
582 @ApiOperation(value = "VF Auto Scale Out", response = Response.class)
584 public Response scaleOutVfModule(String request, @PathParam("version") String version,
585 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
586 @Context ContainerRequestContext requestContext) throws ApiException {
587 String requestId = requestHandlerUtils.getRequestId(requestContext);
588 HashMap<String, String> instanceIdMap = new HashMap<>();
589 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
590 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
591 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
592 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
596 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
597 @Consumes(MediaType.APPLICATION_JSON)
598 @Produces(MediaType.APPLICATION_JSON)
599 @ApiOperation(value = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
600 response = Response.class)
602 public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
603 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
604 @Context ContainerRequestContext requestContext) throws ApiException {
605 String requestId = requestHandlerUtils.getRequestId(requestContext);
606 HashMap<String, String> instanceIdMap = new HashMap<>();
607 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
608 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
609 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
610 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
614 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
615 @Consumes(MediaType.APPLICATION_JSON)
616 @Produces(MediaType.APPLICATION_JSON)
617 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
618 response = Response.class)
620 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
621 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
622 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
623 @Context ContainerRequestContext requestContext) throws ApiException {
624 String requestId = requestHandlerUtils.getRequestId(requestContext);
625 HashMap<String, String> instanceIdMap = new HashMap<>();
626 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
627 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
628 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
629 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
630 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
634 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
635 @Consumes(MediaType.APPLICATION_JSON)
636 @Produces(MediaType.APPLICATION_JSON)
637 @ApiOperation(value = "Delete provided VolumeGroup instance", response = Response.class)
639 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
640 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
641 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
642 @Context ContainerRequestContext requestContext) throws ApiException {
643 String requestId = requestHandlerUtils.getRequestId(requestContext);
644 HashMap<String, String> instanceIdMap = new HashMap<>();
645 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
646 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
647 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
648 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
649 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
653 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
654 @Consumes(MediaType.APPLICATION_JSON)
655 @Produces(MediaType.APPLICATION_JSON)
656 @ApiOperation(value = "Create NetworkInstance on a specified version and serviceInstance ",
657 response = Response.class)
659 public Response createNetworkInstance(String request, @PathParam("version") String version,
660 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
661 throws ApiException {
662 String requestId = requestHandlerUtils.getRequestId(requestContext);
663 HashMap<String, String> instanceIdMap = new HashMap<>();
664 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
665 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
666 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
670 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
671 @Consumes(MediaType.APPLICATION_JSON)
672 @Produces(MediaType.APPLICATION_JSON)
673 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
674 response = Response.class)
676 public Response updateNetworkInstance(String request, @PathParam("version") String version,
677 @PathParam("serviceInstanceId") String serviceInstanceId,
678 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
679 throws ApiException {
680 String requestId = requestHandlerUtils.getRequestId(requestContext);
681 HashMap<String, String> instanceIdMap = new HashMap<>();
682 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
683 instanceIdMap.put("networkInstanceId", networkInstanceId);
684 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
685 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
689 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
690 @Consumes(MediaType.APPLICATION_JSON)
691 @Produces(MediaType.APPLICATION_JSON)
692 @ApiOperation(value = "Delete provided Network instance", response = Response.class)
694 public Response deleteNetworkInstance(String request, @PathParam("version") String version,
695 @PathParam("serviceInstanceId") String serviceInstanceId,
696 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
697 throws ApiException {
698 String requestId = requestHandlerUtils.getRequestId(requestContext);
699 HashMap<String, String> instanceIdMap = new HashMap<>();
700 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
701 instanceIdMap.put("networkInstanceId", networkInstanceId);
702 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
703 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
707 @Path("/{version:[vV][7]}/instanceGroups")
708 @Consumes(MediaType.APPLICATION_JSON)
709 @Produces(MediaType.APPLICATION_JSON)
710 @ApiOperation(value = "Create instanceGroups", response = Response.class)
712 public Response createInstanceGroups(String request, @PathParam("version") String version,
713 @Context ContainerRequestContext requestContext) throws ApiException {
714 String requestId = requestHandlerUtils.getRequestId(requestContext);
715 return serviceInstances(request, Action.createInstance, null, version, requestId,
716 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
720 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
721 @Consumes(MediaType.APPLICATION_JSON)
722 @Produces(MediaType.APPLICATION_JSON)
723 @ApiOperation(value = "Delete instanceGroup", response = Response.class)
725 public Response deleteInstanceGroups(@PathParam("version") String version,
726 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
727 throws ApiException {
728 String requestId = requestHandlerUtils.getRequestId(requestContext);
729 HashMap<String, String> instanceIdMap = new HashMap<>();
730 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
731 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
732 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
736 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
737 @Consumes(MediaType.APPLICATION_JSON)
738 @Produces(MediaType.APPLICATION_JSON)
739 @ApiOperation(value = "Add instanceGroup members", response = Response.class)
741 public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
742 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
743 throws ApiException {
744 String requestId = requestHandlerUtils.getRequestId(requestContext);
745 HashMap<String, String> instanceIdMap = new HashMap<>();
746 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
747 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
748 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
752 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
753 @Consumes(MediaType.APPLICATION_JSON)
754 @Produces(MediaType.APPLICATION_JSON)
755 @ApiOperation(value = "Remove instanceGroup members", response = Response.class)
757 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
758 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
759 throws ApiException {
760 String requestId = requestHandlerUtils.getRequestId(requestContext);
761 HashMap<String, String> instanceIdMap = new HashMap<>();
762 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
763 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
764 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
768 * This method is used for POST a request to the BPEL client (BPMN).
770 * Convert the requestJson to ServiceInstanceRequest(sir), create the msoRequest object, check whether this request
771 * is already being processed in requestdb for duplicate check.
773 * Based on the alacarte flag, sir and msoRequest will do the recipe lookup from the service and servicerecipe table
774 * of catalogdb, and get the OrchestrationURI.
776 * If the present request is not the duplicate request then this request will be saved in the requestdb. and will
777 * POST a request to the BPMN engine at the OrchestrationURI fetched.
779 * @param requestJSON Json fetched as body in the API call
780 * @param action Type of action to be performed
781 * @param instanceIdMap Map of instance ids of service/vnf/vf/configuration etc..
782 * @param version Supported version of API
783 * @param requestId Unique id for the request
785 * @return response object
786 * @throws ApiException
788 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
789 String version, String requestId, String requestUri) throws ApiException {
790 return serviceInstances(requestJSON, action, instanceIdMap, version, requestId, requestUri, null);
794 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
795 String version, String requestId, String requestUri, HashMap<String, String> queryParams)
796 throws ApiException {
797 String serviceInstanceId;
798 Boolean aLaCarte = null;
799 ServiceInstancesRequest sir;
800 String apiVersion = version.substring(1);
802 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
803 action = handleReplaceInstance(action, sir);
804 requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams);
806 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
807 InfraActiveRequests currentActiveReq =
808 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
809 if (sir.getRequestDetails().getRequestParameters() != null) {
810 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
812 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
814 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
816 int requestVersion = Integer.parseInt(version.substring(1));
817 String instanceName = null;
818 if (sir.getRequestDetails().getRequestInfo() != null) {
819 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
821 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
822 String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
823 String networkType = msoRequest.getNetworkType(sir, requestScope);
824 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
825 String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
827 if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
828 currentActiveReq.setVnfType(vnfType);
829 } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
830 currentActiveReq.setNetworkType(networkType);
833 InfraActiveRequests dup = null;
834 boolean inProgress = false;
836 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
839 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
842 if (dup != null && inProgress) {
843 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
846 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
848 RequestReferences referencesResponse = new RequestReferences();
850 referencesResponse.setRequestId(requestId);
852 serviceResponse.setRequestReferences(referencesResponse);
853 RecipeLookupResult recipeLookupResult =
854 getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
855 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
857 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
858 ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
860 Boolean isBaseVfModule = false;
862 if (modelType.equals(ModelType.vfModule)) {
863 isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
867 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
869 String vfModuleId = "";
870 String volumeGroupId = "";
871 String networkId = "";
872 String pnfCorrelationId = "";
873 String instanceGroupId = null;
875 if (sir.getVnfInstanceId() != null) {
876 vnfId = sir.getVnfInstanceId();
879 if (sir.getVfModuleInstanceId() != null) {
880 vfModuleId = sir.getVfModuleInstanceId();
883 if (sir.getVolumeGroupInstanceId() != null) {
884 volumeGroupId = sir.getVolumeGroupInstanceId();
887 if (sir.getNetworkInstanceId() != null) {
888 networkId = sir.getNetworkInstanceId();
890 if (sir.getInstanceGroupId() != null) {
891 instanceGroupId = sir.getInstanceGroupId();
894 pnfCorrelationId = getPnfCorrelationId(sir);
897 infraActiveRequestsClient.save(currentActiveReq);
898 } catch (Exception e) {
899 logger.error("Exception occurred", e);
900 ErrorLoggerInfo errorLoggerInfo =
901 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
902 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
903 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
904 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
907 if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
909 } else if (aLaCarte == null) {
914 RequestClientParameter requestClientParameter = null;
916 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
917 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
918 .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
919 .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
920 .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
921 .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
922 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
923 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
924 .setInstanceGroupId(instanceGroupId).build();
925 } catch (IOException e) {
926 logger.error("Exception occurred", e);
927 ErrorLoggerInfo errorLoggerInfo =
928 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
929 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
930 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
931 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
934 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
935 recipeLookupResult.getOrchestrationURI(), requestScope);
943 protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
944 if (action != null && action.equals(Action.replaceInstance)
945 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
946 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
947 action = Action.replaceInstanceRetainAssignments;
953 * This method deletes the Instance Groups.
955 * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
956 * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
959 * @param instanceIdMap
963 * @param requestContext
965 * @throws ApiException
967 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
968 String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
969 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
970 Boolean aLaCarte = true;
971 String apiVersion = version.substring(1);
972 ServiceInstancesRequest sir = new ServiceInstancesRequest();
973 sir.setInstanceGroupId(instanceGroupId);
975 String requestScope = ModelType.instanceGroup.toString();
976 InfraActiveRequests currentActiveReq =
977 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
978 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
980 requestHandlerUtils.validateHeaders(requestContext);
981 } catch (ValidationException e) {
982 logger.error("Exception occurred", e);
983 ErrorLoggerInfo errorLoggerInfo =
984 new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
985 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
986 ValidateException validateException =
987 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
988 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
989 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
990 throw validateException;
993 InfraActiveRequests dup =
994 requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
995 boolean inProgress = false;
998 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1001 if (dup != null && inProgress) {
1002 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
1006 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1008 RequestReferences referencesResponse = new RequestReferences();
1010 referencesResponse.setRequestId(requestId);
1012 serviceResponse.setRequestReferences(referencesResponse);
1013 Boolean isBaseVfModule = false;
1015 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1018 infraActiveRequestsClient.save(currentActiveReq);
1019 } catch (Exception e) {
1020 logger.error("Exception occurred", e);
1021 ErrorLoggerInfo errorLoggerInfo =
1022 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1023 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1024 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1025 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1028 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1029 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1030 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1031 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1034 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1035 recipeLookupResult.getOrchestrationURI(), requestScope);
1038 protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1039 return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1040 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1044 protected RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
1045 boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
1046 RecipeLookupResult recipeLookupResult = null;
1047 // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT
1048 // recipe for the requested action
1049 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1050 // Query MSO Catalog DB
1052 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1053 recipeLookupResult = getDefaultVnfUri(sir, action);
1054 } else if (action == Action.addMembers || action == Action.removeMembers) {
1055 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1056 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1058 recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
1059 } catch (IOException e) {
1060 ErrorLoggerInfo errorLoggerInfo =
1061 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1062 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1064 ValidateException validateException =
1065 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1066 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1068 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1070 throw validateException;
1072 } else if (modelInfo.getModelType().equals(ModelType.vfModule)
1073 || modelInfo.getModelType().equals(ModelType.volumeGroup)
1074 || modelInfo.getModelType().equals(ModelType.vnf)) {
1076 recipeLookupResult = getVnfOrVfModuleUri(sir, action);
1077 } catch (ValidationException e) {
1078 ErrorLoggerInfo errorLoggerInfo =
1079 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1080 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1082 ValidateException validateException =
1083 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1084 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1086 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1088 throw validateException;
1090 } else if (modelInfo.getModelType().equals(ModelType.network)) {
1092 recipeLookupResult = getNetworkUri(sir, action);
1093 } catch (ValidationException e) {
1095 ErrorLoggerInfo errorLoggerInfo =
1096 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1097 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1099 ValidateException validateException =
1100 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1101 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1102 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1104 throw validateException;
1106 } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
1107 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1110 if (recipeLookupResult == null) {
1111 ErrorLoggerInfo errorLoggerInfo =
1112 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1113 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1115 RecipeNotFoundException recipeNotFoundExceptionException =
1116 new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
1117 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
1120 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
1121 recipeNotFoundExceptionException.getMessage());
1122 throw recipeNotFoundExceptionException;
1124 return recipeLookupResult;
1127 protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
1128 boolean alaCarteFlag) throws IOException {
1130 // Construct the default service name
1131 // TODO need to make this a configurable property
1132 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
1133 RequestDetails requestDetails = servInstReq.getRequestDetails();
1134 ModelInfo modelInfo = requestDetails.getModelInfo();
1135 org.onap.so.db.catalog.beans.Service serviceRecord;
1136 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1137 ServiceRecipe recipe = null;
1140 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1141 if (serviceRecord != null) {
1142 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1146 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1147 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
1149 if (recipe == null) {
1150 serviceRecordList = catalogDbClient
1151 .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1152 if (!serviceRecordList.isEmpty()) {
1153 for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
1154 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
1156 if (recipe != null) {
1164 // if an aLaCarte flag was sent in the request, throw an error if the recipe was
1166 RequestParameters reqParam = requestDetails.getRequestParameters();
1167 if (reqParam != null && alaCarteFlag && recipe == null) {
1169 } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1170 mapToLegacyRequest(requestDetails);
1171 } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
1172 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1173 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1176 if (modelInfo.getModelVersionId() == null) {
1177 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1179 if (recipe == null) {
1182 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1185 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1186 RequestParameters reqParam;
1187 if (requestDetails.getRequestParameters() == null) {
1188 reqParam = new RequestParameters();
1190 reqParam = requestDetails.getRequestParameters();
1192 if (requestDetails.getCloudConfiguration() == null) {
1193 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1194 if (cloudConfig != null) {
1195 requestDetails.setCloudConfiguration(cloudConfig);
1199 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1200 if (!userParams.isEmpty()) {
1201 if (reqParam == null) {
1202 requestDetails.setRequestParameters(new RequestParameters());
1204 requestDetails.getRequestParameters().setUserParams(userParams);
1208 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1210 for (Map<String, Object> params : reqParams.getUserParams()) {
1211 if (params.containsKey("service")) {
1212 Service service = serviceMapper(params);
1214 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1216 if (targetConfiguration.isPresent()) {
1217 return targetConfiguration.get();
1219 for (Networks network : service.getResources().getNetworks()) {
1220 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1221 if (targetConfiguration.isPresent()) {
1222 return targetConfiguration.get();
1226 for (Vnfs vnf : service.getResources().getVnfs()) {
1227 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1229 if (targetConfiguration.isPresent()) {
1230 return targetConfiguration.get();
1233 for (VfModules vfModule : vnf.getVfModules()) {
1234 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1236 if (targetConfiguration.isPresent()) {
1237 return targetConfiguration.get();
1248 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1249 CloudConfiguration targetConfiguration = new CloudConfiguration();
1250 if (sourceCloudConfiguration != null) {
1251 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1252 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1253 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1254 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1255 return Optional.of(targetConfiguration);
1257 return Optional.empty();
1260 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1261 logger.debug("Configuring UserParams for Macro Request");
1262 Map<String, Object> userParams = new HashMap<>();
1264 for (Map<String, Object> params : reqParams.getUserParams()) {
1265 if (params.containsKey("service")) {
1266 Service service = serviceMapper(params);
1268 addUserParams(userParams, service.getInstanceParams());
1270 for (Networks network : service.getResources().getNetworks()) {
1271 addUserParams(userParams, network.getInstanceParams());
1274 for (Vnfs vnf : service.getResources().getVnfs()) {
1275 addUserParams(userParams, vnf.getInstanceParams());
1277 for (VfModules vfModule : vnf.getVfModules()) {
1278 addUserParams(userParams, vfModule.getInstanceParams());
1284 return mapFlatMapToNameValue(userParams);
1287 private Service serviceMapper(Map<String, Object> params) throws IOException {
1288 ObjectMapper obj = new ObjectMapper();
1289 String input = obj.writeValueAsString(params.get("service"));
1290 return obj.readValue(input, Service.class);
1293 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1294 for (Map<String, String> map : sourceUserParams) {
1295 for (Map.Entry<String, String> entry : map.entrySet()) {
1296 targetUserParams.put(entry.getKey(), entry.getValue());
1301 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1302 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1304 for (Map.Entry<String, Object> map : flatMap.entrySet()) {
1305 Map<String, Object> targetMap = new HashMap<>();
1306 targetMap.put(NAME, map.getKey());
1307 targetMap.put(VALUE, map.getValue());
1308 targetUserParams.add(targetMap);
1310 return targetUserParams;
1313 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
1314 throws ValidationException {
1316 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1317 String vnfComponentType = modelInfo.getModelType().name();
1319 RelatedInstanceList[] instanceList = null;
1320 if (servInstReq.getRequestDetails() != null) {
1321 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1325 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1326 String modelCustomizationId = modelInfo.getModelCustomizationId();
1327 String modelCustomizationName = modelInfo.getModelCustomizationName();
1328 String relatedInstanceModelVersionId = null;
1329 String relatedInstanceModelInvariantId = null;
1330 String relatedInstanceVersion = null;
1331 String relatedInstanceModelCustomizationName = null;
1333 if (instanceList != null) {
1335 for (RelatedInstanceList relatedInstanceList : instanceList) {
1337 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1338 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1339 if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
1340 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1341 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1344 if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
1345 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1346 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1347 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1348 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1352 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1353 // a. For a vnf request (only create, no update currently):
1354 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate
1355 // catalog DB has record in
1356 // vnf_resource_customization.model_customization_uuid.
1357 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is
1358 // a pre-1702 ASDC model or
1359 // pre-v3), then modelInfo.modelCustomizationName must have
1360 // been provided (else create request should be rejected). APIH should use the
1361 // relatedInstance.modelInfo[service].modelVersionId** +
1362 // modelInfo[vnf].modelCustomizationName
1363 // to “join�? service_to_resource_customizations with
1364 // vnf_resource_customization to confirm a
1365 // vnf_resource_customization.model_customization_uuid record exists.
1366 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
1367 // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to
1368 // lookup modelVersionId
1369 // (MODEL_UUID) in SERVICE table.
1370 // iii. Regardless of how the value was provided/obtained above, APIH must
1372 // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO
1374 // during 1707 data migration if VID did not provide it originally on request.
1375 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN
1376 // (must still be populated
1378 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use
1379 // modelCustomizationId to
1380 // look it up in our catalog to construct vnf-type value to pass to BPMN.
1382 VnfResource vnfResource = null;
1383 VnfResourceCustomization vrc = null;
1384 // Validation for vnfResource
1386 if (modelCustomizationId != null) {
1387 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1389 vnfResource = vrc.getVnfResources();
1392 org.onap.so.db.catalog.beans.Service service =
1393 catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1394 if (service == null) {
1395 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
1396 relatedInstanceModelInvariantId);
1399 if (service == null) {
1400 throw new ValidationException("service in relatedInstance");
1402 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1403 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1404 vrc = vnfResourceCustom;
1409 vnfResource = vrc.getVnfResources();
1410 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1411 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1415 if (vnfResource == null) {
1416 throw new ValidationException("vnfResource");
1418 if (modelInfo.getModelVersionId() == null) {
1419 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1423 VnfRecipe vnfRecipe = null;
1426 String nfRole = vrc.getNfRole();
1427 if (nfRole != null) {
1429 catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1433 if (vnfRecipe == null) {
1434 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1437 if (vnfRecipe == null) {
1441 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1444 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1445 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
1446 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
1447 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
1448 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
1449 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
1450 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
1451 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
1452 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
1453 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
1454 * the request). This means taking each record found // in vf_module_customization and looking up in
1455 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
1456 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
1458 VfModuleCustomization vfmc = null;
1460 VnfResourceCustomization vnfrc;
1461 VfModule vfModule = null;
1463 if (modelInfo.getModelCustomizationId() != null) {
1464 vfmc = catalogDbClient
1465 .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1467 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1469 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
1470 relatedInstanceModelInvariantId, relatedInstanceVersion);
1472 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
1473 relatedInstanceModelCustomizationName, vnfr);
1475 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1477 String vfModuleModelUUID = modelInfo.getModelVersionId();
1478 for (VfModuleCustomization vf : list) {
1479 VfModuleCustomization vfmCustom;
1480 if (vfModuleModelUUID != null) {
1481 vfmCustom = catalogDbClient
1482 .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
1483 vf.getModelCustomizationUUID(), vfModuleModelUUID);
1484 if (vfmCustom != null) {
1485 vfModule = vfmCustom.getVfModule();
1488 vfmCustom = catalogDbClient
1489 .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1490 if (vfmCustom != null) {
1491 vfModule = vfmCustom.getVfModule();
1493 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
1494 relatedInstanceModelInvariantId, relatedInstanceVersion);
1498 if (vfModule != null) {
1499 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1500 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1506 if (vfmc == null && vfModule == null) {
1507 throw new ValidationException("vfModuleCustomization");
1508 } else if (vfModule == null && vfmc != null) {
1509 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
1510 // VfModuleCustomization table
1513 if (modelInfo.getModelVersionId() == null) {
1514 modelInfo.setModelVersionId(vfModule.getModelUUID());
1517 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1518 vfModule.getModelUUID(), vnfComponentType, action.toString());
1519 if (recipe == null) {
1520 List<VfModule> vfModuleRecords = catalogDbClient
1521 .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1522 if (!vfModuleRecords.isEmpty()) {
1523 for (VfModule record : vfModuleRecords) {
1524 recipe = catalogDbClient
1525 .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1526 record.getModelUUID(), vnfComponentType, action.toString());
1527 if (recipe != null) {
1533 if (recipe == null) {
1534 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1535 defaultSource, vnfComponentType, action.toString());
1536 if (recipe == null) {
1537 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
1538 vnfComponentType, action.toString());
1541 if (recipe == null) {
1548 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1549 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1550 if (recipe == null) {
1554 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1555 defaultSource, vnfComponentType, action.toString());
1557 if (recipe == null) {
1563 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1566 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1568 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1570 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1572 if (vnfRecipe == null) {
1576 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1579 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1581 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1583 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1584 String modelName = modelInfo.getModelName();
1585 Recipe recipe = null;
1587 if (modelInfo.getModelCustomizationId() != null) {
1588 NetworkResourceCustomization networkResourceCustomization = catalogDbClient
1589 .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1590 if (networkResourceCustomization != null) {
1591 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1592 if (networkResource != null) {
1593 if (modelInfo.getModelVersionId() == null) {
1594 modelInfo.setModelVersionId(networkResource.getModelUUID());
1596 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
1599 throw new ValidationException("no catalog entry found");
1601 } else if (action != Action.deleteInstance) {
1602 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1605 // ok for version < 3 and action delete
1606 if (modelName != null) {
1607 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1611 if (recipe == null) {
1612 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1615 return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1618 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1619 String version, String requestId, String requestUri) throws ApiException {
1620 String serviceInstanceId;
1621 Boolean aLaCarte = null;
1622 String apiVersion = version.substring(1);
1623 boolean inProgress = false;
1624 ServiceInstancesRequest sir;
1626 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1627 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1628 InfraActiveRequests currentActiveReq =
1629 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1630 if (sir.getRequestDetails().getRequestParameters() != null) {
1631 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1633 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1635 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1636 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1638 InfraActiveRequests dup = null;
1640 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
1643 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1646 if (instanceIdMap != null && dup != null && inProgress) {
1647 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
1651 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1652 RequestReferences referencesResponse = new RequestReferences();
1653 referencesResponse.setRequestId(requestId);
1654 serviceResponse.setRequestReferences(referencesResponse);
1656 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1657 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1659 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1660 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1661 : "ALaCarte Recipe Timeout not found in properties";
1663 ErrorLoggerInfo errorLoggerInfo =
1664 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1665 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1667 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1668 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1670 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1672 throw validateException;
1676 serviceInstanceId = "";
1677 String configurationId = "";
1678 String pnfCorrelationId = "";
1680 if (sir.getServiceInstanceId() != null) {
1681 serviceInstanceId = sir.getServiceInstanceId();
1684 if (sir.getConfigurationId() != null) {
1685 configurationId = sir.getConfigurationId();
1688 pnfCorrelationId = getPnfCorrelationId(sir);
1691 infraActiveRequestsClient.save(currentActiveReq);
1692 } catch (Exception e) {
1693 ErrorLoggerInfo errorLoggerInfo =
1694 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1695 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1696 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1697 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1700 if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1702 } else if (aLaCarte == null) {
1705 RequestClientParameter requestClientParameter = null;
1707 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1708 .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1709 .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1710 .setConfigurationId(configurationId)
1711 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1712 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1713 } catch (IOException e) {
1714 ErrorLoggerInfo errorLoggerInfo =
1715 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1716 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1717 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1718 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1722 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,