2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Modifications Copyright (c) 2019 Samsung
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
24 package org.onap.so.apihandlerinfra;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
31 import java.util.Optional;
32 import javax.transaction.Transactional;
33 import javax.ws.rs.Consumes;
34 import javax.ws.rs.DELETE;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.PUT;
37 import javax.ws.rs.Path;
38 import javax.ws.rs.PathParam;
39 import javax.ws.rs.Produces;
40 import javax.ws.rs.container.ContainerRequestContext;
41 import javax.ws.rs.core.Context;
42 import javax.ws.rs.core.MediaType;
43 import javax.ws.rs.core.Response;
44 import org.apache.commons.lang.StringUtils;
45 import org.apache.http.HttpStatus;
46 import org.onap.so.apihandler.common.CommonConstants;
47 import org.onap.so.apihandler.common.ErrorNumbers;
48 import org.onap.so.apihandler.common.RequestClientParameter;
49 import org.onap.so.apihandlerinfra.exceptions.ApiException;
50 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
51 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
52 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
53 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
54 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
55 import org.onap.so.db.catalog.beans.NetworkResource;
56 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
57 import org.onap.so.db.catalog.beans.Recipe;
58 import org.onap.so.db.catalog.beans.ServiceRecipe;
59 import org.onap.so.db.catalog.beans.VfModule;
60 import org.onap.so.db.catalog.beans.VfModuleCustomization;
61 import org.onap.so.db.catalog.beans.VnfRecipe;
62 import org.onap.so.db.catalog.beans.VnfResource;
63 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
64 import org.onap.so.db.catalog.client.CatalogDbClient;
65 import org.onap.so.db.request.beans.InfraActiveRequests;
66 import org.onap.so.db.request.client.RequestsDbClient;
67 import org.onap.so.exceptions.ValidationException;
68 import org.onap.so.logger.ErrorCode;
69 import org.onap.so.logger.MessageEnum;
70 import org.onap.so.serviceinstancebeans.CloudConfiguration;
71 import org.onap.so.serviceinstancebeans.ModelInfo;
72 import org.onap.so.serviceinstancebeans.ModelType;
73 import org.onap.so.serviceinstancebeans.Networks;
74 import org.onap.so.serviceinstancebeans.RelatedInstance;
75 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
76 import org.onap.so.serviceinstancebeans.RequestDetails;
77 import org.onap.so.serviceinstancebeans.RequestParameters;
78 import org.onap.so.serviceinstancebeans.RequestReferences;
79 import org.onap.so.serviceinstancebeans.Service;
80 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
81 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
82 import org.onap.so.serviceinstancebeans.VfModules;
83 import org.onap.so.serviceinstancebeans.Vnfs;
84 import org.slf4j.Logger;
85 import org.slf4j.LoggerFactory;
86 import org.springframework.beans.factory.annotation.Autowired;
87 import org.springframework.core.env.Environment;
88 import org.springframework.stereotype.Component;
89 import org.springframework.web.client.RestTemplate;
90 import com.fasterxml.jackson.core.JsonParseException;
91 import com.fasterxml.jackson.core.JsonProcessingException;
92 import com.fasterxml.jackson.databind.JsonMappingException;
93 import com.fasterxml.jackson.databind.ObjectMapper;
94 import io.swagger.annotations.Api;
95 import io.swagger.annotations.ApiOperation;
98 @Path("/onap/so/infra/serviceInstantiation")
99 @Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
100 public class ServiceInstances extends AbstractRestHandler {
102 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
103 private static String NAME = "name";
104 private static String VALUE = "value";
105 private static String uriPrefix = "/serviceInstantiation/";
106 private static final String SAVE_TO_DB = "save instance to db";
109 private Environment env;
112 private RestTemplate restTemplate;
115 private CatalogDbClient catalogDbClient;
118 private RequestsDbClient infraActiveRequestsClient;
121 private MsoRequest msoRequest;
124 private RequestHandlerUtils requestHandlerUtils;
127 @Path("/{version:[vV][5-7]}/serviceInstances")
128 @Consumes(MediaType.APPLICATION_JSON)
129 @Produces(MediaType.APPLICATION_JSON)
130 @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
132 public Response createServiceInstance(String request, @PathParam("version") String version,
133 @Context ContainerRequestContext requestContext) throws ApiException {
134 String requestId = requestHandlerUtils.getRequestId(requestContext);
135 return serviceInstances(request, Action.createInstance, null, version, requestId,
136 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
140 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
141 @Consumes(MediaType.APPLICATION_JSON)
142 @Produces(MediaType.APPLICATION_JSON)
143 @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
145 public Response activateServiceInstance(String request, @PathParam("version") String version,
146 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
147 throws ApiException {
148 String requestId = requestHandlerUtils.getRequestId(requestContext);
149 HashMap<String, String> instanceIdMap = new HashMap<>();
150 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
151 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
152 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
156 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
157 @Consumes(MediaType.APPLICATION_JSON)
158 @Produces(MediaType.APPLICATION_JSON)
159 @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
161 public Response deactivateServiceInstance(String request, @PathParam("version") String version,
162 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
163 throws ApiException {
164 String requestId = requestHandlerUtils.getRequestId(requestContext);
165 HashMap<String, String> instanceIdMap = new HashMap<>();
166 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
167 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
168 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
172 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
173 @Consumes(MediaType.APPLICATION_JSON)
174 @Produces(MediaType.APPLICATION_JSON)
175 @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
177 public Response deleteServiceInstance(String request, @PathParam("version") String version,
178 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
179 throws ApiException {
180 String requestId = requestHandlerUtils.getRequestId(requestContext);
181 HashMap<String, String> instanceIdMap = new HashMap<>();
182 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
183 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
184 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
188 @Path("/{version:[vV][7]}/serviceInstances/assign")
189 @Consumes(MediaType.APPLICATION_JSON)
190 @Produces(MediaType.APPLICATION_JSON)
191 @ApiOperation(value = "Assign Service Instance", response = Response.class)
193 public Response assignServiceInstance(String request, @PathParam("version") String version,
194 @Context ContainerRequestContext requestContext) throws ApiException {
195 String requestId = requestHandlerUtils.getRequestId(requestContext);
196 return serviceInstances(request, Action.assignInstance, null, version, requestId,
197 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
201 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
202 @Consumes(MediaType.APPLICATION_JSON)
203 @Produces(MediaType.APPLICATION_JSON)
204 @ApiOperation(value = "Unassign Service Instance", response = Response.class)
206 public Response unassignServiceInstance(String request, @PathParam("version") String version,
207 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
208 throws ApiException {
209 String requestId = requestHandlerUtils.getRequestId(requestContext);
210 HashMap<String, String> instanceIdMap = new HashMap<>();
211 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
212 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
213 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
217 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
218 @Consumes(MediaType.APPLICATION_JSON)
219 @Produces(MediaType.APPLICATION_JSON)
220 @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
222 public Response createPortConfiguration(String request, @PathParam("version") String version,
223 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
224 throws ApiException {
225 String requestId = requestHandlerUtils.getRequestId(requestContext);
226 HashMap<String, String> instanceIdMap = new HashMap<>();
227 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
228 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
229 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
233 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
234 @Consumes(MediaType.APPLICATION_JSON)
235 @Produces(MediaType.APPLICATION_JSON)
236 @ApiOperation(value = "Delete provided Port", response = Response.class)
238 public Response deletePortConfiguration(String request, @PathParam("version") String version,
239 @PathParam("serviceInstanceId") String serviceInstanceId,
240 @PathParam("configurationInstanceId") String configurationInstanceId,
241 @Context ContainerRequestContext requestContext) throws ApiException {
242 String requestId = requestHandlerUtils.getRequestId(requestContext);
243 HashMap<String, String> instanceIdMap = new HashMap<>();
244 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
245 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
246 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
247 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
251 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
252 @Consumes(MediaType.APPLICATION_JSON)
253 @Produces(MediaType.APPLICATION_JSON)
254 @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
256 public Response enablePort(String request, @PathParam("version") String version,
257 @PathParam("serviceInstanceId") String serviceInstanceId,
258 @PathParam("configurationInstanceId") String configurationInstanceId,
259 @Context ContainerRequestContext requestContext) throws ApiException {
260 String requestId = requestHandlerUtils.getRequestId(requestContext);
261 HashMap<String, String> instanceIdMap = new HashMap<>();
262 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
263 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
264 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
265 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
269 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
270 @Consumes(MediaType.APPLICATION_JSON)
271 @Produces(MediaType.APPLICATION_JSON)
272 @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
274 public Response disablePort(String request, @PathParam("version") String version,
275 @PathParam("serviceInstanceId") String serviceInstanceId,
276 @PathParam("configurationInstanceId") String configurationInstanceId,
277 @Context ContainerRequestContext requestContext) throws ApiException {
278 String requestId = requestHandlerUtils.getRequestId(requestContext);
279 HashMap<String, String> instanceIdMap = new HashMap<>();
280 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
281 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
282 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
283 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
287 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
288 @Consumes(MediaType.APPLICATION_JSON)
289 @Produces(MediaType.APPLICATION_JSON)
290 @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
292 public Response activatePort(String request, @PathParam("version") String version,
293 @PathParam("serviceInstanceId") String serviceInstanceId,
294 @PathParam("configurationInstanceId") String configurationInstanceId,
295 @Context ContainerRequestContext requestContext) throws ApiException {
296 String requestId = requestHandlerUtils.getRequestId(requestContext);
297 HashMap<String, String> instanceIdMap = new HashMap<>();
298 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
299 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
300 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
301 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
305 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
306 @Consumes(MediaType.APPLICATION_JSON)
307 @Produces(MediaType.APPLICATION_JSON)
308 @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
310 public Response deactivatePort(String request, @PathParam("version") String version,
311 @PathParam("serviceInstanceId") String serviceInstanceId,
312 @PathParam("configurationInstanceId") String configurationInstanceId,
313 @Context ContainerRequestContext requestContext) throws ApiException {
314 String requestId = requestHandlerUtils.getRequestId(requestContext);
315 HashMap<String, String> instanceIdMap = new HashMap<>();
316 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
317 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
318 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
319 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
323 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
324 @Consumes(MediaType.APPLICATION_JSON)
325 @Produces(MediaType.APPLICATION_JSON)
326 @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
328 public Response addRelationships(String request, @PathParam("version") String version,
329 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
330 throws ApiException {
331 String requestId = requestHandlerUtils.getRequestId(requestContext);
332 HashMap<String, String> instanceIdMap = new HashMap<>();
333 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
334 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
335 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
339 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
340 @Consumes(MediaType.APPLICATION_JSON)
341 @Produces(MediaType.APPLICATION_JSON)
342 @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
344 public Response removeRelationships(String request, @PathParam("version") String version,
345 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
346 throws ApiException {
347 String requestId = requestHandlerUtils.getRequestId(requestContext);
348 HashMap<String, String> instanceIdMap = new HashMap<>();
349 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
350 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
351 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
355 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
356 @Consumes(MediaType.APPLICATION_JSON)
357 @Produces(MediaType.APPLICATION_JSON)
358 @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
360 public Response createVnfInstance(String request, @PathParam("version") String version,
361 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
362 throws ApiException {
363 String requestId = requestHandlerUtils.getRequestId(requestContext);
364 HashMap<String, String> instanceIdMap = new HashMap<>();
365 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
367 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
368 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
369 } catch (Exception e) {
370 logger.error("Error in vnf", e);
376 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
377 @Consumes(MediaType.APPLICATION_JSON)
378 @Produces(MediaType.APPLICATION_JSON)
379 @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
381 public Response replaceVnfInstance(String request, @PathParam("version") String version,
382 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
383 @Context ContainerRequestContext requestContext) throws ApiException {
384 String requestId = requestHandlerUtils.getRequestId(requestContext);
385 HashMap<String, String> instanceIdMap = new HashMap<>();
386 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
387 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
388 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
389 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
393 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
394 @Consumes(MediaType.APPLICATION_JSON)
395 @Produces(MediaType.APPLICATION_JSON)
396 @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
397 response = Response.class)
399 public Response updateVnfInstance(String request, @PathParam("version") String version,
400 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
401 @Context ContainerRequestContext requestContext) throws ApiException {
402 String requestId = requestHandlerUtils.getRequestId(requestContext);
403 HashMap<String, String> instanceIdMap = new HashMap<>();
404 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
405 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
406 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
407 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
411 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
412 @Consumes(MediaType.APPLICATION_JSON)
413 @Produces(MediaType.APPLICATION_JSON)
414 @ApiOperation(value = "Apply updated configuration", response = Response.class)
415 public Response applyUpdatedConfig(String request, @PathParam("version") String version,
416 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
417 @Context ContainerRequestContext requestContext) throws ApiException {
418 String requestId = requestHandlerUtils.getRequestId(requestContext);
419 HashMap<String, String> instanceIdMap = new HashMap<>();
420 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
421 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
422 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
423 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
427 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
428 @Consumes(MediaType.APPLICATION_JSON)
429 @Produces(MediaType.APPLICATION_JSON)
430 @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
431 public Response recreateVnfInstance(String request, @PathParam("version") String version,
432 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
433 @Context ContainerRequestContext requestContext) throws ApiException {
434 String requestId = requestHandlerUtils.getRequestId(requestContext);
435 HashMap<String, String> instanceIdMap = new HashMap<>();
436 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
437 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
438 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
439 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
444 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
445 @Consumes(MediaType.APPLICATION_JSON)
446 @Produces(MediaType.APPLICATION_JSON)
447 @ApiOperation(value = "Delete provided VNF instance", response = Response.class)
449 public Response deleteVnfInstance(String request, @PathParam("version") String version,
450 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
451 @Context ContainerRequestContext requestContext) throws ApiException {
452 String requestId = requestHandlerUtils.getRequestId(requestContext);
453 HashMap<String, String> instanceIdMap = new HashMap<>();
454 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
455 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
456 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
457 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
461 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
462 @Consumes(MediaType.APPLICATION_JSON)
463 @Produces(MediaType.APPLICATION_JSON)
464 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
465 response = Response.class)
467 public Response createVfModuleInstance(String request, @PathParam("version") String version,
468 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
469 @Context ContainerRequestContext requestContext) throws ApiException {
470 String requestId = requestHandlerUtils.getRequestId(requestContext);
471 HashMap<String, String> instanceIdMap = new HashMap<>();
472 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
473 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
474 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
475 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
479 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
480 @Consumes(MediaType.APPLICATION_JSON)
481 @Produces(MediaType.APPLICATION_JSON)
482 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
483 response = Response.class)
485 public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
486 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
487 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
488 throws ApiException {
489 String requestId = requestHandlerUtils.getRequestId(requestContext);
490 HashMap<String, String> instanceIdMap = new HashMap<>();
491 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
492 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
493 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
494 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
495 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
499 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
500 @Consumes(MediaType.APPLICATION_JSON)
501 @Produces(MediaType.APPLICATION_JSON)
502 @ApiOperation(value = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
503 response = Response.class)
505 public Response updateVfModuleInstance(String request, @PathParam("version") String version,
506 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
507 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
508 throws ApiException {
509 String requestId = requestHandlerUtils.getRequestId(requestContext);
510 HashMap<String, String> instanceIdMap = new HashMap<>();
511 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
512 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
513 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
514 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
515 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
519 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
520 @Consumes(MediaType.APPLICATION_JSON)
521 @Produces(MediaType.APPLICATION_JSON)
522 @ApiOperation(value = "Perform VNF software update", response = Response.class)
524 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
525 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
526 @Context ContainerRequestContext requestContext) throws ApiException {
527 String requestId = requestHandlerUtils.getRequestId(requestContext);
528 HashMap<String, String> instanceIdMap = new HashMap<>();
529 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
530 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
531 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
532 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
536 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
537 @Consumes(MediaType.APPLICATION_JSON)
538 @Produces(MediaType.APPLICATION_JSON)
539 @ApiOperation(value = "Delete provided VfModule instance", response = Response.class)
541 public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
542 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
543 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
544 throws ApiException {
545 String requestId = requestHandlerUtils.getRequestId(requestContext);
546 HashMap<String, String> instanceIdMap = new HashMap<>();
547 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
548 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
549 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
550 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
551 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
555 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
556 @Consumes(MediaType.APPLICATION_JSON)
557 @Produces(MediaType.APPLICATION_JSON)
558 @ApiOperation(value = "Deactivate and Cloud Delete VfModule instance", response = Response.class)
560 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
561 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
562 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
563 throws ApiException {
564 String requestId = requestHandlerUtils.getRequestId(requestContext);
565 HashMap<String, String> instanceIdMap = new HashMap<>();
566 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
567 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
568 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
569 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
570 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
575 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
576 @Consumes(MediaType.APPLICATION_JSON)
577 @Produces(MediaType.APPLICATION_JSON)
578 @ApiOperation(value = "VF Auto Scale Out", response = Response.class)
580 public Response scaleOutVfModule(String request, @PathParam("version") String version,
581 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
582 @Context ContainerRequestContext requestContext) throws ApiException {
583 String requestId = requestHandlerUtils.getRequestId(requestContext);
584 HashMap<String, String> instanceIdMap = new HashMap<>();
585 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
586 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
587 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
588 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));
764 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
765 String version, String requestId, String requestUri) throws ApiException {
766 String serviceInstanceId;
767 Boolean aLaCarte = null;
768 ServiceInstancesRequest sir;
769 String apiVersion = version.substring(1);
771 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
772 action = handleReplaceInstance(action, sir);
773 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
774 InfraActiveRequests currentActiveReq =
775 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
776 if (sir.getRequestDetails().getRequestParameters() != null) {
777 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
779 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
781 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
783 int requestVersion = Integer.parseInt(version.substring(1));
784 String instanceName = null;
785 if (sir.getRequestDetails().getRequestInfo() != null) {
786 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
788 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
789 String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
790 String networkType = msoRequest.getNetworkType(sir, requestScope);
791 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
792 String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
794 if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
795 currentActiveReq.setVnfType(vnfType);
796 } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
797 currentActiveReq.setNetworkType(networkType);
800 InfraActiveRequests dup = null;
801 boolean inProgress = false;
803 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
806 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
809 if (dup != null && inProgress) {
810 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
813 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
815 RequestReferences referencesResponse = new RequestReferences();
817 referencesResponse.setRequestId(requestId);
819 serviceResponse.setRequestReferences(referencesResponse);
820 RecipeLookupResult recipeLookupResult =
821 getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
822 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
824 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
825 ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
827 Boolean isBaseVfModule = false;
829 if (modelType.equals(ModelType.vfModule)) {
830 isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
834 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
836 String vfModuleId = "";
837 String volumeGroupId = "";
838 String networkId = "";
839 String pnfCorrelationId = "";
840 String instanceGroupId = null;
842 if (sir.getVnfInstanceId() != null) {
843 vnfId = sir.getVnfInstanceId();
846 if (sir.getVfModuleInstanceId() != null) {
847 vfModuleId = sir.getVfModuleInstanceId();
850 if (sir.getVolumeGroupInstanceId() != null) {
851 volumeGroupId = sir.getVolumeGroupInstanceId();
854 if (sir.getNetworkInstanceId() != null) {
855 networkId = sir.getNetworkInstanceId();
857 if (sir.getInstanceGroupId() != null) {
858 instanceGroupId = sir.getInstanceGroupId();
861 pnfCorrelationId = getPnfCorrelationId(sir);
864 infraActiveRequestsClient.save(currentActiveReq);
865 } catch (Exception e) {
866 ErrorLoggerInfo errorLoggerInfo =
867 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
868 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
869 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
870 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
873 if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
875 } else if (aLaCarte == null) {
879 RequestClientParameter requestClientParameter = null;
881 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
882 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
883 .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
884 .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
885 .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
886 .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
887 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
888 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
889 .setInstanceGroupId(instanceGroupId).build();
890 } catch (IOException e) {
891 ErrorLoggerInfo errorLoggerInfo =
892 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
893 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
894 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
895 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
898 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
899 recipeLookupResult.getOrchestrationURI(), requestScope);
907 protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
908 if (action != null && action.equals(Action.replaceInstance)
909 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
910 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
911 action = Action.replaceInstanceRetainAssignments;
916 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
917 String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
918 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
919 Boolean aLaCarte = true;
920 String apiVersion = version.substring(1);
921 ServiceInstancesRequest sir = new ServiceInstancesRequest();
922 sir.setInstanceGroupId(instanceGroupId);
924 String requestScope = ModelType.instanceGroup.toString();
925 InfraActiveRequests currentActiveReq =
926 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
927 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
929 requestHandlerUtils.validateHeaders(requestContext);
930 } catch (ValidationException e) {
931 logger.error("Exception occurred", e);
932 ErrorLoggerInfo errorLoggerInfo =
933 new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
934 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
935 ValidateException validateException =
936 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
937 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
938 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
939 throw validateException;
942 InfraActiveRequests dup =
943 requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
944 boolean inProgress = false;
947 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
950 if (dup != null && inProgress) {
951 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
955 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
957 RequestReferences referencesResponse = new RequestReferences();
959 referencesResponse.setRequestId(requestId);
961 serviceResponse.setRequestReferences(referencesResponse);
962 Boolean isBaseVfModule = false;
964 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
967 infraActiveRequestsClient.save(currentActiveReq);
968 } catch (Exception e) {
969 ErrorLoggerInfo errorLoggerInfo =
970 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
971 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
972 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
973 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
976 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
977 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
978 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
979 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
981 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
982 recipeLookupResult.getOrchestrationURI(), requestScope);
985 protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
986 return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
987 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
991 protected RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
992 boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
993 RecipeLookupResult recipeLookupResult = null;
994 // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
995 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
996 // Query MSO Catalog DB
998 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
999 recipeLookupResult = getDefaultVnfUri(sir, action);
1000 } else if (action == Action.addMembers || action == Action.removeMembers) {
1001 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1002 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1004 recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
1005 } catch (IOException e) {
1006 ErrorLoggerInfo errorLoggerInfo =
1007 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1008 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1011 ValidateException validateException =
1012 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1013 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1015 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1017 throw validateException;
1019 } else if (modelInfo.getModelType().equals(ModelType.vfModule)
1020 || modelInfo.getModelType().equals(ModelType.volumeGroup)
1021 || modelInfo.getModelType().equals(ModelType.vnf)) {
1023 recipeLookupResult = getVnfOrVfModuleUri(sir, action);
1024 } catch (ValidationException e) {
1025 ErrorLoggerInfo errorLoggerInfo =
1026 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1027 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1030 ValidateException validateException =
1031 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1032 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1034 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1036 throw validateException;
1038 } else if (modelInfo.getModelType().equals(ModelType.network)) {
1040 recipeLookupResult = getNetworkUri(sir, action);
1041 } catch (ValidationException e) {
1043 ErrorLoggerInfo errorLoggerInfo =
1044 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1045 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1048 ValidateException validateException =
1049 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1050 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1051 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1053 throw validateException;
1055 } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
1056 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1059 if (recipeLookupResult == null) {
1060 ErrorLoggerInfo errorLoggerInfo =
1061 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1062 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1065 RecipeNotFoundException recipeNotFoundExceptionException =
1066 new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
1067 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
1070 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
1071 recipeNotFoundExceptionException.getMessage());
1072 throw recipeNotFoundExceptionException;
1074 return recipeLookupResult;
1077 protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
1078 boolean alaCarteFlag) throws IOException {
1080 // Construct the default service name
1081 // TODO need to make this a configurable property
1082 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
1083 RequestDetails requestDetails = servInstReq.getRequestDetails();
1084 ModelInfo modelInfo = requestDetails.getModelInfo();
1085 org.onap.so.db.catalog.beans.Service serviceRecord;
1086 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1087 ServiceRecipe recipe = null;
1090 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1091 if (serviceRecord != null) {
1092 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1096 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1097 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
1099 if (recipe == null) {
1100 serviceRecordList = catalogDbClient
1101 .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1102 if (!serviceRecordList.isEmpty()) {
1103 for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
1104 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
1106 if (recipe != null) {
1114 // if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1115 RequestParameters reqParam = requestDetails.getRequestParameters();
1116 if (reqParam != null && alaCarteFlag && recipe == null) {
1118 } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1119 mapToLegacyRequest(requestDetails);
1120 } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
1121 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1122 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1125 if (modelInfo.getModelVersionId() == null) {
1126 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1128 if (recipe == null) {
1131 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1134 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1135 RequestParameters reqParam;
1136 if (requestDetails.getRequestParameters() == null) {
1137 reqParam = new RequestParameters();
1139 reqParam = requestDetails.getRequestParameters();
1141 if (requestDetails.getCloudConfiguration() == null) {
1142 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1143 if (cloudConfig != null) {
1144 requestDetails.setCloudConfiguration(cloudConfig);
1148 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1149 if (!userParams.isEmpty()) {
1150 if (reqParam == null) {
1151 requestDetails.setRequestParameters(new RequestParameters());
1153 requestDetails.getRequestParameters().setUserParams(userParams);
1157 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1159 for (Map<String, Object> params : reqParams.getUserParams()) {
1160 if (params.containsKey("service")) {
1161 Service service = serviceMapper(params);
1163 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1165 if (targetConfiguration.isPresent()) {
1166 return targetConfiguration.get();
1168 for (Networks network : service.getResources().getNetworks()) {
1169 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1170 if (targetConfiguration.isPresent()) {
1171 return targetConfiguration.get();
1175 for (Vnfs vnf : service.getResources().getVnfs()) {
1176 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1178 if (targetConfiguration.isPresent()) {
1179 return targetConfiguration.get();
1182 for (VfModules vfModule : vnf.getVfModules()) {
1183 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1185 if (targetConfiguration.isPresent()) {
1186 return targetConfiguration.get();
1197 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1198 CloudConfiguration targetConfiguration = new CloudConfiguration();
1199 if (sourceCloudConfiguration != null) {
1200 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1201 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1202 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1203 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1204 return Optional.of(targetConfiguration);
1206 return Optional.empty();
1209 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1210 logger.debug("Configuring UserParams for Macro Request");
1211 Map<String, Object> userParams = new HashMap<>();
1213 for (Map<String, Object> params : reqParams.getUserParams()) {
1214 if (params.containsKey("service")) {
1215 Service service = serviceMapper(params);
1217 addUserParams(userParams, service.getInstanceParams());
1219 for (Networks network : service.getResources().getNetworks()) {
1220 addUserParams(userParams, network.getInstanceParams());
1223 for (Vnfs vnf : service.getResources().getVnfs()) {
1224 addUserParams(userParams, vnf.getInstanceParams());
1226 for (VfModules vfModule : vnf.getVfModules()) {
1227 addUserParams(userParams, vfModule.getInstanceParams());
1233 return mapFlatMapToNameValue(userParams);
1236 private Service serviceMapper(Map<String, Object> params) throws IOException {
1237 ObjectMapper obj = new ObjectMapper();
1238 String input = obj.writeValueAsString(params.get("service"));
1239 return obj.readValue(input, Service.class);
1242 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1243 for (Map<String, String> map : sourceUserParams) {
1244 for (Map.Entry<String, String> entry : map.entrySet()) {
1245 targetUserParams.put(entry.getKey(), entry.getValue());
1250 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1251 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1253 for (Map.Entry<String, Object> map : flatMap.entrySet()) {
1254 Map<String, Object> targetMap = new HashMap<>();
1255 targetMap.put(NAME, map.getKey());
1256 targetMap.put(VALUE, map.getValue());
1257 targetUserParams.add(targetMap);
1259 return targetUserParams;
1262 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
1263 throws ValidationException {
1265 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1266 String vnfComponentType = modelInfo.getModelType().name();
1268 RelatedInstanceList[] instanceList = null;
1269 if (servInstReq.getRequestDetails() != null) {
1270 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1274 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1275 String modelCustomizationId = modelInfo.getModelCustomizationId();
1276 String modelCustomizationName = modelInfo.getModelCustomizationName();
1277 String relatedInstanceModelVersionId = null;
1278 String relatedInstanceModelInvariantId = null;
1279 String relatedInstanceVersion = null;
1280 String relatedInstanceModelCustomizationName = null;
1282 if (instanceList != null) {
1284 for (RelatedInstanceList relatedInstanceList : instanceList) {
1286 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1287 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1288 if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
1289 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1290 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1293 if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
1294 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1295 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1296 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1297 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1301 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1302 // a. For a vnf request (only create, no update currently):
1303 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in
1304 // vnf_resource_customization.model_customization_uuid.
1305 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1306 // pre-v3), then modelInfo.modelCustomizationName must have
1307 // been provided (else create request should be rejected). APIH should use the
1308 // relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1309 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a
1310 // vnf_resource_customization.model_customization_uuid record exists.
1311 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
1312 // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1313 // (MODEL_UUID) in SERVICE table.
1314 // iii. Regardless of how the value was provided/obtained above, APIH must always populate
1315 // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
1316 // during 1707 data migration if VID did not provide it originally on request.
1317 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated
1319 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to
1320 // look it up in our catalog to construct vnf-type value to pass to BPMN.
1322 VnfResource vnfResource = null;
1323 VnfResourceCustomization vrc = null;
1324 // Validation for vnfResource
1326 if (modelCustomizationId != null) {
1327 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1329 vnfResource = vrc.getVnfResources();
1332 org.onap.so.db.catalog.beans.Service service =
1333 catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1334 if (service == null) {
1335 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
1336 relatedInstanceModelInvariantId);
1339 if (service == null) {
1340 throw new ValidationException("service in relatedInstance");
1342 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1343 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1344 vrc = vnfResourceCustom;
1349 vnfResource = vrc.getVnfResources();
1350 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1351 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1355 if (vnfResource == null) {
1356 throw new ValidationException("vnfResource");
1358 if (modelInfo.getModelVersionId() == null) {
1359 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1363 VnfRecipe vnfRecipe = null;
1366 String nfRole = vrc.getNfRole();
1367 if (nfRole != null) {
1369 catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1373 if (vnfRecipe == null) {
1374 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1377 if (vnfRecipe == null) {
1381 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1384 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1385 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
1386 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
1387 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
1388 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
1389 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
1390 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
1391 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
1392 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
1393 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
1394 * the request). This means taking each record found // in vf_module_customization and looking up in
1395 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
1396 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
1398 VfModuleCustomization vfmc = null;
1400 VnfResourceCustomization vnfrc;
1401 VfModule vfModule = null;
1403 if (modelInfo.getModelCustomizationId() != null) {
1404 vfmc = catalogDbClient
1405 .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1407 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1409 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
1410 relatedInstanceModelInvariantId, relatedInstanceVersion);
1412 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
1413 relatedInstanceModelCustomizationName, vnfr);
1415 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1417 String vfModuleModelUUID = modelInfo.getModelVersionId();
1418 for (VfModuleCustomization vf : list) {
1419 VfModuleCustomization vfmCustom;
1420 if (vfModuleModelUUID != null) {
1421 vfmCustom = catalogDbClient
1422 .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
1423 vf.getModelCustomizationUUID(), vfModuleModelUUID);
1424 if (vfmCustom != null) {
1425 vfModule = vfmCustom.getVfModule();
1428 vfmCustom = catalogDbClient
1429 .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1430 if (vfmCustom != null) {
1431 vfModule = vfmCustom.getVfModule();
1433 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
1434 relatedInstanceModelInvariantId, relatedInstanceVersion);
1438 if (vfModule != null) {
1439 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1440 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1446 if (vfmc == null && vfModule == null) {
1447 throw new ValidationException("vfModuleCustomization");
1448 } else if (vfModule == null && vfmc != null) {
1449 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
1450 // VfModuleCustomization table
1453 if (modelInfo.getModelVersionId() == null) {
1454 modelInfo.setModelVersionId(vfModule.getModelUUID());
1458 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1459 vfModule.getModelUUID(), vnfComponentType, action.toString());
1460 if (recipe == null) {
1461 List<VfModule> vfModuleRecords = catalogDbClient
1462 .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1463 if (!vfModuleRecords.isEmpty()) {
1464 for (VfModule record : vfModuleRecords) {
1465 recipe = catalogDbClient
1466 .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1467 record.getModelUUID(), vnfComponentType, action.toString());
1468 if (recipe != null) {
1474 if (recipe == null) {
1475 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1476 defaultSource, vnfComponentType, action.toString());
1477 if (recipe == null) {
1478 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
1479 vnfComponentType, action.toString());
1482 if (recipe == null) {
1489 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1490 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1491 if (recipe == null) {
1495 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1496 defaultSource, vnfComponentType, action.toString());
1498 if (recipe == null) {
1504 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1507 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1509 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1511 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1513 if (vnfRecipe == null) {
1517 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1521 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1523 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1525 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1526 String modelName = modelInfo.getModelName();
1527 Recipe recipe = null;
1529 if (modelInfo.getModelCustomizationId() != null) {
1530 NetworkResourceCustomization networkResourceCustomization = catalogDbClient
1531 .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1532 if (networkResourceCustomization != null) {
1533 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1534 if (networkResource != null) {
1535 if (modelInfo.getModelVersionId() == null) {
1536 modelInfo.setModelVersionId(networkResource.getModelUUID());
1538 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
1541 throw new ValidationException("no catalog entry found");
1543 } else if (action != Action.deleteInstance) {
1544 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1547 // ok for version < 3 and action delete
1548 if (modelName != null) {
1549 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1553 if (recipe == null) {
1554 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1557 return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1561 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1562 String version, String requestId, String requestUri) throws ApiException {
1563 String serviceInstanceId;
1564 Boolean aLaCarte = null;
1565 String apiVersion = version.substring(1);
1566 boolean inProgress = false;
1567 ServiceInstancesRequest sir;
1569 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1570 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1571 InfraActiveRequests currentActiveReq =
1572 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1573 if (sir.getRequestDetails().getRequestParameters() != null) {
1574 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1576 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1578 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1579 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1581 InfraActiveRequests dup = null;
1583 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
1586 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1589 if (instanceIdMap != null && dup != null && inProgress) {
1590 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
1594 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1595 RequestReferences referencesResponse = new RequestReferences();
1596 referencesResponse.setRequestId(requestId);
1597 serviceResponse.setRequestReferences(referencesResponse);
1600 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1601 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1603 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1604 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1605 : "ALaCarte Recipe Timeout not found in properties";
1607 ErrorLoggerInfo errorLoggerInfo =
1608 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1609 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1612 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1613 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1615 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1617 throw validateException;
1621 serviceInstanceId = "";
1622 String configurationId = "";
1623 String pnfCorrelationId = "";
1625 if (sir.getServiceInstanceId() != null) {
1626 serviceInstanceId = sir.getServiceInstanceId();
1629 if (sir.getConfigurationId() != null) {
1630 configurationId = sir.getConfigurationId();
1633 pnfCorrelationId = getPnfCorrelationId(sir);
1636 infraActiveRequestsClient.save(currentActiveReq);
1637 } catch (Exception e) {
1638 ErrorLoggerInfo errorLoggerInfo =
1639 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1640 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1641 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1642 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1645 if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1647 } else if (aLaCarte == null) {
1650 RequestClientParameter requestClientParameter = null;
1652 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1653 .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1654 .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1655 .setConfigurationId(configurationId)
1656 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1657 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1658 } catch (IOException e) {
1659 ErrorLoggerInfo errorLoggerInfo =
1660 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1661 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1662 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1663 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1667 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,