2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Modifications Copyright (c) 2019 Samsung
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
24 package org.onap.so.apihandlerinfra;
27 import com.fasterxml.jackson.annotation.JsonInclude.Include;
28 import com.fasterxml.jackson.core.JsonParseException;
29 import com.fasterxml.jackson.core.JsonProcessingException;
30 import com.fasterxml.jackson.databind.JsonMappingException;
31 import com.fasterxml.jackson.databind.ObjectMapper;
32 import io.swagger.annotations.Api;
33 import io.swagger.annotations.ApiOperation;
34 import org.apache.commons.lang.StringUtils;
35 import org.apache.http.HttpResponse;
36 import org.apache.http.HttpStatus;
37 import org.onap.logging.ref.slf4j.ONAPLogConstants;
38 import org.onap.so.apihandler.camundabeans.CamundaResponse;
39 import org.onap.so.apihandler.common.CommonConstants;
40 import org.onap.so.apihandler.common.ErrorNumbers;
41 import org.onap.so.apihandler.common.RequestClient;
42 import org.onap.so.apihandler.common.RequestClientFactory;
43 import org.onap.so.apihandler.common.RequestClientParameter;
44 import org.onap.so.apihandler.common.ResponseBuilder;
45 import org.onap.so.apihandler.common.ResponseHandler;
46 import org.onap.so.apihandlerinfra.exceptions.ApiException;
47 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
48 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
49 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
50 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
51 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
52 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
53 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
54 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
55 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
56 import org.onap.so.db.catalog.beans.NetworkResource;
57 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
58 import org.onap.so.db.catalog.beans.Recipe;
59 import org.onap.so.db.catalog.beans.ServiceRecipe;
60 import org.onap.so.db.catalog.beans.VfModule;
61 import org.onap.so.db.catalog.beans.VfModuleCustomization;
62 import org.onap.so.db.catalog.beans.VnfRecipe;
63 import org.onap.so.db.catalog.beans.VnfResource;
64 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
65 import org.onap.so.db.catalog.client.CatalogDbClient;
66 import org.onap.so.db.request.beans.InfraActiveRequests;
67 import org.onap.so.db.request.client.RequestsDbClient;
68 import org.onap.so.exceptions.ValidationException;
69 import org.onap.so.logger.LogConstants;
70 import org.onap.so.logger.MessageEnum;
71 import org.onap.so.logger.MsoLogger;
72 import org.onap.so.serviceinstancebeans.CloudConfiguration;
73 import org.onap.so.serviceinstancebeans.ModelInfo;
74 import org.onap.so.serviceinstancebeans.ModelType;
75 import org.onap.so.serviceinstancebeans.Networks;
76 import org.onap.so.serviceinstancebeans.RelatedInstance;
77 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
78 import org.onap.so.serviceinstancebeans.RequestDetails;
79 import org.onap.so.serviceinstancebeans.RequestParameters;
80 import org.onap.so.serviceinstancebeans.RequestReferences;
81 import org.onap.so.serviceinstancebeans.Service;
82 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
83 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
84 import org.onap.so.serviceinstancebeans.VfModules;
85 import org.onap.so.serviceinstancebeans.Vnfs;
86 import org.onap.so.utils.CryptoUtils;
87 import org.onap.so.utils.UUIDChecker;
88 import org.slf4j.Logger;
89 import org.slf4j.LoggerFactory;
91 import org.springframework.beans.factory.annotation.Autowired;
92 import org.springframework.core.ParameterizedTypeReference;
93 import org.springframework.core.env.Environment;
94 import org.springframework.http.HttpEntity;
95 import org.springframework.http.HttpHeaders;
96 import org.springframework.http.HttpMethod;
97 import org.springframework.http.ResponseEntity;
98 import org.springframework.stereotype.Component;
99 import org.springframework.web.client.HttpStatusCodeException;
100 import org.springframework.web.client.RestTemplate;
101 import org.camunda.bpm.engine.history.HistoricProcessInstance;
102 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
104 import javax.transaction.Transactional;
105 import javax.ws.rs.Consumes;
106 import javax.ws.rs.DELETE;
107 import javax.ws.rs.POST;
108 import javax.ws.rs.PUT;
109 import javax.ws.rs.Path;
110 import javax.ws.rs.PathParam;
111 import javax.ws.rs.Produces;
112 import javax.ws.rs.container.ContainerRequestContext;
113 import javax.ws.rs.core.Context;
114 import javax.ws.rs.core.MediaType;
115 import javax.ws.rs.core.MultivaluedMap;
116 import javax.ws.rs.core.Response;
117 import javax.xml.bind.DatatypeConverter;
118 import java.io.IOException;
120 import java.security.GeneralSecurityException;
121 import java.sql.Timestamp;
122 import java.util.ArrayList;
123 import java.util.HashMap;
124 import java.util.List;
125 import java.util.Map;
126 import java.util.Optional;
129 @Path("/onap/so/infra/serviceInstantiation")
130 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
131 public class ServiceInstances {
133 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
134 private static String NAME = "name";
135 private static String VALUE = "value";
136 private static final String SAVE_TO_DB = "save instance to db";
139 private Environment env;
142 private RequestClientFactory reqClientFactory;
145 private CatalogDbClient catalogDbClient;
148 private RequestsDbClient infraActiveRequestsClient;
151 private ResponseBuilder builder;
154 private MsoRequest msoRequest;
157 private RestTemplate restTemplate;
160 @Path("/{version:[vV][5-7]}/serviceInstances")
161 @Consumes(MediaType.APPLICATION_JSON)
162 @Produces(MediaType.APPLICATION_JSON)
163 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
165 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
166 String requestId = getRequestId(requestContext);
167 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
171 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
172 @Consumes(MediaType.APPLICATION_JSON)
173 @Produces(MediaType.APPLICATION_JSON)
174 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
176 public Response activateServiceInstance(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.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
184 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
185 @Consumes(MediaType.APPLICATION_JSON)
186 @Produces(MediaType.APPLICATION_JSON)
187 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
189 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
190 String requestId = getRequestId(requestContext);
191 HashMap<String, String> instanceIdMap = new HashMap<>();
192 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
193 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
197 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
198 @Consumes(MediaType.APPLICATION_JSON)
199 @Produces(MediaType.APPLICATION_JSON)
200 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
202 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
203 String requestId = getRequestId(requestContext);
204 HashMap<String, String> instanceIdMap = new HashMap<>();
205 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
206 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
210 @Path("/{version:[vV][7]}/serviceInstances/assign")
211 @Consumes(MediaType.APPLICATION_JSON)
212 @Produces(MediaType.APPLICATION_JSON)
213 @ApiOperation(value="Assign Service Instance", response=Response.class)
215 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
216 String requestId = getRequestId(requestContext);
217 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
221 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Unassign Service Instance", response=Response.class)
226 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
227 String requestId = getRequestId(requestContext);
228 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
229 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
230 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
234 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
235 @Consumes(MediaType.APPLICATION_JSON)
236 @Produces(MediaType.APPLICATION_JSON)
237 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
239 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
240 String requestId = getRequestId(requestContext);
241 HashMap<String, String> instanceIdMap = new HashMap<>();
242 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
243 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
247 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
248 @Consumes(MediaType.APPLICATION_JSON)
249 @Produces(MediaType.APPLICATION_JSON)
250 @ApiOperation(value="Delete provided Port",response=Response.class)
252 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
253 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
254 String requestId = getRequestId(requestContext);
255 HashMap<String, String> instanceIdMap = new HashMap<>();
256 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
257 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
258 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
262 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
263 @Consumes(MediaType.APPLICATION_JSON)
264 @Produces(MediaType.APPLICATION_JSON)
265 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
267 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
268 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
269 String requestId = getRequestId(requestContext);
270 HashMap<String, String> instanceIdMap = new HashMap<>();
271 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
272 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
273 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
277 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
278 @Consumes(MediaType.APPLICATION_JSON)
279 @Produces(MediaType.APPLICATION_JSON)
280 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
282 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
283 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
284 String requestId = getRequestId(requestContext);
285 HashMap<String, String> instanceIdMap = new HashMap<>();
286 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
287 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
288 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
292 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
293 @Consumes(MediaType.APPLICATION_JSON)
294 @Produces(MediaType.APPLICATION_JSON)
295 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
297 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
298 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
299 String requestId = getRequestId(requestContext);
300 HashMap<String, String> instanceIdMap = new HashMap<>();
301 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
302 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
303 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
307 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
308 @Consumes(MediaType.APPLICATION_JSON)
309 @Produces(MediaType.APPLICATION_JSON)
310 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
312 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
313 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
314 String requestId = getRequestId(requestContext);
315 HashMap<String, String> instanceIdMap = new HashMap<>();
316 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
317 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
318 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
322 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
323 @Consumes(MediaType.APPLICATION_JSON)
324 @Produces(MediaType.APPLICATION_JSON)
325 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
327 public Response addRelationships(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 configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
335 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
336 @Consumes(MediaType.APPLICATION_JSON)
337 @Produces(MediaType.APPLICATION_JSON)
338 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
340 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
341 String requestId = getRequestId(requestContext);
342 HashMap<String, String> instanceIdMap = new HashMap<>();
343 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
344 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
348 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
349 @Consumes(MediaType.APPLICATION_JSON)
350 @Produces(MediaType.APPLICATION_JSON)
351 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
353 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
354 String requestId = getRequestId(requestContext);
355 HashMap<String, String> instanceIdMap = new HashMap<>();
356 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
357 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
361 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
362 @Consumes(MediaType.APPLICATION_JSON)
363 @Produces(MediaType.APPLICATION_JSON)
364 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
366 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
367 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
368 String requestId = getRequestId(requestContext);
369 HashMap<String, String> instanceIdMap = new HashMap<>();
370 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
371 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
372 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
376 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
377 @Consumes(MediaType.APPLICATION_JSON)
378 @Produces(MediaType.APPLICATION_JSON)
379 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
381 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
382 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
383 String requestId = getRequestId(requestContext);
384 HashMap<String, String> instanceIdMap = new HashMap<>();
385 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
387 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
391 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
392 @Consumes(MediaType.APPLICATION_JSON)
393 @Produces(MediaType.APPLICATION_JSON)
394 @ApiOperation(value="Apply updated configuration",response=Response.class)
395 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
396 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
397 String requestId = getRequestId(requestContext);
398 HashMap<String, String> instanceIdMap = new HashMap<>();
399 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
400 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
401 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
405 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
406 @Consumes(MediaType.APPLICATION_JSON)
407 @Produces(MediaType.APPLICATION_JSON)
408 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
409 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
410 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
411 String requestId = getRequestId(requestContext);
412 HashMap<String, String> instanceIdMap = new HashMap<>();
413 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
414 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
415 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
420 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
421 @Consumes(MediaType.APPLICATION_JSON)
422 @Produces(MediaType.APPLICATION_JSON)
423 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
425 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
426 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
427 String requestId = getRequestId(requestContext);
428 HashMap<String, String> instanceIdMap = new HashMap<>();
429 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
430 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
431 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
435 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
436 @Consumes(MediaType.APPLICATION_JSON)
437 @Produces(MediaType.APPLICATION_JSON)
438 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
440 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
441 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
442 String requestId = getRequestId(requestContext);
443 HashMap<String, String> instanceIdMap = new HashMap<>();
444 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
445 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
446 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
450 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
451 @Consumes(MediaType.APPLICATION_JSON)
452 @Produces(MediaType.APPLICATION_JSON)
453 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
455 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
456 @PathParam("vnfInstanceId") String vnfInstanceId,
457 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
458 String requestId = getRequestId(requestContext);
459 HashMap<String, String> instanceIdMap = new HashMap<>();
460 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
461 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
462 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
463 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
467 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
468 @Consumes(MediaType.APPLICATION_JSON)
469 @Produces(MediaType.APPLICATION_JSON)
470 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
472 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
473 @PathParam("vnfInstanceId") String vnfInstanceId,
474 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
475 String requestId = getRequestId(requestContext);
476 HashMap<String, String> instanceIdMap = new HashMap<>();
477 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
478 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
479 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
480 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
484 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
485 @Consumes(MediaType.APPLICATION_JSON)
486 @Produces(MediaType.APPLICATION_JSON)
487 @ApiOperation(value="Perform VNF software update",response=Response.class)
489 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
490 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
491 String requestId = getRequestId(requestContext);
492 HashMap<String, String> instanceIdMap = new HashMap<>();
493 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
494 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
495 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
499 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
500 @Consumes(MediaType.APPLICATION_JSON)
501 @Produces(MediaType.APPLICATION_JSON)
502 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
504 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
505 @PathParam("vnfInstanceId") String vnfInstanceId,
506 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
507 String requestId = getRequestId(requestContext);
508 HashMap<String, String> instanceIdMap = new HashMap<>();
509 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
510 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
511 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
512 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
516 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
517 @Consumes(MediaType.APPLICATION_JSON)
518 @Produces(MediaType.APPLICATION_JSON)
519 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
521 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
522 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
523 String requestId = getRequestId(requestContext);
524 HashMap<String, String> instanceIdMap = new HashMap<>();
525 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
526 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
527 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
528 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
533 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
534 @Consumes(MediaType.APPLICATION_JSON)
535 @Produces(MediaType.APPLICATION_JSON)
536 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
538 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
539 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
540 String requestId = getRequestId(requestContext);
541 HashMap<String, String> instanceIdMap = new HashMap<>();
542 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
543 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
544 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
549 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
550 @Consumes(MediaType.APPLICATION_JSON)
551 @Produces(MediaType.APPLICATION_JSON)
552 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
554 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
555 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
556 String requestId = getRequestId(requestContext);
557 HashMap<String, String> instanceIdMap = new HashMap<>();
558 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
559 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
560 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
564 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
565 @Consumes(MediaType.APPLICATION_JSON)
566 @Produces(MediaType.APPLICATION_JSON)
567 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
569 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
570 @PathParam("vnfInstanceId") String vnfInstanceId,
571 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
572 String requestId = getRequestId(requestContext);
573 HashMap<String, String> instanceIdMap = new HashMap<>();
574 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
575 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
576 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
577 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
581 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
582 @Consumes(MediaType.APPLICATION_JSON)
583 @Produces(MediaType.APPLICATION_JSON)
584 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
586 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
587 @PathParam("vnfInstanceId") String vnfInstanceId,
588 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
589 String requestId = getRequestId(requestContext);
590 HashMap<String, String> instanceIdMap = new HashMap<>();
591 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
592 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
593 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
594 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
598 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
599 @Consumes(MediaType.APPLICATION_JSON)
600 @Produces(MediaType.APPLICATION_JSON)
601 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
603 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
604 String requestId = getRequestId(requestContext);
605 HashMap<String, String> instanceIdMap = new HashMap<>();
606 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
607 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
611 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
612 @Consumes(MediaType.APPLICATION_JSON)
613 @Produces(MediaType.APPLICATION_JSON)
614 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
616 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
617 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
618 String requestId = getRequestId(requestContext);
619 HashMap<String, String> instanceIdMap = new HashMap<>();
620 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
621 instanceIdMap.put("networkInstanceId", networkInstanceId);
622 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
626 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
627 @Consumes(MediaType.APPLICATION_JSON)
628 @Produces(MediaType.APPLICATION_JSON)
629 @ApiOperation(value="Delete provided Network instance",response=Response.class)
631 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
632 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
633 String requestId = getRequestId(requestContext);
634 HashMap<String, String> instanceIdMap = new HashMap<>();
635 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
636 instanceIdMap.put("networkInstanceId", networkInstanceId);
637 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
641 @Path("/{version:[vV][7]}/instanceGroups")
642 @Consumes(MediaType.APPLICATION_JSON)
643 @Produces(MediaType.APPLICATION_JSON)
644 @ApiOperation(value="Create instanceGroups",response=Response.class)
646 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
647 String requestId = getRequestId(requestContext);
648 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
652 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
653 @Consumes(MediaType.APPLICATION_JSON)
654 @Produces(MediaType.APPLICATION_JSON)
655 @ApiOperation(value="Delete instanceGroup",response=Response.class)
657 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
658 String requestId = getRequestId(requestContext);
659 HashMap<String, String> instanceIdMap = new HashMap<>();
660 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
661 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
665 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
666 @Consumes(MediaType.APPLICATION_JSON)
667 @Produces(MediaType.APPLICATION_JSON)
668 @ApiOperation(value="Add instanceGroup members",response=Response.class)
670 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
671 String requestId = getRequestId(requestContext);
672 HashMap<String, String> instanceIdMap = new HashMap<>();
673 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
674 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
678 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
679 @Consumes(MediaType.APPLICATION_JSON)
680 @Produces(MediaType.APPLICATION_JSON)
681 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
683 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
684 String requestId = getRequestId(requestContext);
685 HashMap<String, String> instanceIdMap = new HashMap<>();
686 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
687 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
690 public String getRequestUri(ContainerRequestContext context){
691 String requestUri = context.getUriInfo().getPath();
692 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
693 MDC.put(LogConstants.HTTP_URL, httpUrl);
694 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
698 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
699 MultivaluedMap<String, String> headers = context.getHeaders();
700 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
701 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
703 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
704 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
706 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
707 throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
711 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
712 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
713 Boolean aLaCarte = null;
714 long startTime = System.currentTimeMillis ();
715 ServiceInstancesRequest sir = null;
716 String apiVersion = version.substring(1);
718 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
719 String requestScope = deriveRequestScope(action, sir, requestUri);
720 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
721 if(sir.getRequestDetails().getRequestParameters() != null){
722 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
724 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
725 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
727 int requestVersion = Integer.parseInt(version.substring(1));
728 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
729 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
730 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
731 String networkType = msoRequest.getNetworkType(sir,requestScope);
732 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
733 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
735 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
736 currentActiveReq.setVnfType(vnfType);
737 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
738 currentActiveReq.setNetworkType(networkType);
741 InfraActiveRequests dup = null;
742 boolean inProgress = false;
744 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
747 inProgress = camundaHistoryCheck(dup, currentActiveReq);
750 if (dup != null && inProgress) {
751 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
753 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
755 RequestReferences referencesResponse = new RequestReferences();
757 referencesResponse.setRequestId(requestId);
759 serviceResponse.setRequestReferences(referencesResponse);
760 Boolean isBaseVfModule = false;
762 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
763 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
765 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
766 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
767 modelType = ModelType.vnf;
768 }else if(action == Action.addMembers || action == Action.removeMembers){
769 modelType = ModelType.instanceGroup;
771 modelType =modelInfo.getModelType();
774 if (modelType.equals(ModelType.vfModule)) {
777 // Get VF Module-specific base module indicator
780 String modelVersionId = modelInfo.getModelVersionId();
782 if(modelVersionId != null) {
783 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
784 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
785 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
789 if (vfm.getIsBase()) {
790 isBaseVfModule = true;
792 } else if (action == Action.createInstance || action == Action.updateInstance) {
793 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
794 // This request cannot proceed
796 String serviceVersionText = "";
797 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
798 serviceVersionText = " with version " + sdcServiceModelVersion;
801 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
802 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
803 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
804 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
806 throw vfModuleException;
811 serviceInstanceId = setServiceInstanceId(requestScope, sir);
813 String vfModuleId = "";
814 String volumeGroupId = "";
815 String networkId = "";
816 String pnfCorrelationId = "";
817 String instanceGroupId = null;
819 if(sir.getVnfInstanceId () != null){
820 vnfId = sir.getVnfInstanceId ();
823 if(sir.getVfModuleInstanceId () != null){
824 vfModuleId = sir.getVfModuleInstanceId ();
827 if(sir.getVolumeGroupInstanceId () != null){
828 volumeGroupId = sir.getVolumeGroupInstanceId ();
831 if(sir.getNetworkInstanceId () != null){
832 networkId = sir.getNetworkInstanceId ();
834 if(sir.getInstanceGroupId() != null){
835 instanceGroupId = sir.getInstanceGroupId();
838 pnfCorrelationId = getPnfCorrelationId(sir);
841 infraActiveRequestsClient.save(currentActiveReq);
843 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
844 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
845 .errorInfo(errorLoggerInfo).build();
848 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
850 }else if(aLaCarte == null){
854 RequestClientParameter requestClientParameter = null;
856 requestClientParameter = new RequestClientParameter.Builder()
857 .setRequestId(requestId)
858 .setBaseVfModule(isBaseVfModule)
859 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
860 .setRequestAction(action.toString())
861 .setServiceInstanceId(serviceInstanceId)
862 .setPnfCorrelationId(pnfCorrelationId)
864 .setVfModuleId(vfModuleId)
865 .setVolumeGroupId(volumeGroupId)
866 .setNetworkId(networkId)
867 .setServiceType(serviceInstanceType)
869 .setVfModuleType(vfModuleType)
870 .setNetworkType(networkType)
871 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
872 .setApiVersion(apiVersion)
873 .setALaCarte(aLaCarte)
874 .setRequestUri(requestUri)
875 .setInstanceGroupId(instanceGroupId).build();
876 } catch (IOException e) {
877 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
878 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
879 .errorInfo(errorLoggerInfo).build();
881 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
883 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
884 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
885 Boolean aLaCarte = true;
886 long startTime = System.currentTimeMillis ();
887 String apiVersion = version.substring(1);
888 ServiceInstancesRequest sir = new ServiceInstancesRequest();
889 sir.setInstanceGroupId(instanceGroupId);
891 String requestScope = ModelType.instanceGroup.toString();
892 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
893 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
895 validateHeaders(requestContext);
896 } catch (ValidationException e) {
897 logger.error("Exception occurred", e);
898 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
899 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
900 .errorInfo(errorLoggerInfo).build();
901 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
902 throw validateException;
905 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
906 boolean inProgress = false;
909 inProgress = camundaHistoryCheck(dup, currentActiveReq);
912 if (dup != null && inProgress) {
913 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
916 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
918 RequestReferences referencesResponse = new RequestReferences();
920 referencesResponse.setRequestId(requestId);
922 serviceResponse.setRequestReferences(referencesResponse);
923 Boolean isBaseVfModule = false;
925 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
928 infraActiveRequestsClient.save(currentActiveReq);
930 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
931 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
932 .errorInfo(errorLoggerInfo).build();
935 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
936 .setRequestId(requestId)
937 .setBaseVfModule(isBaseVfModule)
938 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
939 .setRequestAction(action.toString())
940 .setApiVersion(apiVersion)
941 .setALaCarte(aLaCarte)
942 .setRequestUri(requestUri)
943 .setInstanceGroupId(instanceGroupId).build();
945 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
948 private String getPnfCorrelationId(ServiceInstancesRequest sir) {
949 return Optional.of(sir)
950 .map(ServiceInstancesRequest::getRequestDetails)
951 .map(RequestDetails::getRequestParameters)
952 .map(parameters -> parameters.getUserParamValue("pnfId"))
956 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
957 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
958 return (ModelType.vnf.name());
959 }else if(action == Action.addMembers || action == Action.removeMembers){
960 return(ModelType.instanceGroup.toString());
963 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
964 requestScope = requestScopeFromUri(requestUri);
966 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
971 private String requestScopeFromUri(String requestUri){
973 if(requestUri.contains(ModelType.network.name())){
974 requestScope = ModelType.network.name();
975 }else if(requestUri.contains(ModelType.vfModule.name())){
976 requestScope = ModelType.vfModule.name();
977 }else if(requestUri.contains(ModelType.volumeGroup.name())){
978 requestScope = ModelType.volumeGroup.name();
979 }else if(requestUri.contains(ModelType.configuration.name())){
980 requestScope = ModelType.configuration.name();
981 }else if(requestUri.contains(ModelType.vnf.name())){
982 requestScope = ModelType.vnf.name();
984 requestScope = ModelType.service.name();
988 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
989 RequestClient requestClient = null;
990 HttpResponse response = null;
992 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
993 response = requestClient.post(requestClientParameter);
994 } catch (Exception e) {
996 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
997 String url = requestClient != null ? requestClient.getUrl() : "";
998 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
999 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1001 throw clientException;
1004 if (response == null) {
1006 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1007 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1009 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1011 throw clientException;
1014 ResponseHandler respHandler = null;
1015 int bpelStatus = 500;
1017 respHandler = new ResponseHandler (response, requestClient.getType ());
1018 bpelStatus = respHandler.getStatus ();
1019 } catch (ApiException e) {
1020 logger.error("Exception occurred", e);
1021 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1022 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1023 .errorInfo(errorLoggerInfo).build();
1024 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1025 throw validateException;
1028 // BPEL accepted the request, the request is in progress
1029 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1030 ServiceInstancesResponse jsonResponse;
1031 CamundaResponse camundaResp = respHandler.getResponse();
1033 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1035 ObjectMapper mapper = new ObjectMapper();
1036 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1037 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1038 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1039 if(selfLinkUrl.isPresent()){
1040 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1042 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1044 } catch (IOException e) {
1045 logger.error("Exception occurred", e);
1046 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1047 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1048 .errorInfo(errorLoggerInfo).build();
1049 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1050 throw validateException;
1052 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1056 List<String> variables = new ArrayList<>();
1057 variables.add(bpelStatus + "");
1058 String camundaJSONResponseBody = respHandler.getResponseBody ();
1059 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1061 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1062 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1063 .errorInfo(errorLoggerInfo).build();
1065 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1067 throw bpmnException;
1070 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1073 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1074 .errorInfo(errorLoggerInfo).build();
1075 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1077 throw servException;
1081 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1082 if(StringUtils.isNotBlank(instanceId)) {
1083 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1084 currentActiveReq.setServiceInstanceId(instanceId);
1085 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1086 currentActiveReq.setVnfId(instanceId);
1087 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1088 currentActiveReq.setVfModuleId(instanceId);
1089 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1090 currentActiveReq.setVolumeGroupId(instanceId);
1091 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1092 currentActiveReq.setNetworkId(instanceId);
1093 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1094 currentActiveReq.setConfigurationId(instanceId);
1095 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1096 currentActiveReq.setInstanceGroupId(instanceId);
1098 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1099 if(instanceIdMap.get("serviceInstanceId") != null){
1100 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1102 if(instanceIdMap.get("vnfInstanceId") != null){
1103 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1105 if(instanceIdMap.get("vfModuleInstanceId") != null){
1106 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1108 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1109 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1111 if(instanceIdMap.get("networkInstanceId") != null){
1112 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1114 if(instanceIdMap.get("configurationInstanceId") != null){
1115 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1117 if(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID) != null){
1118 currentActiveReq.setInstanceGroupId(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID));
1123 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1124 ObjectMapper mapper = new ObjectMapper();
1125 mapper.setSerializationInclusion(Include.NON_NULL);
1126 if(msoRawRequest != null){
1127 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1128 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
1129 serviceInstRequest.getRequestDetails() != null &&
1130 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1131 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1132 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1134 logger.debug("Value as string: {}", mapper.writeValueAsString(sir));
1135 return mapper.writeValueAsString(sir);
1140 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1141 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1143 // Found the duplicate record. Return the appropriate error.
1144 String instance = null;
1145 if(instanceName != null){
1146 instance = instanceName;
1148 instance = instanceIdMap.get(requestScope + "InstanceId");
1150 //List<String> variables = new ArrayList<String>();
1151 //variables.add(dup.getRequestStatus());
1152 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1155 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1156 .errorInfo(errorLoggerInfo).build();
1158 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1163 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1164 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1165 InfraActiveRequests dup = null;
1167 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1168 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1170 } catch (Exception e) {
1171 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1172 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1173 .errorInfo(errorLoggerInfo).build();
1174 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1175 throw requestDbFailureException;
1179 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1180 String requestId = duplicateRecord.getRequestId();
1181 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1182 String targetUrl = env.getProperty("mso.camundaURL") + path;
1183 HttpHeaders headers = setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1184 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1185 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1187 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1188 }catch(HttpStatusCodeException e){
1189 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1190 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1191 .errorInfo(errorLoggerInfo).build();
1192 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1193 throw contactCamundaException;
1195 if(response.getBody().isEmpty()){
1196 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1198 for(HistoricProcessInstance instance : response.getBody()){
1199 if(instance.getState().equals("ACTIVE")){
1202 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1207 protected HttpHeaders setCamundaHeaders(String auth, String msoKey) {
1208 HttpHeaders headers = new HttpHeaders();
1209 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1210 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1211 headers.setAccept(acceptableMediaTypes);
1213 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1214 if(userCredentials != null) {
1215 headers.add(HttpHeaders.AUTHORIZATION, "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
1217 } catch(GeneralSecurityException e) {
1218 logger.error("Security exception", e);
1223 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1224 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1226 ObjectMapper mapper = new ObjectMapper();
1227 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1229 } catch (IOException e) {
1231 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1233 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1234 .errorInfo(errorLoggerInfo).build();
1235 String requestScope = requestScopeFromUri(requestUri);
1237 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1239 throw validateException;
1243 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1244 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1245 int reqVersion = Integer.parseInt(version.substring(1));
1247 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1248 } catch (Exception e) {
1249 logger.error("failed to parse request", e);
1250 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1251 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1252 .errorInfo(errorLoggerInfo).build();
1254 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1256 throw validateException;
1260 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1261 InfraActiveRequests currentActiveReq) throws ApiException {
1262 RecipeLookupResult recipeLookupResult = null;
1263 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1264 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1265 // Query MSO Catalog DB
1267 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1268 recipeLookupResult = getDefaultVnfUri(sir, action);
1269 }else if(action == Action.addMembers || action == Action.removeMembers){
1270 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1271 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1273 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1274 } catch (IOException e) {
1275 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1278 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1279 .errorInfo(errorLoggerInfo).build();
1281 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1283 throw validateException;
1285 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1286 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1288 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1289 } catch (ValidationException e) {
1290 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1293 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1294 .errorInfo(errorLoggerInfo).build();
1296 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1298 throw validateException;
1300 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1302 recipeLookupResult = getNetworkUri( sir, action);
1303 } catch (ValidationException e) {
1305 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1308 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1309 .errorInfo(errorLoggerInfo).build();
1310 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1312 throw validateException;
1314 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1315 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1318 if (recipeLookupResult == null) {
1319 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1322 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1323 .errorInfo(errorLoggerInfo).build();
1325 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1326 throw recipeNotFoundExceptionException;
1328 return recipeLookupResult;
1331 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1333 // Construct the default service name
1334 // TODO need to make this a configurable property
1335 String defaultServiceModelName = getDefaultModel(servInstReq);
1336 RequestDetails requestDetails = servInstReq.getRequestDetails();
1337 ModelInfo modelInfo = requestDetails.getModelInfo();
1338 org.onap.so.db.catalog.beans.Service serviceRecord;
1339 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1340 ServiceRecipe recipe = null;
1343 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1344 if(serviceRecord !=null){
1345 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1348 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1349 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1350 if (recipe == null){
1351 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1352 if(!serviceRecordList.isEmpty()){
1353 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1354 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1363 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1364 RequestParameters reqParam = requestDetails.getRequestParameters();
1365 if(reqParam!=null && alaCarteFlag && recipe==null){
1367 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1368 mapToLegacyRequest(requestDetails);
1369 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1370 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1371 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1373 if(modelInfo.getModelVersionId() == null) {
1374 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1379 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1382 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1383 RequestParameters reqParam;
1384 if (requestDetails.getRequestParameters() == null) {
1385 reqParam = new RequestParameters();
1387 reqParam = requestDetails.getRequestParameters();
1389 if(requestDetails.getCloudConfiguration() == null) {
1390 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1391 if(cloudConfig != null) {
1392 requestDetails.setCloudConfiguration(cloudConfig);
1396 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1397 if(!userParams.isEmpty()) {
1398 if (reqParam == null) {
1399 requestDetails.setRequestParameters(new RequestParameters());
1401 requestDetails.getRequestParameters().setUserParams(userParams);
1405 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1407 for(Map<String, Object> params : reqParams.getUserParams()){
1408 if(params.containsKey("service")){
1409 Service service = serviceMapper(params);
1411 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1413 if (targetConfiguration.isPresent()) {
1414 return targetConfiguration.get();
1416 for(Networks network : service.getResources().getNetworks()) {
1417 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1418 if(targetConfiguration.isPresent()) {
1419 return targetConfiguration.get();
1423 for(Vnfs vnf : service.getResources().getVnfs()) {
1424 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1426 if(targetConfiguration.isPresent()) {
1427 return targetConfiguration.get();
1430 for(VfModules vfModule : vnf.getVfModules()) {
1431 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1433 if(targetConfiguration.isPresent()) {
1434 return targetConfiguration.get();
1445 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1446 CloudConfiguration targetConfiguration = new CloudConfiguration();
1447 if(sourceCloudConfiguration != null) {
1448 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1449 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1450 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1451 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1452 return Optional.of(targetConfiguration);
1454 return Optional.empty();
1457 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1458 logger.debug("Configuring UserParams for Macro Request");
1459 Map<String, Object> userParams = new HashMap<>();
1461 for(Map<String, Object> params : reqParams.getUserParams()){
1462 if(params.containsKey("service")){
1463 Service service = serviceMapper(params);
1465 addUserParams(userParams, service.getInstanceParams());
1467 for(Networks network : service.getResources().getNetworks()) {
1468 addUserParams(userParams, network.getInstanceParams());
1471 for(Vnfs vnf: service.getResources().getVnfs()) {
1472 addUserParams(userParams, vnf.getInstanceParams());
1474 for(VfModules vfModule: vnf.getVfModules()) {
1475 addUserParams(userParams, vfModule.getInstanceParams());
1481 return mapFlatMapToNameValue(userParams);
1484 private Service serviceMapper(Map<String, Object> params)
1485 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1486 ObjectMapper obj = new ObjectMapper();
1487 String input = obj.writeValueAsString(params.get("service"));
1488 return obj.readValue(input, Service.class);
1491 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1492 for(Map<String, String> map : sourceUserParams) {
1493 for (Map.Entry<String, String> entry : map.entrySet()) {
1494 targetUserParams.put(entry.getKey(), entry.getValue());
1499 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1500 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1502 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1503 Map<String, Object> targetMap = new HashMap<>();
1504 targetMap.put(NAME, map.getKey());
1505 targetMap.put(VALUE, map.getValue());
1506 targetUserParams.add(targetMap);
1508 return targetUserParams;
1511 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1513 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1514 String vnfComponentType = modelInfo.getModelType().name();
1516 RelatedInstanceList[] instanceList = null;
1517 if (servInstReq.getRequestDetails() != null) {
1518 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1521 Recipe recipe = null;
1522 String defaultSource = getDefaultModel(servInstReq);
1523 String modelCustomizationId = modelInfo.getModelCustomizationId();
1524 String modelCustomizationName = modelInfo.getModelCustomizationName();
1525 String relatedInstanceModelVersionId = null;
1526 String relatedInstanceModelInvariantId = null;
1527 String relatedInstanceVersion = null;
1528 String relatedInstanceModelCustomizationName = null;
1530 if (instanceList != null) {
1532 for(RelatedInstanceList relatedInstanceList : instanceList){
1534 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1535 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1536 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1537 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1538 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1541 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1542 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1543 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1544 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1545 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1549 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1550 // a. For a vnf request (only create, no update currently):
1551 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1552 // 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
1553 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1554 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1555 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1556 // (MODEL_UUID) in SERVICE table.
1557 // 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
1558 // during 1707 data migration if VID did not provide it originally on request.
1559 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1560 // 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.
1562 VnfResource vnfResource = null;
1563 VnfResourceCustomization vrc=null;
1564 // Validation for vnfResource
1566 if(modelCustomizationId!=null) {
1567 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1569 vnfResource = vrc.getVnfResources();
1572 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1573 if(service == null) {
1574 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1577 if(service == null) {
1578 throw new ValidationException("service in relatedInstance");
1580 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1581 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1582 vrc=vnfResourceCustom;
1587 vnfResource = vrc.getVnfResources();
1588 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1589 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1593 if(vnfResource==null){
1594 throw new ValidationException("vnfResource");
1596 if(modelInfo.getModelVersionId() == null) {
1597 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1601 VnfRecipe vnfRecipe = null;
1604 String nfRole = vrc.getNfRole();
1605 if(nfRole != null) {
1606 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1610 if(vnfRecipe == null) {
1611 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1614 if (vnfRecipe == null) {
1618 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1620 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1621 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1622 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1623 // 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.
1624 // 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
1625 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1626 // 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)
1627 // and MODEL_VERSION (modelVersion).
1629 VfModuleCustomization vfmc = null;
1631 VnfResourceCustomization vnfrc;
1632 VfModule vfModule = null;
1634 if(modelInfo.getModelCustomizationId() != null) {
1635 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1637 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1639 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1641 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1643 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1645 String vfModuleModelUUID = modelInfo.getModelVersionId();
1646 for(VfModuleCustomization vf : list) {
1647 VfModuleCustomization vfmCustom;
1648 if(vfModuleModelUUID != null){
1649 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1650 if(vfmCustom != null){
1651 vfModule = vfmCustom.getVfModule();
1654 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1655 if(vfmCustom != null){
1656 vfModule = vfmCustom.getVfModule();
1658 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1662 if(vfModule != null) {
1663 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1664 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1670 if(vfmc == null && vfModule == null) {
1671 throw new ValidationException("vfModuleCustomization");
1672 } else if (vfModule == null && vfmc != null) {
1673 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1676 if(modelInfo.getModelVersionId() == null) {
1677 modelInfo.setModelVersionId(vfModule.getModelUUID());
1681 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1683 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1684 if(!vfModuleRecords.isEmpty()){
1685 for(VfModule record : vfModuleRecords){
1686 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1693 if(recipe == null) {
1694 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1695 if (recipe == null) {
1696 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1699 if(recipe == null) {
1706 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1707 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1708 if (recipe == null) {
1712 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1714 if (recipe == null) {
1720 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1723 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1725 String defaultSource = getDefaultModel(sir);
1727 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1729 if (vnfRecipe == null) {
1733 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1737 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1739 String defaultNetworkType = getDefaultModel(sir);
1741 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1742 String modelName = modelInfo.getModelName();
1743 Recipe recipe = null;
1745 if(modelInfo.getModelCustomizationId()!=null){
1746 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1747 if(networkResourceCustomization != null){
1748 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1749 if(networkResource!=null){
1750 if(modelInfo.getModelVersionId() == null) {
1751 modelInfo.setModelVersionId(networkResource.getModelUUID());
1753 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1755 throw new ValidationException("no catalog entry found");
1757 }else if(action != Action.deleteInstance){
1758 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1761 //ok for version < 3 and action delete
1762 if(modelName != null){
1763 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1768 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1771 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1774 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1775 String requestTestApi = null;
1776 TestApi testApi = null;
1778 if (requestParams != null) {
1779 requestTestApi = requestParams.getTestApi();
1782 if (requestTestApi == null) {
1783 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1784 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1786 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1791 testApi = TestApi.valueOf(requestTestApi);
1792 return Optional.of(testApi.getModelName());
1793 } catch (Exception e) {
1794 logger.warn("Catching the exception on the valueOf enum call and continuing", e);
1795 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1799 private String getDefaultModel(ServiceInstancesRequest sir) {
1800 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1801 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1802 if (oModelName.isPresent()) {
1803 defaultModel = oModelName.get();
1805 return defaultModel;
1808 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1809 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1810 Boolean aLaCarte = null;
1811 String apiVersion = version.substring(1);
1812 boolean inProgress = false;
1814 long startTime = System.currentTimeMillis ();
1815 ServiceInstancesRequest sir = null;
1817 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1818 String requestScope = deriveRequestScope(action,sir, requestUri);
1819 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1820 if(sir.getRequestDetails().getRequestParameters() != null){
1821 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1823 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1824 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1825 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1827 InfraActiveRequests dup = null;
1829 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1832 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1835 if (instanceIdMap != null && dup != null && inProgress) {
1836 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1839 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1840 RequestReferences referencesResponse = new RequestReferences();
1841 referencesResponse.setRequestId(requestId);
1842 serviceResponse.setRequestReferences(referencesResponse);
1845 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1846 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1848 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1849 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1851 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1854 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1855 .errorInfo(errorLoggerInfo).build();
1857 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1859 throw validateException;
1863 serviceInstanceId = "";
1864 String configurationId = "";
1865 String pnfCorrelationId = "";
1867 if(sir.getServiceInstanceId () != null){
1868 serviceInstanceId = sir.getServiceInstanceId ();
1871 if(sir.getConfigurationId() != null){
1872 configurationId = sir.getConfigurationId();
1875 pnfCorrelationId = getPnfCorrelationId(sir);
1878 infraActiveRequestsClient.save(currentActiveReq);
1879 }catch(Exception e){
1880 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1881 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1882 .errorInfo(errorLoggerInfo).build();
1885 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1887 }else if(aLaCarte == null){
1890 RequestClientParameter requestClientParameter = null;
1892 requestClientParameter = new RequestClientParameter.Builder()
1893 .setRequestId(requestId)
1894 .setBaseVfModule(false)
1895 .setRecipeTimeout(Integer.parseInt(timeOut))
1896 .setRequestAction(action.toString())
1897 .setServiceInstanceId(serviceInstanceId)
1898 .setPnfCorrelationId(pnfCorrelationId)
1899 .setConfigurationId(configurationId)
1900 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1901 .setApiVersion(apiVersion)
1902 .setALaCarte(aLaCarte)
1903 .setRequestUri(requestUri).build();
1904 } catch (IOException e) {
1905 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1906 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1907 .errorInfo(errorLoggerInfo).build();
1910 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1913 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1914 String requestId = null;
1915 if (requestContext.getProperty("requestId") != null) {
1916 requestId = requestContext.getProperty("requestId").toString();
1918 if (UUIDChecker.isValidUUID(requestId)) {
1921 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1922 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1923 .errorInfo(errorLoggerInfo).build();
1925 throw validateException;
1928 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1929 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1930 aq.setStatusMessage (errorMessage);
1931 aq.setProgress(new Long(100));
1932 aq.setRequestStatus(status.toString());
1933 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1934 aq.setEndTime (endTimeStamp);
1936 infraActiveRequestsClient.save(aq);
1937 }catch(Exception e){
1938 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1939 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1940 .errorInfo(errorLoggerInfo).build();
1944 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1945 String serviceType = null;
1946 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1947 String defaultServiceModelName = getDefaultModel(sir);
1948 org.onap.so.db.catalog.beans.Service serviceRecord;
1950 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1951 if(serviceRecord != null){
1952 serviceType = serviceRecord.getServiceType();
1955 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1956 if(serviceRecord != null){
1957 serviceType = serviceRecord.getServiceType();
1959 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1960 if(serviceRecord != null){
1961 serviceType = serviceRecord.getServiceType();
1966 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);
1970 protected String setServiceInstanceId(String requestScope, ServiceInstancesRequest sir){
1971 if(sir.getServiceInstanceId () != null){
1972 return sir.getServiceInstanceId ();
1973 }else if(requestScope.equalsIgnoreCase(ModelType.instanceGroup.toString())){
1974 RelatedInstanceList[] relatedInstances = sir.getRequestDetails().getRelatedInstanceList();
1975 if(relatedInstances != null){
1976 for(RelatedInstanceList relatedInstanceList : relatedInstances){
1977 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1978 if(relatedInstance.getModelInfo().getModelType() == ModelType.service){
1979 return relatedInstance.getInstanceId();