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.exceptions.VfModuleNotFoundException;
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 com.fasterxml.jackson.core.JsonParseException;
90 import com.fasterxml.jackson.core.JsonProcessingException;
91 import com.fasterxml.jackson.databind.JsonMappingException;
92 import com.fasterxml.jackson.databind.ObjectMapper;
93 import io.swagger.annotations.Api;
94 import io.swagger.annotations.ApiOperation;
97 @Path("/onap/so/infra/serviceInstantiation")
98 @Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
99 public class ServiceInstances {
101 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
102 private static String NAME = "name";
103 private static String VALUE = "value";
104 private static String uriPrefix = "/serviceInstantiation/";
105 private static final String SAVE_TO_DB = "save instance to db";
108 private Environment env;
111 private CatalogDbClient catalogDbClient;
114 private RequestsDbClient infraActiveRequestsClient;
117 private MsoRequest msoRequest;
120 private RequestHandlerUtils requestHandlerUtils;
123 @Path("/{version:[vV][5-7]}/serviceInstances")
124 @Consumes(MediaType.APPLICATION_JSON)
125 @Produces(MediaType.APPLICATION_JSON)
126 @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
128 public Response createServiceInstance(String request, @PathParam("version") String version,
129 @Context ContainerRequestContext requestContext) throws ApiException {
130 String requestId = requestHandlerUtils.getRequestId(requestContext);
131 return serviceInstances(request, Action.createInstance, null, version, requestId,
132 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
136 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
137 @Consumes(MediaType.APPLICATION_JSON)
138 @Produces(MediaType.APPLICATION_JSON)
139 @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
141 public Response activateServiceInstance(String request, @PathParam("version") String version,
142 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
143 throws ApiException {
144 String requestId = requestHandlerUtils.getRequestId(requestContext);
145 HashMap<String, String> instanceIdMap = new HashMap<>();
146 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
147 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
148 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
152 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
153 @Consumes(MediaType.APPLICATION_JSON)
154 @Produces(MediaType.APPLICATION_JSON)
155 @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
157 public Response deactivateServiceInstance(String request, @PathParam("version") String version,
158 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
159 throws ApiException {
160 String requestId = requestHandlerUtils.getRequestId(requestContext);
161 HashMap<String, String> instanceIdMap = new HashMap<>();
162 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
163 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
164 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
168 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
169 @Consumes(MediaType.APPLICATION_JSON)
170 @Produces(MediaType.APPLICATION_JSON)
171 @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
173 public Response deleteServiceInstance(String request, @PathParam("version") String version,
174 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
175 throws ApiException {
176 String requestId = requestHandlerUtils.getRequestId(requestContext);
177 HashMap<String, String> instanceIdMap = new HashMap<>();
178 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
179 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
180 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
184 @Path("/{version:[vV][7]}/serviceInstances/assign")
185 @Consumes(MediaType.APPLICATION_JSON)
186 @Produces(MediaType.APPLICATION_JSON)
187 @ApiOperation(value = "Assign Service Instance", response = Response.class)
189 public Response assignServiceInstance(String request, @PathParam("version") String version,
190 @Context ContainerRequestContext requestContext) throws ApiException {
191 String requestId = requestHandlerUtils.getRequestId(requestContext);
192 return serviceInstances(request, Action.assignInstance, null, version, requestId,
193 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
197 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
198 @Consumes(MediaType.APPLICATION_JSON)
199 @Produces(MediaType.APPLICATION_JSON)
200 @ApiOperation(value = "Unassign Service Instance", response = Response.class)
202 public Response unassignServiceInstance(String request, @PathParam("version") String version,
203 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
204 throws ApiException {
205 String requestId = requestHandlerUtils.getRequestId(requestContext);
206 HashMap<String, String> instanceIdMap = new HashMap<String, String>();
207 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
208 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
209 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
213 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
214 @Consumes(MediaType.APPLICATION_JSON)
215 @Produces(MediaType.APPLICATION_JSON)
216 @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
218 public Response createPortConfiguration(String request, @PathParam("version") String version,
219 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
220 throws ApiException {
221 String requestId = requestHandlerUtils.getRequestId(requestContext);
222 HashMap<String, String> instanceIdMap = new HashMap<>();
223 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
224 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
225 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
229 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
230 @Consumes(MediaType.APPLICATION_JSON)
231 @Produces(MediaType.APPLICATION_JSON)
232 @ApiOperation(value = "Delete provided Port", response = Response.class)
234 public Response deletePortConfiguration(String request, @PathParam("version") String version,
235 @PathParam("serviceInstanceId") String serviceInstanceId,
236 @PathParam("configurationInstanceId") String configurationInstanceId,
237 @Context ContainerRequestContext requestContext) throws ApiException {
238 String requestId = requestHandlerUtils.getRequestId(requestContext);
239 HashMap<String, String> instanceIdMap = new HashMap<>();
240 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
241 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
242 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
243 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
247 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
248 @Consumes(MediaType.APPLICATION_JSON)
249 @Produces(MediaType.APPLICATION_JSON)
250 @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
252 public Response enablePort(String request, @PathParam("version") String version,
253 @PathParam("serviceInstanceId") String serviceInstanceId,
254 @PathParam("configurationInstanceId") String configurationInstanceId,
255 @Context ContainerRequestContext requestContext) throws ApiException {
256 String requestId = requestHandlerUtils.getRequestId(requestContext);
257 HashMap<String, String> instanceIdMap = new HashMap<>();
258 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
260 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
261 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
265 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
266 @Consumes(MediaType.APPLICATION_JSON)
267 @Produces(MediaType.APPLICATION_JSON)
268 @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
270 public Response disablePort(String request, @PathParam("version") String version,
271 @PathParam("serviceInstanceId") String serviceInstanceId,
272 @PathParam("configurationInstanceId") String configurationInstanceId,
273 @Context ContainerRequestContext requestContext) throws ApiException {
274 String requestId = requestHandlerUtils.getRequestId(requestContext);
275 HashMap<String, String> instanceIdMap = new HashMap<>();
276 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
277 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
278 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
279 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
283 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
284 @Consumes(MediaType.APPLICATION_JSON)
285 @Produces(MediaType.APPLICATION_JSON)
286 @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
288 public Response activatePort(String request, @PathParam("version") String version,
289 @PathParam("serviceInstanceId") String serviceInstanceId,
290 @PathParam("configurationInstanceId") String configurationInstanceId,
291 @Context ContainerRequestContext requestContext) throws ApiException {
292 String requestId = requestHandlerUtils.getRequestId(requestContext);
293 HashMap<String, String> instanceIdMap = new HashMap<>();
294 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
295 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
296 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
297 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
301 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
302 @Consumes(MediaType.APPLICATION_JSON)
303 @Produces(MediaType.APPLICATION_JSON)
304 @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
306 public Response deactivatePort(String request, @PathParam("version") String version,
307 @PathParam("serviceInstanceId") String serviceInstanceId,
308 @PathParam("configurationInstanceId") String configurationInstanceId,
309 @Context ContainerRequestContext requestContext) throws ApiException {
310 String requestId = requestHandlerUtils.getRequestId(requestContext);
311 HashMap<String, String> instanceIdMap = new HashMap<>();
312 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
313 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
314 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
315 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
319 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
320 @Consumes(MediaType.APPLICATION_JSON)
321 @Produces(MediaType.APPLICATION_JSON)
322 @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
324 public Response addRelationships(String request, @PathParam("version") String version,
325 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
326 throws ApiException {
327 String requestId = requestHandlerUtils.getRequestId(requestContext);
328 HashMap<String, String> instanceIdMap = new HashMap<>();
329 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
330 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
331 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
335 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
336 @Consumes(MediaType.APPLICATION_JSON)
337 @Produces(MediaType.APPLICATION_JSON)
338 @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
340 public Response removeRelationships(String request, @PathParam("version") String version,
341 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
342 throws ApiException {
343 String requestId = requestHandlerUtils.getRequestId(requestContext);
344 HashMap<String, String> instanceIdMap = new HashMap<>();
345 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
346 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
347 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
351 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
352 @Consumes(MediaType.APPLICATION_JSON)
353 @Produces(MediaType.APPLICATION_JSON)
354 @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
356 public Response createVnfInstance(String request, @PathParam("version") String version,
357 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
358 throws ApiException {
359 String requestId = requestHandlerUtils.getRequestId(requestContext);
360 HashMap<String, String> instanceIdMap = new HashMap<>();
361 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
363 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
364 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
365 } catch (Exception e) {
366 logger.error("Error in vnf", e);
372 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
373 @Consumes(MediaType.APPLICATION_JSON)
374 @Produces(MediaType.APPLICATION_JSON)
375 @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
377 public Response replaceVnfInstance(String request, @PathParam("version") String version,
378 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
379 @Context ContainerRequestContext requestContext) throws ApiException {
380 String requestId = requestHandlerUtils.getRequestId(requestContext);
381 HashMap<String, String> instanceIdMap = new HashMap<>();
382 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
383 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
384 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
385 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
389 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
390 @Consumes(MediaType.APPLICATION_JSON)
391 @Produces(MediaType.APPLICATION_JSON)
392 @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
393 response = Response.class)
395 public Response updateVnfInstance(String request, @PathParam("version") String version,
396 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
397 @Context ContainerRequestContext requestContext) throws ApiException {
398 String requestId = requestHandlerUtils.getRequestId(requestContext);
399 HashMap<String, String> instanceIdMap = new HashMap<>();
400 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
401 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
402 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
403 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
407 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
408 @Consumes(MediaType.APPLICATION_JSON)
409 @Produces(MediaType.APPLICATION_JSON)
410 @ApiOperation(value = "Apply updated configuration", response = Response.class)
411 public Response applyUpdatedConfig(String request, @PathParam("version") String version,
412 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
413 @Context ContainerRequestContext requestContext) throws ApiException {
414 String requestId = requestHandlerUtils.getRequestId(requestContext);
415 HashMap<String, String> instanceIdMap = new HashMap<>();
416 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
417 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
418 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
419 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
423 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
424 @Consumes(MediaType.APPLICATION_JSON)
425 @Produces(MediaType.APPLICATION_JSON)
426 @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
427 public Response recreateVnfInstance(String request, @PathParam("version") String version,
428 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
429 @Context ContainerRequestContext requestContext) throws ApiException {
430 String requestId = requestHandlerUtils.getRequestId(requestContext);
431 HashMap<String, String> instanceIdMap = new HashMap<>();
432 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
433 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
434 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
435 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
440 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
441 @Consumes(MediaType.APPLICATION_JSON)
442 @Produces(MediaType.APPLICATION_JSON)
443 @ApiOperation(value = "Delete provided VNF instance", response = Response.class)
445 public Response deleteVnfInstance(String request, @PathParam("version") String version,
446 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
447 @Context ContainerRequestContext requestContext) throws ApiException {
448 String requestId = requestHandlerUtils.getRequestId(requestContext);
449 HashMap<String, String> instanceIdMap = new HashMap<>();
450 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
451 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
452 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
453 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
457 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
458 @Consumes(MediaType.APPLICATION_JSON)
459 @Produces(MediaType.APPLICATION_JSON)
460 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
461 response = Response.class)
463 public Response createVfModuleInstance(String request, @PathParam("version") String version,
464 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
465 @Context ContainerRequestContext requestContext) throws ApiException {
466 String requestId = requestHandlerUtils.getRequestId(requestContext);
467 HashMap<String, String> instanceIdMap = new HashMap<>();
468 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
469 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
470 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
471 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
475 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
476 @Consumes(MediaType.APPLICATION_JSON)
477 @Produces(MediaType.APPLICATION_JSON)
478 @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
479 response = Response.class)
481 public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
482 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
483 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
484 throws ApiException {
485 String requestId = requestHandlerUtils.getRequestId(requestContext);
486 HashMap<String, String> instanceIdMap = new HashMap<>();
487 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
488 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
489 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
490 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
491 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
495 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
496 @Consumes(MediaType.APPLICATION_JSON)
497 @Produces(MediaType.APPLICATION_JSON)
498 @ApiOperation(value = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
499 response = Response.class)
501 public Response updateVfModuleInstance(String request, @PathParam("version") String version,
502 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
503 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
504 throws ApiException {
505 String requestId = requestHandlerUtils.getRequestId(requestContext);
506 HashMap<String, String> instanceIdMap = new HashMap<>();
507 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
508 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
509 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
510 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
511 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
515 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
516 @Consumes(MediaType.APPLICATION_JSON)
517 @Produces(MediaType.APPLICATION_JSON)
518 @ApiOperation(value = "Perform VNF software update", response = Response.class)
520 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
521 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
522 @Context ContainerRequestContext requestContext) throws ApiException {
523 String requestId = requestHandlerUtils.getRequestId(requestContext);
524 HashMap<String, String> instanceIdMap = new HashMap<>();
525 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
526 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
527 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
528 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
532 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
533 @Consumes(MediaType.APPLICATION_JSON)
534 @Produces(MediaType.APPLICATION_JSON)
535 @ApiOperation(value = "Delete provided VfModule instance", response = Response.class)
537 public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
538 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
539 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
540 throws ApiException {
541 String requestId = requestHandlerUtils.getRequestId(requestContext);
542 HashMap<String, String> instanceIdMap = new HashMap<>();
543 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
544 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
545 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
546 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
547 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
551 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
552 @Consumes(MediaType.APPLICATION_JSON)
553 @Produces(MediaType.APPLICATION_JSON)
554 @ApiOperation(value = "Deactivate and Cloud Delete VfModule instance", response = Response.class)
556 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
557 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
558 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
559 throws ApiException {
560 String requestId = requestHandlerUtils.getRequestId(requestContext);
561 HashMap<String, String> instanceIdMap = new HashMap<>();
562 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
563 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
564 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
565 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
566 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
571 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
572 @Consumes(MediaType.APPLICATION_JSON)
573 @Produces(MediaType.APPLICATION_JSON)
574 @ApiOperation(value = "VF Auto Scale Out", response = Response.class)
576 public Response scaleOutVfModule(String request, @PathParam("version") String version,
577 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
578 @Context ContainerRequestContext requestContext) throws ApiException {
579 String requestId = requestHandlerUtils.getRequestId(requestContext);
580 HashMap<String, String> instanceIdMap = new HashMap<>();
581 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
582 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
583 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
584 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
589 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
590 @Consumes(MediaType.APPLICATION_JSON)
591 @Produces(MediaType.APPLICATION_JSON)
592 @ApiOperation(value = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
593 response = Response.class)
595 public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
596 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
597 @Context ContainerRequestContext requestContext) throws ApiException {
598 String requestId = requestHandlerUtils.getRequestId(requestContext);
599 HashMap<String, String> instanceIdMap = new HashMap<>();
600 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
601 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
602 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
603 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
607 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
608 @Consumes(MediaType.APPLICATION_JSON)
609 @Produces(MediaType.APPLICATION_JSON)
610 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
611 response = Response.class)
613 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
614 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
615 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
616 @Context ContainerRequestContext requestContext) throws ApiException {
617 String requestId = requestHandlerUtils.getRequestId(requestContext);
618 HashMap<String, String> instanceIdMap = new HashMap<>();
619 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
620 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
621 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
622 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
623 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
627 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
628 @Consumes(MediaType.APPLICATION_JSON)
629 @Produces(MediaType.APPLICATION_JSON)
630 @ApiOperation(value = "Delete provided VolumeGroup instance", response = Response.class)
632 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
633 @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
634 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
635 @Context ContainerRequestContext requestContext) throws ApiException {
636 String requestId = requestHandlerUtils.getRequestId(requestContext);
637 HashMap<String, String> instanceIdMap = new HashMap<>();
638 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
639 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
640 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
641 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
642 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
646 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
647 @Consumes(MediaType.APPLICATION_JSON)
648 @Produces(MediaType.APPLICATION_JSON)
649 @ApiOperation(value = "Create NetworkInstance on a specified version and serviceInstance ",
650 response = Response.class)
652 public Response createNetworkInstance(String request, @PathParam("version") String version,
653 @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
654 throws ApiException {
655 String requestId = requestHandlerUtils.getRequestId(requestContext);
656 HashMap<String, String> instanceIdMap = new HashMap<>();
657 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
658 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
659 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
663 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
664 @Consumes(MediaType.APPLICATION_JSON)
665 @Produces(MediaType.APPLICATION_JSON)
666 @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
667 response = Response.class)
669 public Response updateNetworkInstance(String request, @PathParam("version") String version,
670 @PathParam("serviceInstanceId") String serviceInstanceId,
671 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
672 throws ApiException {
673 String requestId = requestHandlerUtils.getRequestId(requestContext);
674 HashMap<String, String> instanceIdMap = new HashMap<>();
675 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
676 instanceIdMap.put("networkInstanceId", networkInstanceId);
677 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
678 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
682 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
683 @Consumes(MediaType.APPLICATION_JSON)
684 @Produces(MediaType.APPLICATION_JSON)
685 @ApiOperation(value = "Delete provided Network instance", response = Response.class)
687 public Response deleteNetworkInstance(String request, @PathParam("version") String version,
688 @PathParam("serviceInstanceId") String serviceInstanceId,
689 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
690 throws ApiException {
691 String requestId = requestHandlerUtils.getRequestId(requestContext);
692 HashMap<String, String> instanceIdMap = new HashMap<>();
693 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
694 instanceIdMap.put("networkInstanceId", networkInstanceId);
695 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
696 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
700 @Path("/{version:[vV][7]}/instanceGroups")
701 @Consumes(MediaType.APPLICATION_JSON)
702 @Produces(MediaType.APPLICATION_JSON)
703 @ApiOperation(value = "Create instanceGroups", response = Response.class)
705 public Response createInstanceGroups(String request, @PathParam("version") String version,
706 @Context ContainerRequestContext requestContext) throws ApiException {
707 String requestId = requestHandlerUtils.getRequestId(requestContext);
708 return serviceInstances(request, Action.createInstance, null, version, requestId,
709 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
713 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
714 @Consumes(MediaType.APPLICATION_JSON)
715 @Produces(MediaType.APPLICATION_JSON)
716 @ApiOperation(value = "Delete instanceGroup", response = Response.class)
718 public Response deleteInstanceGroups(@PathParam("version") String version,
719 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
720 throws ApiException {
721 String requestId = requestHandlerUtils.getRequestId(requestContext);
722 HashMap<String, String> instanceIdMap = new HashMap<>();
723 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
724 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
725 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
729 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
730 @Consumes(MediaType.APPLICATION_JSON)
731 @Produces(MediaType.APPLICATION_JSON)
732 @ApiOperation(value = "Add instanceGroup members", response = Response.class)
734 public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
735 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
736 throws ApiException {
737 String requestId = requestHandlerUtils.getRequestId(requestContext);
738 HashMap<String, String> instanceIdMap = new HashMap<>();
739 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
740 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
741 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
745 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
746 @Consumes(MediaType.APPLICATION_JSON)
747 @Produces(MediaType.APPLICATION_JSON)
748 @ApiOperation(value = "Remove instanceGroup members", response = Response.class)
750 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
751 @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
752 throws ApiException {
753 String requestId = requestHandlerUtils.getRequestId(requestContext);
754 HashMap<String, String> instanceIdMap = new HashMap<>();
755 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
756 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
757 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
760 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
761 String version, String requestId, String requestUri) throws ApiException {
762 String serviceInstanceId = (instanceIdMap == null) ? null : instanceIdMap.get("serviceInstanceId");
763 Boolean aLaCarte = null;
764 long startTime = System.currentTimeMillis();
765 ServiceInstancesRequest sir = null;
766 String apiVersion = version.substring(1);
768 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
769 action = handleReplaceInstance(action, sir);
770 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
771 InfraActiveRequests currentActiveReq =
772 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
773 if (sir.getRequestDetails().getRequestParameters() != null) {
774 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
776 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
778 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
780 int requestVersion = Integer.parseInt(version.substring(1));
781 String instanceName = null;
782 if (sir.getRequestDetails().getRequestInfo() != null) {
783 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
785 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
786 String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
787 String networkType = msoRequest.getNetworkType(sir, requestScope);
788 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
789 String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
791 if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
792 currentActiveReq.setVnfType(vnfType);
793 } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
794 currentActiveReq.setNetworkType(networkType);
797 InfraActiveRequests dup = null;
798 boolean inProgress = false;
800 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
803 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
806 if (dup != null && inProgress) {
807 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
810 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
812 RequestReferences referencesResponse = new RequestReferences();
814 referencesResponse.setRequestId(requestId);
816 serviceResponse.setRequestReferences(referencesResponse);
817 Boolean isBaseVfModule = false;
819 RecipeLookupResult recipeLookupResult =
820 getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
821 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
823 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
824 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
825 modelType = ModelType.vnf;
826 } else if (action == Action.addMembers || action == Action.removeMembers) {
827 modelType = ModelType.instanceGroup;
829 modelType = modelInfo.getModelType();
832 if (modelType.equals(ModelType.vfModule)) {
835 // Get VF Module-specific base module indicator
838 String modelVersionId = modelInfo.getModelVersionId();
840 if (modelVersionId != null) {
841 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
842 } else if (modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null) {
843 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(),
844 modelInfo.getModelVersion());
848 if (vfm.getIsBase()) {
849 isBaseVfModule = true;
851 } else if (action == Action.createInstance || action == Action.updateInstance) {
852 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in
854 // This request cannot proceed
856 String serviceVersionText = "";
857 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty()) {
858 serviceVersionText = " with version " + sdcServiceModelVersion;
861 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName()
862 + serviceVersionText + " not found in MSO Catalog DB";
863 ErrorLoggerInfo errorLoggerInfo =
864 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
865 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
866 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage,
867 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
868 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
870 throw vfModuleException;
875 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
877 String vfModuleId = "";
878 String volumeGroupId = "";
879 String networkId = "";
880 String pnfCorrelationId = "";
881 String instanceGroupId = null;
883 if (sir.getVnfInstanceId() != null) {
884 vnfId = sir.getVnfInstanceId();
887 if (sir.getVfModuleInstanceId() != null) {
888 vfModuleId = sir.getVfModuleInstanceId();
891 if (sir.getVolumeGroupInstanceId() != null) {
892 volumeGroupId = sir.getVolumeGroupInstanceId();
895 if (sir.getNetworkInstanceId() != null) {
896 networkId = sir.getNetworkInstanceId();
898 if (sir.getInstanceGroupId() != null) {
899 instanceGroupId = sir.getInstanceGroupId();
902 pnfCorrelationId = getPnfCorrelationId(sir);
905 infraActiveRequestsClient.save(currentActiveReq);
906 } catch (Exception e) {
907 ErrorLoggerInfo errorLoggerInfo =
908 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
909 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
910 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
911 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
914 if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
916 } else if (aLaCarte == null) {
920 RequestClientParameter requestClientParameter = null;
922 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
923 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
924 .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
925 .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
926 .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
927 .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
928 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
929 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
930 .setInstanceGroupId(instanceGroupId).build();
931 } catch (IOException e) {
932 ErrorLoggerInfo errorLoggerInfo =
933 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
934 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
935 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
936 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
939 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
940 recipeLookupResult.getOrchestrationURI(), requestScope);
948 protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
949 if (action != null && action.equals(Action.replaceInstance)
950 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
951 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
952 action = Action.replaceInstanceRetainAssignments;
957 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
958 String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
959 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
960 Boolean aLaCarte = true;
961 long startTime = System.currentTimeMillis();
962 String apiVersion = version.substring(1);
963 ServiceInstancesRequest sir = new ServiceInstancesRequest();
964 sir.setInstanceGroupId(instanceGroupId);
966 String requestScope = ModelType.instanceGroup.toString();
967 InfraActiveRequests currentActiveReq =
968 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
969 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
971 requestHandlerUtils.validateHeaders(requestContext);
972 } catch (ValidationException e) {
973 logger.error("Exception occurred", e);
974 ErrorLoggerInfo errorLoggerInfo =
975 new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
976 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
977 ValidateException validateException =
978 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
979 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
980 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
981 throw validateException;
984 InfraActiveRequests dup =
985 requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
986 boolean inProgress = false;
989 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
992 if (dup != null && inProgress) {
993 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
997 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
999 RequestReferences referencesResponse = new RequestReferences();
1001 referencesResponse.setRequestId(requestId);
1003 serviceResponse.setRequestReferences(referencesResponse);
1004 Boolean isBaseVfModule = false;
1006 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1009 infraActiveRequestsClient.save(currentActiveReq);
1010 } catch (Exception e) {
1011 ErrorLoggerInfo errorLoggerInfo =
1012 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1013 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1014 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1015 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1018 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1019 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1020 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1021 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1023 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1024 recipeLookupResult.getOrchestrationURI(), requestScope);
1027 protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1028 return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1029 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1033 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
1034 boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
1035 RecipeLookupResult recipeLookupResult = null;
1036 // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1037 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1038 // Query MSO Catalog DB
1040 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1041 recipeLookupResult = getDefaultVnfUri(sir, action);
1042 } else if (action == Action.addMembers || action == Action.removeMembers) {
1043 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1044 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1046 recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
1047 } catch (IOException e) {
1048 ErrorLoggerInfo errorLoggerInfo =
1049 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1050 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1053 ValidateException validateException =
1054 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1055 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1057 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1059 throw validateException;
1061 } else if (modelInfo.getModelType().equals(ModelType.vfModule)
1062 || modelInfo.getModelType().equals(ModelType.volumeGroup)
1063 || modelInfo.getModelType().equals(ModelType.vnf)) {
1065 recipeLookupResult = getVnfOrVfModuleUri(sir, action);
1066 } catch (ValidationException e) {
1067 ErrorLoggerInfo errorLoggerInfo =
1068 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1069 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1072 ValidateException validateException =
1073 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1074 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1076 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1078 throw validateException;
1080 } else if (modelInfo.getModelType().equals(ModelType.network)) {
1082 recipeLookupResult = getNetworkUri(sir, action);
1083 } catch (ValidationException e) {
1085 ErrorLoggerInfo errorLoggerInfo =
1086 new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
1087 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1090 ValidateException validateException =
1091 new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1092 ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1093 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1095 throw validateException;
1097 } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
1098 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1101 if (recipeLookupResult == null) {
1102 ErrorLoggerInfo errorLoggerInfo =
1103 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1104 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1107 RecipeNotFoundException recipeNotFoundExceptionException =
1108 new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
1109 HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
1112 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
1113 recipeNotFoundExceptionException.getMessage());
1114 throw recipeNotFoundExceptionException;
1116 return recipeLookupResult;
1119 protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
1120 boolean alaCarteFlag) throws IOException {
1122 // Construct the default service name
1123 // TODO need to make this a configurable property
1124 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
1125 RequestDetails requestDetails = servInstReq.getRequestDetails();
1126 ModelInfo modelInfo = requestDetails.getModelInfo();
1127 org.onap.so.db.catalog.beans.Service serviceRecord;
1128 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1129 ServiceRecipe recipe = null;
1132 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1133 if (serviceRecord != null) {
1134 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1138 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1139 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
1141 if (recipe == null) {
1142 serviceRecordList = catalogDbClient
1143 .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1144 if (!serviceRecordList.isEmpty()) {
1145 for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
1146 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
1148 if (recipe != null) {
1156 // if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1157 RequestParameters reqParam = requestDetails.getRequestParameters();
1158 if (reqParam != null && alaCarteFlag && recipe == null) {
1160 } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1161 mapToLegacyRequest(requestDetails);
1162 } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
1163 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1164 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
1167 if (modelInfo.getModelVersionId() == null) {
1168 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1170 if (recipe == null) {
1173 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1176 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1177 RequestParameters reqParam;
1178 if (requestDetails.getRequestParameters() == null) {
1179 reqParam = new RequestParameters();
1181 reqParam = requestDetails.getRequestParameters();
1183 if (requestDetails.getCloudConfiguration() == null) {
1184 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1185 if (cloudConfig != null) {
1186 requestDetails.setCloudConfiguration(cloudConfig);
1190 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1191 if (!userParams.isEmpty()) {
1192 if (reqParam == null) {
1193 requestDetails.setRequestParameters(new RequestParameters());
1195 requestDetails.getRequestParameters().setUserParams(userParams);
1199 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1201 for (Map<String, Object> params : reqParams.getUserParams()) {
1202 if (params.containsKey("service")) {
1203 Service service = serviceMapper(params);
1205 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1207 if (targetConfiguration.isPresent()) {
1208 return targetConfiguration.get();
1210 for (Networks network : service.getResources().getNetworks()) {
1211 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1212 if (targetConfiguration.isPresent()) {
1213 return targetConfiguration.get();
1217 for (Vnfs vnf : service.getResources().getVnfs()) {
1218 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1220 if (targetConfiguration.isPresent()) {
1221 return targetConfiguration.get();
1224 for (VfModules vfModule : vnf.getVfModules()) {
1225 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1227 if (targetConfiguration.isPresent()) {
1228 return targetConfiguration.get();
1239 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1240 CloudConfiguration targetConfiguration = new CloudConfiguration();
1241 if (sourceCloudConfiguration != null) {
1242 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1243 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1244 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1245 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1246 return Optional.of(targetConfiguration);
1248 return Optional.empty();
1251 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1252 logger.debug("Configuring UserParams for Macro Request");
1253 Map<String, Object> userParams = new HashMap<>();
1255 for (Map<String, Object> params : reqParams.getUserParams()) {
1256 if (params.containsKey("service")) {
1257 Service service = serviceMapper(params);
1259 addUserParams(userParams, service.getInstanceParams());
1261 for (Networks network : service.getResources().getNetworks()) {
1262 addUserParams(userParams, network.getInstanceParams());
1265 for (Vnfs vnf : service.getResources().getVnfs()) {
1266 addUserParams(userParams, vnf.getInstanceParams());
1268 for (VfModules vfModule : vnf.getVfModules()) {
1269 addUserParams(userParams, vfModule.getInstanceParams());
1275 return mapFlatMapToNameValue(userParams);
1278 private Service serviceMapper(Map<String, Object> params)
1279 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1280 ObjectMapper obj = new ObjectMapper();
1281 String input = obj.writeValueAsString(params.get("service"));
1282 return obj.readValue(input, Service.class);
1285 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1286 for (Map<String, String> map : sourceUserParams) {
1287 for (Map.Entry<String, String> entry : map.entrySet()) {
1288 targetUserParams.put(entry.getKey(), entry.getValue());
1293 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1294 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1296 for (Map.Entry<String, Object> map : flatMap.entrySet()) {
1297 Map<String, Object> targetMap = new HashMap<>();
1298 targetMap.put(NAME, map.getKey());
1299 targetMap.put(VALUE, map.getValue());
1300 targetUserParams.add(targetMap);
1302 return targetUserParams;
1305 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
1306 throws ValidationException {
1308 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1309 String vnfComponentType = modelInfo.getModelType().name();
1311 RelatedInstanceList[] instanceList = null;
1312 if (servInstReq.getRequestDetails() != null) {
1313 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1316 Recipe recipe = null;
1317 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1318 String modelCustomizationId = modelInfo.getModelCustomizationId();
1319 String modelCustomizationName = modelInfo.getModelCustomizationName();
1320 String relatedInstanceModelVersionId = null;
1321 String relatedInstanceModelInvariantId = null;
1322 String relatedInstanceVersion = null;
1323 String relatedInstanceModelCustomizationName = null;
1325 if (instanceList != null) {
1327 for (RelatedInstanceList relatedInstanceList : instanceList) {
1329 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1330 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1331 if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
1332 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1333 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1336 if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
1337 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1338 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1339 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1340 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1344 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1345 // a. For a vnf request (only create, no update currently):
1346 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in
1347 // vnf_resource_customization.model_customization_uuid.
1348 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1349 // pre-v3), then modelInfo.modelCustomizationName must have
1350 // been provided (else create request should be rejected). APIH should use the
1351 // relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1352 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a
1353 // vnf_resource_customization.model_customization_uuid record exists.
1354 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
1355 // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1356 // (MODEL_UUID) in SERVICE table.
1357 // iii. Regardless of how the value was provided/obtained above, APIH must always populate
1358 // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
1359 // during 1707 data migration if VID did not provide it originally on request.
1360 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated
1362 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to
1363 // look it up in our catalog to construct vnf-type value to pass to BPMN.
1365 VnfResource vnfResource = null;
1366 VnfResourceCustomization vrc = null;
1367 // Validation for vnfResource
1369 if (modelCustomizationId != null) {
1370 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1372 vnfResource = vrc.getVnfResources();
1375 org.onap.so.db.catalog.beans.Service service =
1376 catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1377 if (service == null) {
1378 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
1379 relatedInstanceModelInvariantId);
1382 if (service == null) {
1383 throw new ValidationException("service in relatedInstance");
1385 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1386 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1387 vrc = vnfResourceCustom;
1392 vnfResource = vrc.getVnfResources();
1393 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1394 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1398 if (vnfResource == null) {
1399 throw new ValidationException("vnfResource");
1401 if (modelInfo.getModelVersionId() == null) {
1402 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1406 VnfRecipe vnfRecipe = null;
1409 String nfRole = vrc.getNfRole();
1410 if (nfRole != null) {
1412 catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1416 if (vnfRecipe == null) {
1417 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1420 if (vnfRecipe == null) {
1424 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1427 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
1428 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
1429 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
1430 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
1431 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
1432 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
1433 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
1434 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
1435 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
1436 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
1437 * the request). This means taking each record found // in vf_module_customization and looking up in
1438 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
1439 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
1441 VfModuleCustomization vfmc = null;
1443 VnfResourceCustomization vnfrc;
1444 VfModule vfModule = null;
1446 if (modelInfo.getModelCustomizationId() != null) {
1447 vfmc = catalogDbClient
1448 .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1450 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1452 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
1453 relatedInstanceModelInvariantId, relatedInstanceVersion);
1455 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
1456 relatedInstanceModelCustomizationName, vnfr);
1458 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1460 String vfModuleModelUUID = modelInfo.getModelVersionId();
1461 for (VfModuleCustomization vf : list) {
1462 VfModuleCustomization vfmCustom;
1463 if (vfModuleModelUUID != null) {
1464 vfmCustom = catalogDbClient
1465 .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
1466 vf.getModelCustomizationUUID(), vfModuleModelUUID);
1467 if (vfmCustom != null) {
1468 vfModule = vfmCustom.getVfModule();
1471 vfmCustom = catalogDbClient
1472 .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1473 if (vfmCustom != null) {
1474 vfModule = vfmCustom.getVfModule();
1476 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
1477 relatedInstanceModelInvariantId, relatedInstanceVersion);
1481 if (vfModule != null) {
1482 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1483 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1489 if (vfmc == null && vfModule == null) {
1490 throw new ValidationException("vfModuleCustomization");
1491 } else if (vfModule == null && vfmc != null) {
1492 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
1493 // VfModuleCustomization table
1496 if (modelInfo.getModelVersionId() == null) {
1497 modelInfo.setModelVersionId(vfModule.getModelUUID());
1501 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1502 vfModule.getModelUUID(), vnfComponentType, action.toString());
1503 if (recipe == null) {
1504 List<VfModule> vfModuleRecords = catalogDbClient
1505 .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1506 if (!vfModuleRecords.isEmpty()) {
1507 for (VfModule record : vfModuleRecords) {
1508 recipe = catalogDbClient
1509 .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1510 record.getModelUUID(), vnfComponentType, action.toString());
1511 if (recipe != null) {
1517 if (recipe == null) {
1518 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1519 defaultSource, vnfComponentType, action.toString());
1520 if (recipe == null) {
1521 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
1522 vnfComponentType, action.toString());
1525 if (recipe == null) {
1532 if (modelInfo.getModelType().equals(ModelType.vnf)) {
1533 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1534 if (recipe == null) {
1538 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
1539 defaultSource, vnfComponentType, action.toString());
1541 if (recipe == null) {
1547 return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
1550 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1552 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1554 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1556 if (vnfRecipe == null) {
1560 return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1564 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1566 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1568 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1569 String modelName = modelInfo.getModelName();
1570 Recipe recipe = null;
1572 if (modelInfo.getModelCustomizationId() != null) {
1573 NetworkResourceCustomization networkResourceCustomization = catalogDbClient
1574 .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1575 if (networkResourceCustomization != null) {
1576 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1577 if (networkResource != null) {
1578 if (modelInfo.getModelVersionId() == null) {
1579 modelInfo.setModelVersionId(networkResource.getModelUUID());
1581 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
1584 throw new ValidationException("no catalog entry found");
1586 } else if (action != Action.deleteInstance) {
1587 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1590 // ok for version < 3 and action delete
1591 if (modelName != null) {
1592 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1596 if (recipe == null) {
1597 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1600 return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1604 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1605 String version, String requestId, String requestUri) throws ApiException {
1606 String serviceInstanceId = (instanceIdMap == null) ? null : instanceIdMap.get("serviceInstanceId");
1607 Boolean aLaCarte = null;
1608 String apiVersion = version.substring(1);
1609 boolean inProgress = false;
1611 long startTime = System.currentTimeMillis();
1612 ServiceInstancesRequest sir = null;
1614 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1615 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1616 InfraActiveRequests currentActiveReq =
1617 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1618 if (sir.getRequestDetails().getRequestParameters() != null) {
1619 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1621 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1623 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1624 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1626 InfraActiveRequests dup = null;
1628 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
1631 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1634 if (instanceIdMap != null && dup != null && inProgress) {
1635 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
1639 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1640 RequestReferences referencesResponse = new RequestReferences();
1641 referencesResponse.setRequestId(requestId);
1642 serviceResponse.setRequestReferences(referencesResponse);
1645 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1646 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1648 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1649 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1650 : "ALaCarte Recipe Timeout not found in properties";
1652 ErrorLoggerInfo errorLoggerInfo =
1653 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1654 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1657 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1658 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1660 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1662 throw validateException;
1666 serviceInstanceId = "";
1667 String configurationId = "";
1668 String pnfCorrelationId = "";
1670 if (sir.getServiceInstanceId() != null) {
1671 serviceInstanceId = sir.getServiceInstanceId();
1674 if (sir.getConfigurationId() != null) {
1675 configurationId = sir.getConfigurationId();
1678 pnfCorrelationId = getPnfCorrelationId(sir);
1681 infraActiveRequestsClient.save(currentActiveReq);
1682 } catch (Exception e) {
1683 ErrorLoggerInfo errorLoggerInfo =
1684 new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1685 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1686 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1687 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1690 if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1692 } else if (aLaCarte == null) {
1695 RequestClientParameter requestClientParameter = null;
1697 requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1698 .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1699 .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1700 .setConfigurationId(configurationId)
1701 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1702 .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1703 } catch (IOException e) {
1704 ErrorLoggerInfo errorLoggerInfo =
1705 new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1706 .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1707 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1708 HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1712 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,