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 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.so.apihandlerinfra;
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
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.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.so.apihandler.camundabeans.CamundaResponse;
36 import org.onap.so.apihandler.common.CommonConstants;
37 import org.onap.so.apihandler.common.ErrorNumbers;
38 import org.onap.so.apihandler.common.RequestClient;
39 import org.onap.so.apihandler.common.RequestClientFactory;
40 import org.onap.so.apihandler.common.RequestClientParameter;
41 import org.onap.so.apihandler.common.ResponseBuilder;
42 import org.onap.so.apihandler.common.ResponseHandler;
43 import org.onap.so.apihandlerinfra.exceptions.ApiException;
44 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
45 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
46 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
47 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
48 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
49 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
50 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
51 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
52 import org.onap.so.db.catalog.beans.NetworkResource;
53 import org.onap.so.db.catalog.beans.Recipe;
54 import org.onap.so.db.catalog.beans.ServiceRecipe;
55 import org.onap.so.db.catalog.beans.VfModule;
56 import org.onap.so.db.catalog.beans.VfModuleCustomization;
57 import org.onap.so.db.catalog.beans.VnfRecipe;
58 import org.onap.so.db.catalog.beans.VnfResource;
59 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
60 import org.onap.so.db.catalog.client.CatalogDbClient;
61 import org.onap.so.db.request.beans.InfraActiveRequests;
62 import org.onap.so.db.request.client.RequestsDbClient;
63 import org.onap.so.exceptions.ValidationException;
64 import org.onap.so.logger.MessageEnum;
65 import org.onap.so.logger.MsoLogger;
66 import org.onap.so.serviceinstancebeans.CloudConfiguration;
67 import org.onap.so.serviceinstancebeans.ModelInfo;
68 import org.onap.so.serviceinstancebeans.ModelType;
69 import org.onap.so.serviceinstancebeans.Networks;
70 import org.onap.so.serviceinstancebeans.RelatedInstance;
71 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
72 import org.onap.so.serviceinstancebeans.RequestDetails;
73 import org.onap.so.serviceinstancebeans.RequestParameters;
74 import org.onap.so.serviceinstancebeans.RequestReferences;
75 import org.onap.so.serviceinstancebeans.Service;
76 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
77 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
78 import org.onap.so.serviceinstancebeans.VfModules;
79 import org.onap.so.serviceinstancebeans.Vnfs;
80 import org.onap.so.utils.UUIDChecker;
81 import org.springframework.beans.factory.annotation.Autowired;
82 import org.springframework.core.env.Environment;
83 import org.springframework.stereotype.Component;
85 import javax.transaction.Transactional;
86 import javax.ws.rs.Consumes;
87 import javax.ws.rs.DELETE;
88 import javax.ws.rs.POST;
89 import javax.ws.rs.PUT;
90 import javax.ws.rs.Path;
91 import javax.ws.rs.PathParam;
92 import javax.ws.rs.Produces;
93 import javax.ws.rs.container.ContainerRequestContext;
94 import javax.ws.rs.core.Context;
95 import javax.ws.rs.core.MediaType;
96 import javax.ws.rs.core.Response;
97 import java.io.IOException;
99 import java.sql.Timestamp;
100 import java.util.ArrayList;
101 import java.util.HashMap;
102 import java.util.List;
103 import java.util.Map;
104 import java.util.Optional;
107 @Path("/onap/so/infra/serviceInstantiation")
108 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
109 public class ServiceInstances {
111 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
112 private static String NAME = "name";
113 private static String VALUE = "value";
114 private static final String SAVE_TO_DB = "save instance to db";
117 private Environment env;
120 private RequestClientFactory reqClientFactory;
123 private CatalogDbClient catalogDbClient;
126 private RequestsDbClient infraActiveRequestsClient;
129 private ResponseBuilder builder;
132 private MsoRequest msoRequest;
135 @Path("/{version:[vV][5-7]}/serviceInstances")
136 @Consumes(MediaType.APPLICATION_JSON)
137 @Produces(MediaType.APPLICATION_JSON)
138 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
140 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
141 String requestId = getRequestId(requestContext);
142 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
146 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
147 @Consumes(MediaType.APPLICATION_JSON)
148 @Produces(MediaType.APPLICATION_JSON)
149 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
151 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
152 String requestId = getRequestId(requestContext);
153 HashMap<String, String> instanceIdMap = new HashMap<>();
154 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
155 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
159 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
160 @Consumes(MediaType.APPLICATION_JSON)
161 @Produces(MediaType.APPLICATION_JSON)
162 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
164 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
165 String requestId = getRequestId(requestContext);
166 HashMap<String, String> instanceIdMap = new HashMap<>();
167 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
168 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
172 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
173 @Consumes(MediaType.APPLICATION_JSON)
174 @Produces(MediaType.APPLICATION_JSON)
175 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
177 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
178 String requestId = getRequestId(requestContext);
179 HashMap<String, String> instanceIdMap = new HashMap<>();
180 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
181 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
185 @Path("/{version:[vV][7]}/serviceInstances/assign")
186 @Consumes(MediaType.APPLICATION_JSON)
187 @Produces(MediaType.APPLICATION_JSON)
188 @ApiOperation(value="Assign Service Instance", response=Response.class)
190 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
191 String requestId = getRequestId(requestContext);
192 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
196 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
197 @Consumes(MediaType.APPLICATION_JSON)
198 @Produces(MediaType.APPLICATION_JSON)
199 @ApiOperation(value="Unassign Service Instance", response=Response.class)
201 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
202 String requestId = getRequestId(requestContext);
203 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
204 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
205 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
209 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
210 @Consumes(MediaType.APPLICATION_JSON)
211 @Produces(MediaType.APPLICATION_JSON)
212 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
214 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
215 String requestId = getRequestId(requestContext);
216 HashMap<String, String> instanceIdMap = new HashMap<>();
217 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
218 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
222 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
223 @Consumes(MediaType.APPLICATION_JSON)
224 @Produces(MediaType.APPLICATION_JSON)
225 @ApiOperation(value="Delete provided Port",response=Response.class)
227 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
228 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
229 String requestId = getRequestId(requestContext);
230 HashMap<String, String> instanceIdMap = new HashMap<>();
231 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
232 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
233 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
237 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
238 @Consumes(MediaType.APPLICATION_JSON)
239 @Produces(MediaType.APPLICATION_JSON)
240 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
242 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
243 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
244 String requestId = getRequestId(requestContext);
245 HashMap<String, String> instanceIdMap = new HashMap<>();
246 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
247 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
248 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
252 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
253 @Consumes(MediaType.APPLICATION_JSON)
254 @Produces(MediaType.APPLICATION_JSON)
255 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
257 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
258 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
259 String requestId = getRequestId(requestContext);
260 HashMap<String, String> instanceIdMap = new HashMap<>();
261 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
262 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
263 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
267 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
268 @Consumes(MediaType.APPLICATION_JSON)
269 @Produces(MediaType.APPLICATION_JSON)
270 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
272 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
273 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
274 String requestId = getRequestId(requestContext);
275 HashMap<String, String> instanceIdMap = new HashMap<>();
276 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
277 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
278 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
282 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
283 @Consumes(MediaType.APPLICATION_JSON)
284 @Produces(MediaType.APPLICATION_JSON)
285 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
287 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
288 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
289 String requestId = getRequestId(requestContext);
290 HashMap<String, String> instanceIdMap = new HashMap<>();
291 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
292 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
293 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
297 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
298 @Consumes(MediaType.APPLICATION_JSON)
299 @Produces(MediaType.APPLICATION_JSON)
300 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
302 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
303 String requestId = getRequestId(requestContext);
304 HashMap<String, String> instanceIdMap = new HashMap<>();
305 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
306 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
310 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
311 @Consumes(MediaType.APPLICATION_JSON)
312 @Produces(MediaType.APPLICATION_JSON)
313 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
315 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
316 String requestId = getRequestId(requestContext);
317 HashMap<String, String> instanceIdMap = new HashMap<>();
318 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
323 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
324 @Consumes(MediaType.APPLICATION_JSON)
325 @Produces(MediaType.APPLICATION_JSON)
326 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
328 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
329 String requestId = getRequestId(requestContext);
330 HashMap<String, String> instanceIdMap = new HashMap<>();
331 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
332 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
336 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
337 @Consumes(MediaType.APPLICATION_JSON)
338 @Produces(MediaType.APPLICATION_JSON)
339 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
341 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
342 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
343 String requestId = getRequestId(requestContext);
344 HashMap<String, String> instanceIdMap = new HashMap<>();
345 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
346 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
347 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
351 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
352 @Consumes(MediaType.APPLICATION_JSON)
353 @Produces(MediaType.APPLICATION_JSON)
354 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
356 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
357 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
358 String requestId = getRequestId(requestContext);
359 HashMap<String, String> instanceIdMap = new HashMap<>();
360 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
361 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
362 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
366 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
367 @Consumes(MediaType.APPLICATION_JSON)
368 @Produces(MediaType.APPLICATION_JSON)
369 @ApiOperation(value="Apply updated configuration",response=Response.class)
370 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
371 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
372 String requestId = getRequestId(requestContext);
373 HashMap<String, String> instanceIdMap = new HashMap<>();
374 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
375 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
376 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
380 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
381 @Consumes(MediaType.APPLICATION_JSON)
382 @Produces(MediaType.APPLICATION_JSON)
383 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
384 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
385 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
386 String requestId = getRequestId(requestContext);
387 HashMap<String, String> instanceIdMap = new HashMap<>();
388 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
389 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
390 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
395 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
396 @Consumes(MediaType.APPLICATION_JSON)
397 @Produces(MediaType.APPLICATION_JSON)
398 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
400 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
401 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
402 String requestId = getRequestId(requestContext);
403 HashMap<String, String> instanceIdMap = new HashMap<>();
404 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
405 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
406 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
410 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
411 @Consumes(MediaType.APPLICATION_JSON)
412 @Produces(MediaType.APPLICATION_JSON)
413 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
415 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
416 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
417 String requestId = getRequestId(requestContext);
418 HashMap<String, String> instanceIdMap = new HashMap<>();
419 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
420 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
421 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
425 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
426 @Consumes(MediaType.APPLICATION_JSON)
427 @Produces(MediaType.APPLICATION_JSON)
428 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
430 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
431 @PathParam("vnfInstanceId") String vnfInstanceId,
432 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
433 String requestId = getRequestId(requestContext);
434 HashMap<String, String> instanceIdMap = new HashMap<>();
435 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
436 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
437 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
438 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
442 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
443 @Consumes(MediaType.APPLICATION_JSON)
444 @Produces(MediaType.APPLICATION_JSON)
445 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
447 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
448 @PathParam("vnfInstanceId") String vnfInstanceId,
449 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
450 String requestId = getRequestId(requestContext);
451 HashMap<String, String> instanceIdMap = new HashMap<>();
452 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
453 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
454 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
455 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
459 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
460 @Consumes(MediaType.APPLICATION_JSON)
461 @Produces(MediaType.APPLICATION_JSON)
462 @ApiOperation(value="Perform VNF software update",response=Response.class)
464 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
465 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
466 String requestId = getRequestId(requestContext);
467 HashMap<String, String> instanceIdMap = new HashMap<>();
468 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
469 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
470 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
474 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
475 @Consumes(MediaType.APPLICATION_JSON)
476 @Produces(MediaType.APPLICATION_JSON)
477 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
479 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
480 @PathParam("vnfInstanceId") String vnfInstanceId,
481 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
482 String requestId = getRequestId(requestContext);
483 HashMap<String, String> instanceIdMap = new HashMap<>();
484 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
485 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
486 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
487 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
491 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
492 @Consumes(MediaType.APPLICATION_JSON)
493 @Produces(MediaType.APPLICATION_JSON)
494 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
496 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
497 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
498 String requestId = getRequestId(requestContext);
499 HashMap<String, String> instanceIdMap = new HashMap<>();
500 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
501 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
502 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
503 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
508 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
509 @Consumes(MediaType.APPLICATION_JSON)
510 @Produces(MediaType.APPLICATION_JSON)
511 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
513 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
514 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
515 String requestId = getRequestId(requestContext);
516 HashMap<String, String> instanceIdMap = new HashMap<>();
517 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
518 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
519 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
524 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
525 @Consumes(MediaType.APPLICATION_JSON)
526 @Produces(MediaType.APPLICATION_JSON)
527 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
529 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
530 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
531 String requestId = getRequestId(requestContext);
532 HashMap<String, String> instanceIdMap = new HashMap<>();
533 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
534 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
535 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
539 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
540 @Consumes(MediaType.APPLICATION_JSON)
541 @Produces(MediaType.APPLICATION_JSON)
542 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
544 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
545 @PathParam("vnfInstanceId") String vnfInstanceId,
546 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
547 String requestId = getRequestId(requestContext);
548 HashMap<String, String> instanceIdMap = new HashMap<>();
549 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
550 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
551 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
552 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
556 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
557 @Consumes(MediaType.APPLICATION_JSON)
558 @Produces(MediaType.APPLICATION_JSON)
559 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
561 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
562 @PathParam("vnfInstanceId") String vnfInstanceId,
563 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
564 String requestId = getRequestId(requestContext);
565 HashMap<String, String> instanceIdMap = new HashMap<>();
566 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
567 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
568 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
569 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
573 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
574 @Consumes(MediaType.APPLICATION_JSON)
575 @Produces(MediaType.APPLICATION_JSON)
576 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
578 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
579 String requestId = getRequestId(requestContext);
580 HashMap<String, String> instanceIdMap = new HashMap<>();
581 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
582 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
586 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
587 @Consumes(MediaType.APPLICATION_JSON)
588 @Produces(MediaType.APPLICATION_JSON)
589 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
591 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
592 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
593 String requestId = getRequestId(requestContext);
594 HashMap<String, String> instanceIdMap = new HashMap<>();
595 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
596 instanceIdMap.put("networkInstanceId", networkInstanceId);
597 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
601 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
602 @Consumes(MediaType.APPLICATION_JSON)
603 @Produces(MediaType.APPLICATION_JSON)
604 @ApiOperation(value="Delete provided Network instance",response=Response.class)
606 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
607 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
608 String requestId = getRequestId(requestContext);
609 HashMap<String, String> instanceIdMap = new HashMap<>();
610 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
611 instanceIdMap.put("networkInstanceId", networkInstanceId);
612 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
615 public String getRequestUri(ContainerRequestContext context){
616 String requestUri = context.getUriInfo().getPath();
617 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
621 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
622 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
623 Boolean aLaCarte = null;
624 long startTime = System.currentTimeMillis ();
625 ServiceInstancesRequest sir = null;
626 String apiVersion = version.substring(1);
628 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
629 String requestScope = deriveRequestScope(action, sir, requestUri);
630 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
631 if(sir.getRequestDetails().getRequestParameters() != null){
632 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
634 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
635 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
637 int requestVersion = Integer.parseInt(version.substring(1));
638 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
639 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
640 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
641 String networkType = msoRequest.getNetworkType(sir,requestScope);
642 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
643 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
644 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
646 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
647 currentActiveReq.setVnfType(vnfType);
648 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
649 currentActiveReq.setNetworkType(networkType);
652 InfraActiveRequests dup = null;
655 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
658 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
660 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
662 RequestReferences referencesResponse = new RequestReferences();
664 referencesResponse.setRequestId(requestId);
666 serviceResponse.setRequestReferences(referencesResponse);
667 Boolean isBaseVfModule = false;
669 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
672 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
673 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
674 modelType = ModelType.vnf;
676 modelType =modelInfo.getModelType();
679 if (modelType.equals(ModelType.vfModule)) {
682 // Get VF Module-specific base module indicator
685 String modelVersionId = modelInfo.getModelVersionId();
687 if(modelVersionId != null) {
688 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
689 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
690 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
694 if (vfm.getIsBase()) {
695 isBaseVfModule = true;
697 } else if (action == Action.createInstance || action == Action.updateInstance) {
698 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
699 // This request cannot proceed
701 String serviceVersionText = "";
702 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
703 serviceVersionText = " with version " + sdcServiceModelVersion;
706 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
707 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
708 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
709 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
711 throw vfModuleException;
716 serviceInstanceId = "";
718 String vfModuleId = "";
719 String volumeGroupId = "";
720 String networkId = "";
721 String correlationId = "";
723 if(sir.getServiceInstanceId () != null){
724 serviceInstanceId = sir.getServiceInstanceId ();
727 if(sir.getVnfInstanceId () != null){
728 vnfId = sir.getVnfInstanceId ();
731 if(sir.getVfModuleInstanceId () != null){
732 vfModuleId = sir.getVfModuleInstanceId ();
735 if(sir.getVolumeGroupInstanceId () != null){
736 volumeGroupId = sir.getVolumeGroupInstanceId ();
739 if(sir.getNetworkInstanceId () != null){
740 networkId = sir.getNetworkInstanceId ();
743 correlationId = getCorrelationId(sir);
746 infraActiveRequestsClient.save(currentActiveReq);
748 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
749 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
750 .errorInfo(errorLoggerInfo).build();
753 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
755 }else if(aLaCarte == null){
759 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
760 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
761 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
764 private String getCorrelationId(ServiceInstancesRequest sir) {
765 return Optional.of(sir)
766 .map(ServiceInstancesRequest::getRequestDetails)
767 .map(RequestDetails::getRequestParameters)
768 .map(parameters -> parameters.getUserParamValue("pnfId"))
772 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
773 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
774 return (ModelType.vnf.name());
777 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
778 requestScope = requestScopeFromUri(requestUri);
780 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
785 private String requestScopeFromUri(String requestUri){
787 if(requestUri.contains(ModelType.network.name())){
788 requestScope = ModelType.network.name();
789 }else if(requestUri.contains(ModelType.vfModule.name())){
790 requestScope = ModelType.vfModule.name();
791 }else if(requestUri.contains(ModelType.volumeGroup.name())){
792 requestScope = ModelType.volumeGroup.name();
793 }else if(requestUri.contains(ModelType.configuration.name())){
794 requestScope = ModelType.configuration.name();
795 }else if(requestUri.contains(ModelType.vnf.name())){
796 requestScope = ModelType.vnf.name();
798 requestScope = ModelType.service.name();
802 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
803 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
804 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
805 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
806 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
807 RequestClient requestClient = null;
808 HttpResponse response = null;
810 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
811 response = requestClient.post(new RequestClientParameter.Builder()
812 .setRequestId(requestId)
813 .setBaseVfModule(isBaseVfModule)
814 .setRecipeTimeout(timeOut)
815 .setRequestAction(action.toString())
816 .setServiceInstanceId(serviceInstanceId)
817 .setCorrelationId(correlationId)
819 .setVfModuleId(vfModuleId)
820 .setVolumeGroupId(volumeGroupId)
821 .setNetworkId(networkId)
822 .setConfigurationId(configurationId)
823 .setServiceType(serviceInstanceType)
825 .setVfModuleType(vfModuleType)
826 .setNetworkType(networkType)
827 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
828 .setApiVersion(apiVersion)
829 .setALaCarte(aLaCarte)
830 .setRecipeParamXsd(paramXsd)
831 .setRequestUri(requestUri).build());
834 } catch (Exception e) {
836 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
837 String url = requestClient != null ? requestClient.getUrl() : "";
838 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
839 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
841 throw clientException;
844 if (response == null) {
846 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
847 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
849 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
851 throw clientException;
854 ResponseHandler respHandler = null;
855 int bpelStatus = 500;
857 respHandler = new ResponseHandler (response, requestClient.getType ());
858 bpelStatus = respHandler.getStatus ();
859 } catch (ApiException e) {
861 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
862 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
863 .errorInfo(errorLoggerInfo).build();
864 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
865 throw validateException;
868 // BPEL accepted the request, the request is in progress
869 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
870 ServiceInstancesResponse jsonResponse;
871 CamundaResponse camundaResp = respHandler.getResponse();
873 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
875 ObjectMapper mapper = new ObjectMapper();
876 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
877 jsonResponse.getRequestReferences().setRequestId(requestId);
878 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestId);
879 if(selfLinkUrl.isPresent()){
880 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
882 jsonResponse.getRequestReferences().setRequestSelfLink(null);
884 } catch (IOException e) {
886 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
887 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
888 .errorInfo(errorLoggerInfo).build();
889 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
890 throw validateException;
893 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
894 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
897 infraActiveRequestsClient.save(currentActiveReq);
899 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
900 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
901 .errorInfo(errorLoggerInfo).build();
903 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
907 List<String> variables = new ArrayList<>();
908 variables.add(bpelStatus + "");
909 String camundaJSONResponseBody = respHandler.getResponseBody ();
910 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
912 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
913 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
914 .errorInfo(errorLoggerInfo).build();
916 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
921 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
924 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
925 .errorInfo(errorLoggerInfo).build();
926 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
932 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
933 if(StringUtils.isNotBlank(instanceId)) {
934 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
935 currentActiveReq.setServiceInstanceId(instanceId);
936 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
937 currentActiveReq.setVnfId(instanceId);
938 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
939 currentActiveReq.setVfModuleId(instanceId);
940 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
941 currentActiveReq.setVolumeGroupId(instanceId);
942 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
943 currentActiveReq.setNetworkId(instanceId);
944 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
945 currentActiveReq.setConfigurationId(instanceId);
947 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
948 if(instanceIdMap.get("serviceInstanceId") != null){
949 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
951 if(instanceIdMap.get("vnfInstanceId") != null){
952 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
954 if(instanceIdMap.get("vfModuleInstanceId") != null){
955 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
957 if(instanceIdMap.get("volumeGroupInstanceId") != null){
958 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
960 if(instanceIdMap.get("networkInstanceId") != null){
961 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
963 if(instanceIdMap.get("configurationInstanceId") != null){
964 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
969 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
970 ObjectMapper mapper = new ObjectMapper();
971 mapper.setSerializationInclusion(Include.NON_NULL);
972 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
973 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
974 serviceInstRequest.getRequestDetails() != null &&
975 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
976 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
977 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
979 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
980 return mapper.writeValueAsString(sir);
983 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
984 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
986 // Found the duplicate record. Return the appropriate error.
987 String instance = null;
988 if(instanceName != null){
989 instance = instanceName;
991 instance = instanceIdMap.get(requestScope + "InstanceId");
993 //List<String> variables = new ArrayList<String>();
994 //variables.add(dup.getRequestStatus());
995 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
998 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
999 .errorInfo(errorLoggerInfo).build();
1001 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1006 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1007 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1008 InfraActiveRequests dup = null;
1010 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1011 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1013 } catch (Exception e) {
1014 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1015 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1016 .errorInfo(errorLoggerInfo).build();
1017 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1018 throw requestDbFailureException;
1023 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1024 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1026 ObjectMapper mapper = new ObjectMapper();
1027 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1029 } catch (IOException e) {
1031 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1033 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1034 .errorInfo(errorLoggerInfo).build();
1035 String requestScope = requestScopeFromUri(requestUri);
1037 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1039 throw validateException;
1043 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1044 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1045 int reqVersion = Integer.parseInt(version.substring(1));
1047 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1048 } catch (Exception e) {
1049 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1050 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1051 .errorInfo(errorLoggerInfo).build();
1053 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1055 throw validateException;
1059 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1060 InfraActiveRequests currentActiveReq) throws ApiException {
1061 RecipeLookupResult recipeLookupResult = null;
1062 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1063 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1064 // Query MSO Catalog DB
1066 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1067 recipeLookupResult = getDefaultVnfUri(sir, action);
1068 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1070 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1071 } catch (IOException e) {
1072 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1075 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1076 .errorInfo(errorLoggerInfo).build();
1078 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1080 throw validateException;
1082 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1083 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1085 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1086 } catch (ValidationException e) {
1087 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1090 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1091 .errorInfo(errorLoggerInfo).build();
1093 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1095 throw validateException;
1097 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1099 recipeLookupResult = getNetworkUri( sir, action);
1100 } catch (ValidationException e) {
1102 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1105 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1106 .errorInfo(errorLoggerInfo).build();
1107 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1109 throw validateException;
1113 if (recipeLookupResult == null) {
1114 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1117 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1118 .errorInfo(errorLoggerInfo).build();
1120 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1121 throw recipeNotFoundExceptionException;
1123 return recipeLookupResult;
1126 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1128 // Construct the default service name
1129 // TODO need to make this a configurable property
1130 String defaultServiceModelName = getDefaultModel(servInstReq);
1131 RequestDetails requestDetails = servInstReq.getRequestDetails();
1132 ModelInfo modelInfo = requestDetails.getModelInfo();
1133 org.onap.so.db.catalog.beans.Service serviceRecord;
1134 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1135 ServiceRecipe recipe = null;
1138 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1139 if(serviceRecord !=null){
1140 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1143 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1144 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1145 if (recipe == null){
1146 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1147 if(!serviceRecordList.isEmpty()){
1148 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1149 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1158 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1159 RequestParameters reqParam = requestDetails.getRequestParameters();
1160 if(reqParam!=null && alaCarteFlag && recipe==null){
1162 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1163 mapToLegacyRequest(requestDetails);
1164 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1165 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1166 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1168 if(modelInfo.getModelVersionId() == null) {
1169 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1174 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1177 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1178 RequestParameters reqParam;
1179 if (requestDetails.getRequestParameters() == null) {
1180 reqParam = new RequestParameters();
1182 reqParam = requestDetails.getRequestParameters();
1184 if(requestDetails.getCloudConfiguration() == null) {
1185 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1186 if(cloudConfig != null) {
1187 requestDetails.setCloudConfiguration(cloudConfig);
1191 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1192 if(!userParams.isEmpty()) {
1193 if (reqParam == null) {
1194 requestDetails.setRequestParameters(new RequestParameters());
1196 requestDetails.getRequestParameters().setUserParams(userParams);
1200 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1202 for(Map<String, Object> params : reqParams.getUserParams()){
1203 if(params.containsKey("service")){
1204 Service service = serviceMapper(params);
1206 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1208 if (targetConfiguration.isPresent()) {
1209 return targetConfiguration.get();
1211 for(Networks network : service.getResources().getNetworks()) {
1212 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1213 if(targetConfiguration.isPresent()) {
1214 return targetConfiguration.get();
1218 for(Vnfs vnf : service.getResources().getVnfs()) {
1219 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1221 if(targetConfiguration.isPresent()) {
1222 return targetConfiguration.get();
1225 for(VfModules vfModule : vnf.getVfModules()) {
1226 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1228 if(targetConfiguration.isPresent()) {
1229 return targetConfiguration.get();
1240 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1241 CloudConfiguration targetConfiguration = new CloudConfiguration();
1242 if(sourceCloudConfiguration != null) {
1243 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1244 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1245 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1246 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1247 return Optional.of(targetConfiguration);
1249 return Optional.empty();
1252 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1253 msoLogger.debug("Configuring UserParams for Macro Request");
1254 Map<String, Object> userParams = new HashMap<>();
1256 for(Map<String, Object> params : reqParams.getUserParams()){
1257 if(params.containsKey("service")){
1258 Service service = serviceMapper(params);
1260 addUserParams(userParams, service.getInstanceParams());
1262 for(Networks network : service.getResources().getNetworks()) {
1263 addUserParams(userParams, network.getInstanceParams());
1266 for(Vnfs vnf: service.getResources().getVnfs()) {
1267 addUserParams(userParams, vnf.getInstanceParams());
1269 for(VfModules vfModule: vnf.getVfModules()) {
1270 addUserParams(userParams, vfModule.getInstanceParams());
1276 return mapFlatMapToNameValue(userParams);
1279 private Service serviceMapper(Map<String, Object> params)
1280 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1281 ObjectMapper obj = new ObjectMapper();
1282 String input = obj.writeValueAsString(params.get("service"));
1283 return obj.readValue(input, Service.class);
1286 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1287 for(Map<String, String> map : sourceUserParams) {
1288 for (Map.Entry<String, String> entry : map.entrySet()) {
1289 targetUserParams.put(entry.getKey(), entry.getValue());
1294 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1295 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1297 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1298 Map<String, Object> targetMap = new HashMap<>();
1299 targetMap.put(NAME, map.getKey());
1300 targetMap.put(VALUE, map.getValue());
1301 targetUserParams.add(targetMap);
1303 return targetUserParams;
1306 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) 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 = 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 vnf_resource_customization.model_customization_uuid.
1347 // 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
1348 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1349 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1350 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1351 // (MODEL_UUID) in SERVICE table.
1352 // 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
1353 // during 1707 data migration if VID did not provide it originally on request.
1354 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1355 // 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.
1357 VnfResource vnfResource = null;
1358 VnfResourceCustomization vrc=null;
1359 // Validation for vnfResource
1361 if(modelCustomizationId!=null) {
1362 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1364 vnfResource = vrc.getVnfResources();
1367 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1368 if(service == null) {
1369 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1372 if(service == null) {
1373 throw new ValidationException("service in relatedInstance");
1375 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1376 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1377 vrc=vnfResourceCustom;
1382 vnfResource = vrc.getVnfResources();
1383 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1384 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1388 if(vnfResource==null){
1389 throw new ValidationException("vnfResource");
1391 if(modelInfo.getModelVersionId() == null) {
1392 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1396 VnfRecipe vnfRecipe = null;
1399 String nfRole = vrc.getNfRole();
1400 if(nfRole != null) {
1401 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1405 if(vnfRecipe == null) {
1406 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1409 if (vnfRecipe == null) {
1413 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1415 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1416 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1417 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1418 // 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.
1419 // 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
1420 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1421 // 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)
1422 // and MODEL_VERSION (modelVersion).
1424 VfModuleCustomization vfmc = null;
1426 VnfResourceCustomization vnfrc;
1427 VfModule vfModule = null;
1429 if(modelInfo.getModelCustomizationId() != null) {
1430 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1432 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1434 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1436 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1438 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1440 String vfModuleModelUUID = modelInfo.getModelVersionId();
1441 for(VfModuleCustomization vf : list) {
1442 VfModuleCustomization vfmCustom;
1443 if(vfModuleModelUUID != null){
1444 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1445 if(vfmCustom != null){
1446 vfModule = vfmCustom.getVfModule();
1449 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1450 if(vfmCustom != null){
1451 vfModule = vfmCustom.getVfModule();
1453 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1457 if(vfModule != null) {
1458 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1459 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1465 if(vfmc == null && vfModule == null) {
1466 throw new ValidationException("vfModuleCustomization");
1467 } else if (vfModule == null && vfmc != null) {
1468 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1471 if(modelInfo.getModelVersionId() == null) {
1472 modelInfo.setModelVersionId(vfModule.getModelUUID());
1476 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1478 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1479 if(!vfModuleRecords.isEmpty()){
1480 for(VfModule record : vfModuleRecords){
1481 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1488 if(recipe == null) {
1489 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1490 if (recipe == null) {
1491 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1494 if(recipe == null) {
1501 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1502 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1503 if (recipe == null) {
1507 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1509 if (recipe == null) {
1515 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1518 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1520 String defaultSource = getDefaultModel(sir);
1522 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1524 if (vnfRecipe == null) {
1528 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1532 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1534 String defaultNetworkType = getDefaultModel(sir);
1536 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1537 String modelName = modelInfo.getModelName();
1538 Recipe recipe = null;
1540 if(modelInfo.getModelCustomizationId()!=null){
1541 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1542 if(networkResource!=null){
1543 if(modelInfo.getModelVersionId() == null) {
1544 modelInfo.setModelVersionId(networkResource.getModelUUID());
1546 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1548 throw new ValidationException("no catalog entry found");
1551 //ok for version < 3 and action delete
1552 if(modelName != null){
1553 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1558 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1561 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1564 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1565 String requestTestApi = null;
1566 TestApi testApi = null;
1568 if (requestParams != null) {
1569 requestTestApi = requestParams.getTestApi();
1572 if (requestTestApi == null) {
1573 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1574 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1576 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1581 testApi = TestApi.valueOf(requestTestApi);
1582 return Optional.of(testApi.getModelName());
1583 } catch (Exception e) {
1584 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1585 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1589 private String getDefaultModel(ServiceInstancesRequest sir) {
1590 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1591 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1592 if (oModelName.isPresent()) {
1593 defaultModel = oModelName.get();
1595 return defaultModel;
1598 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1599 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1600 Boolean aLaCarte = null;
1601 String apiVersion = version.substring(1);
1603 long startTime = System.currentTimeMillis ();
1604 ServiceInstancesRequest sir = null;
1606 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1607 String requestScope = deriveRequestScope(action,sir, requestUri);
1608 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1609 if(sir.getRequestDetails().getRequestParameters() != null){
1610 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1612 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1613 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1614 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1616 InfraActiveRequests dup = null;
1618 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1620 if (instanceIdMap != null && dup != null) {
1621 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1624 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1625 RequestReferences referencesResponse = new RequestReferences();
1626 referencesResponse.setRequestId(requestId);
1627 serviceResponse.setRequestReferences(referencesResponse);
1630 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1631 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1633 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1634 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1636 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1639 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1640 .errorInfo(errorLoggerInfo).build();
1642 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1644 throw validateException;
1648 serviceInstanceId = "";
1649 String configurationId = "";
1650 String correlationId = "";
1652 if(sir.getServiceInstanceId () != null){
1653 serviceInstanceId = sir.getServiceInstanceId ();
1656 if(sir.getConfigurationId() != null){
1657 configurationId = sir.getConfigurationId();
1660 correlationId = getCorrelationId(sir);
1663 infraActiveRequestsClient.save(currentActiveReq);
1664 }catch(Exception e){
1665 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1666 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1667 .errorInfo(errorLoggerInfo).build();
1670 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1672 }else if(aLaCarte == null){
1676 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1677 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1680 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1681 String requestId = null;
1682 if (requestContext.getProperty("requestId") != null) {
1683 requestId = requestContext.getProperty("requestId").toString();
1685 if (UUIDChecker.isValidUUID(requestId)) {
1688 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1689 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1690 .errorInfo(errorLoggerInfo).build();
1692 throw validateException;
1695 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1696 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1697 aq.setStatusMessage (errorMessage);
1698 aq.setProgress(new Long(100));
1699 aq.setRequestStatus(status.toString());
1700 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1701 aq.setEndTime (endTimeStamp);
1703 infraActiveRequestsClient.save(aq);
1704 }catch(Exception e){
1705 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1706 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1707 .errorInfo(errorLoggerInfo).build();