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( serviceInstRequest != null &&
1129 serviceInstRequest.getRequestDetails() != null &&
1130 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1131 if( !isAlaCarte && Action.createInstance.equals(action)) {
1132 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1133 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1135 sir.getRequestDetails().getRequestParameters().setUsePreload(serviceInstRequest.getRequestDetails().getRequestParameters().getUsePreload());
1138 logger.debug("Value as string: {}", mapper.writeValueAsString(sir));
1139 return mapper.writeValueAsString(sir);
1144 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1145 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1147 // Found the duplicate record. Return the appropriate error.
1148 String instance = null;
1149 if(instanceName != null){
1150 instance = instanceName;
1152 instance = instanceIdMap.get(requestScope + "InstanceId");
1154 //List<String> variables = new ArrayList<String>();
1155 //variables.add(dup.getRequestStatus());
1156 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1159 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1160 .errorInfo(errorLoggerInfo).build();
1162 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1167 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1168 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1169 InfraActiveRequests dup = null;
1171 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1172 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1174 } catch (Exception e) {
1175 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1176 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1177 .errorInfo(errorLoggerInfo).build();
1178 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1179 throw requestDbFailureException;
1183 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1184 String requestId = duplicateRecord.getRequestId();
1185 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1186 String targetUrl = env.getProperty("mso.camundaURL") + path;
1187 HttpHeaders headers = setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1188 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1189 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1191 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1192 }catch(HttpStatusCodeException e){
1193 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1194 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1195 .errorInfo(errorLoggerInfo).build();
1196 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1197 throw contactCamundaException;
1199 if(response.getBody().isEmpty()){
1200 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1202 for(HistoricProcessInstance instance : response.getBody()){
1203 if(instance.getState().equals("ACTIVE")){
1206 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1211 protected HttpHeaders setCamundaHeaders(String auth, String msoKey) {
1212 HttpHeaders headers = new HttpHeaders();
1213 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1214 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1215 headers.setAccept(acceptableMediaTypes);
1217 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1218 if(userCredentials != null) {
1219 headers.add(HttpHeaders.AUTHORIZATION, "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
1221 } catch(GeneralSecurityException e) {
1222 logger.error("Security exception", e);
1227 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1228 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1230 ObjectMapper mapper = new ObjectMapper();
1231 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1233 } catch (IOException e) {
1235 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1237 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1238 .errorInfo(errorLoggerInfo).build();
1239 String requestScope = requestScopeFromUri(requestUri);
1241 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1243 throw validateException;
1247 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1248 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1249 int reqVersion = Integer.parseInt(version.substring(1));
1251 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1252 } catch (Exception e) {
1253 logger.error("failed to parse request", e);
1254 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1255 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1256 .errorInfo(errorLoggerInfo).build();
1258 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1260 throw validateException;
1264 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1265 InfraActiveRequests currentActiveReq) throws ApiException {
1266 RecipeLookupResult recipeLookupResult = null;
1267 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1268 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1269 // Query MSO Catalog DB
1271 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1272 recipeLookupResult = getDefaultVnfUri(sir, action);
1273 }else if(action == Action.addMembers || action == Action.removeMembers){
1274 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1275 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1277 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1278 } catch (IOException e) {
1279 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1282 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1283 .errorInfo(errorLoggerInfo).build();
1285 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1287 throw validateException;
1289 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1290 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1292 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1293 } catch (ValidationException e) {
1294 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1297 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1298 .errorInfo(errorLoggerInfo).build();
1300 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1302 throw validateException;
1304 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1306 recipeLookupResult = getNetworkUri( sir, action);
1307 } catch (ValidationException e) {
1309 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1312 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1313 .errorInfo(errorLoggerInfo).build();
1314 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1316 throw validateException;
1318 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1319 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1322 if (recipeLookupResult == null) {
1323 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1326 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1327 .errorInfo(errorLoggerInfo).build();
1329 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1330 throw recipeNotFoundExceptionException;
1332 return recipeLookupResult;
1335 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1337 // Construct the default service name
1338 // TODO need to make this a configurable property
1339 String defaultServiceModelName = getDefaultModel(servInstReq);
1340 RequestDetails requestDetails = servInstReq.getRequestDetails();
1341 ModelInfo modelInfo = requestDetails.getModelInfo();
1342 org.onap.so.db.catalog.beans.Service serviceRecord;
1343 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1344 ServiceRecipe recipe = null;
1347 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1348 if(serviceRecord !=null){
1349 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1352 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1353 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1354 if (recipe == null){
1355 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1356 if(!serviceRecordList.isEmpty()){
1357 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1358 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1367 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1368 RequestParameters reqParam = requestDetails.getRequestParameters();
1369 if(reqParam!=null && alaCarteFlag && recipe==null){
1371 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1372 mapToLegacyRequest(requestDetails);
1373 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1374 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1375 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1377 if(modelInfo.getModelVersionId() == null) {
1378 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1383 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1386 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1387 RequestParameters reqParam;
1388 if (requestDetails.getRequestParameters() == null) {
1389 reqParam = new RequestParameters();
1391 reqParam = requestDetails.getRequestParameters();
1393 if(requestDetails.getCloudConfiguration() == null) {
1394 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1395 if(cloudConfig != null) {
1396 requestDetails.setCloudConfiguration(cloudConfig);
1400 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1401 if(!userParams.isEmpty()) {
1402 if (reqParam == null) {
1403 requestDetails.setRequestParameters(new RequestParameters());
1405 requestDetails.getRequestParameters().setUserParams(userParams);
1409 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1411 for(Map<String, Object> params : reqParams.getUserParams()){
1412 if(params.containsKey("service")){
1413 Service service = serviceMapper(params);
1415 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1417 if (targetConfiguration.isPresent()) {
1418 return targetConfiguration.get();
1420 for(Networks network : service.getResources().getNetworks()) {
1421 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1422 if(targetConfiguration.isPresent()) {
1423 return targetConfiguration.get();
1427 for(Vnfs vnf : service.getResources().getVnfs()) {
1428 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1430 if(targetConfiguration.isPresent()) {
1431 return targetConfiguration.get();
1434 for(VfModules vfModule : vnf.getVfModules()) {
1435 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1437 if(targetConfiguration.isPresent()) {
1438 return targetConfiguration.get();
1449 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1450 CloudConfiguration targetConfiguration = new CloudConfiguration();
1451 if(sourceCloudConfiguration != null) {
1452 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1453 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1454 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1455 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1456 return Optional.of(targetConfiguration);
1458 return Optional.empty();
1461 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1462 logger.debug("Configuring UserParams for Macro Request");
1463 Map<String, Object> userParams = new HashMap<>();
1465 for(Map<String, Object> params : reqParams.getUserParams()){
1466 if(params.containsKey("service")){
1467 Service service = serviceMapper(params);
1469 addUserParams(userParams, service.getInstanceParams());
1471 for(Networks network : service.getResources().getNetworks()) {
1472 addUserParams(userParams, network.getInstanceParams());
1475 for(Vnfs vnf: service.getResources().getVnfs()) {
1476 addUserParams(userParams, vnf.getInstanceParams());
1478 for(VfModules vfModule: vnf.getVfModules()) {
1479 addUserParams(userParams, vfModule.getInstanceParams());
1485 return mapFlatMapToNameValue(userParams);
1488 private Service serviceMapper(Map<String, Object> params)
1489 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1490 ObjectMapper obj = new ObjectMapper();
1491 String input = obj.writeValueAsString(params.get("service"));
1492 return obj.readValue(input, Service.class);
1495 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1496 for(Map<String, String> map : sourceUserParams) {
1497 for (Map.Entry<String, String> entry : map.entrySet()) {
1498 targetUserParams.put(entry.getKey(), entry.getValue());
1503 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1504 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1506 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1507 Map<String, Object> targetMap = new HashMap<>();
1508 targetMap.put(NAME, map.getKey());
1509 targetMap.put(VALUE, map.getValue());
1510 targetUserParams.add(targetMap);
1512 return targetUserParams;
1515 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1517 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1518 String vnfComponentType = modelInfo.getModelType().name();
1520 RelatedInstanceList[] instanceList = null;
1521 if (servInstReq.getRequestDetails() != null) {
1522 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1525 Recipe recipe = null;
1526 String defaultSource = getDefaultModel(servInstReq);
1527 String modelCustomizationId = modelInfo.getModelCustomizationId();
1528 String modelCustomizationName = modelInfo.getModelCustomizationName();
1529 String relatedInstanceModelVersionId = null;
1530 String relatedInstanceModelInvariantId = null;
1531 String relatedInstanceVersion = null;
1532 String relatedInstanceModelCustomizationName = null;
1534 if (instanceList != null) {
1536 for(RelatedInstanceList relatedInstanceList : instanceList){
1538 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1539 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1540 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1541 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1542 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1545 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1546 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1547 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1548 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1549 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1553 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1554 // a. For a vnf request (only create, no update currently):
1555 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1556 // 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
1557 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1558 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1559 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1560 // (MODEL_UUID) in SERVICE table.
1561 // 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
1562 // during 1707 data migration if VID did not provide it originally on request.
1563 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1564 // 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.
1566 VnfResource vnfResource = null;
1567 VnfResourceCustomization vrc=null;
1568 // Validation for vnfResource
1570 if(modelCustomizationId!=null) {
1571 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1573 vnfResource = vrc.getVnfResources();
1576 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1577 if(service == null) {
1578 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1581 if(service == null) {
1582 throw new ValidationException("service in relatedInstance");
1584 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1585 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1586 vrc=vnfResourceCustom;
1591 vnfResource = vrc.getVnfResources();
1592 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1593 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1597 if(vnfResource==null){
1598 throw new ValidationException("vnfResource");
1600 if(modelInfo.getModelVersionId() == null) {
1601 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1605 VnfRecipe vnfRecipe = null;
1608 String nfRole = vrc.getNfRole();
1609 if(nfRole != null) {
1610 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1614 if(vnfRecipe == null) {
1615 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1618 if (vnfRecipe == null) {
1622 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1624 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1625 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1626 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1627 // 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.
1628 // 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
1629 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1630 // 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)
1631 // and MODEL_VERSION (modelVersion).
1633 VfModuleCustomization vfmc = null;
1635 VnfResourceCustomization vnfrc;
1636 VfModule vfModule = null;
1638 if(modelInfo.getModelCustomizationId() != null) {
1639 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1641 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1643 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1645 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1647 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1649 String vfModuleModelUUID = modelInfo.getModelVersionId();
1650 for(VfModuleCustomization vf : list) {
1651 VfModuleCustomization vfmCustom;
1652 if(vfModuleModelUUID != null){
1653 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1654 if(vfmCustom != null){
1655 vfModule = vfmCustom.getVfModule();
1658 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1659 if(vfmCustom != null){
1660 vfModule = vfmCustom.getVfModule();
1662 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1666 if(vfModule != null) {
1667 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1668 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1674 if(vfmc == null && vfModule == null) {
1675 throw new ValidationException("vfModuleCustomization");
1676 } else if (vfModule == null && vfmc != null) {
1677 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1680 if(modelInfo.getModelVersionId() == null) {
1681 modelInfo.setModelVersionId(vfModule.getModelUUID());
1685 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1687 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1688 if(!vfModuleRecords.isEmpty()){
1689 for(VfModule record : vfModuleRecords){
1690 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1697 if(recipe == null) {
1698 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1699 if (recipe == null) {
1700 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1703 if(recipe == null) {
1710 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1711 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1712 if (recipe == null) {
1716 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1718 if (recipe == null) {
1724 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1727 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1729 String defaultSource = getDefaultModel(sir);
1731 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1733 if (vnfRecipe == null) {
1737 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1741 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1743 String defaultNetworkType = getDefaultModel(sir);
1745 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1746 String modelName = modelInfo.getModelName();
1747 Recipe recipe = null;
1749 if(modelInfo.getModelCustomizationId()!=null){
1750 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1751 if(networkResourceCustomization != null){
1752 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1753 if(networkResource!=null){
1754 if(modelInfo.getModelVersionId() == null) {
1755 modelInfo.setModelVersionId(networkResource.getModelUUID());
1757 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1759 throw new ValidationException("no catalog entry found");
1761 }else if(action != Action.deleteInstance){
1762 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1765 //ok for version < 3 and action delete
1766 if(modelName != null){
1767 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1772 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1775 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1778 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1779 String requestTestApi = null;
1780 TestApi testApi = null;
1782 if (requestParams != null) {
1783 requestTestApi = requestParams.getTestApi();
1786 if (requestTestApi == null) {
1787 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1788 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1790 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1795 testApi = TestApi.valueOf(requestTestApi);
1796 return Optional.of(testApi.getModelName());
1797 } catch (Exception e) {
1798 logger.warn("Catching the exception on the valueOf enum call and continuing", e);
1799 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1803 private String getDefaultModel(ServiceInstancesRequest sir) {
1804 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1805 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1806 if (oModelName.isPresent()) {
1807 defaultModel = oModelName.get();
1809 return defaultModel;
1812 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1813 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1814 Boolean aLaCarte = null;
1815 String apiVersion = version.substring(1);
1816 boolean inProgress = false;
1818 long startTime = System.currentTimeMillis ();
1819 ServiceInstancesRequest sir = null;
1821 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1822 String requestScope = deriveRequestScope(action,sir, requestUri);
1823 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1824 if(sir.getRequestDetails().getRequestParameters() != null){
1825 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1827 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1828 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1829 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1831 InfraActiveRequests dup = null;
1833 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1836 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1839 if (instanceIdMap != null && dup != null && inProgress) {
1840 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1843 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1844 RequestReferences referencesResponse = new RequestReferences();
1845 referencesResponse.setRequestId(requestId);
1846 serviceResponse.setRequestReferences(referencesResponse);
1849 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1850 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1852 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1853 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1855 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1858 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1859 .errorInfo(errorLoggerInfo).build();
1861 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1863 throw validateException;
1867 serviceInstanceId = "";
1868 String configurationId = "";
1869 String pnfCorrelationId = "";
1871 if(sir.getServiceInstanceId () != null){
1872 serviceInstanceId = sir.getServiceInstanceId ();
1875 if(sir.getConfigurationId() != null){
1876 configurationId = sir.getConfigurationId();
1879 pnfCorrelationId = getPnfCorrelationId(sir);
1882 infraActiveRequestsClient.save(currentActiveReq);
1883 }catch(Exception e){
1884 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1885 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1886 .errorInfo(errorLoggerInfo).build();
1889 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1891 }else if(aLaCarte == null){
1894 RequestClientParameter requestClientParameter = null;
1896 requestClientParameter = new RequestClientParameter.Builder()
1897 .setRequestId(requestId)
1898 .setBaseVfModule(false)
1899 .setRecipeTimeout(Integer.parseInt(timeOut))
1900 .setRequestAction(action.toString())
1901 .setServiceInstanceId(serviceInstanceId)
1902 .setPnfCorrelationId(pnfCorrelationId)
1903 .setConfigurationId(configurationId)
1904 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1905 .setApiVersion(apiVersion)
1906 .setALaCarte(aLaCarte)
1907 .setRequestUri(requestUri).build();
1908 } catch (IOException e) {
1909 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1910 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1911 .errorInfo(errorLoggerInfo).build();
1914 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1917 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1918 String requestId = null;
1919 if (requestContext.getProperty("requestId") != null) {
1920 requestId = requestContext.getProperty("requestId").toString();
1922 if (UUIDChecker.isValidUUID(requestId)) {
1925 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1926 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1927 .errorInfo(errorLoggerInfo).build();
1929 throw validateException;
1932 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1933 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1934 aq.setStatusMessage (errorMessage);
1935 aq.setProgress(new Long(100));
1936 aq.setRequestStatus(status.toString());
1937 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1938 aq.setEndTime (endTimeStamp);
1940 infraActiveRequestsClient.save(aq);
1941 }catch(Exception e){
1942 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1943 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1944 .errorInfo(errorLoggerInfo).build();
1948 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1949 String serviceType = null;
1950 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1951 String defaultServiceModelName = getDefaultModel(sir);
1952 org.onap.so.db.catalog.beans.Service serviceRecord;
1954 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1955 if(serviceRecord != null){
1956 serviceType = serviceRecord.getServiceType();
1959 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1960 if(serviceRecord != null){
1961 serviceType = serviceRecord.getServiceType();
1963 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1964 if(serviceRecord != null){
1965 serviceType = serviceRecord.getServiceType();
1970 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);
1974 protected String setServiceInstanceId(String requestScope, ServiceInstancesRequest sir){
1975 if(sir.getServiceInstanceId () != null){
1976 return sir.getServiceInstanceId ();
1977 }else if(requestScope.equalsIgnoreCase(ModelType.instanceGroup.toString())){
1978 RelatedInstanceList[] relatedInstances = sir.getRequestDetails().getRelatedInstanceList();
1979 if(relatedInstances != null){
1980 for(RelatedInstanceList relatedInstanceList : relatedInstances){
1981 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1982 if(relatedInstance.getModelInfo().getModelType() == ModelType.service){
1983 return relatedInstance.getInstanceId();