2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.so.apihandlerinfra;
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
26 import com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.logging.ref.slf4j.ONAPLogConstants;
36 import org.onap.so.apihandler.camundabeans.CamundaResponse;
37 import org.onap.so.apihandler.common.CommonConstants;
38 import org.onap.so.apihandler.common.ErrorNumbers;
39 import org.onap.so.apihandler.common.RequestClient;
40 import org.onap.so.apihandler.common.RequestClientFactory;
41 import org.onap.so.apihandler.common.RequestClientParameter;
42 import org.onap.so.apihandler.common.ResponseBuilder;
43 import org.onap.so.apihandler.common.ResponseHandler;
44 import org.onap.so.apihandlerinfra.exceptions.ApiException;
45 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
46 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
47 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
48 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
49 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
50 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
51 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
52 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
53 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
54 import org.onap.so.db.catalog.beans.NetworkResource;
55 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
56 import org.onap.so.db.catalog.beans.Recipe;
57 import org.onap.so.db.catalog.beans.ServiceRecipe;
58 import org.onap.so.db.catalog.beans.VfModule;
59 import org.onap.so.db.catalog.beans.VfModuleCustomization;
60 import org.onap.so.db.catalog.beans.VnfRecipe;
61 import org.onap.so.db.catalog.beans.VnfResource;
62 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
63 import org.onap.so.db.catalog.client.CatalogDbClient;
64 import org.onap.so.db.request.beans.InfraActiveRequests;
65 import org.onap.so.db.request.client.RequestsDbClient;
66 import org.onap.so.exceptions.ValidationException;
67 import org.onap.so.logger.LogConstants;
68 import org.onap.so.logger.MessageEnum;
69 import org.onap.so.logger.MsoLogger;
70 import org.onap.so.serviceinstancebeans.CloudConfiguration;
71 import org.onap.so.serviceinstancebeans.ModelInfo;
72 import org.onap.so.serviceinstancebeans.ModelType;
73 import org.onap.so.serviceinstancebeans.Networks;
74 import org.onap.so.serviceinstancebeans.RelatedInstance;
75 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
76 import org.onap.so.serviceinstancebeans.RequestDetails;
77 import org.onap.so.serviceinstancebeans.RequestParameters;
78 import org.onap.so.serviceinstancebeans.RequestReferences;
79 import org.onap.so.serviceinstancebeans.Service;
80 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
81 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
82 import org.onap.so.serviceinstancebeans.VfModules;
83 import org.onap.so.serviceinstancebeans.Vnfs;
84 import org.onap.so.utils.UUIDChecker;
86 import org.springframework.beans.factory.annotation.Autowired;
87 import org.springframework.core.ParameterizedTypeReference;
88 import org.springframework.core.env.Environment;
89 import org.springframework.http.HttpEntity;
90 import org.springframework.http.HttpHeaders;
91 import org.springframework.http.HttpMethod;
92 import org.springframework.http.ResponseEntity;
93 import org.springframework.stereotype.Component;
94 import org.springframework.web.client.HttpStatusCodeException;
95 import org.springframework.web.client.RestTemplate;
96 import org.camunda.bpm.engine.history.HistoricProcessInstance;
97 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
99 import javax.transaction.Transactional;
100 import javax.ws.rs.Consumes;
101 import javax.ws.rs.DELETE;
102 import javax.ws.rs.POST;
103 import javax.ws.rs.PUT;
104 import javax.ws.rs.Path;
105 import javax.ws.rs.PathParam;
106 import javax.ws.rs.Produces;
107 import javax.ws.rs.container.ContainerRequestContext;
108 import javax.ws.rs.core.Context;
109 import javax.ws.rs.core.MediaType;
110 import javax.ws.rs.core.MultivaluedMap;
111 import javax.ws.rs.core.Response;
112 import java.io.IOException;
114 import java.sql.Timestamp;
115 import java.util.ArrayList;
116 import java.util.HashMap;
117 import java.util.List;
118 import java.util.Map;
119 import java.util.Optional;
122 @Path("/onap/so/infra/serviceInstantiation")
123 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
124 public class ServiceInstances {
126 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
127 private static String NAME = "name";
128 private static String VALUE = "value";
129 private static final String SAVE_TO_DB = "save instance to db";
132 private Environment env;
135 private RequestClientFactory reqClientFactory;
138 private CatalogDbClient catalogDbClient;
141 private RequestsDbClient infraActiveRequestsClient;
144 private ResponseBuilder builder;
147 private MsoRequest msoRequest;
150 private RestTemplate restTemplate;
153 @Path("/{version:[vV][5-7]}/serviceInstances")
154 @Consumes(MediaType.APPLICATION_JSON)
155 @Produces(MediaType.APPLICATION_JSON)
156 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
158 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
159 String requestId = getRequestId(requestContext);
160 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
164 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
165 @Consumes(MediaType.APPLICATION_JSON)
166 @Produces(MediaType.APPLICATION_JSON)
167 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
169 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
170 String requestId = getRequestId(requestContext);
171 HashMap<String, String> instanceIdMap = new HashMap<>();
172 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
173 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
177 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
178 @Consumes(MediaType.APPLICATION_JSON)
179 @Produces(MediaType.APPLICATION_JSON)
180 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
182 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
183 String requestId = getRequestId(requestContext);
184 HashMap<String, String> instanceIdMap = new HashMap<>();
185 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
186 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
190 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
191 @Consumes(MediaType.APPLICATION_JSON)
192 @Produces(MediaType.APPLICATION_JSON)
193 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
195 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
196 String requestId = getRequestId(requestContext);
197 HashMap<String, String> instanceIdMap = new HashMap<>();
198 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
199 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
203 @Path("/{version:[vV][7]}/serviceInstances/assign")
204 @Consumes(MediaType.APPLICATION_JSON)
205 @Produces(MediaType.APPLICATION_JSON)
206 @ApiOperation(value="Assign Service Instance", response=Response.class)
208 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
209 String requestId = getRequestId(requestContext);
210 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
214 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
215 @Consumes(MediaType.APPLICATION_JSON)
216 @Produces(MediaType.APPLICATION_JSON)
217 @ApiOperation(value="Unassign Service Instance", response=Response.class)
219 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
220 String requestId = getRequestId(requestContext);
221 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
222 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
223 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
227 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
228 @Consumes(MediaType.APPLICATION_JSON)
229 @Produces(MediaType.APPLICATION_JSON)
230 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
232 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
233 String requestId = getRequestId(requestContext);
234 HashMap<String, String> instanceIdMap = new HashMap<>();
235 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
240 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
241 @Consumes(MediaType.APPLICATION_JSON)
242 @Produces(MediaType.APPLICATION_JSON)
243 @ApiOperation(value="Delete provided Port",response=Response.class)
245 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
246 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
247 String requestId = getRequestId(requestContext);
248 HashMap<String, String> instanceIdMap = new HashMap<>();
249 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
250 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
251 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
255 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
256 @Consumes(MediaType.APPLICATION_JSON)
257 @Produces(MediaType.APPLICATION_JSON)
258 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
260 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
261 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
262 String requestId = getRequestId(requestContext);
263 HashMap<String, String> instanceIdMap = new HashMap<>();
264 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
265 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
266 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
270 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
271 @Consumes(MediaType.APPLICATION_JSON)
272 @Produces(MediaType.APPLICATION_JSON)
273 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
275 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
276 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
277 String requestId = getRequestId(requestContext);
278 HashMap<String, String> instanceIdMap = new HashMap<>();
279 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
280 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
281 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
285 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
286 @Consumes(MediaType.APPLICATION_JSON)
287 @Produces(MediaType.APPLICATION_JSON)
288 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
290 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
291 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
292 String requestId = getRequestId(requestContext);
293 HashMap<String, String> instanceIdMap = new HashMap<>();
294 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
295 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
296 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
300 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
301 @Consumes(MediaType.APPLICATION_JSON)
302 @Produces(MediaType.APPLICATION_JSON)
303 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
305 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
306 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
307 String requestId = getRequestId(requestContext);
308 HashMap<String, String> instanceIdMap = new HashMap<>();
309 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
310 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
311 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
315 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
316 @Consumes(MediaType.APPLICATION_JSON)
317 @Produces(MediaType.APPLICATION_JSON)
318 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
320 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
321 String requestId = getRequestId(requestContext);
322 HashMap<String, String> instanceIdMap = new HashMap<>();
323 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
324 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
328 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
329 @Consumes(MediaType.APPLICATION_JSON)
330 @Produces(MediaType.APPLICATION_JSON)
331 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
333 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
334 String requestId = getRequestId(requestContext);
335 HashMap<String, String> instanceIdMap = new HashMap<>();
336 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
337 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
341 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
342 @Consumes(MediaType.APPLICATION_JSON)
343 @Produces(MediaType.APPLICATION_JSON)
344 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
346 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
347 String requestId = getRequestId(requestContext);
348 HashMap<String, String> instanceIdMap = new HashMap<>();
349 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
350 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
354 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
355 @Consumes(MediaType.APPLICATION_JSON)
356 @Produces(MediaType.APPLICATION_JSON)
357 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
359 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
360 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
361 String requestId = getRequestId(requestContext);
362 HashMap<String, String> instanceIdMap = new HashMap<>();
363 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
364 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
365 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
369 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
370 @Consumes(MediaType.APPLICATION_JSON)
371 @Produces(MediaType.APPLICATION_JSON)
372 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
374 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
375 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
376 String requestId = getRequestId(requestContext);
377 HashMap<String, String> instanceIdMap = new HashMap<>();
378 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
379 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
380 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
384 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
385 @Consumes(MediaType.APPLICATION_JSON)
386 @Produces(MediaType.APPLICATION_JSON)
387 @ApiOperation(value="Apply updated configuration",response=Response.class)
388 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
389 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
390 String requestId = getRequestId(requestContext);
391 HashMap<String, String> instanceIdMap = new HashMap<>();
392 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
393 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
394 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
398 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
399 @Consumes(MediaType.APPLICATION_JSON)
400 @Produces(MediaType.APPLICATION_JSON)
401 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
402 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
403 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
404 String requestId = getRequestId(requestContext);
405 HashMap<String, String> instanceIdMap = new HashMap<>();
406 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
407 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
408 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
413 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
414 @Consumes(MediaType.APPLICATION_JSON)
415 @Produces(MediaType.APPLICATION_JSON)
416 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
418 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
419 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
420 String requestId = getRequestId(requestContext);
421 HashMap<String, String> instanceIdMap = new HashMap<>();
422 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
423 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
424 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
428 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
429 @Consumes(MediaType.APPLICATION_JSON)
430 @Produces(MediaType.APPLICATION_JSON)
431 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
433 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
434 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
435 String requestId = getRequestId(requestContext);
436 HashMap<String, String> instanceIdMap = new HashMap<>();
437 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
438 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
439 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
443 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
444 @Consumes(MediaType.APPLICATION_JSON)
445 @Produces(MediaType.APPLICATION_JSON)
446 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
448 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
449 @PathParam("vnfInstanceId") String vnfInstanceId,
450 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
451 String requestId = getRequestId(requestContext);
452 HashMap<String, String> instanceIdMap = new HashMap<>();
453 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
454 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
455 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
456 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
460 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
461 @Consumes(MediaType.APPLICATION_JSON)
462 @Produces(MediaType.APPLICATION_JSON)
463 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
465 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
466 @PathParam("vnfInstanceId") String vnfInstanceId,
467 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
468 String requestId = getRequestId(requestContext);
469 HashMap<String, String> instanceIdMap = new HashMap<>();
470 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
471 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
472 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
473 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
477 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
478 @Consumes(MediaType.APPLICATION_JSON)
479 @Produces(MediaType.APPLICATION_JSON)
480 @ApiOperation(value="Perform VNF software update",response=Response.class)
482 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
483 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
484 String requestId = getRequestId(requestContext);
485 HashMap<String, String> instanceIdMap = new HashMap<>();
486 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
487 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
488 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
492 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
493 @Consumes(MediaType.APPLICATION_JSON)
494 @Produces(MediaType.APPLICATION_JSON)
495 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
497 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
498 @PathParam("vnfInstanceId") String vnfInstanceId,
499 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
500 String requestId = getRequestId(requestContext);
501 HashMap<String, String> instanceIdMap = new HashMap<>();
502 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
503 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
504 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
505 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
509 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
510 @Consumes(MediaType.APPLICATION_JSON)
511 @Produces(MediaType.APPLICATION_JSON)
512 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
514 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
515 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
516 String requestId = getRequestId(requestContext);
517 HashMap<String, String> instanceIdMap = new HashMap<>();
518 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
519 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
520 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
521 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
526 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
527 @Consumes(MediaType.APPLICATION_JSON)
528 @Produces(MediaType.APPLICATION_JSON)
529 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
531 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
532 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
533 String requestId = getRequestId(requestContext);
534 HashMap<String, String> instanceIdMap = new HashMap<>();
535 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
536 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
537 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
542 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
543 @Consumes(MediaType.APPLICATION_JSON)
544 @Produces(MediaType.APPLICATION_JSON)
545 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
547 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
548 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
549 String requestId = getRequestId(requestContext);
550 HashMap<String, String> instanceIdMap = new HashMap<>();
551 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
552 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
553 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
557 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
558 @Consumes(MediaType.APPLICATION_JSON)
559 @Produces(MediaType.APPLICATION_JSON)
560 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
562 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
563 @PathParam("vnfInstanceId") String vnfInstanceId,
564 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
565 String requestId = getRequestId(requestContext);
566 HashMap<String, String> instanceIdMap = new HashMap<>();
567 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
568 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
569 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
570 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
574 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
575 @Consumes(MediaType.APPLICATION_JSON)
576 @Produces(MediaType.APPLICATION_JSON)
577 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
579 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
580 @PathParam("vnfInstanceId") String vnfInstanceId,
581 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
582 String requestId = getRequestId(requestContext);
583 HashMap<String, String> instanceIdMap = new HashMap<>();
584 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
585 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
586 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
587 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
591 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
592 @Consumes(MediaType.APPLICATION_JSON)
593 @Produces(MediaType.APPLICATION_JSON)
594 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
596 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
597 String requestId = getRequestId(requestContext);
598 HashMap<String, String> instanceIdMap = new HashMap<>();
599 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
600 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
604 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
605 @Consumes(MediaType.APPLICATION_JSON)
606 @Produces(MediaType.APPLICATION_JSON)
607 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
609 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
610 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
611 String requestId = getRequestId(requestContext);
612 HashMap<String, String> instanceIdMap = new HashMap<>();
613 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
614 instanceIdMap.put("networkInstanceId", networkInstanceId);
615 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
619 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
620 @Consumes(MediaType.APPLICATION_JSON)
621 @Produces(MediaType.APPLICATION_JSON)
622 @ApiOperation(value="Delete provided Network instance",response=Response.class)
624 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
625 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
626 String requestId = getRequestId(requestContext);
627 HashMap<String, String> instanceIdMap = new HashMap<>();
628 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
629 instanceIdMap.put("networkInstanceId", networkInstanceId);
630 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
634 @Path("/{version:[vV][7]}/instanceGroups")
635 @Consumes(MediaType.APPLICATION_JSON)
636 @Produces(MediaType.APPLICATION_JSON)
637 @ApiOperation(value="Create instanceGroups",response=Response.class)
639 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
640 String requestId = getRequestId(requestContext);
641 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
645 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
646 @Consumes(MediaType.APPLICATION_JSON)
647 @Produces(MediaType.APPLICATION_JSON)
648 @ApiOperation(value="Delete instanceGroup",response=Response.class)
650 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
651 String requestId = getRequestId(requestContext);
652 HashMap<String, String> instanceIdMap = new HashMap<>();
653 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
654 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
658 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
659 @Consumes(MediaType.APPLICATION_JSON)
660 @Produces(MediaType.APPLICATION_JSON)
661 @ApiOperation(value="Add instanceGroup members",response=Response.class)
663 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
664 String requestId = getRequestId(requestContext);
665 HashMap<String, String> instanceIdMap = new HashMap<>();
666 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
667 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
671 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
672 @Consumes(MediaType.APPLICATION_JSON)
673 @Produces(MediaType.APPLICATION_JSON)
674 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
676 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
677 String requestId = getRequestId(requestContext);
678 HashMap<String, String> instanceIdMap = new HashMap<>();
679 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
680 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
683 public String getRequestUri(ContainerRequestContext context){
684 String requestUri = context.getUriInfo().getPath();
685 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
686 MDC.put(LogConstants.HTTP_URL, httpUrl);
687 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
691 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
692 MultivaluedMap<String, String> headers = context.getHeaders();
693 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
694 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
696 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
697 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
699 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
700 throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
704 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
705 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
706 Boolean aLaCarte = null;
707 long startTime = System.currentTimeMillis ();
708 ServiceInstancesRequest sir = null;
709 String apiVersion = version.substring(1);
711 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
712 String requestScope = deriveRequestScope(action, sir, requestUri);
713 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
714 if(sir.getRequestDetails().getRequestParameters() != null){
715 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
717 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
718 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
720 int requestVersion = Integer.parseInt(version.substring(1));
721 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
722 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
723 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
724 String networkType = msoRequest.getNetworkType(sir,requestScope);
725 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
726 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
728 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
729 currentActiveReq.setVnfType(vnfType);
730 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
731 currentActiveReq.setNetworkType(networkType);
734 InfraActiveRequests dup = null;
735 boolean inProgress = false;
737 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
740 inProgress = camundaHistoryCheck(dup, currentActiveReq);
743 if (dup != null && inProgress) {
744 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
746 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
748 RequestReferences referencesResponse = new RequestReferences();
750 referencesResponse.setRequestId(requestId);
752 serviceResponse.setRequestReferences(referencesResponse);
753 Boolean isBaseVfModule = false;
755 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
756 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
758 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
759 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
760 modelType = ModelType.vnf;
761 }else if(action == Action.addMembers || action == Action.removeMembers){
762 modelType = ModelType.instanceGroup;
764 modelType =modelInfo.getModelType();
767 if (modelType.equals(ModelType.vfModule)) {
770 // Get VF Module-specific base module indicator
773 String modelVersionId = modelInfo.getModelVersionId();
775 if(modelVersionId != null) {
776 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
777 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
778 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
782 if (vfm.getIsBase()) {
783 isBaseVfModule = true;
785 } else if (action == Action.createInstance || action == Action.updateInstance) {
786 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
787 // This request cannot proceed
789 String serviceVersionText = "";
790 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
791 serviceVersionText = " with version " + sdcServiceModelVersion;
794 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
795 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
796 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
797 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
799 throw vfModuleException;
804 serviceInstanceId = "";
806 String vfModuleId = "";
807 String volumeGroupId = "";
808 String networkId = "";
809 String correlationId = "";
810 String instanceGroupId = null;
811 if(sir.getServiceInstanceId () != null){
812 serviceInstanceId = sir.getServiceInstanceId ();
815 if(sir.getVnfInstanceId () != null){
816 vnfId = sir.getVnfInstanceId ();
819 if(sir.getVfModuleInstanceId () != null){
820 vfModuleId = sir.getVfModuleInstanceId ();
823 if(sir.getVolumeGroupInstanceId () != null){
824 volumeGroupId = sir.getVolumeGroupInstanceId ();
827 if(sir.getNetworkInstanceId () != null){
828 networkId = sir.getNetworkInstanceId ();
830 if(sir.getInstanceGroupId() != null){
831 instanceGroupId = sir.getInstanceGroupId();
834 correlationId = getCorrelationId(sir);
837 infraActiveRequestsClient.save(currentActiveReq);
839 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
840 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
841 .errorInfo(errorLoggerInfo).build();
844 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
846 }else if(aLaCarte == null){
850 RequestClientParameter requestClientParameter = null;
852 requestClientParameter = new RequestClientParameter.Builder()
853 .setRequestId(requestId)
854 .setBaseVfModule(isBaseVfModule)
855 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
856 .setRequestAction(action.toString())
857 .setServiceInstanceId(serviceInstanceId)
858 .setCorrelationId(correlationId)
860 .setVfModuleId(vfModuleId)
861 .setVolumeGroupId(volumeGroupId)
862 .setNetworkId(networkId)
863 .setServiceType(serviceInstanceType)
865 .setVfModuleType(vfModuleType)
866 .setNetworkType(networkType)
867 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
868 .setApiVersion(apiVersion)
869 .setALaCarte(aLaCarte)
870 .setRequestUri(requestUri)
871 .setInstanceGroupId(instanceGroupId).build();
872 } catch (IOException e) {
873 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
874 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
875 .errorInfo(errorLoggerInfo).build();
877 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
879 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
880 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
881 Boolean aLaCarte = true;
882 long startTime = System.currentTimeMillis ();
883 String apiVersion = version.substring(1);
884 ServiceInstancesRequest sir = new ServiceInstancesRequest();
885 sir.setInstanceGroupId(instanceGroupId);
887 String requestScope = ModelType.instanceGroup.toString();
888 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
889 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
891 validateHeaders(requestContext);
892 } catch (ValidationException e) {
894 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
895 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
896 .errorInfo(errorLoggerInfo).build();
897 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
898 throw validateException;
901 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
902 boolean inProgress = false;
905 inProgress = camundaHistoryCheck(dup, currentActiveReq);
908 if (dup != null && inProgress) {
909 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
912 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
914 RequestReferences referencesResponse = new RequestReferences();
916 referencesResponse.setRequestId(requestId);
918 serviceResponse.setRequestReferences(referencesResponse);
919 Boolean isBaseVfModule = false;
921 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
924 infraActiveRequestsClient.save(currentActiveReq);
926 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
927 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
928 .errorInfo(errorLoggerInfo).build();
931 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
932 .setRequestId(requestId)
933 .setBaseVfModule(isBaseVfModule)
934 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
935 .setRequestAction(action.toString())
936 .setApiVersion(apiVersion)
937 .setALaCarte(aLaCarte)
938 .setRequestUri(requestUri)
939 .setInstanceGroupId(instanceGroupId).build();
941 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
944 private String getCorrelationId(ServiceInstancesRequest sir) {
945 return Optional.of(sir)
946 .map(ServiceInstancesRequest::getRequestDetails)
947 .map(RequestDetails::getRequestParameters)
948 .map(parameters -> parameters.getUserParamValue("pnfId"))
952 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
953 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
954 return (ModelType.vnf.name());
955 }else if(action == Action.addMembers || action == Action.removeMembers){
956 return(ModelType.instanceGroup.toString());
959 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
960 requestScope = requestScopeFromUri(requestUri);
962 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
967 private String requestScopeFromUri(String requestUri){
969 if(requestUri.contains(ModelType.network.name())){
970 requestScope = ModelType.network.name();
971 }else if(requestUri.contains(ModelType.vfModule.name())){
972 requestScope = ModelType.vfModule.name();
973 }else if(requestUri.contains(ModelType.volumeGroup.name())){
974 requestScope = ModelType.volumeGroup.name();
975 }else if(requestUri.contains(ModelType.configuration.name())){
976 requestScope = ModelType.configuration.name();
977 }else if(requestUri.contains(ModelType.vnf.name())){
978 requestScope = ModelType.vnf.name();
980 requestScope = ModelType.service.name();
984 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
985 RequestClient requestClient = null;
986 HttpResponse response = null;
988 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
989 response = requestClient.post(requestClientParameter);
990 } catch (Exception e) {
992 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
993 String url = requestClient != null ? requestClient.getUrl() : "";
994 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
995 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
997 throw clientException;
1000 if (response == null) {
1002 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1003 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1005 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1007 throw clientException;
1010 ResponseHandler respHandler = null;
1011 int bpelStatus = 500;
1013 respHandler = new ResponseHandler (response, requestClient.getType ());
1014 bpelStatus = respHandler.getStatus ();
1015 } catch (ApiException e) {
1017 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1018 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1019 .errorInfo(errorLoggerInfo).build();
1020 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1021 throw validateException;
1024 // BPEL accepted the request, the request is in progress
1025 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1026 ServiceInstancesResponse jsonResponse;
1027 CamundaResponse camundaResp = respHandler.getResponse();
1029 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1031 ObjectMapper mapper = new ObjectMapper();
1032 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1033 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1034 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1035 if(selfLinkUrl.isPresent()){
1036 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1038 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1040 } catch (IOException e) {
1042 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1043 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1044 .errorInfo(errorLoggerInfo).build();
1045 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1046 throw validateException;
1048 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1052 List<String> variables = new ArrayList<>();
1053 variables.add(bpelStatus + "");
1054 String camundaJSONResponseBody = respHandler.getResponseBody ();
1055 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1057 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1058 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1059 .errorInfo(errorLoggerInfo).build();
1061 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1063 throw bpmnException;
1066 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1069 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1070 .errorInfo(errorLoggerInfo).build();
1071 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1073 throw servException;
1077 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1078 if(StringUtils.isNotBlank(instanceId)) {
1079 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1080 currentActiveReq.setServiceInstanceId(instanceId);
1081 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1082 currentActiveReq.setVnfId(instanceId);
1083 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1084 currentActiveReq.setVfModuleId(instanceId);
1085 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1086 currentActiveReq.setVolumeGroupId(instanceId);
1087 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1088 currentActiveReq.setNetworkId(instanceId);
1089 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1090 currentActiveReq.setConfigurationId(instanceId);
1091 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1092 currentActiveReq.setInstanceGroupId(instanceId);
1094 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1095 if(instanceIdMap.get("serviceInstanceId") != null){
1096 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1098 if(instanceIdMap.get("vnfInstanceId") != null){
1099 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1101 if(instanceIdMap.get("vfModuleInstanceId") != null){
1102 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1104 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1105 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1107 if(instanceIdMap.get("networkInstanceId") != null){
1108 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1110 if(instanceIdMap.get("configurationInstanceId") != null){
1111 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1113 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1114 currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1119 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1120 ObjectMapper mapper = new ObjectMapper();
1121 mapper.setSerializationInclusion(Include.NON_NULL);
1122 if(msoRawRequest != null){
1123 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1124 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
1125 serviceInstRequest.getRequestDetails() != null &&
1126 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1127 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1128 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1130 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
1131 return mapper.writeValueAsString(sir);
1136 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1137 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1139 // Found the duplicate record. Return the appropriate error.
1140 String instance = null;
1141 if(instanceName != null){
1142 instance = instanceName;
1144 instance = instanceIdMap.get(requestScope + "InstanceId");
1146 //List<String> variables = new ArrayList<String>();
1147 //variables.add(dup.getRequestStatus());
1148 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1151 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1152 .errorInfo(errorLoggerInfo).build();
1154 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1159 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1160 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1161 InfraActiveRequests dup = null;
1163 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1164 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1166 } catch (Exception e) {
1167 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1168 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1169 .errorInfo(errorLoggerInfo).build();
1170 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1171 throw requestDbFailureException;
1175 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1176 String requestId = duplicateRecord.getRequestId();
1177 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1178 String targetUrl = env.getProperty("mso.camundaURL") + path;
1179 HttpHeaders headers = setHeaders(env.getProperty("mso.camundaAuth"));
1180 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1181 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1183 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1184 }catch(HttpStatusCodeException e){
1185 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1186 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1187 .errorInfo(errorLoggerInfo).build();
1188 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1189 throw contactCamundaException;
1191 if(response.getBody().isEmpty()){
1192 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1194 for(HistoricProcessInstance instance : response.getBody()){
1195 if(instance.getState().equals("ACTIVE")){
1198 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1203 private HttpHeaders setHeaders(String auth) {
1204 HttpHeaders headers = new HttpHeaders();
1205 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1206 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1207 headers.setAccept(acceptableMediaTypes);
1208 headers.add(HttpHeaders.AUTHORIZATION, auth);
1212 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1213 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1215 ObjectMapper mapper = new ObjectMapper();
1216 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1218 } catch (IOException e) {
1220 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1222 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1223 .errorInfo(errorLoggerInfo).build();
1224 String requestScope = requestScopeFromUri(requestUri);
1226 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1228 throw validateException;
1232 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1233 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1234 int reqVersion = Integer.parseInt(version.substring(1));
1236 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1237 } catch (Exception e) {
1238 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1239 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1240 .errorInfo(errorLoggerInfo).build();
1242 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1244 throw validateException;
1248 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1249 InfraActiveRequests currentActiveReq) throws ApiException {
1250 RecipeLookupResult recipeLookupResult = null;
1251 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1252 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1253 // Query MSO Catalog DB
1255 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1256 recipeLookupResult = getDefaultVnfUri(sir, action);
1257 }else if(action == Action.addMembers || action == Action.removeMembers){
1258 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1259 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1261 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1262 } catch (IOException e) {
1263 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1266 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1267 .errorInfo(errorLoggerInfo).build();
1269 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1271 throw validateException;
1273 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1274 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1276 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1277 } catch (ValidationException e) {
1278 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1281 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1282 .errorInfo(errorLoggerInfo).build();
1284 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1286 throw validateException;
1288 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1290 recipeLookupResult = getNetworkUri( sir, action);
1291 } catch (ValidationException e) {
1293 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1296 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1297 .errorInfo(errorLoggerInfo).build();
1298 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1300 throw validateException;
1302 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1303 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1306 if (recipeLookupResult == null) {
1307 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1310 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1311 .errorInfo(errorLoggerInfo).build();
1313 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1314 throw recipeNotFoundExceptionException;
1316 return recipeLookupResult;
1319 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1321 // Construct the default service name
1322 // TODO need to make this a configurable property
1323 String defaultServiceModelName = getDefaultModel(servInstReq);
1324 RequestDetails requestDetails = servInstReq.getRequestDetails();
1325 ModelInfo modelInfo = requestDetails.getModelInfo();
1326 org.onap.so.db.catalog.beans.Service serviceRecord;
1327 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1328 ServiceRecipe recipe = null;
1331 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1332 if(serviceRecord !=null){
1333 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1336 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1337 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1338 if (recipe == null){
1339 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1340 if(!serviceRecordList.isEmpty()){
1341 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1342 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1351 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1352 RequestParameters reqParam = requestDetails.getRequestParameters();
1353 if(reqParam!=null && alaCarteFlag && recipe==null){
1355 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1356 mapToLegacyRequest(requestDetails);
1357 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1358 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1359 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1361 if(modelInfo.getModelVersionId() == null) {
1362 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1367 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1370 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1371 RequestParameters reqParam;
1372 if (requestDetails.getRequestParameters() == null) {
1373 reqParam = new RequestParameters();
1375 reqParam = requestDetails.getRequestParameters();
1377 if(requestDetails.getCloudConfiguration() == null) {
1378 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1379 if(cloudConfig != null) {
1380 requestDetails.setCloudConfiguration(cloudConfig);
1384 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1385 if(!userParams.isEmpty()) {
1386 if (reqParam == null) {
1387 requestDetails.setRequestParameters(new RequestParameters());
1389 requestDetails.getRequestParameters().setUserParams(userParams);
1393 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1395 for(Map<String, Object> params : reqParams.getUserParams()){
1396 if(params.containsKey("service")){
1397 Service service = serviceMapper(params);
1399 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1401 if (targetConfiguration.isPresent()) {
1402 return targetConfiguration.get();
1404 for(Networks network : service.getResources().getNetworks()) {
1405 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1406 if(targetConfiguration.isPresent()) {
1407 return targetConfiguration.get();
1411 for(Vnfs vnf : service.getResources().getVnfs()) {
1412 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1414 if(targetConfiguration.isPresent()) {
1415 return targetConfiguration.get();
1418 for(VfModules vfModule : vnf.getVfModules()) {
1419 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1421 if(targetConfiguration.isPresent()) {
1422 return targetConfiguration.get();
1433 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1434 CloudConfiguration targetConfiguration = new CloudConfiguration();
1435 if(sourceCloudConfiguration != null) {
1436 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1437 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1438 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1439 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1440 return Optional.of(targetConfiguration);
1442 return Optional.empty();
1445 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1446 msoLogger.debug("Configuring UserParams for Macro Request");
1447 Map<String, Object> userParams = new HashMap<>();
1449 for(Map<String, Object> params : reqParams.getUserParams()){
1450 if(params.containsKey("service")){
1451 Service service = serviceMapper(params);
1453 addUserParams(userParams, service.getInstanceParams());
1455 for(Networks network : service.getResources().getNetworks()) {
1456 addUserParams(userParams, network.getInstanceParams());
1459 for(Vnfs vnf: service.getResources().getVnfs()) {
1460 addUserParams(userParams, vnf.getInstanceParams());
1462 for(VfModules vfModule: vnf.getVfModules()) {
1463 addUserParams(userParams, vfModule.getInstanceParams());
1469 return mapFlatMapToNameValue(userParams);
1472 private Service serviceMapper(Map<String, Object> params)
1473 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1474 ObjectMapper obj = new ObjectMapper();
1475 String input = obj.writeValueAsString(params.get("service"));
1476 return obj.readValue(input, Service.class);
1479 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1480 for(Map<String, String> map : sourceUserParams) {
1481 for (Map.Entry<String, String> entry : map.entrySet()) {
1482 targetUserParams.put(entry.getKey(), entry.getValue());
1487 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1488 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1490 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1491 Map<String, Object> targetMap = new HashMap<>();
1492 targetMap.put(NAME, map.getKey());
1493 targetMap.put(VALUE, map.getValue());
1494 targetUserParams.add(targetMap);
1496 return targetUserParams;
1499 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1501 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1502 String vnfComponentType = modelInfo.getModelType().name();
1504 RelatedInstanceList[] instanceList = null;
1505 if (servInstReq.getRequestDetails() != null) {
1506 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1509 Recipe recipe = null;
1510 String defaultSource = getDefaultModel(servInstReq);
1511 String modelCustomizationId = modelInfo.getModelCustomizationId();
1512 String modelCustomizationName = modelInfo.getModelCustomizationName();
1513 String relatedInstanceModelVersionId = null;
1514 String relatedInstanceModelInvariantId = null;
1515 String relatedInstanceVersion = null;
1516 String relatedInstanceModelCustomizationName = null;
1518 if (instanceList != null) {
1520 for(RelatedInstanceList relatedInstanceList : instanceList){
1522 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1523 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1524 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1525 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1526 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1529 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1530 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1531 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1532 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1533 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1537 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1538 // a. For a vnf request (only create, no update currently):
1539 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1540 // 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
1541 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1542 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1543 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1544 // (MODEL_UUID) in SERVICE table.
1545 // 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
1546 // during 1707 data migration if VID did not provide it originally on request.
1547 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1548 // 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.
1550 VnfResource vnfResource = null;
1551 VnfResourceCustomization vrc=null;
1552 // Validation for vnfResource
1554 if(modelCustomizationId!=null) {
1555 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1557 vnfResource = vrc.getVnfResources();
1560 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1561 if(service == null) {
1562 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1565 if(service == null) {
1566 throw new ValidationException("service in relatedInstance");
1568 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1569 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1570 vrc=vnfResourceCustom;
1575 vnfResource = vrc.getVnfResources();
1576 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1577 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1581 if(vnfResource==null){
1582 throw new ValidationException("vnfResource");
1584 if(modelInfo.getModelVersionId() == null) {
1585 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1589 VnfRecipe vnfRecipe = null;
1592 String nfRole = vrc.getNfRole();
1593 if(nfRole != null) {
1594 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1598 if(vnfRecipe == null) {
1599 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1602 if (vnfRecipe == null) {
1606 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1608 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1609 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1610 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1611 // 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.
1612 // 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
1613 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1614 // 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)
1615 // and MODEL_VERSION (modelVersion).
1617 VfModuleCustomization vfmc = null;
1619 VnfResourceCustomization vnfrc;
1620 VfModule vfModule = null;
1622 if(modelInfo.getModelCustomizationId() != null) {
1623 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1625 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1627 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1629 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1631 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1633 String vfModuleModelUUID = modelInfo.getModelVersionId();
1634 for(VfModuleCustomization vf : list) {
1635 VfModuleCustomization vfmCustom;
1636 if(vfModuleModelUUID != null){
1637 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1638 if(vfmCustom != null){
1639 vfModule = vfmCustom.getVfModule();
1642 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1643 if(vfmCustom != null){
1644 vfModule = vfmCustom.getVfModule();
1646 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1650 if(vfModule != null) {
1651 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1652 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1658 if(vfmc == null && vfModule == null) {
1659 throw new ValidationException("vfModuleCustomization");
1660 } else if (vfModule == null && vfmc != null) {
1661 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1664 if(modelInfo.getModelVersionId() == null) {
1665 modelInfo.setModelVersionId(vfModule.getModelUUID());
1669 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1671 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1672 if(!vfModuleRecords.isEmpty()){
1673 for(VfModule record : vfModuleRecords){
1674 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1681 if(recipe == null) {
1682 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1683 if (recipe == null) {
1684 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1687 if(recipe == null) {
1694 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1695 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1696 if (recipe == null) {
1700 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1702 if (recipe == null) {
1708 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1711 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1713 String defaultSource = getDefaultModel(sir);
1715 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1717 if (vnfRecipe == null) {
1721 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1725 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1727 String defaultNetworkType = getDefaultModel(sir);
1729 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1730 String modelName = modelInfo.getModelName();
1731 Recipe recipe = null;
1733 if(modelInfo.getModelCustomizationId()!=null){
1734 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1735 if(networkResourceCustomization != null){
1736 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1737 if(networkResource!=null){
1738 if(modelInfo.getModelVersionId() == null) {
1739 modelInfo.setModelVersionId(networkResource.getModelUUID());
1741 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1743 throw new ValidationException("no catalog entry found");
1745 }else if(action != Action.deleteInstance){
1746 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1749 //ok for version < 3 and action delete
1750 if(modelName != null){
1751 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1756 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1759 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1762 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1763 String requestTestApi = null;
1764 TestApi testApi = null;
1766 if (requestParams != null) {
1767 requestTestApi = requestParams.getTestApi();
1770 if (requestTestApi == null) {
1771 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1772 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1774 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1779 testApi = TestApi.valueOf(requestTestApi);
1780 return Optional.of(testApi.getModelName());
1781 } catch (Exception e) {
1782 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1783 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1787 private String getDefaultModel(ServiceInstancesRequest sir) {
1788 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1789 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1790 if (oModelName.isPresent()) {
1791 defaultModel = oModelName.get();
1793 return defaultModel;
1796 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1797 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1798 Boolean aLaCarte = null;
1799 String apiVersion = version.substring(1);
1800 boolean inProgress = false;
1802 long startTime = System.currentTimeMillis ();
1803 ServiceInstancesRequest sir = null;
1805 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1806 String requestScope = deriveRequestScope(action,sir, requestUri);
1807 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1808 if(sir.getRequestDetails().getRequestParameters() != null){
1809 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1811 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1812 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1813 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1815 InfraActiveRequests dup = null;
1817 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1820 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1823 if (instanceIdMap != null && dup != null && inProgress) {
1824 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1827 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1828 RequestReferences referencesResponse = new RequestReferences();
1829 referencesResponse.setRequestId(requestId);
1830 serviceResponse.setRequestReferences(referencesResponse);
1833 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1834 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1836 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1837 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1839 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1842 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1843 .errorInfo(errorLoggerInfo).build();
1845 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1847 throw validateException;
1851 serviceInstanceId = "";
1852 String configurationId = "";
1853 String correlationId = "";
1855 if(sir.getServiceInstanceId () != null){
1856 serviceInstanceId = sir.getServiceInstanceId ();
1859 if(sir.getConfigurationId() != null){
1860 configurationId = sir.getConfigurationId();
1863 correlationId = getCorrelationId(sir);
1866 infraActiveRequestsClient.save(currentActiveReq);
1867 }catch(Exception e){
1868 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1869 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1870 .errorInfo(errorLoggerInfo).build();
1873 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1875 }else if(aLaCarte == null){
1878 RequestClientParameter requestClientParameter = null;
1880 requestClientParameter = new RequestClientParameter.Builder()
1881 .setRequestId(requestId)
1882 .setBaseVfModule(false)
1883 .setRecipeTimeout(Integer.parseInt(timeOut))
1884 .setRequestAction(action.toString())
1885 .setServiceInstanceId(serviceInstanceId)
1886 .setCorrelationId(correlationId)
1887 .setConfigurationId(configurationId)
1888 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1889 .setApiVersion(apiVersion)
1890 .setALaCarte(aLaCarte)
1891 .setRequestUri(requestUri).build();
1892 } catch (IOException e) {
1893 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1894 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1895 .errorInfo(errorLoggerInfo).build();
1898 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1901 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1902 String requestId = null;
1903 if (requestContext.getProperty("requestId") != null) {
1904 requestId = requestContext.getProperty("requestId").toString();
1906 if (UUIDChecker.isValidUUID(requestId)) {
1909 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1910 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1911 .errorInfo(errorLoggerInfo).build();
1913 throw validateException;
1916 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1917 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1918 aq.setStatusMessage (errorMessage);
1919 aq.setProgress(new Long(100));
1920 aq.setRequestStatus(status.toString());
1921 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1922 aq.setEndTime (endTimeStamp);
1924 infraActiveRequestsClient.save(aq);
1925 }catch(Exception e){
1926 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1927 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1928 .errorInfo(errorLoggerInfo).build();
1932 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1933 String serviceType = null;
1934 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1935 String defaultServiceModelName = getDefaultModel(sir);
1936 org.onap.so.db.catalog.beans.Service serviceRecord;
1938 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1939 if(serviceRecord != null){
1940 serviceType = serviceRecord.getServiceType();
1943 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1944 if(serviceRecord != null){
1945 serviceType = serviceRecord.getServiceType();
1947 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1948 if(serviceRecord != null){
1949 serviceType = serviceRecord.getServiceType();
1954 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);