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;
98 import java.sql.Timestamp;
99 import java.util.ArrayList;
100 import java.util.HashMap;
101 import java.util.List;
102 import java.util.Map;
103 import java.util.Optional;
106 @Path("/onap/so/infra/serviceInstantiation")
107 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
108 public class ServiceInstances {
110 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
111 private static String NAME = "name";
112 private static String VALUE = "value";
113 private static final String SAVE_TO_DB = "save instance to db";
116 private Environment env;
119 private RequestClientFactory reqClientFactory;
122 private CatalogDbClient catalogDbClient;
125 private RequestsDbClient infraActiveRequestsClient;
128 private ResponseBuilder builder;
131 private MsoRequest msoRequest;
134 @Path("/{version:[vV][5-7]}/serviceInstances")
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
139 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
140 String requestId = getRequestId(requestContext);
141 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
145 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
146 @Consumes(MediaType.APPLICATION_JSON)
147 @Produces(MediaType.APPLICATION_JSON)
148 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
150 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
151 String requestId = getRequestId(requestContext);
152 HashMap<String, String> instanceIdMap = new HashMap<>();
153 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
154 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
158 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
159 @Consumes(MediaType.APPLICATION_JSON)
160 @Produces(MediaType.APPLICATION_JSON)
161 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
163 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
164 String requestId = getRequestId(requestContext);
165 HashMap<String, String> instanceIdMap = new HashMap<>();
166 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
167 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
171 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
172 @Consumes(MediaType.APPLICATION_JSON)
173 @Produces(MediaType.APPLICATION_JSON)
174 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
176 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
177 String requestId = getRequestId(requestContext);
178 HashMap<String, String> instanceIdMap = new HashMap<>();
179 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
180 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
184 @Path("/{version:[vV][7]}/serviceInstances/assign")
185 @Consumes(MediaType.APPLICATION_JSON)
186 @Produces(MediaType.APPLICATION_JSON)
187 @ApiOperation(value="Assign Service Instance", response=Response.class)
189 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
190 String requestId = getRequestId(requestContext);
191 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
195 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
196 @Consumes(MediaType.APPLICATION_JSON)
197 @Produces(MediaType.APPLICATION_JSON)
198 @ApiOperation(value="Unassign Service Instance", response=Response.class)
200 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
201 String requestId = getRequestId(requestContext);
202 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
203 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
204 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
208 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
209 @Consumes(MediaType.APPLICATION_JSON)
210 @Produces(MediaType.APPLICATION_JSON)
211 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
213 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
214 String requestId = getRequestId(requestContext);
215 HashMap<String, String> instanceIdMap = new HashMap<>();
216 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
217 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
221 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Delete provided Port",response=Response.class)
226 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
227 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
228 String requestId = getRequestId(requestContext);
229 HashMap<String, String> instanceIdMap = new HashMap<>();
230 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
231 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
232 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
236 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
237 @Consumes(MediaType.APPLICATION_JSON)
238 @Produces(MediaType.APPLICATION_JSON)
239 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
241 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
242 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
243 String requestId = getRequestId(requestContext);
244 HashMap<String, String> instanceIdMap = new HashMap<>();
245 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
246 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
247 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
251 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
252 @Consumes(MediaType.APPLICATION_JSON)
253 @Produces(MediaType.APPLICATION_JSON)
254 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
256 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
257 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
258 String requestId = getRequestId(requestContext);
259 HashMap<String, String> instanceIdMap = new HashMap<>();
260 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
261 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
262 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
266 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
267 @Consumes(MediaType.APPLICATION_JSON)
268 @Produces(MediaType.APPLICATION_JSON)
269 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
271 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
272 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
273 String requestId = getRequestId(requestContext);
274 HashMap<String, String> instanceIdMap = new HashMap<>();
275 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
276 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
277 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
281 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
282 @Consumes(MediaType.APPLICATION_JSON)
283 @Produces(MediaType.APPLICATION_JSON)
284 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
286 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
287 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
288 String requestId = getRequestId(requestContext);
289 HashMap<String, String> instanceIdMap = new HashMap<>();
290 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
291 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
292 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
296 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
297 @Consumes(MediaType.APPLICATION_JSON)
298 @Produces(MediaType.APPLICATION_JSON)
299 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
301 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
302 String requestId = getRequestId(requestContext);
303 HashMap<String, String> instanceIdMap = new HashMap<>();
304 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
305 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
309 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
310 @Consumes(MediaType.APPLICATION_JSON)
311 @Produces(MediaType.APPLICATION_JSON)
312 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
314 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
315 String requestId = getRequestId(requestContext);
316 HashMap<String, String> instanceIdMap = new HashMap<>();
317 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
318 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
322 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
323 @Consumes(MediaType.APPLICATION_JSON)
324 @Produces(MediaType.APPLICATION_JSON)
325 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
327 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
328 String requestId = getRequestId(requestContext);
329 HashMap<String, String> instanceIdMap = new HashMap<>();
330 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
331 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
335 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
336 @Consumes(MediaType.APPLICATION_JSON)
337 @Produces(MediaType.APPLICATION_JSON)
338 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
340 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
341 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
342 String requestId = getRequestId(requestContext);
343 HashMap<String, String> instanceIdMap = new HashMap<>();
344 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
345 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
346 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
350 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
351 @Consumes(MediaType.APPLICATION_JSON)
352 @Produces(MediaType.APPLICATION_JSON)
353 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
355 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
356 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
357 String requestId = getRequestId(requestContext);
358 HashMap<String, String> instanceIdMap = new HashMap<>();
359 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
360 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
361 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
365 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
366 @Consumes(MediaType.APPLICATION_JSON)
367 @Produces(MediaType.APPLICATION_JSON)
368 @ApiOperation(value="Apply updated configuration",response=Response.class)
369 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
370 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
371 String requestId = getRequestId(requestContext);
372 HashMap<String, String> instanceIdMap = new HashMap<>();
373 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
374 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
375 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
379 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
380 @Consumes(MediaType.APPLICATION_JSON)
381 @Produces(MediaType.APPLICATION_JSON)
382 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
383 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
384 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
385 String requestId = getRequestId(requestContext);
386 HashMap<String, String> instanceIdMap = new HashMap<>();
387 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
388 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
389 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
394 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
395 @Consumes(MediaType.APPLICATION_JSON)
396 @Produces(MediaType.APPLICATION_JSON)
397 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
399 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
400 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
401 String requestId = getRequestId(requestContext);
402 HashMap<String, String> instanceIdMap = new HashMap<>();
403 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
404 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
405 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
409 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
410 @Consumes(MediaType.APPLICATION_JSON)
411 @Produces(MediaType.APPLICATION_JSON)
412 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
414 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
415 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
416 String requestId = getRequestId(requestContext);
417 HashMap<String, String> instanceIdMap = new HashMap<>();
418 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
419 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
420 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
424 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
425 @Consumes(MediaType.APPLICATION_JSON)
426 @Produces(MediaType.APPLICATION_JSON)
427 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
429 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
430 @PathParam("vnfInstanceId") String vnfInstanceId,
431 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
432 String requestId = getRequestId(requestContext);
433 HashMap<String, String> instanceIdMap = new HashMap<>();
434 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
435 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
436 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
437 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
441 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
442 @Consumes(MediaType.APPLICATION_JSON)
443 @Produces(MediaType.APPLICATION_JSON)
444 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
446 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
447 @PathParam("vnfInstanceId") String vnfInstanceId,
448 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
449 String requestId = getRequestId(requestContext);
450 HashMap<String, String> instanceIdMap = new HashMap<>();
451 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
452 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
453 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
454 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
458 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
459 @Consumes(MediaType.APPLICATION_JSON)
460 @Produces(MediaType.APPLICATION_JSON)
461 @ApiOperation(value="Perform VNF software update",response=Response.class)
463 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
464 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
465 String requestId = getRequestId(requestContext);
466 HashMap<String, String> instanceIdMap = new HashMap<>();
467 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
468 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
469 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
473 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
474 @Consumes(MediaType.APPLICATION_JSON)
475 @Produces(MediaType.APPLICATION_JSON)
476 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
478 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
479 @PathParam("vnfInstanceId") String vnfInstanceId,
480 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
481 String requestId = getRequestId(requestContext);
482 HashMap<String, String> instanceIdMap = new HashMap<>();
483 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
484 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
485 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
486 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
490 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
491 @Consumes(MediaType.APPLICATION_JSON)
492 @Produces(MediaType.APPLICATION_JSON)
493 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
495 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
496 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
497 String requestId = getRequestId(requestContext);
498 HashMap<String, String> instanceIdMap = new HashMap<>();
499 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
500 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
501 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
502 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
507 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
508 @Consumes(MediaType.APPLICATION_JSON)
509 @Produces(MediaType.APPLICATION_JSON)
510 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
512 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
513 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
514 String requestId = getRequestId(requestContext);
515 HashMap<String, String> instanceIdMap = new HashMap<>();
516 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
517 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
518 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
523 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
524 @Consumes(MediaType.APPLICATION_JSON)
525 @Produces(MediaType.APPLICATION_JSON)
526 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
528 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
529 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
530 String requestId = getRequestId(requestContext);
531 HashMap<String, String> instanceIdMap = new HashMap<>();
532 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
533 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
534 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
538 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
539 @Consumes(MediaType.APPLICATION_JSON)
540 @Produces(MediaType.APPLICATION_JSON)
541 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
543 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
544 @PathParam("vnfInstanceId") String vnfInstanceId,
545 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
546 String requestId = getRequestId(requestContext);
547 HashMap<String, String> instanceIdMap = new HashMap<>();
548 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
549 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
550 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
551 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
555 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
556 @Consumes(MediaType.APPLICATION_JSON)
557 @Produces(MediaType.APPLICATION_JSON)
558 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
560 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
561 @PathParam("vnfInstanceId") String vnfInstanceId,
562 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
563 String requestId = getRequestId(requestContext);
564 HashMap<String, String> instanceIdMap = new HashMap<>();
565 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
566 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
567 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
568 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
572 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
573 @Consumes(MediaType.APPLICATION_JSON)
574 @Produces(MediaType.APPLICATION_JSON)
575 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
577 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
578 String requestId = getRequestId(requestContext);
579 HashMap<String, String> instanceIdMap = new HashMap<>();
580 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
581 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
585 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
586 @Consumes(MediaType.APPLICATION_JSON)
587 @Produces(MediaType.APPLICATION_JSON)
588 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
590 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
591 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
592 String requestId = getRequestId(requestContext);
593 HashMap<String, String> instanceIdMap = new HashMap<>();
594 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
595 instanceIdMap.put("networkInstanceId", networkInstanceId);
596 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
600 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
601 @Consumes(MediaType.APPLICATION_JSON)
602 @Produces(MediaType.APPLICATION_JSON)
603 @ApiOperation(value="Delete provided Network instance",response=Response.class)
605 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
606 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
607 String requestId = getRequestId(requestContext);
608 HashMap<String, String> instanceIdMap = new HashMap<>();
609 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
610 instanceIdMap.put("networkInstanceId", networkInstanceId);
611 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
614 public String getRequestUri(ContainerRequestContext context){
615 String requestUri = context.getUriInfo().getPath();
616 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
620 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
621 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
622 Boolean aLaCarte = null;
623 long startTime = System.currentTimeMillis ();
624 ServiceInstancesRequest sir = null;
625 String apiVersion = version.substring(1);
627 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
628 String requestScope = deriveRequestScope(action, sir, requestUri);
629 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
630 if(sir.getRequestDetails().getRequestParameters() != null){
631 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
633 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
634 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
636 int requestVersion = Integer.parseInt(version.substring(1));
637 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
638 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
639 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
640 String networkType = msoRequest.getNetworkType(sir,requestScope);
641 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
642 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
643 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
645 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
646 currentActiveReq.setVnfType(vnfType);
647 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
648 currentActiveReq.setNetworkType(networkType);
651 InfraActiveRequests dup = null;
654 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
657 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
659 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
661 RequestReferences referencesResponse = new RequestReferences();
663 referencesResponse.setRequestId(requestId);
665 serviceResponse.setRequestReferences(referencesResponse);
666 Boolean isBaseVfModule = false;
668 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
671 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
672 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
673 modelType = ModelType.vnf;
675 modelType =modelInfo.getModelType();
678 if (modelType.equals(ModelType.vfModule)) {
681 // Get VF Module-specific base module indicator
684 String modelVersionId = modelInfo.getModelVersionId();
686 if(modelVersionId != null) {
687 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
688 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
689 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
693 if (vfm.getIsBase()) {
694 isBaseVfModule = true;
696 } else if (action == Action.createInstance || action == Action.updateInstance) {
697 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
698 // This request cannot proceed
700 String serviceVersionText = "";
701 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
702 serviceVersionText = " with version " + sdcServiceModelVersion;
705 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
706 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
707 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
708 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
710 throw vfModuleException;
715 serviceInstanceId = "";
717 String vfModuleId = "";
718 String volumeGroupId = "";
719 String networkId = "";
720 String correlationId = "";
722 if(sir.getServiceInstanceId () != null){
723 serviceInstanceId = sir.getServiceInstanceId ();
726 if(sir.getVnfInstanceId () != null){
727 vnfId = sir.getVnfInstanceId ();
730 if(sir.getVfModuleInstanceId () != null){
731 vfModuleId = sir.getVfModuleInstanceId ();
734 if(sir.getVolumeGroupInstanceId () != null){
735 volumeGroupId = sir.getVolumeGroupInstanceId ();
738 if(sir.getNetworkInstanceId () != null){
739 networkId = sir.getNetworkInstanceId ();
742 correlationId = getCorrelationId(sir);
745 infraActiveRequestsClient.save(currentActiveReq);
747 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
748 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
749 .errorInfo(errorLoggerInfo).build();
752 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
754 }else if(aLaCarte == null){
758 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
759 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
760 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
763 private String getCorrelationId(ServiceInstancesRequest sir) {
764 return Optional.of(sir)
765 .map(ServiceInstancesRequest::getRequestDetails)
766 .map(RequestDetails::getRequestParameters)
767 .map(parameters -> parameters.getUserParamValue("pnfId"))
771 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
772 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
773 return (ModelType.vnf.name());
776 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
777 requestScope = requestScopeFromUri(requestUri);
779 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
784 private String requestScopeFromUri(String requestUri){
786 if(requestUri.contains(ModelType.network.name())){
787 requestScope = ModelType.network.name();
788 }else if(requestUri.contains(ModelType.vfModule.name())){
789 requestScope = ModelType.vfModule.name();
790 }else if(requestUri.contains(ModelType.volumeGroup.name())){
791 requestScope = ModelType.volumeGroup.name();
792 }else if(requestUri.contains(ModelType.configuration.name())){
793 requestScope = ModelType.configuration.name();
794 }else if(requestUri.contains(ModelType.vnf.name())){
795 requestScope = ModelType.vnf.name();
797 requestScope = ModelType.service.name();
801 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
802 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
803 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
804 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
805 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
806 RequestClient requestClient = null;
807 HttpResponse response = null;
809 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
810 response = requestClient.post(new RequestClientParameter.Builder()
811 .setRequestId(requestId)
812 .setBaseVfModule(isBaseVfModule)
813 .setRecipeTimeout(timeOut)
814 .setRequestAction(action.toString())
815 .setServiceInstanceId(serviceInstanceId)
816 .setCorrelationId(correlationId)
818 .setVfModuleId(vfModuleId)
819 .setVolumeGroupId(volumeGroupId)
820 .setNetworkId(networkId)
821 .setConfigurationId(configurationId)
822 .setServiceType(serviceInstanceType)
824 .setVfModuleType(vfModuleType)
825 .setNetworkType(networkType)
826 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
827 .setApiVersion(apiVersion)
828 .setALaCarte(aLaCarte)
829 .setRecipeParamXsd(paramXsd)
830 .setRequestUri(requestUri).build());
833 } catch (Exception e) {
835 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
836 String url = requestClient != null ? requestClient.getUrl() : "";
837 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
838 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
840 throw clientException;
843 if (response == null) {
845 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
848 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
850 throw clientException;
853 ResponseHandler respHandler = null;
854 int bpelStatus = 500;
856 respHandler = new ResponseHandler (response, requestClient.getType ());
857 bpelStatus = respHandler.getStatus ();
858 } catch (ApiException e) {
860 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
861 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
862 .errorInfo(errorLoggerInfo).build();
863 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
864 throw validateException;
867 // BPEL accepted the request, the request is in progress
868 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
869 ServiceInstancesResponse jsonResponse;
870 CamundaResponse camundaResp = respHandler.getResponse();
872 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
874 ObjectMapper mapper = new ObjectMapper();
875 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
876 } catch (IOException e) {
878 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
879 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
880 .errorInfo(errorLoggerInfo).build();
881 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
882 throw validateException;
885 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
886 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
889 infraActiveRequestsClient.save(currentActiveReq);
891 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
892 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
893 .errorInfo(errorLoggerInfo).build();
895 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
899 List<String> variables = new ArrayList<>();
900 variables.add(bpelStatus + "");
901 String camundaJSONResponseBody = respHandler.getResponseBody ();
902 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
904 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
905 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
906 .errorInfo(errorLoggerInfo).build();
908 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
913 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
916 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
917 .errorInfo(errorLoggerInfo).build();
918 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
924 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
925 if(StringUtils.isNotBlank(instanceId)) {
926 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
927 currentActiveReq.setServiceInstanceId(instanceId);
928 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
929 currentActiveReq.setVnfId(instanceId);
930 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
931 currentActiveReq.setVfModuleId(instanceId);
932 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
933 currentActiveReq.setVolumeGroupId(instanceId);
934 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
935 currentActiveReq.setNetworkId(instanceId);
936 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
937 currentActiveReq.setConfigurationId(instanceId);
939 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
940 if(instanceIdMap.get("serviceInstanceId") != null){
941 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
943 if(instanceIdMap.get("vnfInstanceId") != null){
944 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
946 if(instanceIdMap.get("vfModuleInstanceId") != null){
947 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
949 if(instanceIdMap.get("volumeGroupInstanceId") != null){
950 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
952 if(instanceIdMap.get("networkInstanceId") != null){
953 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
955 if(instanceIdMap.get("configurationInstanceId") != null){
956 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
961 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
962 ObjectMapper mapper = new ObjectMapper();
963 mapper.setSerializationInclusion(Include.NON_NULL);
964 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
965 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
966 serviceInstRequest.getRequestDetails() != null &&
967 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
968 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
969 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
971 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
972 return mapper.writeValueAsString(sir);
975 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
976 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
978 // Found the duplicate record. Return the appropriate error.
979 String instance = null;
980 if(instanceName != null){
981 instance = instanceName;
983 instance = instanceIdMap.get(requestScope + "InstanceId");
985 //List<String> variables = new ArrayList<String>();
986 //variables.add(dup.getRequestStatus());
987 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
990 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
991 .errorInfo(errorLoggerInfo).build();
993 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
998 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
999 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1000 InfraActiveRequests dup = null;
1002 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1003 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1005 } catch (Exception e) {
1006 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1007 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1008 .errorInfo(errorLoggerInfo).build();
1009 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1010 throw requestDbFailureException;
1015 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1016 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1018 ObjectMapper mapper = new ObjectMapper();
1019 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1021 } catch (IOException e) {
1023 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1025 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1026 .errorInfo(errorLoggerInfo).build();
1027 String requestScope = requestScopeFromUri(requestUri);
1029 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1031 throw validateException;
1035 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1036 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1037 int reqVersion = Integer.parseInt(version.substring(1));
1039 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1040 } catch (Exception e) {
1041 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1042 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1043 .errorInfo(errorLoggerInfo).build();
1045 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1047 throw validateException;
1051 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1052 InfraActiveRequests currentActiveReq) throws ApiException {
1053 RecipeLookupResult recipeLookupResult = null;
1054 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1055 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1056 // Query MSO Catalog DB
1058 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1059 recipeLookupResult = getDefaultVnfUri(sir, action);
1060 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1062 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1063 } catch (IOException e) {
1064 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1067 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1068 .errorInfo(errorLoggerInfo).build();
1070 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1072 throw validateException;
1074 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1075 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1077 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1078 } catch (ValidationException e) {
1079 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1082 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1083 .errorInfo(errorLoggerInfo).build();
1085 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1087 throw validateException;
1089 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1091 recipeLookupResult = getNetworkUri( sir, action);
1092 } catch (ValidationException e) {
1094 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1097 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1098 .errorInfo(errorLoggerInfo).build();
1099 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1101 throw validateException;
1105 if (recipeLookupResult == null) {
1106 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1109 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1110 .errorInfo(errorLoggerInfo).build();
1112 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1113 throw recipeNotFoundExceptionException;
1115 return recipeLookupResult;
1118 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1120 // Construct the default service name
1121 // TODO need to make this a configurable property
1122 String defaultServiceModelName = getDefaultModel(servInstReq);
1123 RequestDetails requestDetails = servInstReq.getRequestDetails();
1124 ModelInfo modelInfo = requestDetails.getModelInfo();
1125 org.onap.so.db.catalog.beans.Service serviceRecord;
1126 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1127 ServiceRecipe recipe = null;
1130 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1131 if(serviceRecord !=null){
1132 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1135 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1136 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1137 if (recipe == null){
1138 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1139 if(!serviceRecordList.isEmpty()){
1140 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1141 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1150 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1151 RequestParameters reqParam = requestDetails.getRequestParameters();
1152 if(reqParam!=null && alaCarteFlag && recipe==null){
1154 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1155 mapToLegacyRequest(requestDetails);
1156 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1157 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1158 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1160 if(modelInfo.getModelVersionId() == null) {
1161 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1166 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1169 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1170 RequestParameters reqParam;
1171 if (requestDetails.getRequestParameters() == null) {
1172 reqParam = new RequestParameters();
1174 reqParam = requestDetails.getRequestParameters();
1176 if(requestDetails.getCloudConfiguration() == null) {
1177 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1178 if(cloudConfig != null) {
1179 requestDetails.setCloudConfiguration(cloudConfig);
1183 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1184 if(!userParams.isEmpty()) {
1185 if (reqParam == null) {
1186 requestDetails.setRequestParameters(new RequestParameters());
1188 requestDetails.getRequestParameters().setUserParams(userParams);
1192 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1194 for(Map<String, Object> params : reqParams.getUserParams()){
1195 if(params.containsKey("service")){
1196 Service service = serviceMapper(params);
1198 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1200 if (targetConfiguration.isPresent()) {
1201 return targetConfiguration.get();
1203 for(Networks network : service.getResources().getNetworks()) {
1204 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1205 if(targetConfiguration.isPresent()) {
1206 return targetConfiguration.get();
1210 for(Vnfs vnf : service.getResources().getVnfs()) {
1211 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1213 if(targetConfiguration.isPresent()) {
1214 return targetConfiguration.get();
1217 for(VfModules vfModule : vnf.getVfModules()) {
1218 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1220 if(targetConfiguration.isPresent()) {
1221 return targetConfiguration.get();
1232 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1233 CloudConfiguration targetConfiguration = new CloudConfiguration();
1234 if(sourceCloudConfiguration != null) {
1235 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1236 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1237 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1238 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1239 return Optional.of(targetConfiguration);
1241 return Optional.empty();
1244 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1245 msoLogger.debug("Configuring UserParams for Macro Request");
1246 Map<String, Object> userParams = new HashMap<>();
1248 for(Map<String, Object> params : reqParams.getUserParams()){
1249 if(params.containsKey("service")){
1250 Service service = serviceMapper(params);
1252 addUserParams(userParams, service.getInstanceParams());
1254 for(Networks network : service.getResources().getNetworks()) {
1255 addUserParams(userParams, network.getInstanceParams());
1258 for(Vnfs vnf: service.getResources().getVnfs()) {
1259 addUserParams(userParams, vnf.getInstanceParams());
1261 for(VfModules vfModule: vnf.getVfModules()) {
1262 addUserParams(userParams, vfModule.getInstanceParams());
1268 return mapFlatMapToNameValue(userParams);
1271 private Service serviceMapper(Map<String, Object> params)
1272 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1273 ObjectMapper obj = new ObjectMapper();
1274 String input = obj.writeValueAsString(params.get("service"));
1275 return obj.readValue(input, Service.class);
1278 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1279 for(Map<String, String> map : sourceUserParams) {
1280 for (Map.Entry<String, String> entry : map.entrySet()) {
1281 targetUserParams.put(entry.getKey(), entry.getValue());
1286 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1287 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1289 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1290 Map<String, Object> targetMap = new HashMap<>();
1291 targetMap.put(NAME, map.getKey());
1292 targetMap.put(VALUE, map.getValue());
1293 targetUserParams.add(targetMap);
1295 return targetUserParams;
1298 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1300 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1301 String vnfComponentType = modelInfo.getModelType().name();
1303 RelatedInstanceList[] instanceList = null;
1304 if (servInstReq.getRequestDetails() != null) {
1305 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1308 Recipe recipe = null;
1309 String defaultSource = getDefaultModel(servInstReq);
1310 String modelCustomizationId = modelInfo.getModelCustomizationId();
1311 String modelCustomizationName = modelInfo.getModelCustomizationName();
1312 String relatedInstanceModelVersionId = null;
1313 String relatedInstanceModelInvariantId = null;
1314 String relatedInstanceVersion = null;
1315 String relatedInstanceModelCustomizationName = null;
1317 if (instanceList != null) {
1319 for(RelatedInstanceList relatedInstanceList : instanceList){
1321 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1322 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1323 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1324 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1325 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1328 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1329 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1330 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1331 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1332 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1336 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1337 // a. For a vnf request (only create, no update currently):
1338 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1339 // 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
1340 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1341 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1342 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1343 // (MODEL_UUID) in SERVICE table.
1344 // 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
1345 // during 1707 data migration if VID did not provide it originally on request.
1346 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1347 // 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.
1349 VnfResource vnfResource = null;
1350 VnfResourceCustomization vrc=null;
1351 // Validation for vnfResource
1353 if(modelCustomizationId!=null) {
1354 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1356 vnfResource = vrc.getVnfResources();
1359 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1360 if(service == null) {
1361 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1364 if(service == null) {
1365 throw new ValidationException("service in relatedInstance");
1367 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1368 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1369 vrc=vnfResourceCustom;
1374 vnfResource = vrc.getVnfResources();
1375 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1376 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1380 if(vnfResource==null){
1381 throw new ValidationException("vnfResource");
1383 if(modelInfo.getModelVersionId() == null) {
1384 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1388 VnfRecipe vnfRecipe = null;
1391 String nfRole = vrc.getNfRole();
1392 if(nfRole != null) {
1393 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1397 if(vnfRecipe == null) {
1398 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1401 if (vnfRecipe == null) {
1405 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1407 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1408 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1409 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1410 // 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.
1411 // 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
1412 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1413 // 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)
1414 // and MODEL_VERSION (modelVersion).
1416 VfModuleCustomization vfmc = null;
1418 VnfResourceCustomization vnfrc;
1419 VfModule vfModule = null;
1421 if(modelInfo.getModelCustomizationId() != null) {
1422 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1424 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1426 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1428 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1430 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1432 String vfModuleModelUUID = modelInfo.getModelVersionId();
1433 for(VfModuleCustomization vf : list) {
1434 VfModuleCustomization vfmCustom;
1435 if(vfModuleModelUUID != null){
1436 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1437 if(vfmCustom != null){
1438 vfModule = vfmCustom.getVfModule();
1441 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1442 if(vfmCustom != null){
1443 vfModule = vfmCustom.getVfModule();
1445 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1449 if(vfModule != null) {
1450 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1451 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1457 if(vfmc == null && vfModule == null) {
1458 throw new ValidationException("vfModuleCustomization");
1459 } else if (vfModule == null && vfmc != null) {
1460 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1463 if(modelInfo.getModelVersionId() == null) {
1464 modelInfo.setModelVersionId(vfModule.getModelUUID());
1468 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1470 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1471 if(!vfModuleRecords.isEmpty()){
1472 for(VfModule record : vfModuleRecords){
1473 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1480 if(recipe == null) {
1481 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1482 if (recipe == null) {
1483 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1486 if(recipe == null) {
1493 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1494 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1495 if (recipe == null) {
1499 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1501 if (recipe == null) {
1507 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1510 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1512 String defaultSource = getDefaultModel(sir);
1514 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1516 if (vnfRecipe == null) {
1520 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1524 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1526 String defaultNetworkType = getDefaultModel(sir);
1528 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1529 String modelName = modelInfo.getModelName();
1530 Recipe recipe = null;
1532 if(modelInfo.getModelCustomizationId()!=null){
1533 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1534 if(networkResource!=null){
1535 if(modelInfo.getModelVersionId() == null) {
1536 modelInfo.setModelVersionId(networkResource.getModelUUID());
1538 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1540 throw new ValidationException("no catalog entry found");
1543 //ok for version < 3 and action delete
1544 if(modelName != null){
1545 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1550 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1553 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1556 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1557 String requestTestApi = null;
1558 TestApi testApi = null;
1560 if (requestParams != null) {
1561 requestTestApi = requestParams.getTestApi();
1564 if (requestTestApi == null) {
1565 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1566 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1568 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1573 testApi = TestApi.valueOf(requestTestApi);
1574 return Optional.of(testApi.getModelName());
1575 } catch (Exception e) {
1576 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1577 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1581 private String getDefaultModel(ServiceInstancesRequest sir) {
1582 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1583 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1584 if (oModelName.isPresent()) {
1585 defaultModel = oModelName.get();
1587 return defaultModel;
1590 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1591 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1592 Boolean aLaCarte = null;
1593 String apiVersion = version.substring(1);
1595 long startTime = System.currentTimeMillis ();
1596 ServiceInstancesRequest sir = null;
1598 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1599 String requestScope = deriveRequestScope(action,sir, requestUri);
1600 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1601 if(sir.getRequestDetails().getRequestParameters() != null){
1602 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1604 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1605 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1606 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1608 InfraActiveRequests dup = null;
1610 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1612 if (instanceIdMap != null && dup != null) {
1613 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1616 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1617 RequestReferences referencesResponse = new RequestReferences();
1618 referencesResponse.setRequestId(requestId);
1619 serviceResponse.setRequestReferences(referencesResponse);
1622 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1623 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1625 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1626 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1628 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1631 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1632 .errorInfo(errorLoggerInfo).build();
1634 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1636 throw validateException;
1640 serviceInstanceId = "";
1641 String configurationId = "";
1642 String correlationId = "";
1644 if(sir.getServiceInstanceId () != null){
1645 serviceInstanceId = sir.getServiceInstanceId ();
1648 if(sir.getConfigurationId() != null){
1649 configurationId = sir.getConfigurationId();
1652 correlationId = getCorrelationId(sir);
1655 infraActiveRequestsClient.save(currentActiveReq);
1656 }catch(Exception e){
1657 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1658 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1659 .errorInfo(errorLoggerInfo).build();
1662 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1664 }else if(aLaCarte == null){
1668 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1669 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1672 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1673 String requestId = null;
1674 if (requestContext.getProperty("requestId") != null) {
1675 requestId = requestContext.getProperty("requestId").toString();
1677 if (UUIDChecker.isValidUUID(requestId)) {
1680 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1681 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1682 .errorInfo(errorLoggerInfo).build();
1684 throw validateException;
1687 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1688 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1689 aq.setStatusMessage (errorMessage);
1690 aq.setProgress(new Long(100));
1691 aq.setRequestStatus(status.toString());
1692 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1693 aq.setEndTime (endTimeStamp);
1695 infraActiveRequestsClient.save(aq);
1696 }catch(Exception e){
1697 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1698 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1699 .errorInfo(errorLoggerInfo).build();