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.ErrorCode;
70 import org.onap.so.logger.LogConstants;
71 import org.onap.so.logger.MessageEnum;
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;
128 import static org.onap.so.logger.HttpHeadersConstants.REQUESTOR_ID;
131 @Path("/onap/so/infra/serviceInstantiation")
132 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
133 public class ServiceInstances {
135 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
136 private static String NAME = "name";
137 private static String VALUE = "value";
138 private static final String SAVE_TO_DB = "save instance to db";
141 private Environment env;
144 private RequestClientFactory reqClientFactory;
147 private CatalogDbClient catalogDbClient;
150 private RequestsDbClient infraActiveRequestsClient;
153 private ResponseBuilder builder;
156 private MsoRequest msoRequest;
159 private RestTemplate restTemplate;
162 @Path("/{version:[vV][5-7]}/serviceInstances")
163 @Consumes(MediaType.APPLICATION_JSON)
164 @Produces(MediaType.APPLICATION_JSON)
165 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
167 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
168 String requestId = getRequestId(requestContext);
169 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
173 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
174 @Consumes(MediaType.APPLICATION_JSON)
175 @Produces(MediaType.APPLICATION_JSON)
176 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
178 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
179 String requestId = getRequestId(requestContext);
180 HashMap<String, String> instanceIdMap = new HashMap<>();
181 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
182 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
186 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
187 @Consumes(MediaType.APPLICATION_JSON)
188 @Produces(MediaType.APPLICATION_JSON)
189 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
191 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
192 String requestId = getRequestId(requestContext);
193 HashMap<String, String> instanceIdMap = new HashMap<>();
194 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
195 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
199 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
200 @Consumes(MediaType.APPLICATION_JSON)
201 @Produces(MediaType.APPLICATION_JSON)
202 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
204 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
205 String requestId = getRequestId(requestContext);
206 HashMap<String, String> instanceIdMap = new HashMap<>();
207 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
208 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
212 @Path("/{version:[vV][7]}/serviceInstances/assign")
213 @Consumes(MediaType.APPLICATION_JSON)
214 @Produces(MediaType.APPLICATION_JSON)
215 @ApiOperation(value="Assign Service Instance", response=Response.class)
217 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
218 String requestId = getRequestId(requestContext);
219 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
223 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
224 @Consumes(MediaType.APPLICATION_JSON)
225 @Produces(MediaType.APPLICATION_JSON)
226 @ApiOperation(value="Unassign Service Instance", response=Response.class)
228 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
229 String requestId = getRequestId(requestContext);
230 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
231 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
232 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
236 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
237 @Consumes(MediaType.APPLICATION_JSON)
238 @Produces(MediaType.APPLICATION_JSON)
239 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
241 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
242 String requestId = getRequestId(requestContext);
243 HashMap<String, String> instanceIdMap = new HashMap<>();
244 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
245 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
249 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
250 @Consumes(MediaType.APPLICATION_JSON)
251 @Produces(MediaType.APPLICATION_JSON)
252 @ApiOperation(value="Delete provided Port",response=Response.class)
254 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
255 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
256 String requestId = getRequestId(requestContext);
257 HashMap<String, String> instanceIdMap = new HashMap<>();
258 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
260 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
264 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
265 @Consumes(MediaType.APPLICATION_JSON)
266 @Produces(MediaType.APPLICATION_JSON)
267 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
269 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
270 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
271 String requestId = getRequestId(requestContext);
272 HashMap<String, String> instanceIdMap = new HashMap<>();
273 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
274 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
275 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
279 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
280 @Consumes(MediaType.APPLICATION_JSON)
281 @Produces(MediaType.APPLICATION_JSON)
282 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
284 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
285 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
286 String requestId = getRequestId(requestContext);
287 HashMap<String, String> instanceIdMap = new HashMap<>();
288 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
290 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
294 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
295 @Consumes(MediaType.APPLICATION_JSON)
296 @Produces(MediaType.APPLICATION_JSON)
297 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
299 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
300 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
301 String requestId = getRequestId(requestContext);
302 HashMap<String, String> instanceIdMap = new HashMap<>();
303 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
304 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
305 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
309 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
310 @Consumes(MediaType.APPLICATION_JSON)
311 @Produces(MediaType.APPLICATION_JSON)
312 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
314 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
315 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
316 String requestId = getRequestId(requestContext);
317 HashMap<String, String> instanceIdMap = new HashMap<>();
318 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
320 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
324 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
325 @Consumes(MediaType.APPLICATION_JSON)
326 @Produces(MediaType.APPLICATION_JSON)
327 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
329 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
330 String requestId = getRequestId(requestContext);
331 HashMap<String, String> instanceIdMap = new HashMap<>();
332 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
333 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
337 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
338 @Consumes(MediaType.APPLICATION_JSON)
339 @Produces(MediaType.APPLICATION_JSON)
340 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
342 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
343 String requestId = getRequestId(requestContext);
344 HashMap<String, String> instanceIdMap = new HashMap<>();
345 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
346 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
350 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
351 @Consumes(MediaType.APPLICATION_JSON)
352 @Produces(MediaType.APPLICATION_JSON)
353 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
355 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
356 String requestId = getRequestId(requestContext);
357 HashMap<String, String> instanceIdMap = new HashMap<>();
358 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
359 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
363 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
364 @Consumes(MediaType.APPLICATION_JSON)
365 @Produces(MediaType.APPLICATION_JSON)
366 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
368 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
369 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
370 String requestId = getRequestId(requestContext);
371 HashMap<String, String> instanceIdMap = new HashMap<>();
372 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
373 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
374 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
378 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
379 @Consumes(MediaType.APPLICATION_JSON)
380 @Produces(MediaType.APPLICATION_JSON)
381 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
383 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
384 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
385 String requestId = getRequestId(requestContext);
386 HashMap<String, String> instanceIdMap = new HashMap<>();
387 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
388 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
389 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
393 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
394 @Consumes(MediaType.APPLICATION_JSON)
395 @Produces(MediaType.APPLICATION_JSON)
396 @ApiOperation(value="Apply updated configuration",response=Response.class)
397 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
398 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
399 String requestId = getRequestId(requestContext);
400 HashMap<String, String> instanceIdMap = new HashMap<>();
401 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
402 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
403 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
407 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
408 @Consumes(MediaType.APPLICATION_JSON)
409 @Produces(MediaType.APPLICATION_JSON)
410 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
411 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
412 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
413 String requestId = getRequestId(requestContext);
414 HashMap<String, String> instanceIdMap = new HashMap<>();
415 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
416 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
417 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
422 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
423 @Consumes(MediaType.APPLICATION_JSON)
424 @Produces(MediaType.APPLICATION_JSON)
425 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
427 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
428 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
429 String requestId = getRequestId(requestContext);
430 HashMap<String, String> instanceIdMap = new HashMap<>();
431 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
432 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
433 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
437 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
438 @Consumes(MediaType.APPLICATION_JSON)
439 @Produces(MediaType.APPLICATION_JSON)
440 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
442 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
443 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
444 String requestId = getRequestId(requestContext);
445 HashMap<String, String> instanceIdMap = new HashMap<>();
446 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
447 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
448 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
452 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
453 @Consumes(MediaType.APPLICATION_JSON)
454 @Produces(MediaType.APPLICATION_JSON)
455 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
457 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
458 @PathParam("vnfInstanceId") String vnfInstanceId,
459 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
460 String requestId = getRequestId(requestContext);
461 HashMap<String, String> instanceIdMap = new HashMap<>();
462 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
463 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
464 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
465 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
469 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
470 @Consumes(MediaType.APPLICATION_JSON)
471 @Produces(MediaType.APPLICATION_JSON)
472 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
474 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
475 @PathParam("vnfInstanceId") String vnfInstanceId,
476 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
477 String requestId = getRequestId(requestContext);
478 HashMap<String, String> instanceIdMap = new HashMap<>();
479 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
480 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
481 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
482 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
486 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
487 @Consumes(MediaType.APPLICATION_JSON)
488 @Produces(MediaType.APPLICATION_JSON)
489 @ApiOperation(value="Perform VNF software update",response=Response.class)
491 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
492 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
493 String requestId = getRequestId(requestContext);
494 HashMap<String, String> instanceIdMap = new HashMap<>();
495 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
496 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
497 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
501 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
502 @Consumes(MediaType.APPLICATION_JSON)
503 @Produces(MediaType.APPLICATION_JSON)
504 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
506 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
507 @PathParam("vnfInstanceId") String vnfInstanceId,
508 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
509 String requestId = getRequestId(requestContext);
510 HashMap<String, String> instanceIdMap = new HashMap<>();
511 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
512 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
513 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
514 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
518 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
519 @Consumes(MediaType.APPLICATION_JSON)
520 @Produces(MediaType.APPLICATION_JSON)
521 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
523 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
524 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
525 String requestId = getRequestId(requestContext);
526 HashMap<String, String> instanceIdMap = new HashMap<>();
527 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
528 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
529 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
530 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
535 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
536 @Consumes(MediaType.APPLICATION_JSON)
537 @Produces(MediaType.APPLICATION_JSON)
538 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
540 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
541 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
542 String requestId = getRequestId(requestContext);
543 HashMap<String, String> instanceIdMap = new HashMap<>();
544 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
545 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
546 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
551 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
552 @Consumes(MediaType.APPLICATION_JSON)
553 @Produces(MediaType.APPLICATION_JSON)
554 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
556 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
557 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
558 String requestId = getRequestId(requestContext);
559 HashMap<String, String> instanceIdMap = new HashMap<>();
560 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
561 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
562 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
566 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
567 @Consumes(MediaType.APPLICATION_JSON)
568 @Produces(MediaType.APPLICATION_JSON)
569 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
571 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
572 @PathParam("vnfInstanceId") String vnfInstanceId,
573 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
574 String requestId = getRequestId(requestContext);
575 HashMap<String, String> instanceIdMap = new HashMap<>();
576 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
577 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
578 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
579 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
583 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
584 @Consumes(MediaType.APPLICATION_JSON)
585 @Produces(MediaType.APPLICATION_JSON)
586 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
588 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
589 @PathParam("vnfInstanceId") String vnfInstanceId,
590 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
591 String requestId = getRequestId(requestContext);
592 HashMap<String, String> instanceIdMap = new HashMap<>();
593 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
594 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
595 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
596 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
600 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
601 @Consumes(MediaType.APPLICATION_JSON)
602 @Produces(MediaType.APPLICATION_JSON)
603 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
605 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
606 String requestId = getRequestId(requestContext);
607 HashMap<String, String> instanceIdMap = new HashMap<>();
608 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
609 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
613 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
614 @Consumes(MediaType.APPLICATION_JSON)
615 @Produces(MediaType.APPLICATION_JSON)
616 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
618 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
619 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
620 String requestId = getRequestId(requestContext);
621 HashMap<String, String> instanceIdMap = new HashMap<>();
622 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
623 instanceIdMap.put("networkInstanceId", networkInstanceId);
624 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
628 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
629 @Consumes(MediaType.APPLICATION_JSON)
630 @Produces(MediaType.APPLICATION_JSON)
631 @ApiOperation(value="Delete provided Network instance",response=Response.class)
633 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
634 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
635 String requestId = getRequestId(requestContext);
636 HashMap<String, String> instanceIdMap = new HashMap<>();
637 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
638 instanceIdMap.put("networkInstanceId", networkInstanceId);
639 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
643 @Path("/{version:[vV][7]}/instanceGroups")
644 @Consumes(MediaType.APPLICATION_JSON)
645 @Produces(MediaType.APPLICATION_JSON)
646 @ApiOperation(value="Create instanceGroups",response=Response.class)
648 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
649 String requestId = getRequestId(requestContext);
650 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
654 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
655 @Consumes(MediaType.APPLICATION_JSON)
656 @Produces(MediaType.APPLICATION_JSON)
657 @ApiOperation(value="Delete instanceGroup",response=Response.class)
659 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
660 String requestId = getRequestId(requestContext);
661 HashMap<String, String> instanceIdMap = new HashMap<>();
662 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
663 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
667 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
668 @Consumes(MediaType.APPLICATION_JSON)
669 @Produces(MediaType.APPLICATION_JSON)
670 @ApiOperation(value="Add instanceGroup members",response=Response.class)
672 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
673 String requestId = getRequestId(requestContext);
674 HashMap<String, String> instanceIdMap = new HashMap<>();
675 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
676 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
680 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
681 @Consumes(MediaType.APPLICATION_JSON)
682 @Produces(MediaType.APPLICATION_JSON)
683 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
685 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
686 String requestId = getRequestId(requestContext);
687 HashMap<String, String> instanceIdMap = new HashMap<>();
688 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
689 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
692 public String getRequestUri(ContainerRequestContext context){
693 String requestUri = context.getUriInfo().getPath();
694 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
695 MDC.put(LogConstants.HTTP_URL, httpUrl);
696 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
700 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
701 MultivaluedMap<String, String> headers = context.getHeaders();
702 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
703 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
705 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
706 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
708 if(!headers.containsKey(REQUESTOR_ID)){
709 throw new ValidationException(REQUESTOR_ID + " header", true);
713 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
714 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
715 Boolean aLaCarte = null;
716 long startTime = System.currentTimeMillis ();
717 ServiceInstancesRequest sir = null;
718 String apiVersion = version.substring(1);
720 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
721 String requestScope = deriveRequestScope(action, sir, requestUri);
722 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
723 if(sir.getRequestDetails().getRequestParameters() != null){
724 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
726 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
727 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
729 int requestVersion = Integer.parseInt(version.substring(1));
730 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
731 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
732 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
733 String networkType = msoRequest.getNetworkType(sir,requestScope);
734 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
735 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
737 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
738 currentActiveReq.setVnfType(vnfType);
739 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
740 currentActiveReq.setNetworkType(networkType);
743 InfraActiveRequests dup = null;
744 boolean inProgress = false;
746 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
749 inProgress = camundaHistoryCheck(dup, currentActiveReq);
752 if (dup != null && inProgress) {
753 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
755 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
757 RequestReferences referencesResponse = new RequestReferences();
759 referencesResponse.setRequestId(requestId);
761 serviceResponse.setRequestReferences(referencesResponse);
762 Boolean isBaseVfModule = false;
764 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
765 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
767 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
768 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
769 modelType = ModelType.vnf;
770 }else if(action == Action.addMembers || action == Action.removeMembers){
771 modelType = ModelType.instanceGroup;
773 modelType =modelInfo.getModelType();
776 if (modelType.equals(ModelType.vfModule)) {
779 // Get VF Module-specific base module indicator
782 String modelVersionId = modelInfo.getModelVersionId();
784 if(modelVersionId != null) {
785 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
786 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
787 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
791 if (vfm.getIsBase()) {
792 isBaseVfModule = true;
794 } else if (action == Action.createInstance || action == Action.updateInstance) {
795 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
796 // This request cannot proceed
798 String serviceVersionText = "";
799 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
800 serviceVersionText = " with version " + sdcServiceModelVersion;
803 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
804 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
805 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
806 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
808 throw vfModuleException;
813 serviceInstanceId = setServiceInstanceId(requestScope, sir);
815 String vfModuleId = "";
816 String volumeGroupId = "";
817 String networkId = "";
818 String pnfCorrelationId = "";
819 String instanceGroupId = null;
821 if(sir.getVnfInstanceId () != null){
822 vnfId = sir.getVnfInstanceId ();
825 if(sir.getVfModuleInstanceId () != null){
826 vfModuleId = sir.getVfModuleInstanceId ();
829 if(sir.getVolumeGroupInstanceId () != null){
830 volumeGroupId = sir.getVolumeGroupInstanceId ();
833 if(sir.getNetworkInstanceId () != null){
834 networkId = sir.getNetworkInstanceId ();
836 if(sir.getInstanceGroupId() != null){
837 instanceGroupId = sir.getInstanceGroupId();
840 pnfCorrelationId = getPnfCorrelationId(sir);
843 infraActiveRequestsClient.save(currentActiveReq);
845 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
847 .errorInfo(errorLoggerInfo).build();
850 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
852 }else if(aLaCarte == null){
856 RequestClientParameter requestClientParameter = null;
858 requestClientParameter = new RequestClientParameter.Builder()
859 .setRequestId(requestId)
860 .setBaseVfModule(isBaseVfModule)
861 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
862 .setRequestAction(action.toString())
863 .setServiceInstanceId(serviceInstanceId)
864 .setPnfCorrelationId(pnfCorrelationId)
866 .setVfModuleId(vfModuleId)
867 .setVolumeGroupId(volumeGroupId)
868 .setNetworkId(networkId)
869 .setServiceType(serviceInstanceType)
871 .setVfModuleType(vfModuleType)
872 .setNetworkType(networkType)
873 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
874 .setApiVersion(apiVersion)
875 .setALaCarte(aLaCarte)
876 .setRequestUri(requestUri)
877 .setInstanceGroupId(instanceGroupId).build();
878 } catch (IOException e) {
879 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
880 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
881 .errorInfo(errorLoggerInfo).build();
883 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
885 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
886 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
887 Boolean aLaCarte = true;
888 long startTime = System.currentTimeMillis ();
889 String apiVersion = version.substring(1);
890 ServiceInstancesRequest sir = new ServiceInstancesRequest();
891 sir.setInstanceGroupId(instanceGroupId);
893 String requestScope = ModelType.instanceGroup.toString();
894 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
895 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
897 validateHeaders(requestContext);
898 } catch (ValidationException e) {
899 logger.error("Exception occurred", e);
900 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
901 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
902 .errorInfo(errorLoggerInfo).build();
903 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
904 throw validateException;
907 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
908 boolean inProgress = false;
911 inProgress = camundaHistoryCheck(dup, currentActiveReq);
914 if (dup != null && inProgress) {
915 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
918 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
920 RequestReferences referencesResponse = new RequestReferences();
922 referencesResponse.setRequestId(requestId);
924 serviceResponse.setRequestReferences(referencesResponse);
925 Boolean isBaseVfModule = false;
927 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
930 infraActiveRequestsClient.save(currentActiveReq);
932 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
933 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
934 .errorInfo(errorLoggerInfo).build();
937 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
938 .setRequestId(requestId)
939 .setBaseVfModule(isBaseVfModule)
940 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
941 .setRequestAction(action.toString())
942 .setApiVersion(apiVersion)
943 .setALaCarte(aLaCarte)
944 .setRequestUri(requestUri)
945 .setInstanceGroupId(instanceGroupId).build();
947 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
950 private String getPnfCorrelationId(ServiceInstancesRequest sir) {
951 return Optional.of(sir)
952 .map(ServiceInstancesRequest::getRequestDetails)
953 .map(RequestDetails::getRequestParameters)
954 .map(parameters -> parameters.getUserParamValue("pnfId"))
958 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
959 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
960 return (ModelType.vnf.name());
961 }else if(action == Action.addMembers || action == Action.removeMembers){
962 return(ModelType.instanceGroup.toString());
965 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
966 requestScope = requestScopeFromUri(requestUri);
968 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
973 private String requestScopeFromUri(String requestUri){
975 if(requestUri.contains(ModelType.network.name())){
976 requestScope = ModelType.network.name();
977 }else if(requestUri.contains(ModelType.vfModule.name())){
978 requestScope = ModelType.vfModule.name();
979 }else if(requestUri.contains(ModelType.volumeGroup.name())){
980 requestScope = ModelType.volumeGroup.name();
981 }else if(requestUri.contains(ModelType.configuration.name())){
982 requestScope = ModelType.configuration.name();
983 }else if(requestUri.contains(ModelType.vnf.name())){
984 requestScope = ModelType.vnf.name();
986 requestScope = ModelType.service.name();
990 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
991 RequestClient requestClient = null;
992 HttpResponse response = null;
994 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
995 response = requestClient.post(requestClientParameter);
996 } catch (Exception e) {
998 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
999 String url = requestClient != null ? requestClient.getUrl() : "";
1000 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
1001 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1003 throw clientException;
1006 if (response == null) {
1008 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1009 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1011 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1013 throw clientException;
1016 ResponseHandler respHandler = null;
1017 int bpelStatus = 500;
1019 respHandler = new ResponseHandler (response, requestClient.getType ());
1020 bpelStatus = respHandler.getStatus ();
1021 } catch (ApiException e) {
1022 logger.error("Exception occurred", e);
1023 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1024 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1025 .errorInfo(errorLoggerInfo).build();
1026 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1027 throw validateException;
1030 // BPEL accepted the request, the request is in progress
1031 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1032 ServiceInstancesResponse jsonResponse;
1033 CamundaResponse camundaResp = respHandler.getResponse();
1035 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1037 ObjectMapper mapper = new ObjectMapper();
1038 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1039 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1040 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1041 if(selfLinkUrl.isPresent()){
1042 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1044 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1046 } catch (IOException e) {
1047 logger.error("Exception occurred", e);
1048 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1049 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1050 .errorInfo(errorLoggerInfo).build();
1051 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1052 throw validateException;
1054 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1058 List<String> variables = new ArrayList<>();
1059 variables.add(bpelStatus + "");
1060 String camundaJSONResponseBody = respHandler.getResponseBody ();
1061 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1063 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1064 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1065 .errorInfo(errorLoggerInfo).build();
1067 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1069 throw bpmnException;
1072 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1075 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1076 .errorInfo(errorLoggerInfo).build();
1077 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1079 throw servException;
1083 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1084 if(StringUtils.isNotBlank(instanceId)) {
1085 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1086 currentActiveReq.setServiceInstanceId(instanceId);
1087 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1088 currentActiveReq.setVnfId(instanceId);
1089 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1090 currentActiveReq.setVfModuleId(instanceId);
1091 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1092 currentActiveReq.setVolumeGroupId(instanceId);
1093 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1094 currentActiveReq.setNetworkId(instanceId);
1095 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1096 currentActiveReq.setConfigurationId(instanceId);
1097 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1098 currentActiveReq.setInstanceGroupId(instanceId);
1100 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1101 if(instanceIdMap.get("serviceInstanceId") != null){
1102 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1104 if(instanceIdMap.get("vnfInstanceId") != null){
1105 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1107 if(instanceIdMap.get("vfModuleInstanceId") != null){
1108 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1110 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1111 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1113 if(instanceIdMap.get("networkInstanceId") != null){
1114 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1116 if(instanceIdMap.get("configurationInstanceId") != null){
1117 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1119 if(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID) != null){
1120 currentActiveReq.setInstanceGroupId(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID));
1125 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1126 ObjectMapper mapper = new ObjectMapper();
1127 mapper.setSerializationInclusion(Include.NON_NULL);
1128 if(msoRawRequest != null){
1129 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1130 if( serviceInstRequest != null &&
1131 serviceInstRequest.getRequestDetails() != null &&
1132 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1133 if( !isAlaCarte && Action.createInstance.equals(action)) {
1134 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1135 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1137 sir.getRequestDetails().getRequestParameters().setUsePreload(serviceInstRequest.getRequestDetails().getRequestParameters().getUsePreload());
1140 logger.debug("Value as string: {}", mapper.writeValueAsString(sir));
1141 return mapper.writeValueAsString(sir);
1146 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1147 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1149 // Found the duplicate record. Return the appropriate error.
1150 String instance = null;
1151 if(instanceName != null){
1152 instance = instanceName;
1154 instance = instanceIdMap.get(requestScope + "InstanceId");
1156 //List<String> variables = new ArrayList<String>();
1157 //variables.add(dup.getRequestStatus());
1158 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1161 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1162 .errorInfo(errorLoggerInfo).build();
1164 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1169 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1170 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1171 InfraActiveRequests dup = null;
1173 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1174 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1176 } catch (Exception e) {
1177 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1178 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1179 .errorInfo(errorLoggerInfo).build();
1180 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1181 throw requestDbFailureException;
1185 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1186 String requestId = duplicateRecord.getRequestId();
1187 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1188 String targetUrl = env.getProperty("mso.camundaURL") + path;
1189 HttpHeaders headers = setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1190 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1191 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1193 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1194 }catch(HttpStatusCodeException e){
1195 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1196 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1197 .errorInfo(errorLoggerInfo).build();
1198 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1199 throw contactCamundaException;
1201 if(response.getBody().isEmpty()){
1202 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1204 for(HistoricProcessInstance instance : response.getBody()){
1205 if(instance.getState().equals("ACTIVE")){
1208 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1213 protected HttpHeaders setCamundaHeaders(String auth, String msoKey) {
1214 HttpHeaders headers = new HttpHeaders();
1215 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1216 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1217 headers.setAccept(acceptableMediaTypes);
1219 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1220 if(userCredentials != null) {
1221 headers.add(HttpHeaders.AUTHORIZATION, "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
1223 } catch(GeneralSecurityException e) {
1224 logger.error("Security exception", e);
1229 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1230 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1232 ObjectMapper mapper = new ObjectMapper();
1233 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1235 } catch (IOException e) {
1237 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1239 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1240 .errorInfo(errorLoggerInfo).build();
1241 String requestScope = requestScopeFromUri(requestUri);
1243 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1245 throw validateException;
1249 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1250 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1251 int reqVersion = Integer.parseInt(version.substring(1));
1253 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1254 } catch (Exception e) {
1255 logger.error("failed to parse request", e);
1256 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1257 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1258 .errorInfo(errorLoggerInfo).build();
1260 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1262 throw validateException;
1266 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1267 InfraActiveRequests currentActiveReq) throws ApiException {
1268 RecipeLookupResult recipeLookupResult = null;
1269 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1270 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1271 // Query MSO Catalog DB
1273 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1274 recipeLookupResult = getDefaultVnfUri(sir, action);
1275 }else if(action == Action.addMembers || action == Action.removeMembers){
1276 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1277 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1279 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1280 } catch (IOException e) {
1281 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1284 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1285 .errorInfo(errorLoggerInfo).build();
1287 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1289 throw validateException;
1291 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1292 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1294 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1295 } catch (ValidationException e) {
1296 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1299 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1300 .errorInfo(errorLoggerInfo).build();
1302 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1304 throw validateException;
1306 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1308 recipeLookupResult = getNetworkUri( sir, action);
1309 } catch (ValidationException e) {
1311 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1314 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1315 .errorInfo(errorLoggerInfo).build();
1316 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1318 throw validateException;
1320 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1321 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1324 if (recipeLookupResult == null) {
1325 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1328 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1329 .errorInfo(errorLoggerInfo).build();
1331 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1332 throw recipeNotFoundExceptionException;
1334 return recipeLookupResult;
1337 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1339 // Construct the default service name
1340 // TODO need to make this a configurable property
1341 String defaultServiceModelName = getDefaultModel(servInstReq);
1342 RequestDetails requestDetails = servInstReq.getRequestDetails();
1343 ModelInfo modelInfo = requestDetails.getModelInfo();
1344 org.onap.so.db.catalog.beans.Service serviceRecord;
1345 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1346 ServiceRecipe recipe = null;
1349 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1350 if(serviceRecord !=null){
1351 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1354 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1355 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1356 if (recipe == null){
1357 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1358 if(!serviceRecordList.isEmpty()){
1359 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1360 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1369 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1370 RequestParameters reqParam = requestDetails.getRequestParameters();
1371 if(reqParam!=null && alaCarteFlag && recipe==null){
1373 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1374 mapToLegacyRequest(requestDetails);
1375 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1376 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1377 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1379 if(modelInfo.getModelVersionId() == null) {
1380 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1385 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1388 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1389 RequestParameters reqParam;
1390 if (requestDetails.getRequestParameters() == null) {
1391 reqParam = new RequestParameters();
1393 reqParam = requestDetails.getRequestParameters();
1395 if(requestDetails.getCloudConfiguration() == null) {
1396 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1397 if(cloudConfig != null) {
1398 requestDetails.setCloudConfiguration(cloudConfig);
1402 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1403 if(!userParams.isEmpty()) {
1404 if (reqParam == null) {
1405 requestDetails.setRequestParameters(new RequestParameters());
1407 requestDetails.getRequestParameters().setUserParams(userParams);
1411 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1413 for(Map<String, Object> params : reqParams.getUserParams()){
1414 if(params.containsKey("service")){
1415 Service service = serviceMapper(params);
1417 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1419 if (targetConfiguration.isPresent()) {
1420 return targetConfiguration.get();
1422 for(Networks network : service.getResources().getNetworks()) {
1423 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1424 if(targetConfiguration.isPresent()) {
1425 return targetConfiguration.get();
1429 for(Vnfs vnf : service.getResources().getVnfs()) {
1430 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1432 if(targetConfiguration.isPresent()) {
1433 return targetConfiguration.get();
1436 for(VfModules vfModule : vnf.getVfModules()) {
1437 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1439 if(targetConfiguration.isPresent()) {
1440 return targetConfiguration.get();
1451 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1452 CloudConfiguration targetConfiguration = new CloudConfiguration();
1453 if(sourceCloudConfiguration != null) {
1454 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1455 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1456 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1457 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1458 return Optional.of(targetConfiguration);
1460 return Optional.empty();
1463 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1464 logger.debug("Configuring UserParams for Macro Request");
1465 Map<String, Object> userParams = new HashMap<>();
1467 for(Map<String, Object> params : reqParams.getUserParams()){
1468 if(params.containsKey("service")){
1469 Service service = serviceMapper(params);
1471 addUserParams(userParams, service.getInstanceParams());
1473 for(Networks network : service.getResources().getNetworks()) {
1474 addUserParams(userParams, network.getInstanceParams());
1477 for(Vnfs vnf: service.getResources().getVnfs()) {
1478 addUserParams(userParams, vnf.getInstanceParams());
1480 for(VfModules vfModule: vnf.getVfModules()) {
1481 addUserParams(userParams, vfModule.getInstanceParams());
1487 return mapFlatMapToNameValue(userParams);
1490 private Service serviceMapper(Map<String, Object> params)
1491 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1492 ObjectMapper obj = new ObjectMapper();
1493 String input = obj.writeValueAsString(params.get("service"));
1494 return obj.readValue(input, Service.class);
1497 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1498 for(Map<String, String> map : sourceUserParams) {
1499 for (Map.Entry<String, String> entry : map.entrySet()) {
1500 targetUserParams.put(entry.getKey(), entry.getValue());
1505 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1506 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1508 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1509 Map<String, Object> targetMap = new HashMap<>();
1510 targetMap.put(NAME, map.getKey());
1511 targetMap.put(VALUE, map.getValue());
1512 targetUserParams.add(targetMap);
1514 return targetUserParams;
1517 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1519 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1520 String vnfComponentType = modelInfo.getModelType().name();
1522 RelatedInstanceList[] instanceList = null;
1523 if (servInstReq.getRequestDetails() != null) {
1524 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1527 Recipe recipe = null;
1528 String defaultSource = getDefaultModel(servInstReq);
1529 String modelCustomizationId = modelInfo.getModelCustomizationId();
1530 String modelCustomizationName = modelInfo.getModelCustomizationName();
1531 String relatedInstanceModelVersionId = null;
1532 String relatedInstanceModelInvariantId = null;
1533 String relatedInstanceVersion = null;
1534 String relatedInstanceModelCustomizationName = null;
1536 if (instanceList != null) {
1538 for(RelatedInstanceList relatedInstanceList : instanceList){
1540 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1541 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1542 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1543 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1544 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1547 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1548 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1549 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1550 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1551 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1555 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1556 // a. For a vnf request (only create, no update currently):
1557 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1558 // 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
1559 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1560 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1561 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1562 // (MODEL_UUID) in SERVICE table.
1563 // 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
1564 // during 1707 data migration if VID did not provide it originally on request.
1565 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1566 // 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.
1568 VnfResource vnfResource = null;
1569 VnfResourceCustomization vrc=null;
1570 // Validation for vnfResource
1572 if(modelCustomizationId!=null) {
1573 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1575 vnfResource = vrc.getVnfResources();
1578 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1579 if(service == null) {
1580 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1583 if(service == null) {
1584 throw new ValidationException("service in relatedInstance");
1586 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1587 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1588 vrc=vnfResourceCustom;
1593 vnfResource = vrc.getVnfResources();
1594 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1595 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1599 if(vnfResource==null){
1600 throw new ValidationException("vnfResource");
1602 if(modelInfo.getModelVersionId() == null) {
1603 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1607 VnfRecipe vnfRecipe = null;
1610 String nfRole = vrc.getNfRole();
1611 if(nfRole != null) {
1612 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1616 if(vnfRecipe == null) {
1617 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1620 if (vnfRecipe == null) {
1624 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1626 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1627 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1628 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1629 // 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.
1630 // 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
1631 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1632 // 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)
1633 // and MODEL_VERSION (modelVersion).
1635 VfModuleCustomization vfmc = null;
1637 VnfResourceCustomization vnfrc;
1638 VfModule vfModule = null;
1640 if(modelInfo.getModelCustomizationId() != null) {
1641 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1643 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1645 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1647 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1649 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1651 String vfModuleModelUUID = modelInfo.getModelVersionId();
1652 for(VfModuleCustomization vf : list) {
1653 VfModuleCustomization vfmCustom;
1654 if(vfModuleModelUUID != null){
1655 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1656 if(vfmCustom != null){
1657 vfModule = vfmCustom.getVfModule();
1660 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1661 if(vfmCustom != null){
1662 vfModule = vfmCustom.getVfModule();
1664 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1668 if(vfModule != null) {
1669 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1670 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1676 if(vfmc == null && vfModule == null) {
1677 throw new ValidationException("vfModuleCustomization");
1678 } else if (vfModule == null && vfmc != null) {
1679 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1682 if(modelInfo.getModelVersionId() == null) {
1683 modelInfo.setModelVersionId(vfModule.getModelUUID());
1687 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1689 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1690 if(!vfModuleRecords.isEmpty()){
1691 for(VfModule record : vfModuleRecords){
1692 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1699 if(recipe == null) {
1700 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1701 if (recipe == null) {
1702 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1705 if(recipe == null) {
1712 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1713 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1714 if (recipe == null) {
1718 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1720 if (recipe == null) {
1726 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1729 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1731 String defaultSource = getDefaultModel(sir);
1733 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1735 if (vnfRecipe == null) {
1739 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1743 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1745 String defaultNetworkType = getDefaultModel(sir);
1747 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1748 String modelName = modelInfo.getModelName();
1749 Recipe recipe = null;
1751 if(modelInfo.getModelCustomizationId()!=null){
1752 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1753 if(networkResourceCustomization != null){
1754 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1755 if(networkResource!=null){
1756 if(modelInfo.getModelVersionId() == null) {
1757 modelInfo.setModelVersionId(networkResource.getModelUUID());
1759 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1761 throw new ValidationException("no catalog entry found");
1763 }else if(action != Action.deleteInstance){
1764 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1767 //ok for version < 3 and action delete
1768 if(modelName != null){
1769 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1774 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1777 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1780 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1781 String requestTestApi = null;
1782 TestApi testApi = null;
1784 if (requestParams != null) {
1785 requestTestApi = requestParams.getTestApi();
1788 if (requestTestApi == null) {
1789 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1790 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1792 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1797 testApi = TestApi.valueOf(requestTestApi);
1798 return Optional.of(testApi.getModelName());
1799 } catch (Exception e) {
1800 logger.warn("Catching the exception on the valueOf enum call and continuing", e);
1801 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1805 private String getDefaultModel(ServiceInstancesRequest sir) {
1806 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1807 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1808 if (oModelName.isPresent()) {
1809 defaultModel = oModelName.get();
1811 return defaultModel;
1814 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1815 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1816 Boolean aLaCarte = null;
1817 String apiVersion = version.substring(1);
1818 boolean inProgress = false;
1820 long startTime = System.currentTimeMillis ();
1821 ServiceInstancesRequest sir = null;
1823 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1824 String requestScope = deriveRequestScope(action,sir, requestUri);
1825 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1826 if(sir.getRequestDetails().getRequestParameters() != null){
1827 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1829 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1830 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1831 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1833 InfraActiveRequests dup = null;
1835 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1838 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1841 if (instanceIdMap != null && dup != null && inProgress) {
1842 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1845 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1846 RequestReferences referencesResponse = new RequestReferences();
1847 referencesResponse.setRequestId(requestId);
1848 serviceResponse.setRequestReferences(referencesResponse);
1851 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1852 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1854 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1855 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1857 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1860 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1861 .errorInfo(errorLoggerInfo).build();
1863 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1865 throw validateException;
1869 serviceInstanceId = "";
1870 String configurationId = "";
1871 String pnfCorrelationId = "";
1873 if(sir.getServiceInstanceId () != null){
1874 serviceInstanceId = sir.getServiceInstanceId ();
1877 if(sir.getConfigurationId() != null){
1878 configurationId = sir.getConfigurationId();
1881 pnfCorrelationId = getPnfCorrelationId(sir);
1884 infraActiveRequestsClient.save(currentActiveReq);
1885 }catch(Exception e){
1886 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1887 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1888 .errorInfo(errorLoggerInfo).build();
1891 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1893 }else if(aLaCarte == null){
1896 RequestClientParameter requestClientParameter = null;
1898 requestClientParameter = new RequestClientParameter.Builder()
1899 .setRequestId(requestId)
1900 .setBaseVfModule(false)
1901 .setRecipeTimeout(Integer.parseInt(timeOut))
1902 .setRequestAction(action.toString())
1903 .setServiceInstanceId(serviceInstanceId)
1904 .setPnfCorrelationId(pnfCorrelationId)
1905 .setConfigurationId(configurationId)
1906 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1907 .setApiVersion(apiVersion)
1908 .setALaCarte(aLaCarte)
1909 .setRequestUri(requestUri).build();
1910 } catch (IOException e) {
1911 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1912 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1913 .errorInfo(errorLoggerInfo).build();
1916 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1919 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1920 String requestId = null;
1921 if (requestContext.getProperty("requestId") != null) {
1922 requestId = requestContext.getProperty("requestId").toString();
1924 if (UUIDChecker.isValidUUID(requestId)) {
1927 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1928 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1929 .errorInfo(errorLoggerInfo).build();
1931 throw validateException;
1934 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1935 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1936 aq.setStatusMessage (errorMessage);
1937 aq.setProgress(new Long(100));
1938 aq.setRequestStatus(status.toString());
1939 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1940 aq.setEndTime (endTimeStamp);
1942 infraActiveRequestsClient.save(aq);
1943 }catch(Exception e){
1944 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1945 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1946 .errorInfo(errorLoggerInfo).build();
1950 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1951 String serviceType = null;
1952 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1953 String defaultServiceModelName = getDefaultModel(sir);
1954 org.onap.so.db.catalog.beans.Service serviceRecord;
1956 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1957 if(serviceRecord != null){
1958 serviceType = serviceRecord.getServiceType();
1961 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1962 if(serviceRecord != null){
1963 serviceType = serviceRecord.getServiceType();
1965 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1966 if(serviceRecord != null){
1967 serviceType = serviceRecord.getServiceType();
1972 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);
1976 protected String setServiceInstanceId(String requestScope, ServiceInstancesRequest sir){
1977 if(sir.getServiceInstanceId () != null){
1978 return sir.getServiceInstanceId ();
1979 }else if(requestScope.equalsIgnoreCase(ModelType.instanceGroup.toString())){
1980 RelatedInstanceList[] relatedInstances = sir.getRequestDetails().getRelatedInstanceList();
1981 if(relatedInstances != null){
1982 for(RelatedInstanceList relatedInstanceList : relatedInstances){
1983 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1984 if(relatedInstance.getModelInfo().getModelType() == ModelType.service){
1985 return relatedInstance.getInstanceId();