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 com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpStatus;
34 import org.onap.so.apihandler.common.CommonConstants;
35 import org.onap.so.apihandler.common.ErrorNumbers;
36 import org.onap.so.apihandler.common.RequestClientParameter;
37 import org.onap.so.apihandlerinfra.exceptions.ApiException;
38 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
39 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
40 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
41 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
42 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
43 import org.onap.so.db.catalog.beans.NetworkResource;
44 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
45 import org.onap.so.db.catalog.beans.Recipe;
46 import org.onap.so.db.catalog.beans.ServiceRecipe;
47 import org.onap.so.db.catalog.beans.VfModule;
48 import org.onap.so.db.catalog.beans.VfModuleCustomization;
49 import org.onap.so.db.catalog.beans.VnfRecipe;
50 import org.onap.so.db.catalog.beans.VnfResource;
51 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
52 import org.onap.so.db.catalog.client.CatalogDbClient;
53 import org.onap.so.db.request.beans.InfraActiveRequests;
54 import org.onap.so.db.request.client.RequestsDbClient;
55 import org.onap.so.exceptions.ValidationException;
56 import org.onap.so.logger.ErrorCode;
57 import org.onap.so.logger.MessageEnum;
58 import org.onap.so.serviceinstancebeans.CloudConfiguration;
59 import org.onap.so.serviceinstancebeans.ModelInfo;
60 import org.onap.so.serviceinstancebeans.ModelType;
61 import org.onap.so.serviceinstancebeans.Networks;
62 import org.onap.so.serviceinstancebeans.RelatedInstance;
63 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
64 import org.onap.so.serviceinstancebeans.RequestDetails;
65 import org.onap.so.serviceinstancebeans.RequestParameters;
66 import org.onap.so.serviceinstancebeans.RequestReferences;
67 import org.onap.so.serviceinstancebeans.Service;
68 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
69 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
70 import org.onap.so.serviceinstancebeans.VfModules;
71 import org.onap.so.serviceinstancebeans.Vnfs;
72 import org.slf4j.Logger;
73 import org.slf4j.LoggerFactory;
74 import org.springframework.beans.factory.annotation.Autowired;
75 import org.springframework.core.env.Environment;
76 import org.springframework.stereotype.Component;
78 import javax.transaction.Transactional;
79 import javax.ws.rs.Consumes;
80 import javax.ws.rs.DELETE;
81 import javax.ws.rs.POST;
82 import javax.ws.rs.PUT;
83 import javax.ws.rs.Path;
84 import javax.ws.rs.PathParam;
85 import javax.ws.rs.Produces;
86 import javax.ws.rs.container.ContainerRequestContext;
87 import javax.ws.rs.core.Context;
88 import javax.ws.rs.core.MediaType;
89 import javax.ws.rs.core.Response;
90 import java.io.IOException;
91 import java.util.ArrayList;
92 import java.util.HashMap;
93 import java.util.List;
95 import java.util.Optional;
98 @Path("/onap/so/infra/serviceInstantiation")
99 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
100 public class ServiceInstances {
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 CatalogDbClient catalogDbClient;
115 private RequestsDbClient infraActiveRequestsClient;
118 private MsoRequest msoRequest;
121 private RequestHandlerUtils requestHandlerUtils;
124 @Path("/{version:[vV][5-7]}/serviceInstances")
125 @Consumes(MediaType.APPLICATION_JSON)
126 @Produces(MediaType.APPLICATION_JSON)
127 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
129 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
130 String requestId = requestHandlerUtils.getRequestId(requestContext);
131 return serviceInstances(request, Action.createInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
135 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
136 @Consumes(MediaType.APPLICATION_JSON)
137 @Produces(MediaType.APPLICATION_JSON)
138 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
140 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
141 String requestId = requestHandlerUtils.getRequestId(requestContext);
142 HashMap<String, String> instanceIdMap = new HashMap<>();
143 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
144 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
148 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
149 @Consumes(MediaType.APPLICATION_JSON)
150 @Produces(MediaType.APPLICATION_JSON)
151 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
153 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
154 String requestId = requestHandlerUtils.getRequestId(requestContext);
155 HashMap<String, String> instanceIdMap = new HashMap<>();
156 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
157 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
161 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
162 @Consumes(MediaType.APPLICATION_JSON)
163 @Produces(MediaType.APPLICATION_JSON)
164 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
166 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
167 String requestId = requestHandlerUtils.getRequestId(requestContext);
168 HashMap<String, String> instanceIdMap = new HashMap<>();
169 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
170 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
174 @Path("/{version:[vV][7]}/serviceInstances/assign")
175 @Consumes(MediaType.APPLICATION_JSON)
176 @Produces(MediaType.APPLICATION_JSON)
177 @ApiOperation(value="Assign Service Instance", response=Response.class)
179 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
180 String requestId = requestHandlerUtils.getRequestId(requestContext);
181 return serviceInstances(request, Action.assignInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
185 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
186 @Consumes(MediaType.APPLICATION_JSON)
187 @Produces(MediaType.APPLICATION_JSON)
188 @ApiOperation(value="Unassign Service Instance", response=Response.class)
190 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
191 String requestId = requestHandlerUtils.getRequestId(requestContext);
192 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
193 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
194 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
198 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
199 @Consumes(MediaType.APPLICATION_JSON)
200 @Produces(MediaType.APPLICATION_JSON)
201 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
203 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
204 String requestId = requestHandlerUtils.getRequestId(requestContext);
205 HashMap<String, String> instanceIdMap = new HashMap<>();
206 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
207 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
211 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
212 @Consumes(MediaType.APPLICATION_JSON)
213 @Produces(MediaType.APPLICATION_JSON)
214 @ApiOperation(value="Delete provided Port",response=Response.class)
216 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
217 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
218 String requestId = requestHandlerUtils.getRequestId(requestContext);
219 HashMap<String, String> instanceIdMap = new HashMap<>();
220 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
221 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
222 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
226 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
227 @Consumes(MediaType.APPLICATION_JSON)
228 @Produces(MediaType.APPLICATION_JSON)
229 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
231 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
232 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
233 String requestId = requestHandlerUtils.getRequestId(requestContext);
234 HashMap<String, String> instanceIdMap = new HashMap<>();
235 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
237 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
241 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
242 @Consumes(MediaType.APPLICATION_JSON)
243 @Produces(MediaType.APPLICATION_JSON)
244 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
246 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
247 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
248 String requestId = requestHandlerUtils.getRequestId(requestContext);
249 HashMap<String, String> instanceIdMap = new HashMap<>();
250 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
251 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
252 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
256 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
257 @Consumes(MediaType.APPLICATION_JSON)
258 @Produces(MediaType.APPLICATION_JSON)
259 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
261 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
262 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
263 String requestId = requestHandlerUtils.getRequestId(requestContext);
264 HashMap<String, String> instanceIdMap = new HashMap<>();
265 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
266 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
267 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
271 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
272 @Consumes(MediaType.APPLICATION_JSON)
273 @Produces(MediaType.APPLICATION_JSON)
274 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
276 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
277 @PathParam("configurationInstanceId") String configurationInstanceId, @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.deactivateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
286 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
287 @Consumes(MediaType.APPLICATION_JSON)
288 @Produces(MediaType.APPLICATION_JSON)
289 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
291 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
292 String requestId = requestHandlerUtils.getRequestId(requestContext);
293 HashMap<String, String> instanceIdMap = new HashMap<>();
294 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
295 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
299 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
300 @Consumes(MediaType.APPLICATION_JSON)
301 @Produces(MediaType.APPLICATION_JSON)
302 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
304 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
305 String requestId = requestHandlerUtils.getRequestId(requestContext);
306 HashMap<String, String> instanceIdMap = new HashMap<>();
307 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
308 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
312 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
313 @Consumes(MediaType.APPLICATION_JSON)
314 @Produces(MediaType.APPLICATION_JSON)
315 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
317 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
318 String requestId = requestHandlerUtils.getRequestId(requestContext);
319 HashMap<String, String> instanceIdMap = new HashMap<>();
320 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
321 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
325 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
326 @Consumes(MediaType.APPLICATION_JSON)
327 @Produces(MediaType.APPLICATION_JSON)
328 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
330 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
331 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
332 String requestId = requestHandlerUtils.getRequestId(requestContext);
333 HashMap<String, String> instanceIdMap = new HashMap<>();
334 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
335 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
336 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
340 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
341 @Consumes(MediaType.APPLICATION_JSON)
342 @Produces(MediaType.APPLICATION_JSON)
343 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
345 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
346 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
347 String requestId = requestHandlerUtils.getRequestId(requestContext);
348 HashMap<String, String> instanceIdMap = new HashMap<>();
349 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
350 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
351 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
355 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
356 @Consumes(MediaType.APPLICATION_JSON)
357 @Produces(MediaType.APPLICATION_JSON)
358 @ApiOperation(value="Apply updated configuration",response=Response.class)
359 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
360 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
361 String requestId = requestHandlerUtils.getRequestId(requestContext);
362 HashMap<String, String> instanceIdMap = new HashMap<>();
363 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
364 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
365 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
369 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
370 @Consumes(MediaType.APPLICATION_JSON)
371 @Produces(MediaType.APPLICATION_JSON)
372 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
373 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
374 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
375 String requestId = requestHandlerUtils.getRequestId(requestContext);
376 HashMap<String, String> instanceIdMap = new HashMap<>();
377 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
378 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
379 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
384 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
385 @Consumes(MediaType.APPLICATION_JSON)
386 @Produces(MediaType.APPLICATION_JSON)
387 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
389 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
390 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
391 String requestId = requestHandlerUtils.getRequestId(requestContext);
392 HashMap<String, String> instanceIdMap = new HashMap<>();
393 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
394 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
395 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
399 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
400 @Consumes(MediaType.APPLICATION_JSON)
401 @Produces(MediaType.APPLICATION_JSON)
402 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
404 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
405 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
406 String requestId = requestHandlerUtils.getRequestId(requestContext);
407 HashMap<String, String> instanceIdMap = new HashMap<>();
408 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
409 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
410 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
414 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
415 @Consumes(MediaType.APPLICATION_JSON)
416 @Produces(MediaType.APPLICATION_JSON)
417 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
419 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
420 @PathParam("vnfInstanceId") String vnfInstanceId,
421 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
422 String requestId = requestHandlerUtils.getRequestId(requestContext);
423 HashMap<String, String> instanceIdMap = new HashMap<>();
424 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
425 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
426 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
427 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
431 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
432 @Consumes(MediaType.APPLICATION_JSON)
433 @Produces(MediaType.APPLICATION_JSON)
434 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
436 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
437 @PathParam("vnfInstanceId") String vnfInstanceId,
438 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
439 String requestId = requestHandlerUtils.getRequestId(requestContext);
440 HashMap<String, String> instanceIdMap = new HashMap<>();
441 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
442 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
443 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
444 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
448 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
449 @Consumes(MediaType.APPLICATION_JSON)
450 @Produces(MediaType.APPLICATION_JSON)
451 @ApiOperation(value="Perform VNF software update",response=Response.class)
453 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
454 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
455 String requestId = requestHandlerUtils.getRequestId(requestContext);
456 HashMap<String, String> instanceIdMap = new HashMap<>();
457 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
458 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
459 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
463 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
464 @Consumes(MediaType.APPLICATION_JSON)
465 @Produces(MediaType.APPLICATION_JSON)
466 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
468 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
469 @PathParam("vnfInstanceId") String vnfInstanceId,
470 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
471 String requestId = requestHandlerUtils.getRequestId(requestContext);
472 HashMap<String, String> instanceIdMap = new HashMap<>();
473 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
474 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
475 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
476 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
480 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
481 @Consumes(MediaType.APPLICATION_JSON)
482 @Produces(MediaType.APPLICATION_JSON)
483 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
485 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
486 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
487 String requestId = requestHandlerUtils.getRequestId(requestContext);
488 HashMap<String, String> instanceIdMap = new HashMap<>();
489 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
490 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
491 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
492 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
497 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
498 @Consumes(MediaType.APPLICATION_JSON)
499 @Produces(MediaType.APPLICATION_JSON)
500 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
502 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
503 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
504 String requestId = requestHandlerUtils.getRequestId(requestContext);
505 HashMap<String, String> instanceIdMap = new HashMap<>();
506 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
507 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
508 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
513 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
514 @Consumes(MediaType.APPLICATION_JSON)
515 @Produces(MediaType.APPLICATION_JSON)
516 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
518 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
519 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
520 String requestId = requestHandlerUtils.getRequestId(requestContext);
521 HashMap<String, String> instanceIdMap = new HashMap<>();
522 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
523 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
524 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
528 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
529 @Consumes(MediaType.APPLICATION_JSON)
530 @Produces(MediaType.APPLICATION_JSON)
531 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
533 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
534 @PathParam("vnfInstanceId") String vnfInstanceId,
535 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
536 String requestId = requestHandlerUtils.getRequestId(requestContext);
537 HashMap<String, String> instanceIdMap = new HashMap<>();
538 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
539 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
540 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
541 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
545 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
546 @Consumes(MediaType.APPLICATION_JSON)
547 @Produces(MediaType.APPLICATION_JSON)
548 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
550 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
551 @PathParam("vnfInstanceId") String vnfInstanceId,
552 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
553 String requestId = requestHandlerUtils.getRequestId(requestContext);
554 HashMap<String, String> instanceIdMap = new HashMap<>();
555 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
556 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
557 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
558 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
562 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
563 @Consumes(MediaType.APPLICATION_JSON)
564 @Produces(MediaType.APPLICATION_JSON)
565 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
567 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
568 String requestId = requestHandlerUtils.getRequestId(requestContext);
569 HashMap<String, String> instanceIdMap = new HashMap<>();
570 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
571 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
575 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
576 @Consumes(MediaType.APPLICATION_JSON)
577 @Produces(MediaType.APPLICATION_JSON)
578 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
580 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
581 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
582 String requestId = requestHandlerUtils.getRequestId(requestContext);
583 HashMap<String, String> instanceIdMap = new HashMap<>();
584 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
585 instanceIdMap.put("networkInstanceId", networkInstanceId);
586 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
590 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
591 @Consumes(MediaType.APPLICATION_JSON)
592 @Produces(MediaType.APPLICATION_JSON)
593 @ApiOperation(value="Delete provided Network instance",response=Response.class)
595 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
596 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
597 String requestId = requestHandlerUtils.getRequestId(requestContext);
598 HashMap<String, String> instanceIdMap = new HashMap<>();
599 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
600 instanceIdMap.put("networkInstanceId", networkInstanceId);
601 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
605 @Path("/{version:[vV][7]}/instanceGroups")
606 @Consumes(MediaType.APPLICATION_JSON)
607 @Produces(MediaType.APPLICATION_JSON)
608 @ApiOperation(value="Create instanceGroups",response=Response.class)
610 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
611 String requestId = requestHandlerUtils.getRequestId(requestContext);
612 return serviceInstances(request, Action.createInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
616 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
617 @Consumes(MediaType.APPLICATION_JSON)
618 @Produces(MediaType.APPLICATION_JSON)
619 @ApiOperation(value="Delete instanceGroup",response=Response.class)
621 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
622 String requestId = requestHandlerUtils.getRequestId(requestContext);
623 HashMap<String, String> instanceIdMap = new HashMap<>();
624 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
625 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
629 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
630 @Consumes(MediaType.APPLICATION_JSON)
631 @Produces(MediaType.APPLICATION_JSON)
632 @ApiOperation(value="Add instanceGroup members",response=Response.class)
634 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
635 String requestId = requestHandlerUtils.getRequestId(requestContext);
636 HashMap<String, String> instanceIdMap = new HashMap<>();
637 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
638 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
642 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
643 @Consumes(MediaType.APPLICATION_JSON)
644 @Produces(MediaType.APPLICATION_JSON)
645 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
647 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
648 String requestId = requestHandlerUtils.getRequestId(requestContext);
649 HashMap<String, String> instanceIdMap = new HashMap<>();
650 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
651 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
654 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
655 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
656 Boolean aLaCarte = null;
657 long startTime = System.currentTimeMillis ();
658 ServiceInstancesRequest sir = null;
659 String apiVersion = version.substring(1);
661 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
662 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
663 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
664 if(sir.getRequestDetails().getRequestParameters() != null){
665 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
667 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
668 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
670 int requestVersion = Integer.parseInt(version.substring(1));
671 String instanceName = null;
672 if (sir.getRequestDetails().getRequestInfo() != null) {
673 instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
675 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
676 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
677 String networkType = msoRequest.getNetworkType(sir,requestScope);
678 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
679 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
681 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
682 currentActiveReq.setVnfType(vnfType);
683 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
684 currentActiveReq.setNetworkType(networkType);
687 InfraActiveRequests dup = null;
688 boolean inProgress = false;
690 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
693 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
696 if (dup != null && inProgress) {
697 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
699 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
701 RequestReferences referencesResponse = new RequestReferences();
703 referencesResponse.setRequestId(requestId);
705 serviceResponse.setRequestReferences(referencesResponse);
706 Boolean isBaseVfModule = false;
708 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
709 String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
711 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
712 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
713 modelType = ModelType.vnf;
714 }else if(action == Action.addMembers || action == Action.removeMembers){
715 modelType = ModelType.instanceGroup;
717 modelType =modelInfo.getModelType();
720 if (modelType.equals(ModelType.vfModule)) {
723 // Get VF Module-specific base module indicator
726 String modelVersionId = modelInfo.getModelVersionId();
728 if(modelVersionId != null) {
729 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
730 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
731 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
735 if (vfm.getIsBase()) {
736 isBaseVfModule = true;
738 } else if (action == Action.createInstance || action == Action.updateInstance) {
739 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
740 // This request cannot proceed
742 String serviceVersionText = "";
743 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
744 serviceVersionText = " with version " + sdcServiceModelVersion;
747 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
748 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
749 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
750 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
752 throw vfModuleException;
757 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
759 String vfModuleId = "";
760 String volumeGroupId = "";
761 String networkId = "";
762 String pnfCorrelationId = "";
763 String instanceGroupId = null;
765 if(sir.getVnfInstanceId () != null){
766 vnfId = sir.getVnfInstanceId ();
769 if(sir.getVfModuleInstanceId () != null){
770 vfModuleId = sir.getVfModuleInstanceId ();
773 if(sir.getVolumeGroupInstanceId () != null){
774 volumeGroupId = sir.getVolumeGroupInstanceId ();
777 if(sir.getNetworkInstanceId () != null){
778 networkId = sir.getNetworkInstanceId ();
780 if(sir.getInstanceGroupId() != null){
781 instanceGroupId = sir.getInstanceGroupId();
784 pnfCorrelationId = getPnfCorrelationId(sir);
787 infraActiveRequestsClient.save(currentActiveReq);
789 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
790 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
791 .errorInfo(errorLoggerInfo).build();
794 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
796 }else if(aLaCarte == null){
800 RequestClientParameter requestClientParameter = null;
802 requestClientParameter = new RequestClientParameter.Builder()
803 .setRequestId(requestId)
804 .setBaseVfModule(isBaseVfModule)
805 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
806 .setRequestAction(action.toString())
807 .setServiceInstanceId(serviceInstanceId)
808 .setPnfCorrelationId(pnfCorrelationId)
810 .setVfModuleId(vfModuleId)
811 .setVolumeGroupId(volumeGroupId)
812 .setNetworkId(networkId)
813 .setServiceType(serviceInstanceType)
815 .setVfModuleType(vfModuleType)
816 .setNetworkType(networkType)
817 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
818 .setApiVersion(apiVersion)
819 .setALaCarte(aLaCarte)
820 .setRequestUri(requestUri)
821 .setInstanceGroupId(instanceGroupId).build();
822 } catch (IOException e) {
823 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
824 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
825 .errorInfo(errorLoggerInfo).build();
827 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
829 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
830 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
831 Boolean aLaCarte = true;
832 long startTime = System.currentTimeMillis ();
833 String apiVersion = version.substring(1);
834 ServiceInstancesRequest sir = new ServiceInstancesRequest();
835 sir.setInstanceGroupId(instanceGroupId);
837 String requestScope = ModelType.instanceGroup.toString();
838 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
839 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
841 requestHandlerUtils.validateHeaders(requestContext);
842 } catch (ValidationException e) {
843 logger.error("Exception occurred", e);
844 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
845 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
846 .errorInfo(errorLoggerInfo).build();
847 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
848 throw validateException;
851 InfraActiveRequests dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
852 boolean inProgress = false;
855 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
858 if (dup != null && inProgress) {
859 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
862 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
864 RequestReferences referencesResponse = new RequestReferences();
866 referencesResponse.setRequestId(requestId);
868 serviceResponse.setRequestReferences(referencesResponse);
869 Boolean isBaseVfModule = false;
871 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
874 infraActiveRequestsClient.save(currentActiveReq);
876 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
877 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
878 .errorInfo(errorLoggerInfo).build();
881 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
882 .setRequestId(requestId)
883 .setBaseVfModule(isBaseVfModule)
884 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
885 .setRequestAction(action.toString())
886 .setApiVersion(apiVersion)
887 .setALaCarte(aLaCarte)
888 .setRequestUri(requestUri)
889 .setInstanceGroupId(instanceGroupId).build();
891 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
894 private String getPnfCorrelationId(ServiceInstancesRequest sir) {
895 return Optional.of(sir)
896 .map(ServiceInstancesRequest::getRequestDetails)
897 .map(RequestDetails::getRequestParameters)
898 .map(parameters -> parameters.getUserParamValue("pnfId"))
902 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
903 InfraActiveRequests currentActiveReq) throws ApiException {
904 RecipeLookupResult recipeLookupResult = null;
905 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
906 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
907 // Query MSO Catalog DB
909 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
910 recipeLookupResult = getDefaultVnfUri(sir, action);
911 }else if(action == Action.addMembers || action == Action.removeMembers){
912 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
913 }else if (modelInfo.getModelType().equals(ModelType.service)) {
915 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
916 } catch (IOException e) {
917 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
920 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
921 .errorInfo(errorLoggerInfo).build();
923 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
925 throw validateException;
927 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
928 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
930 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
931 } catch (ValidationException e) {
932 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
935 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
936 .errorInfo(errorLoggerInfo).build();
938 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
940 throw validateException;
942 }else if (modelInfo.getModelType().equals(ModelType.network)) {
944 recipeLookupResult = getNetworkUri( sir, action);
945 } catch (ValidationException e) {
947 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
950 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
951 .errorInfo(errorLoggerInfo).build();
952 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
954 throw validateException;
956 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
957 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
960 if (recipeLookupResult == null) {
961 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
964 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
965 .errorInfo(errorLoggerInfo).build();
967 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
968 throw recipeNotFoundExceptionException;
970 return recipeLookupResult;
973 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
975 // Construct the default service name
976 // TODO need to make this a configurable property
977 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
978 RequestDetails requestDetails = servInstReq.getRequestDetails();
979 ModelInfo modelInfo = requestDetails.getModelInfo();
980 org.onap.so.db.catalog.beans.Service serviceRecord;
981 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
982 ServiceRecipe recipe = null;
985 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
986 if(serviceRecord !=null){
987 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
990 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
991 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
993 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
994 if(!serviceRecordList.isEmpty()){
995 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
996 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1005 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1006 RequestParameters reqParam = requestDetails.getRequestParameters();
1007 if(reqParam!=null && alaCarteFlag && recipe==null){
1009 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1010 mapToLegacyRequest(requestDetails);
1011 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1012 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1013 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1015 if(modelInfo.getModelVersionId() == null) {
1016 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1021 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1024 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1025 RequestParameters reqParam;
1026 if (requestDetails.getRequestParameters() == null) {
1027 reqParam = new RequestParameters();
1029 reqParam = requestDetails.getRequestParameters();
1031 if(requestDetails.getCloudConfiguration() == null) {
1032 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1033 if(cloudConfig != null) {
1034 requestDetails.setCloudConfiguration(cloudConfig);
1038 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1039 if(!userParams.isEmpty()) {
1040 if (reqParam == null) {
1041 requestDetails.setRequestParameters(new RequestParameters());
1043 requestDetails.getRequestParameters().setUserParams(userParams);
1047 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1049 for(Map<String, Object> params : reqParams.getUserParams()){
1050 if(params.containsKey("service")){
1051 Service service = serviceMapper(params);
1053 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1055 if (targetConfiguration.isPresent()) {
1056 return targetConfiguration.get();
1058 for(Networks network : service.getResources().getNetworks()) {
1059 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1060 if(targetConfiguration.isPresent()) {
1061 return targetConfiguration.get();
1065 for(Vnfs vnf : service.getResources().getVnfs()) {
1066 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1068 if(targetConfiguration.isPresent()) {
1069 return targetConfiguration.get();
1072 for(VfModules vfModule : vnf.getVfModules()) {
1073 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1075 if(targetConfiguration.isPresent()) {
1076 return targetConfiguration.get();
1087 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1088 CloudConfiguration targetConfiguration = new CloudConfiguration();
1089 if(sourceCloudConfiguration != null) {
1090 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1091 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1092 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1093 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1094 return Optional.of(targetConfiguration);
1096 return Optional.empty();
1099 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1100 logger.debug("Configuring UserParams for Macro Request");
1101 Map<String, Object> userParams = new HashMap<>();
1103 for(Map<String, Object> params : reqParams.getUserParams()){
1104 if(params.containsKey("service")){
1105 Service service = serviceMapper(params);
1107 addUserParams(userParams, service.getInstanceParams());
1109 for(Networks network : service.getResources().getNetworks()) {
1110 addUserParams(userParams, network.getInstanceParams());
1113 for(Vnfs vnf: service.getResources().getVnfs()) {
1114 addUserParams(userParams, vnf.getInstanceParams());
1116 for(VfModules vfModule: vnf.getVfModules()) {
1117 addUserParams(userParams, vfModule.getInstanceParams());
1123 return mapFlatMapToNameValue(userParams);
1126 private Service serviceMapper(Map<String, Object> params)
1127 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1128 ObjectMapper obj = new ObjectMapper();
1129 String input = obj.writeValueAsString(params.get("service"));
1130 return obj.readValue(input, Service.class);
1133 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1134 for(Map<String, String> map : sourceUserParams) {
1135 for (Map.Entry<String, String> entry : map.entrySet()) {
1136 targetUserParams.put(entry.getKey(), entry.getValue());
1141 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1142 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1144 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1145 Map<String, Object> targetMap = new HashMap<>();
1146 targetMap.put(NAME, map.getKey());
1147 targetMap.put(VALUE, map.getValue());
1148 targetUserParams.add(targetMap);
1150 return targetUserParams;
1153 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1155 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1156 String vnfComponentType = modelInfo.getModelType().name();
1158 RelatedInstanceList[] instanceList = null;
1159 if (servInstReq.getRequestDetails() != null) {
1160 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1163 Recipe recipe = null;
1164 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1165 String modelCustomizationId = modelInfo.getModelCustomizationId();
1166 String modelCustomizationName = modelInfo.getModelCustomizationName();
1167 String relatedInstanceModelVersionId = null;
1168 String relatedInstanceModelInvariantId = null;
1169 String relatedInstanceVersion = null;
1170 String relatedInstanceModelCustomizationName = null;
1172 if (instanceList != null) {
1174 for(RelatedInstanceList relatedInstanceList : instanceList){
1176 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1177 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1178 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1179 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1180 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1183 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1184 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1185 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1186 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1187 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1191 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1192 // a. For a vnf request (only create, no update currently):
1193 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1194 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1195 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1196 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1197 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1198 // (MODEL_UUID) in SERVICE table.
1199 // iii. Regardless of how the value was provided/obtained above, APIH must always populate vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
1200 // during 1707 data migration if VID did not provide it originally on request.
1201 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1202 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to look it up in our catalog to construct vnf-type value to pass to BPMN.
1204 VnfResource vnfResource = null;
1205 VnfResourceCustomization vrc=null;
1206 // Validation for vnfResource
1208 if(modelCustomizationId!=null) {
1209 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1211 vnfResource = vrc.getVnfResources();
1214 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1215 if(service == null) {
1216 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1219 if(service == null) {
1220 throw new ValidationException("service in relatedInstance");
1222 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1223 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1224 vrc=vnfResourceCustom;
1229 vnfResource = vrc.getVnfResources();
1230 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1231 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1235 if(vnfResource==null){
1236 throw new ValidationException("vnfResource");
1238 if(modelInfo.getModelVersionId() == null) {
1239 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1243 VnfRecipe vnfRecipe = null;
1246 String nfRole = vrc.getNfRole();
1247 if(nfRole != null) {
1248 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1252 if(vnfRecipe == null) {
1253 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1256 if (vnfRecipe == null) {
1260 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1262 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1263 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1264 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1265 // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table.
1266 // For each vf_module_cust_model_customization_uuid value returned, use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to
1267 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1268 // in vf_module_customization and looking up in vf_module (using vf_module_customization’s FK into vf_module) to find a match on MODEL_INVARIANT_UUID (modelInvariantId)
1269 // and MODEL_VERSION (modelVersion).
1271 VfModuleCustomization vfmc = null;
1273 VnfResourceCustomization vnfrc;
1274 VfModule vfModule = null;
1276 if(modelInfo.getModelCustomizationId() != null) {
1277 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1279 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1281 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1283 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1285 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1287 String vfModuleModelUUID = modelInfo.getModelVersionId();
1288 for(VfModuleCustomization vf : list) {
1289 VfModuleCustomization vfmCustom;
1290 if(vfModuleModelUUID != null){
1291 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1292 if(vfmCustom != null){
1293 vfModule = vfmCustom.getVfModule();
1296 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1297 if(vfmCustom != null){
1298 vfModule = vfmCustom.getVfModule();
1300 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1304 if(vfModule != null) {
1305 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1306 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1312 if(vfmc == null && vfModule == null) {
1313 throw new ValidationException("vfModuleCustomization");
1314 } else if (vfModule == null && vfmc != null) {
1315 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1318 if(modelInfo.getModelVersionId() == null) {
1319 modelInfo.setModelVersionId(vfModule.getModelUUID());
1323 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1325 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1326 if(!vfModuleRecords.isEmpty()){
1327 for(VfModule record : vfModuleRecords){
1328 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1335 if(recipe == null) {
1336 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1337 if (recipe == null) {
1338 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1341 if(recipe == null) {
1348 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1349 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1350 if (recipe == null) {
1354 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1356 if (recipe == null) {
1362 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1365 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1367 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1369 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1371 if (vnfRecipe == null) {
1375 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1379 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1381 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1383 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1384 String modelName = modelInfo.getModelName();
1385 Recipe recipe = null;
1387 if(modelInfo.getModelCustomizationId()!=null){
1388 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1389 if(networkResourceCustomization != null){
1390 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1391 if(networkResource!=null){
1392 if(modelInfo.getModelVersionId() == null) {
1393 modelInfo.setModelVersionId(networkResource.getModelUUID());
1395 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1397 throw new ValidationException("no catalog entry found");
1399 }else if(action != Action.deleteInstance){
1400 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1403 //ok for version < 3 and action delete
1404 if(modelName != null){
1405 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1410 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1413 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1417 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1418 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1419 Boolean aLaCarte = null;
1420 String apiVersion = version.substring(1);
1421 boolean inProgress = false;
1423 long startTime = System.currentTimeMillis ();
1424 ServiceInstancesRequest sir = null;
1426 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1427 String requestScope = requestHandlerUtils.deriveRequestScope(action,sir, requestUri);
1428 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1429 if(sir.getRequestDetails().getRequestParameters() != null){
1430 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1432 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1433 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1434 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1436 InfraActiveRequests dup = null;
1438 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1441 inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1444 if (instanceIdMap != null && dup != null && inProgress) {
1445 requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1448 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1449 RequestReferences referencesResponse = new RequestReferences();
1450 referencesResponse.setRequestId(requestId);
1451 serviceResponse.setRequestReferences(referencesResponse);
1454 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1455 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1457 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1458 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1460 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1463 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1464 .errorInfo(errorLoggerInfo).build();
1466 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1468 throw validateException;
1472 serviceInstanceId = "";
1473 String configurationId = "";
1474 String pnfCorrelationId = "";
1476 if(sir.getServiceInstanceId () != null){
1477 serviceInstanceId = sir.getServiceInstanceId ();
1480 if(sir.getConfigurationId() != null){
1481 configurationId = sir.getConfigurationId();
1484 pnfCorrelationId = getPnfCorrelationId(sir);
1487 infraActiveRequestsClient.save(currentActiveReq);
1488 }catch(Exception e){
1489 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1490 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1491 .errorInfo(errorLoggerInfo).build();
1494 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1496 }else if(aLaCarte == null){
1499 RequestClientParameter requestClientParameter = null;
1501 requestClientParameter = new RequestClientParameter.Builder()
1502 .setRequestId(requestId)
1503 .setBaseVfModule(false)
1504 .setRecipeTimeout(Integer.parseInt(timeOut))
1505 .setRequestAction(action.toString())
1506 .setServiceInstanceId(serviceInstanceId)
1507 .setPnfCorrelationId(pnfCorrelationId)
1508 .setConfigurationId(configurationId)
1509 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1510 .setApiVersion(apiVersion)
1511 .setALaCarte(aLaCarte)
1512 .setRequestUri(requestUri).build();
1513 } catch (IOException e) {
1514 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1515 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1516 .errorInfo(errorLoggerInfo).build();
1519 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);