2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Modifications Copyright (c) 2019 Samsung
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
24 package org.onap.so.apihandlerinfra;
27 import com.fasterxml.jackson.annotation.JsonInclude.Include;
28 import com.fasterxml.jackson.core.JsonParseException;
29 import com.fasterxml.jackson.core.JsonProcessingException;
30 import com.fasterxml.jackson.databind.JsonMappingException;
31 import com.fasterxml.jackson.databind.ObjectMapper;
32 import io.swagger.annotations.Api;
33 import io.swagger.annotations.ApiOperation;
34 import org.apache.commons.lang.StringUtils;
35 import org.apache.http.HttpResponse;
36 import org.apache.http.HttpStatus;
37 import org.onap.logging.ref.slf4j.ONAPLogConstants;
38 import org.onap.so.apihandler.camundabeans.CamundaResponse;
39 import org.onap.so.apihandler.common.CommonConstants;
40 import org.onap.so.apihandler.common.ErrorNumbers;
41 import org.onap.so.apihandler.common.RequestClient;
42 import org.onap.so.apihandler.common.RequestClientFactory;
43 import org.onap.so.apihandler.common.RequestClientParameter;
44 import org.onap.so.apihandler.common.ResponseBuilder;
45 import org.onap.so.apihandler.common.ResponseHandler;
46 import org.onap.so.apihandlerinfra.exceptions.ApiException;
47 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
48 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
49 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
50 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
51 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
52 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
53 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
54 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
55 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
56 import org.onap.so.db.catalog.beans.NetworkResource;
57 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
58 import org.onap.so.db.catalog.beans.Recipe;
59 import org.onap.so.db.catalog.beans.ServiceRecipe;
60 import org.onap.so.db.catalog.beans.VfModule;
61 import org.onap.so.db.catalog.beans.VfModuleCustomization;
62 import org.onap.so.db.catalog.beans.VnfRecipe;
63 import org.onap.so.db.catalog.beans.VnfResource;
64 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
65 import org.onap.so.db.catalog.client.CatalogDbClient;
66 import org.onap.so.db.request.beans.InfraActiveRequests;
67 import org.onap.so.db.request.client.RequestsDbClient;
68 import org.onap.so.exceptions.ValidationException;
69 import org.onap.so.logger.LogConstants;
70 import org.onap.so.logger.MessageEnum;
71 import org.onap.so.logger.MsoLogger;
72 import org.onap.so.serviceinstancebeans.CloudConfiguration;
73 import org.onap.so.serviceinstancebeans.ModelInfo;
74 import org.onap.so.serviceinstancebeans.ModelType;
75 import org.onap.so.serviceinstancebeans.Networks;
76 import org.onap.so.serviceinstancebeans.RelatedInstance;
77 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
78 import org.onap.so.serviceinstancebeans.RequestDetails;
79 import org.onap.so.serviceinstancebeans.RequestParameters;
80 import org.onap.so.serviceinstancebeans.RequestReferences;
81 import org.onap.so.serviceinstancebeans.Service;
82 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
83 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
84 import org.onap.so.serviceinstancebeans.VfModules;
85 import org.onap.so.serviceinstancebeans.Vnfs;
86 import org.onap.so.utils.CryptoUtils;
87 import org.onap.so.utils.UUIDChecker;
88 import org.slf4j.Logger;
89 import org.slf4j.LoggerFactory;
91 import org.springframework.beans.factory.annotation.Autowired;
92 import org.springframework.core.ParameterizedTypeReference;
93 import org.springframework.core.env.Environment;
94 import org.springframework.http.HttpEntity;
95 import org.springframework.http.HttpHeaders;
96 import org.springframework.http.HttpMethod;
97 import org.springframework.http.ResponseEntity;
98 import org.springframework.stereotype.Component;
99 import org.springframework.web.client.HttpStatusCodeException;
100 import org.springframework.web.client.RestTemplate;
101 import org.camunda.bpm.engine.history.HistoricProcessInstance;
102 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
104 import javax.transaction.Transactional;
105 import javax.ws.rs.Consumes;
106 import javax.ws.rs.DELETE;
107 import javax.ws.rs.POST;
108 import javax.ws.rs.PUT;
109 import javax.ws.rs.Path;
110 import javax.ws.rs.PathParam;
111 import javax.ws.rs.Produces;
112 import javax.ws.rs.container.ContainerRequestContext;
113 import javax.ws.rs.core.Context;
114 import javax.ws.rs.core.MediaType;
115 import javax.ws.rs.core.MultivaluedMap;
116 import javax.ws.rs.core.Response;
117 import javax.xml.bind.DatatypeConverter;
118 import java.io.IOException;
120 import java.security.GeneralSecurityException;
121 import java.sql.Timestamp;
122 import java.util.ArrayList;
123 import java.util.HashMap;
124 import java.util.List;
125 import java.util.Map;
126 import java.util.Optional;
129 @Path("/onap/so/infra/serviceInstantiation")
130 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
131 public class ServiceInstances {
133 private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
134 private static String NAME = "name";
135 private static String VALUE = "value";
136 private static final String SAVE_TO_DB = "save instance to db";
139 private Environment env;
142 private RequestClientFactory reqClientFactory;
145 private CatalogDbClient catalogDbClient;
148 private RequestsDbClient infraActiveRequestsClient;
151 private ResponseBuilder builder;
154 private MsoRequest msoRequest;
157 private RestTemplate restTemplate;
160 @Path("/{version:[vV][5-7]}/serviceInstances")
161 @Consumes(MediaType.APPLICATION_JSON)
162 @Produces(MediaType.APPLICATION_JSON)
163 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
165 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
166 String requestId = getRequestId(requestContext);
167 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
171 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
172 @Consumes(MediaType.APPLICATION_JSON)
173 @Produces(MediaType.APPLICATION_JSON)
174 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
176 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
177 String requestId = getRequestId(requestContext);
178 HashMap<String, String> instanceIdMap = new HashMap<>();
179 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
180 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
184 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
185 @Consumes(MediaType.APPLICATION_JSON)
186 @Produces(MediaType.APPLICATION_JSON)
187 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
189 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
190 String requestId = getRequestId(requestContext);
191 HashMap<String, String> instanceIdMap = new HashMap<>();
192 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
193 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
197 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
198 @Consumes(MediaType.APPLICATION_JSON)
199 @Produces(MediaType.APPLICATION_JSON)
200 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
202 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
203 String requestId = getRequestId(requestContext);
204 HashMap<String, String> instanceIdMap = new HashMap<>();
205 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
206 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
210 @Path("/{version:[vV][7]}/serviceInstances/assign")
211 @Consumes(MediaType.APPLICATION_JSON)
212 @Produces(MediaType.APPLICATION_JSON)
213 @ApiOperation(value="Assign Service Instance", response=Response.class)
215 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
216 String requestId = getRequestId(requestContext);
217 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
221 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Unassign Service Instance", response=Response.class)
226 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
227 String requestId = getRequestId(requestContext);
228 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
229 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
230 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
234 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
235 @Consumes(MediaType.APPLICATION_JSON)
236 @Produces(MediaType.APPLICATION_JSON)
237 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
239 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
240 String requestId = getRequestId(requestContext);
241 HashMap<String, String> instanceIdMap = new HashMap<>();
242 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
243 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
247 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
248 @Consumes(MediaType.APPLICATION_JSON)
249 @Produces(MediaType.APPLICATION_JSON)
250 @ApiOperation(value="Delete provided Port",response=Response.class)
252 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
253 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
254 String requestId = getRequestId(requestContext);
255 HashMap<String, String> instanceIdMap = new HashMap<>();
256 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
257 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
258 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
262 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
263 @Consumes(MediaType.APPLICATION_JSON)
264 @Produces(MediaType.APPLICATION_JSON)
265 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
267 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
268 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
269 String requestId = getRequestId(requestContext);
270 HashMap<String, String> instanceIdMap = new HashMap<>();
271 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
272 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
273 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
277 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
278 @Consumes(MediaType.APPLICATION_JSON)
279 @Produces(MediaType.APPLICATION_JSON)
280 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
282 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
283 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
284 String requestId = getRequestId(requestContext);
285 HashMap<String, String> instanceIdMap = new HashMap<>();
286 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
287 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
288 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
292 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
293 @Consumes(MediaType.APPLICATION_JSON)
294 @Produces(MediaType.APPLICATION_JSON)
295 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
297 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
298 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
299 String requestId = getRequestId(requestContext);
300 HashMap<String, String> instanceIdMap = new HashMap<>();
301 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
302 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
303 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
307 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
308 @Consumes(MediaType.APPLICATION_JSON)
309 @Produces(MediaType.APPLICATION_JSON)
310 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
312 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
313 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
314 String requestId = getRequestId(requestContext);
315 HashMap<String, String> instanceIdMap = new HashMap<>();
316 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
317 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
318 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
322 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
323 @Consumes(MediaType.APPLICATION_JSON)
324 @Produces(MediaType.APPLICATION_JSON)
325 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
327 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
328 String requestId = getRequestId(requestContext);
329 HashMap<String, String> instanceIdMap = new HashMap<>();
330 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
331 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
335 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
336 @Consumes(MediaType.APPLICATION_JSON)
337 @Produces(MediaType.APPLICATION_JSON)
338 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
340 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
341 String requestId = getRequestId(requestContext);
342 HashMap<String, String> instanceIdMap = new HashMap<>();
343 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
344 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
348 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
349 @Consumes(MediaType.APPLICATION_JSON)
350 @Produces(MediaType.APPLICATION_JSON)
351 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
353 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
354 String requestId = getRequestId(requestContext);
355 HashMap<String, String> instanceIdMap = new HashMap<>();
356 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
357 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
361 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
362 @Consumes(MediaType.APPLICATION_JSON)
363 @Produces(MediaType.APPLICATION_JSON)
364 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
366 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
367 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
368 String requestId = getRequestId(requestContext);
369 HashMap<String, String> instanceIdMap = new HashMap<>();
370 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
371 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
372 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
376 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
377 @Consumes(MediaType.APPLICATION_JSON)
378 @Produces(MediaType.APPLICATION_JSON)
379 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
381 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
382 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
383 String requestId = getRequestId(requestContext);
384 HashMap<String, String> instanceIdMap = new HashMap<>();
385 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
387 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
391 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
392 @Consumes(MediaType.APPLICATION_JSON)
393 @Produces(MediaType.APPLICATION_JSON)
394 @ApiOperation(value="Apply updated configuration",response=Response.class)
395 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
396 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
397 String requestId = getRequestId(requestContext);
398 HashMap<String, String> instanceIdMap = new HashMap<>();
399 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
400 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
401 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
405 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
406 @Consumes(MediaType.APPLICATION_JSON)
407 @Produces(MediaType.APPLICATION_JSON)
408 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
409 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
410 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
411 String requestId = getRequestId(requestContext);
412 HashMap<String, String> instanceIdMap = new HashMap<>();
413 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
414 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
415 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
420 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
421 @Consumes(MediaType.APPLICATION_JSON)
422 @Produces(MediaType.APPLICATION_JSON)
423 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
425 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
426 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
427 String requestId = getRequestId(requestContext);
428 HashMap<String, String> instanceIdMap = new HashMap<>();
429 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
430 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
431 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
435 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
436 @Consumes(MediaType.APPLICATION_JSON)
437 @Produces(MediaType.APPLICATION_JSON)
438 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
440 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
441 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
442 String requestId = getRequestId(requestContext);
443 HashMap<String, String> instanceIdMap = new HashMap<>();
444 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
445 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
446 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
450 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
451 @Consumes(MediaType.APPLICATION_JSON)
452 @Produces(MediaType.APPLICATION_JSON)
453 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
455 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
456 @PathParam("vnfInstanceId") String vnfInstanceId,
457 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
458 String requestId = getRequestId(requestContext);
459 HashMap<String, String> instanceIdMap = new HashMap<>();
460 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
461 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
462 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
463 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
467 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
468 @Consumes(MediaType.APPLICATION_JSON)
469 @Produces(MediaType.APPLICATION_JSON)
470 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
472 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
473 @PathParam("vnfInstanceId") String vnfInstanceId,
474 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
475 String requestId = getRequestId(requestContext);
476 HashMap<String, String> instanceIdMap = new HashMap<>();
477 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
478 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
479 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
480 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
484 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
485 @Consumes(MediaType.APPLICATION_JSON)
486 @Produces(MediaType.APPLICATION_JSON)
487 @ApiOperation(value="Perform VNF software update",response=Response.class)
489 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
490 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
491 String requestId = getRequestId(requestContext);
492 HashMap<String, String> instanceIdMap = new HashMap<>();
493 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
494 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
495 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
499 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
500 @Consumes(MediaType.APPLICATION_JSON)
501 @Produces(MediaType.APPLICATION_JSON)
502 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
504 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
505 @PathParam("vnfInstanceId") String vnfInstanceId,
506 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
507 String requestId = getRequestId(requestContext);
508 HashMap<String, String> instanceIdMap = new HashMap<>();
509 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
510 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
511 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
512 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
516 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
517 @Consumes(MediaType.APPLICATION_JSON)
518 @Produces(MediaType.APPLICATION_JSON)
519 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
521 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
522 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
523 String requestId = getRequestId(requestContext);
524 HashMap<String, String> instanceIdMap = new HashMap<>();
525 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
526 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
527 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
528 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
533 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
534 @Consumes(MediaType.APPLICATION_JSON)
535 @Produces(MediaType.APPLICATION_JSON)
536 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
538 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
539 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
540 String requestId = getRequestId(requestContext);
541 HashMap<String, String> instanceIdMap = new HashMap<>();
542 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
543 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
544 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
549 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
550 @Consumes(MediaType.APPLICATION_JSON)
551 @Produces(MediaType.APPLICATION_JSON)
552 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
554 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
555 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
556 String requestId = getRequestId(requestContext);
557 HashMap<String, String> instanceIdMap = new HashMap<>();
558 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
559 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
560 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
564 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
565 @Consumes(MediaType.APPLICATION_JSON)
566 @Produces(MediaType.APPLICATION_JSON)
567 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
569 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
570 @PathParam("vnfInstanceId") String vnfInstanceId,
571 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
572 String requestId = getRequestId(requestContext);
573 HashMap<String, String> instanceIdMap = new HashMap<>();
574 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
575 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
576 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
577 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
581 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
582 @Consumes(MediaType.APPLICATION_JSON)
583 @Produces(MediaType.APPLICATION_JSON)
584 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
586 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
587 @PathParam("vnfInstanceId") String vnfInstanceId,
588 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
589 String requestId = getRequestId(requestContext);
590 HashMap<String, String> instanceIdMap = new HashMap<>();
591 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
592 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
593 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
594 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
598 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
599 @Consumes(MediaType.APPLICATION_JSON)
600 @Produces(MediaType.APPLICATION_JSON)
601 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
603 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
604 String requestId = getRequestId(requestContext);
605 HashMap<String, String> instanceIdMap = new HashMap<>();
606 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
607 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
611 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
612 @Consumes(MediaType.APPLICATION_JSON)
613 @Produces(MediaType.APPLICATION_JSON)
614 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
616 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
617 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
618 String requestId = getRequestId(requestContext);
619 HashMap<String, String> instanceIdMap = new HashMap<>();
620 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
621 instanceIdMap.put("networkInstanceId", networkInstanceId);
622 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
626 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
627 @Consumes(MediaType.APPLICATION_JSON)
628 @Produces(MediaType.APPLICATION_JSON)
629 @ApiOperation(value="Delete provided Network instance",response=Response.class)
631 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
632 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
633 String requestId = getRequestId(requestContext);
634 HashMap<String, String> instanceIdMap = new HashMap<>();
635 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
636 instanceIdMap.put("networkInstanceId", networkInstanceId);
637 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
641 @Path("/{version:[vV][7]}/instanceGroups")
642 @Consumes(MediaType.APPLICATION_JSON)
643 @Produces(MediaType.APPLICATION_JSON)
644 @ApiOperation(value="Create instanceGroups",response=Response.class)
646 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
647 String requestId = getRequestId(requestContext);
648 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
652 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
653 @Consumes(MediaType.APPLICATION_JSON)
654 @Produces(MediaType.APPLICATION_JSON)
655 @ApiOperation(value="Delete instanceGroup",response=Response.class)
657 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
658 String requestId = getRequestId(requestContext);
659 HashMap<String, String> instanceIdMap = new HashMap<>();
660 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
661 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
665 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
666 @Consumes(MediaType.APPLICATION_JSON)
667 @Produces(MediaType.APPLICATION_JSON)
668 @ApiOperation(value="Add instanceGroup members",response=Response.class)
670 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
671 String requestId = getRequestId(requestContext);
672 HashMap<String, String> instanceIdMap = new HashMap<>();
673 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
674 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
678 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
679 @Consumes(MediaType.APPLICATION_JSON)
680 @Produces(MediaType.APPLICATION_JSON)
681 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
683 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
684 String requestId = getRequestId(requestContext);
685 HashMap<String, String> instanceIdMap = new HashMap<>();
686 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
687 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
690 public String getRequestUri(ContainerRequestContext context){
691 String requestUri = context.getUriInfo().getPath();
692 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
693 MDC.put(LogConstants.HTTP_URL, httpUrl);
694 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
698 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
699 MultivaluedMap<String, String> headers = context.getHeaders();
700 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
701 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
703 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
704 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
706 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
707 throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
711 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
712 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
713 Boolean aLaCarte = null;
714 long startTime = System.currentTimeMillis ();
715 ServiceInstancesRequest sir = null;
716 String apiVersion = version.substring(1);
718 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
719 String requestScope = deriveRequestScope(action, sir, requestUri);
720 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
721 if(sir.getRequestDetails().getRequestParameters() != null){
722 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
724 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
725 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
727 int requestVersion = Integer.parseInt(version.substring(1));
728 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
729 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
730 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
731 String networkType = msoRequest.getNetworkType(sir,requestScope);
732 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
733 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
735 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
736 currentActiveReq.setVnfType(vnfType);
737 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
738 currentActiveReq.setNetworkType(networkType);
741 InfraActiveRequests dup = null;
742 boolean inProgress = false;
744 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
747 inProgress = camundaHistoryCheck(dup, currentActiveReq);
750 if (dup != null && inProgress) {
751 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
753 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
755 RequestReferences referencesResponse = new RequestReferences();
757 referencesResponse.setRequestId(requestId);
759 serviceResponse.setRequestReferences(referencesResponse);
760 Boolean isBaseVfModule = false;
762 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
763 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
765 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
766 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
767 modelType = ModelType.vnf;
768 }else if(action == Action.addMembers || action == Action.removeMembers){
769 modelType = ModelType.instanceGroup;
771 modelType =modelInfo.getModelType();
774 if (modelType.equals(ModelType.vfModule)) {
777 // Get VF Module-specific base module indicator
780 String modelVersionId = modelInfo.getModelVersionId();
782 if(modelVersionId != null) {
783 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
784 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
785 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
789 if (vfm.getIsBase()) {
790 isBaseVfModule = true;
792 } else if (action == Action.createInstance || action == Action.updateInstance) {
793 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
794 // This request cannot proceed
796 String serviceVersionText = "";
797 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
798 serviceVersionText = " with version " + sdcServiceModelVersion;
801 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
802 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
803 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
804 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
806 throw vfModuleException;
811 serviceInstanceId = "";
813 String vfModuleId = "";
814 String volumeGroupId = "";
815 String networkId = "";
816 String pnfCorrelationId = "";
817 String instanceGroupId = null;
818 if(sir.getServiceInstanceId () != null){
819 serviceInstanceId = sir.getServiceInstanceId ();
822 if(sir.getVnfInstanceId () != null){
823 vnfId = sir.getVnfInstanceId ();
826 if(sir.getVfModuleInstanceId () != null){
827 vfModuleId = sir.getVfModuleInstanceId ();
830 if(sir.getVolumeGroupInstanceId () != null){
831 volumeGroupId = sir.getVolumeGroupInstanceId ();
834 if(sir.getNetworkInstanceId () != null){
835 networkId = sir.getNetworkInstanceId ();
837 if(sir.getInstanceGroupId() != null){
838 instanceGroupId = sir.getInstanceGroupId();
841 pnfCorrelationId = getPnfCorrelationId(sir);
844 infraActiveRequestsClient.save(currentActiveReq);
846 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
847 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
848 .errorInfo(errorLoggerInfo).build();
851 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
853 }else if(aLaCarte == null){
857 RequestClientParameter requestClientParameter = null;
859 requestClientParameter = new RequestClientParameter.Builder()
860 .setRequestId(requestId)
861 .setBaseVfModule(isBaseVfModule)
862 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
863 .setRequestAction(action.toString())
864 .setServiceInstanceId(serviceInstanceId)
865 .setPnfCorrelationId(pnfCorrelationId)
867 .setVfModuleId(vfModuleId)
868 .setVolumeGroupId(volumeGroupId)
869 .setNetworkId(networkId)
870 .setServiceType(serviceInstanceType)
872 .setVfModuleType(vfModuleType)
873 .setNetworkType(networkType)
874 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
875 .setApiVersion(apiVersion)
876 .setALaCarte(aLaCarte)
877 .setRequestUri(requestUri)
878 .setInstanceGroupId(instanceGroupId).build();
879 } catch (IOException e) {
880 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
881 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
882 .errorInfo(errorLoggerInfo).build();
884 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
886 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
887 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
888 Boolean aLaCarte = true;
889 long startTime = System.currentTimeMillis ();
890 String apiVersion = version.substring(1);
891 ServiceInstancesRequest sir = new ServiceInstancesRequest();
892 sir.setInstanceGroupId(instanceGroupId);
894 String requestScope = ModelType.instanceGroup.toString();
895 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
896 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
898 validateHeaders(requestContext);
899 } catch (ValidationException e) {
900 logger.error("Exception occurred", e);
901 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
902 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
903 .errorInfo(errorLoggerInfo).build();
904 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
905 throw validateException;
908 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
909 boolean inProgress = false;
912 inProgress = camundaHistoryCheck(dup, currentActiveReq);
915 if (dup != null && inProgress) {
916 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
919 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
921 RequestReferences referencesResponse = new RequestReferences();
923 referencesResponse.setRequestId(requestId);
925 serviceResponse.setRequestReferences(referencesResponse);
926 Boolean isBaseVfModule = false;
928 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
931 infraActiveRequestsClient.save(currentActiveReq);
933 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
934 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
935 .errorInfo(errorLoggerInfo).build();
938 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
939 .setRequestId(requestId)
940 .setBaseVfModule(isBaseVfModule)
941 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
942 .setRequestAction(action.toString())
943 .setApiVersion(apiVersion)
944 .setALaCarte(aLaCarte)
945 .setRequestUri(requestUri)
946 .setInstanceGroupId(instanceGroupId).build();
948 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
951 private String getPnfCorrelationId(ServiceInstancesRequest sir) {
952 return Optional.of(sir)
953 .map(ServiceInstancesRequest::getRequestDetails)
954 .map(RequestDetails::getRequestParameters)
955 .map(parameters -> parameters.getUserParamValue("pnfId"))
959 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
960 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
961 return (ModelType.vnf.name());
962 }else if(action == Action.addMembers || action == Action.removeMembers){
963 return(ModelType.instanceGroup.toString());
966 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
967 requestScope = requestScopeFromUri(requestUri);
969 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
974 private String requestScopeFromUri(String requestUri){
976 if(requestUri.contains(ModelType.network.name())){
977 requestScope = ModelType.network.name();
978 }else if(requestUri.contains(ModelType.vfModule.name())){
979 requestScope = ModelType.vfModule.name();
980 }else if(requestUri.contains(ModelType.volumeGroup.name())){
981 requestScope = ModelType.volumeGroup.name();
982 }else if(requestUri.contains(ModelType.configuration.name())){
983 requestScope = ModelType.configuration.name();
984 }else if(requestUri.contains(ModelType.vnf.name())){
985 requestScope = ModelType.vnf.name();
987 requestScope = ModelType.service.name();
991 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
992 RequestClient requestClient = null;
993 HttpResponse response = null;
995 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
996 response = requestClient.post(requestClientParameter);
997 } catch (Exception e) {
999 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1000 String url = requestClient != null ? requestClient.getUrl() : "";
1001 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
1002 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1004 throw clientException;
1007 if (response == null) {
1009 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1010 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1012 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1014 throw clientException;
1017 ResponseHandler respHandler = null;
1018 int bpelStatus = 500;
1020 respHandler = new ResponseHandler (response, requestClient.getType ());
1021 bpelStatus = respHandler.getStatus ();
1022 } catch (ApiException e) {
1023 logger.error("Exception occurred", e);
1024 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1025 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1026 .errorInfo(errorLoggerInfo).build();
1027 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1028 throw validateException;
1031 // BPEL accepted the request, the request is in progress
1032 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1033 ServiceInstancesResponse jsonResponse;
1034 CamundaResponse camundaResp = respHandler.getResponse();
1036 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1038 ObjectMapper mapper = new ObjectMapper();
1039 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1040 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1041 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1042 if(selfLinkUrl.isPresent()){
1043 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1045 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1047 } catch (IOException e) {
1048 logger.error("Exception occurred", e);
1049 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1050 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1051 .errorInfo(errorLoggerInfo).build();
1052 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1053 throw validateException;
1055 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1059 List<String> variables = new ArrayList<>();
1060 variables.add(bpelStatus + "");
1061 String camundaJSONResponseBody = respHandler.getResponseBody ();
1062 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1064 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1065 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1066 .errorInfo(errorLoggerInfo).build();
1068 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1070 throw bpmnException;
1073 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1076 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1077 .errorInfo(errorLoggerInfo).build();
1078 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1080 throw servException;
1084 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1085 if(StringUtils.isNotBlank(instanceId)) {
1086 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1087 currentActiveReq.setServiceInstanceId(instanceId);
1088 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1089 currentActiveReq.setVnfId(instanceId);
1090 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1091 currentActiveReq.setVfModuleId(instanceId);
1092 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1093 currentActiveReq.setVolumeGroupId(instanceId);
1094 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1095 currentActiveReq.setNetworkId(instanceId);
1096 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1097 currentActiveReq.setConfigurationId(instanceId);
1098 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1099 currentActiveReq.setInstanceGroupId(instanceId);
1101 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1102 if(instanceIdMap.get("serviceInstanceId") != null){
1103 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1105 if(instanceIdMap.get("vnfInstanceId") != null){
1106 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1108 if(instanceIdMap.get("vfModuleInstanceId") != null){
1109 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1111 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1112 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1114 if(instanceIdMap.get("networkInstanceId") != null){
1115 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1117 if(instanceIdMap.get("configurationInstanceId") != null){
1118 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1120 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1121 currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1126 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1127 ObjectMapper mapper = new ObjectMapper();
1128 mapper.setSerializationInclusion(Include.NON_NULL);
1129 if(msoRawRequest != null){
1130 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1131 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
1132 serviceInstRequest.getRequestDetails() != null &&
1133 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1134 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1135 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1137 logger.debug("Value as string: {}", mapper.writeValueAsString(sir));
1138 return mapper.writeValueAsString(sir);
1143 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1144 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1146 // Found the duplicate record. Return the appropriate error.
1147 String instance = null;
1148 if(instanceName != null){
1149 instance = instanceName;
1151 instance = instanceIdMap.get(requestScope + "InstanceId");
1153 //List<String> variables = new ArrayList<String>();
1154 //variables.add(dup.getRequestStatus());
1155 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1158 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1159 .errorInfo(errorLoggerInfo).build();
1161 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1166 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1167 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1168 InfraActiveRequests dup = null;
1170 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1171 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1173 } catch (Exception e) {
1174 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1175 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1176 .errorInfo(errorLoggerInfo).build();
1177 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1178 throw requestDbFailureException;
1182 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1183 String requestId = duplicateRecord.getRequestId();
1184 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1185 String targetUrl = env.getProperty("mso.camundaURL") + path;
1186 HttpHeaders headers = setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1187 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1188 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1190 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1191 }catch(HttpStatusCodeException e){
1192 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1193 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1194 .errorInfo(errorLoggerInfo).build();
1195 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1196 throw contactCamundaException;
1198 if(response.getBody().isEmpty()){
1199 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1201 for(HistoricProcessInstance instance : response.getBody()){
1202 if(instance.getState().equals("ACTIVE")){
1205 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1210 protected HttpHeaders setCamundaHeaders(String auth, String msoKey) {
1211 HttpHeaders headers = new HttpHeaders();
1212 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1213 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1214 headers.setAccept(acceptableMediaTypes);
1216 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1217 if(userCredentials != null) {
1218 headers.add(HttpHeaders.AUTHORIZATION, "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
1220 } catch(GeneralSecurityException e) {
1221 logger.error("Security exception", e);
1226 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1227 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1229 ObjectMapper mapper = new ObjectMapper();
1230 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1232 } catch (IOException e) {
1234 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1236 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1237 .errorInfo(errorLoggerInfo).build();
1238 String requestScope = requestScopeFromUri(requestUri);
1240 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1242 throw validateException;
1246 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1247 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1248 int reqVersion = Integer.parseInt(version.substring(1));
1250 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1251 } catch (Exception e) {
1252 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1253 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1254 .errorInfo(errorLoggerInfo).build();
1256 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1258 throw validateException;
1262 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1263 InfraActiveRequests currentActiveReq) throws ApiException {
1264 RecipeLookupResult recipeLookupResult = null;
1265 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1266 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1267 // Query MSO Catalog DB
1269 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1270 recipeLookupResult = getDefaultVnfUri(sir, action);
1271 }else if(action == Action.addMembers || action == Action.removeMembers){
1272 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1273 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1275 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1276 } catch (IOException e) {
1277 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1280 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1281 .errorInfo(errorLoggerInfo).build();
1283 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1285 throw validateException;
1287 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1288 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1290 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1291 } catch (ValidationException e) {
1292 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1295 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1296 .errorInfo(errorLoggerInfo).build();
1298 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1300 throw validateException;
1302 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1304 recipeLookupResult = getNetworkUri( sir, action);
1305 } catch (ValidationException e) {
1307 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1310 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1311 .errorInfo(errorLoggerInfo).build();
1312 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1314 throw validateException;
1316 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1317 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1320 if (recipeLookupResult == null) {
1321 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1324 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1325 .errorInfo(errorLoggerInfo).build();
1327 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1328 throw recipeNotFoundExceptionException;
1330 return recipeLookupResult;
1333 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1335 // Construct the default service name
1336 // TODO need to make this a configurable property
1337 String defaultServiceModelName = getDefaultModel(servInstReq);
1338 RequestDetails requestDetails = servInstReq.getRequestDetails();
1339 ModelInfo modelInfo = requestDetails.getModelInfo();
1340 org.onap.so.db.catalog.beans.Service serviceRecord;
1341 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1342 ServiceRecipe recipe = null;
1345 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1346 if(serviceRecord !=null){
1347 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1350 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1351 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1352 if (recipe == null){
1353 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1354 if(!serviceRecordList.isEmpty()){
1355 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1356 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1365 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1366 RequestParameters reqParam = requestDetails.getRequestParameters();
1367 if(reqParam!=null && alaCarteFlag && recipe==null){
1369 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1370 mapToLegacyRequest(requestDetails);
1371 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1372 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1373 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1375 if(modelInfo.getModelVersionId() == null) {
1376 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1381 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1384 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1385 RequestParameters reqParam;
1386 if (requestDetails.getRequestParameters() == null) {
1387 reqParam = new RequestParameters();
1389 reqParam = requestDetails.getRequestParameters();
1391 if(requestDetails.getCloudConfiguration() == null) {
1392 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1393 if(cloudConfig != null) {
1394 requestDetails.setCloudConfiguration(cloudConfig);
1398 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1399 if(!userParams.isEmpty()) {
1400 if (reqParam == null) {
1401 requestDetails.setRequestParameters(new RequestParameters());
1403 requestDetails.getRequestParameters().setUserParams(userParams);
1407 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1409 for(Map<String, Object> params : reqParams.getUserParams()){
1410 if(params.containsKey("service")){
1411 Service service = serviceMapper(params);
1413 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1415 if (targetConfiguration.isPresent()) {
1416 return targetConfiguration.get();
1418 for(Networks network : service.getResources().getNetworks()) {
1419 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1420 if(targetConfiguration.isPresent()) {
1421 return targetConfiguration.get();
1425 for(Vnfs vnf : service.getResources().getVnfs()) {
1426 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1428 if(targetConfiguration.isPresent()) {
1429 return targetConfiguration.get();
1432 for(VfModules vfModule : vnf.getVfModules()) {
1433 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1435 if(targetConfiguration.isPresent()) {
1436 return targetConfiguration.get();
1447 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1448 CloudConfiguration targetConfiguration = new CloudConfiguration();
1449 if(sourceCloudConfiguration != null) {
1450 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1451 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1452 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1453 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1454 return Optional.of(targetConfiguration);
1456 return Optional.empty();
1459 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1460 logger.debug("Configuring UserParams for Macro Request");
1461 Map<String, Object> userParams = new HashMap<>();
1463 for(Map<String, Object> params : reqParams.getUserParams()){
1464 if(params.containsKey("service")){
1465 Service service = serviceMapper(params);
1467 addUserParams(userParams, service.getInstanceParams());
1469 for(Networks network : service.getResources().getNetworks()) {
1470 addUserParams(userParams, network.getInstanceParams());
1473 for(Vnfs vnf: service.getResources().getVnfs()) {
1474 addUserParams(userParams, vnf.getInstanceParams());
1476 for(VfModules vfModule: vnf.getVfModules()) {
1477 addUserParams(userParams, vfModule.getInstanceParams());
1483 return mapFlatMapToNameValue(userParams);
1486 private Service serviceMapper(Map<String, Object> params)
1487 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1488 ObjectMapper obj = new ObjectMapper();
1489 String input = obj.writeValueAsString(params.get("service"));
1490 return obj.readValue(input, Service.class);
1493 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1494 for(Map<String, String> map : sourceUserParams) {
1495 for (Map.Entry<String, String> entry : map.entrySet()) {
1496 targetUserParams.put(entry.getKey(), entry.getValue());
1501 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1502 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1504 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1505 Map<String, Object> targetMap = new HashMap<>();
1506 targetMap.put(NAME, map.getKey());
1507 targetMap.put(VALUE, map.getValue());
1508 targetUserParams.add(targetMap);
1510 return targetUserParams;
1513 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1515 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1516 String vnfComponentType = modelInfo.getModelType().name();
1518 RelatedInstanceList[] instanceList = null;
1519 if (servInstReq.getRequestDetails() != null) {
1520 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1523 Recipe recipe = null;
1524 String defaultSource = getDefaultModel(servInstReq);
1525 String modelCustomizationId = modelInfo.getModelCustomizationId();
1526 String modelCustomizationName = modelInfo.getModelCustomizationName();
1527 String relatedInstanceModelVersionId = null;
1528 String relatedInstanceModelInvariantId = null;
1529 String relatedInstanceVersion = null;
1530 String relatedInstanceModelCustomizationName = null;
1532 if (instanceList != null) {
1534 for(RelatedInstanceList relatedInstanceList : instanceList){
1536 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1537 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1538 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1539 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1540 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1543 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1544 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1545 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1546 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1547 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1551 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1552 // a. For a vnf request (only create, no update currently):
1553 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1554 // 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
1555 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1556 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1557 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1558 // (MODEL_UUID) in SERVICE table.
1559 // 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
1560 // during 1707 data migration if VID did not provide it originally on request.
1561 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1562 // 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.
1564 VnfResource vnfResource = null;
1565 VnfResourceCustomization vrc=null;
1566 // Validation for vnfResource
1568 if(modelCustomizationId!=null) {
1569 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1571 vnfResource = vrc.getVnfResources();
1574 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1575 if(service == null) {
1576 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1579 if(service == null) {
1580 throw new ValidationException("service in relatedInstance");
1582 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1583 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1584 vrc=vnfResourceCustom;
1589 vnfResource = vrc.getVnfResources();
1590 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1591 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1595 if(vnfResource==null){
1596 throw new ValidationException("vnfResource");
1598 if(modelInfo.getModelVersionId() == null) {
1599 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1603 VnfRecipe vnfRecipe = null;
1606 String nfRole = vrc.getNfRole();
1607 if(nfRole != null) {
1608 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1612 if(vnfRecipe == null) {
1613 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1616 if (vnfRecipe == null) {
1620 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1622 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1623 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1624 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1625 // 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.
1626 // 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
1627 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1628 // 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)
1629 // and MODEL_VERSION (modelVersion).
1631 VfModuleCustomization vfmc = null;
1633 VnfResourceCustomization vnfrc;
1634 VfModule vfModule = null;
1636 if(modelInfo.getModelCustomizationId() != null) {
1637 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1639 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1641 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1643 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1645 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1647 String vfModuleModelUUID = modelInfo.getModelVersionId();
1648 for(VfModuleCustomization vf : list) {
1649 VfModuleCustomization vfmCustom;
1650 if(vfModuleModelUUID != null){
1651 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1652 if(vfmCustom != null){
1653 vfModule = vfmCustom.getVfModule();
1656 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1657 if(vfmCustom != null){
1658 vfModule = vfmCustom.getVfModule();
1660 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1664 if(vfModule != null) {
1665 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1666 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1672 if(vfmc == null && vfModule == null) {
1673 throw new ValidationException("vfModuleCustomization");
1674 } else if (vfModule == null && vfmc != null) {
1675 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1678 if(modelInfo.getModelVersionId() == null) {
1679 modelInfo.setModelVersionId(vfModule.getModelUUID());
1683 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1685 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1686 if(!vfModuleRecords.isEmpty()){
1687 for(VfModule record : vfModuleRecords){
1688 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1695 if(recipe == null) {
1696 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1697 if (recipe == null) {
1698 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1701 if(recipe == null) {
1708 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1709 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1710 if (recipe == null) {
1714 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1716 if (recipe == null) {
1722 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1725 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1727 String defaultSource = getDefaultModel(sir);
1729 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1731 if (vnfRecipe == null) {
1735 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1739 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1741 String defaultNetworkType = getDefaultModel(sir);
1743 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1744 String modelName = modelInfo.getModelName();
1745 Recipe recipe = null;
1747 if(modelInfo.getModelCustomizationId()!=null){
1748 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1749 if(networkResourceCustomization != null){
1750 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1751 if(networkResource!=null){
1752 if(modelInfo.getModelVersionId() == null) {
1753 modelInfo.setModelVersionId(networkResource.getModelUUID());
1755 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1757 throw new ValidationException("no catalog entry found");
1759 }else if(action != Action.deleteInstance){
1760 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1763 //ok for version < 3 and action delete
1764 if(modelName != null){
1765 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1770 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1773 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1776 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1777 String requestTestApi = null;
1778 TestApi testApi = null;
1780 if (requestParams != null) {
1781 requestTestApi = requestParams.getTestApi();
1784 if (requestTestApi == null) {
1785 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1786 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1788 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1793 testApi = TestApi.valueOf(requestTestApi);
1794 return Optional.of(testApi.getModelName());
1795 } catch (Exception e) {
1796 logger.warn("Catching the exception on the valueOf enum call and continuing", e);
1797 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1801 private String getDefaultModel(ServiceInstancesRequest sir) {
1802 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1803 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1804 if (oModelName.isPresent()) {
1805 defaultModel = oModelName.get();
1807 return defaultModel;
1810 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1811 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1812 Boolean aLaCarte = null;
1813 String apiVersion = version.substring(1);
1814 boolean inProgress = false;
1816 long startTime = System.currentTimeMillis ();
1817 ServiceInstancesRequest sir = null;
1819 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1820 String requestScope = deriveRequestScope(action,sir, requestUri);
1821 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1822 if(sir.getRequestDetails().getRequestParameters() != null){
1823 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1825 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1826 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1827 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1829 InfraActiveRequests dup = null;
1831 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1834 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1837 if (instanceIdMap != null && dup != null && inProgress) {
1838 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1841 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1842 RequestReferences referencesResponse = new RequestReferences();
1843 referencesResponse.setRequestId(requestId);
1844 serviceResponse.setRequestReferences(referencesResponse);
1847 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1848 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1850 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1851 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1853 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1856 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1857 .errorInfo(errorLoggerInfo).build();
1859 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1861 throw validateException;
1865 serviceInstanceId = "";
1866 String configurationId = "";
1867 String pnfCorrelationId = "";
1869 if(sir.getServiceInstanceId () != null){
1870 serviceInstanceId = sir.getServiceInstanceId ();
1873 if(sir.getConfigurationId() != null){
1874 configurationId = sir.getConfigurationId();
1877 pnfCorrelationId = getPnfCorrelationId(sir);
1880 infraActiveRequestsClient.save(currentActiveReq);
1881 }catch(Exception e){
1882 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1883 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1884 .errorInfo(errorLoggerInfo).build();
1887 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1889 }else if(aLaCarte == null){
1892 RequestClientParameter requestClientParameter = null;
1894 requestClientParameter = new RequestClientParameter.Builder()
1895 .setRequestId(requestId)
1896 .setBaseVfModule(false)
1897 .setRecipeTimeout(Integer.parseInt(timeOut))
1898 .setRequestAction(action.toString())
1899 .setServiceInstanceId(serviceInstanceId)
1900 .setPnfCorrelationId(pnfCorrelationId)
1901 .setConfigurationId(configurationId)
1902 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1903 .setApiVersion(apiVersion)
1904 .setALaCarte(aLaCarte)
1905 .setRequestUri(requestUri).build();
1906 } catch (IOException e) {
1907 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1908 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1909 .errorInfo(errorLoggerInfo).build();
1912 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1915 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1916 String requestId = null;
1917 if (requestContext.getProperty("requestId") != null) {
1918 requestId = requestContext.getProperty("requestId").toString();
1920 if (UUIDChecker.isValidUUID(requestId)) {
1923 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1924 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1925 .errorInfo(errorLoggerInfo).build();
1927 throw validateException;
1930 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1931 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1932 aq.setStatusMessage (errorMessage);
1933 aq.setProgress(new Long(100));
1934 aq.setRequestStatus(status.toString());
1935 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1936 aq.setEndTime (endTimeStamp);
1938 infraActiveRequestsClient.save(aq);
1939 }catch(Exception e){
1940 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1941 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1942 .errorInfo(errorLoggerInfo).build();
1946 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1947 String serviceType = null;
1948 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1949 String defaultServiceModelName = getDefaultModel(sir);
1950 org.onap.so.db.catalog.beans.Service serviceRecord;
1952 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1953 if(serviceRecord != null){
1954 serviceType = serviceRecord.getServiceType();
1957 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1958 if(serviceRecord != null){
1959 serviceType = serviceRecord.getServiceType();
1961 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1962 if(serviceRecord != null){
1963 serviceType = serviceRecord.getServiceType();
1968 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);