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.CryptoUtils;
85 import org.onap.so.utils.UUIDChecker;
87 import org.springframework.beans.factory.annotation.Autowired;
88 import org.springframework.core.ParameterizedTypeReference;
89 import org.springframework.core.env.Environment;
90 import org.springframework.http.HttpEntity;
91 import org.springframework.http.HttpHeaders;
92 import org.springframework.http.HttpMethod;
93 import org.springframework.http.ResponseEntity;
94 import org.springframework.stereotype.Component;
95 import org.springframework.web.client.HttpStatusCodeException;
96 import org.springframework.web.client.RestTemplate;
97 import org.camunda.bpm.engine.history.HistoricProcessInstance;
98 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
100 import javax.transaction.Transactional;
101 import javax.ws.rs.Consumes;
102 import javax.ws.rs.DELETE;
103 import javax.ws.rs.POST;
104 import javax.ws.rs.PUT;
105 import javax.ws.rs.Path;
106 import javax.ws.rs.PathParam;
107 import javax.ws.rs.Produces;
108 import javax.ws.rs.container.ContainerRequestContext;
109 import javax.ws.rs.core.Context;
110 import javax.ws.rs.core.MediaType;
111 import javax.ws.rs.core.MultivaluedMap;
112 import javax.ws.rs.core.Response;
113 import javax.xml.bind.DatatypeConverter;
114 import java.io.IOException;
116 import java.security.GeneralSecurityException;
117 import java.sql.Timestamp;
118 import java.util.ArrayList;
119 import java.util.HashMap;
120 import java.util.List;
121 import java.util.Map;
122 import java.util.Optional;
125 @Path("/onap/so/infra/serviceInstantiation")
126 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
127 public class ServiceInstances {
129 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
130 private static String NAME = "name";
131 private static String VALUE = "value";
132 private static final String SAVE_TO_DB = "save instance to db";
135 private Environment env;
138 private RequestClientFactory reqClientFactory;
141 private CatalogDbClient catalogDbClient;
144 private RequestsDbClient infraActiveRequestsClient;
147 private ResponseBuilder builder;
150 private MsoRequest msoRequest;
153 private RestTemplate restTemplate;
156 @Path("/{version:[vV][5-7]}/serviceInstances")
157 @Consumes(MediaType.APPLICATION_JSON)
158 @Produces(MediaType.APPLICATION_JSON)
159 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
161 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
162 String requestId = getRequestId(requestContext);
163 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
167 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
168 @Consumes(MediaType.APPLICATION_JSON)
169 @Produces(MediaType.APPLICATION_JSON)
170 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
172 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
173 String requestId = getRequestId(requestContext);
174 HashMap<String, String> instanceIdMap = new HashMap<>();
175 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
176 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
180 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
181 @Consumes(MediaType.APPLICATION_JSON)
182 @Produces(MediaType.APPLICATION_JSON)
183 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
185 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
186 String requestId = getRequestId(requestContext);
187 HashMap<String, String> instanceIdMap = new HashMap<>();
188 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
189 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
193 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
194 @Consumes(MediaType.APPLICATION_JSON)
195 @Produces(MediaType.APPLICATION_JSON)
196 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
198 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
199 String requestId = getRequestId(requestContext);
200 HashMap<String, String> instanceIdMap = new HashMap<>();
201 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
202 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
206 @Path("/{version:[vV][7]}/serviceInstances/assign")
207 @Consumes(MediaType.APPLICATION_JSON)
208 @Produces(MediaType.APPLICATION_JSON)
209 @ApiOperation(value="Assign Service Instance", response=Response.class)
211 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
212 String requestId = getRequestId(requestContext);
213 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
217 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
218 @Consumes(MediaType.APPLICATION_JSON)
219 @Produces(MediaType.APPLICATION_JSON)
220 @ApiOperation(value="Unassign Service Instance", response=Response.class)
222 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
223 String requestId = getRequestId(requestContext);
224 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
225 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
226 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
230 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
231 @Consumes(MediaType.APPLICATION_JSON)
232 @Produces(MediaType.APPLICATION_JSON)
233 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
235 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
236 String requestId = getRequestId(requestContext);
237 HashMap<String, String> instanceIdMap = new HashMap<>();
238 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
239 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
243 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
244 @Consumes(MediaType.APPLICATION_JSON)
245 @Produces(MediaType.APPLICATION_JSON)
246 @ApiOperation(value="Delete provided Port",response=Response.class)
248 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
249 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
250 String requestId = getRequestId(requestContext);
251 HashMap<String, String> instanceIdMap = new HashMap<>();
252 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
253 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
254 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
258 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
259 @Consumes(MediaType.APPLICATION_JSON)
260 @Produces(MediaType.APPLICATION_JSON)
261 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
263 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
264 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
265 String requestId = getRequestId(requestContext);
266 HashMap<String, String> instanceIdMap = new HashMap<>();
267 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
268 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
269 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
273 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
274 @Consumes(MediaType.APPLICATION_JSON)
275 @Produces(MediaType.APPLICATION_JSON)
276 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
278 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
279 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
280 String requestId = getRequestId(requestContext);
281 HashMap<String, String> instanceIdMap = new HashMap<>();
282 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
283 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
284 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
288 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
289 @Consumes(MediaType.APPLICATION_JSON)
290 @Produces(MediaType.APPLICATION_JSON)
291 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
293 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
294 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
295 String requestId = getRequestId(requestContext);
296 HashMap<String, String> instanceIdMap = new HashMap<>();
297 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
298 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
299 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
303 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
304 @Consumes(MediaType.APPLICATION_JSON)
305 @Produces(MediaType.APPLICATION_JSON)
306 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
308 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
309 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
310 String requestId = getRequestId(requestContext);
311 HashMap<String, String> instanceIdMap = new HashMap<>();
312 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
313 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
314 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
318 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
319 @Consumes(MediaType.APPLICATION_JSON)
320 @Produces(MediaType.APPLICATION_JSON)
321 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
323 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
324 String requestId = getRequestId(requestContext);
325 HashMap<String, String> instanceIdMap = new HashMap<>();
326 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
327 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
331 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
332 @Consumes(MediaType.APPLICATION_JSON)
333 @Produces(MediaType.APPLICATION_JSON)
334 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
336 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
337 String requestId = getRequestId(requestContext);
338 HashMap<String, String> instanceIdMap = new HashMap<>();
339 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
340 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
344 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
345 @Consumes(MediaType.APPLICATION_JSON)
346 @Produces(MediaType.APPLICATION_JSON)
347 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
349 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
350 String requestId = getRequestId(requestContext);
351 HashMap<String, String> instanceIdMap = new HashMap<>();
352 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
353 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
357 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
358 @Consumes(MediaType.APPLICATION_JSON)
359 @Produces(MediaType.APPLICATION_JSON)
360 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
362 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
363 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
364 String requestId = getRequestId(requestContext);
365 HashMap<String, String> instanceIdMap = new HashMap<>();
366 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
367 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
368 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
372 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
373 @Consumes(MediaType.APPLICATION_JSON)
374 @Produces(MediaType.APPLICATION_JSON)
375 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
377 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
378 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
379 String requestId = getRequestId(requestContext);
380 HashMap<String, String> instanceIdMap = new HashMap<>();
381 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
382 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
383 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
387 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
388 @Consumes(MediaType.APPLICATION_JSON)
389 @Produces(MediaType.APPLICATION_JSON)
390 @ApiOperation(value="Apply updated configuration",response=Response.class)
391 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
392 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
393 String requestId = getRequestId(requestContext);
394 HashMap<String, String> instanceIdMap = new HashMap<>();
395 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
396 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
397 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
401 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
402 @Consumes(MediaType.APPLICATION_JSON)
403 @Produces(MediaType.APPLICATION_JSON)
404 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
405 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
406 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
407 String requestId = getRequestId(requestContext);
408 HashMap<String, String> instanceIdMap = new HashMap<>();
409 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
410 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
411 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
416 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
417 @Consumes(MediaType.APPLICATION_JSON)
418 @Produces(MediaType.APPLICATION_JSON)
419 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
421 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
422 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
423 String requestId = getRequestId(requestContext);
424 HashMap<String, String> instanceIdMap = new HashMap<>();
425 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
426 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
427 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
431 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
432 @Consumes(MediaType.APPLICATION_JSON)
433 @Produces(MediaType.APPLICATION_JSON)
434 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
436 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
437 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
438 String requestId = getRequestId(requestContext);
439 HashMap<String, String> instanceIdMap = new HashMap<>();
440 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
441 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
442 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
446 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
447 @Consumes(MediaType.APPLICATION_JSON)
448 @Produces(MediaType.APPLICATION_JSON)
449 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
451 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
452 @PathParam("vnfInstanceId") String vnfInstanceId,
453 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
454 String requestId = getRequestId(requestContext);
455 HashMap<String, String> instanceIdMap = new HashMap<>();
456 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
457 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
458 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
459 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
463 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
464 @Consumes(MediaType.APPLICATION_JSON)
465 @Produces(MediaType.APPLICATION_JSON)
466 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
468 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
469 @PathParam("vnfInstanceId") String vnfInstanceId,
470 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
471 String requestId = getRequestId(requestContext);
472 HashMap<String, String> instanceIdMap = new HashMap<>();
473 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
474 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
475 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
476 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
480 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
481 @Consumes(MediaType.APPLICATION_JSON)
482 @Produces(MediaType.APPLICATION_JSON)
483 @ApiOperation(value="Perform VNF software update",response=Response.class)
485 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
486 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
487 String requestId = getRequestId(requestContext);
488 HashMap<String, String> instanceIdMap = new HashMap<>();
489 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
490 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
491 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
495 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
496 @Consumes(MediaType.APPLICATION_JSON)
497 @Produces(MediaType.APPLICATION_JSON)
498 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
500 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
501 @PathParam("vnfInstanceId") String vnfInstanceId,
502 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
503 String requestId = getRequestId(requestContext);
504 HashMap<String, String> instanceIdMap = new HashMap<>();
505 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
506 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
507 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
508 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
512 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
513 @Consumes(MediaType.APPLICATION_JSON)
514 @Produces(MediaType.APPLICATION_JSON)
515 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
517 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
518 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
519 String requestId = getRequestId(requestContext);
520 HashMap<String, String> instanceIdMap = new HashMap<>();
521 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
522 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
523 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
524 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
529 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
530 @Consumes(MediaType.APPLICATION_JSON)
531 @Produces(MediaType.APPLICATION_JSON)
532 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
534 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
535 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
536 String requestId = getRequestId(requestContext);
537 HashMap<String, String> instanceIdMap = new HashMap<>();
538 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
539 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
540 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
545 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
546 @Consumes(MediaType.APPLICATION_JSON)
547 @Produces(MediaType.APPLICATION_JSON)
548 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
550 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
551 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
552 String requestId = getRequestId(requestContext);
553 HashMap<String, String> instanceIdMap = new HashMap<>();
554 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
555 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
556 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
560 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
561 @Consumes(MediaType.APPLICATION_JSON)
562 @Produces(MediaType.APPLICATION_JSON)
563 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
565 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
566 @PathParam("vnfInstanceId") String vnfInstanceId,
567 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
568 String requestId = getRequestId(requestContext);
569 HashMap<String, String> instanceIdMap = new HashMap<>();
570 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
571 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
572 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
573 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
577 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
578 @Consumes(MediaType.APPLICATION_JSON)
579 @Produces(MediaType.APPLICATION_JSON)
580 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
582 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
583 @PathParam("vnfInstanceId") String vnfInstanceId,
584 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
585 String requestId = getRequestId(requestContext);
586 HashMap<String, String> instanceIdMap = new HashMap<>();
587 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
588 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
589 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
590 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
594 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
595 @Consumes(MediaType.APPLICATION_JSON)
596 @Produces(MediaType.APPLICATION_JSON)
597 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
599 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
600 String requestId = getRequestId(requestContext);
601 HashMap<String, String> instanceIdMap = new HashMap<>();
602 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
603 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
607 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
608 @Consumes(MediaType.APPLICATION_JSON)
609 @Produces(MediaType.APPLICATION_JSON)
610 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
612 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
613 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
614 String requestId = getRequestId(requestContext);
615 HashMap<String, String> instanceIdMap = new HashMap<>();
616 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
617 instanceIdMap.put("networkInstanceId", networkInstanceId);
618 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
622 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
623 @Consumes(MediaType.APPLICATION_JSON)
624 @Produces(MediaType.APPLICATION_JSON)
625 @ApiOperation(value="Delete provided Network instance",response=Response.class)
627 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
628 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
629 String requestId = getRequestId(requestContext);
630 HashMap<String, String> instanceIdMap = new HashMap<>();
631 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
632 instanceIdMap.put("networkInstanceId", networkInstanceId);
633 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
637 @Path("/{version:[vV][7]}/instanceGroups")
638 @Consumes(MediaType.APPLICATION_JSON)
639 @Produces(MediaType.APPLICATION_JSON)
640 @ApiOperation(value="Create instanceGroups",response=Response.class)
642 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
643 String requestId = getRequestId(requestContext);
644 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
648 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
649 @Consumes(MediaType.APPLICATION_JSON)
650 @Produces(MediaType.APPLICATION_JSON)
651 @ApiOperation(value="Delete instanceGroup",response=Response.class)
653 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
654 String requestId = getRequestId(requestContext);
655 HashMap<String, String> instanceIdMap = new HashMap<>();
656 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
657 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
661 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
662 @Consumes(MediaType.APPLICATION_JSON)
663 @Produces(MediaType.APPLICATION_JSON)
664 @ApiOperation(value="Add instanceGroup members",response=Response.class)
666 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
667 String requestId = getRequestId(requestContext);
668 HashMap<String, String> instanceIdMap = new HashMap<>();
669 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
670 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
674 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
675 @Consumes(MediaType.APPLICATION_JSON)
676 @Produces(MediaType.APPLICATION_JSON)
677 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
679 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
680 String requestId = getRequestId(requestContext);
681 HashMap<String, String> instanceIdMap = new HashMap<>();
682 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
683 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
686 public String getRequestUri(ContainerRequestContext context){
687 String requestUri = context.getUriInfo().getPath();
688 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
689 MDC.put(LogConstants.HTTP_URL, httpUrl);
690 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
694 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
695 MultivaluedMap<String, String> headers = context.getHeaders();
696 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
697 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
699 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
700 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
702 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
703 throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
707 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
708 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
709 Boolean aLaCarte = null;
710 long startTime = System.currentTimeMillis ();
711 ServiceInstancesRequest sir = null;
712 String apiVersion = version.substring(1);
714 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
715 String requestScope = deriveRequestScope(action, sir, requestUri);
716 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
717 if(sir.getRequestDetails().getRequestParameters() != null){
718 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
720 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
721 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
723 int requestVersion = Integer.parseInt(version.substring(1));
724 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
725 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
726 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
727 String networkType = msoRequest.getNetworkType(sir,requestScope);
728 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
729 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
731 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
732 currentActiveReq.setVnfType(vnfType);
733 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
734 currentActiveReq.setNetworkType(networkType);
737 InfraActiveRequests dup = null;
738 boolean inProgress = false;
740 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
743 inProgress = camundaHistoryCheck(dup, currentActiveReq);
746 if (dup != null && inProgress) {
747 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
749 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
751 RequestReferences referencesResponse = new RequestReferences();
753 referencesResponse.setRequestId(requestId);
755 serviceResponse.setRequestReferences(referencesResponse);
756 Boolean isBaseVfModule = false;
758 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
759 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
761 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
762 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
763 modelType = ModelType.vnf;
764 }else if(action == Action.addMembers || action == Action.removeMembers){
765 modelType = ModelType.instanceGroup;
767 modelType =modelInfo.getModelType();
770 if (modelType.equals(ModelType.vfModule)) {
773 // Get VF Module-specific base module indicator
776 String modelVersionId = modelInfo.getModelVersionId();
778 if(modelVersionId != null) {
779 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
780 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
781 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
785 if (vfm.getIsBase()) {
786 isBaseVfModule = true;
788 } else if (action == Action.createInstance || action == Action.updateInstance) {
789 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
790 // This request cannot proceed
792 String serviceVersionText = "";
793 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
794 serviceVersionText = " with version " + sdcServiceModelVersion;
797 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
798 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
799 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
800 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
802 throw vfModuleException;
807 serviceInstanceId = "";
809 String vfModuleId = "";
810 String volumeGroupId = "";
811 String networkId = "";
812 String correlationId = "";
813 String instanceGroupId = null;
814 if(sir.getServiceInstanceId () != null){
815 serviceInstanceId = sir.getServiceInstanceId ();
818 if(sir.getVnfInstanceId () != null){
819 vnfId = sir.getVnfInstanceId ();
822 if(sir.getVfModuleInstanceId () != null){
823 vfModuleId = sir.getVfModuleInstanceId ();
826 if(sir.getVolumeGroupInstanceId () != null){
827 volumeGroupId = sir.getVolumeGroupInstanceId ();
830 if(sir.getNetworkInstanceId () != null){
831 networkId = sir.getNetworkInstanceId ();
833 if(sir.getInstanceGroupId() != null){
834 instanceGroupId = sir.getInstanceGroupId();
837 correlationId = getCorrelationId(sir);
840 infraActiveRequestsClient.save(currentActiveReq);
842 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
843 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
844 .errorInfo(errorLoggerInfo).build();
847 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
849 }else if(aLaCarte == null){
853 RequestClientParameter requestClientParameter = null;
855 requestClientParameter = new RequestClientParameter.Builder()
856 .setRequestId(requestId)
857 .setBaseVfModule(isBaseVfModule)
858 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
859 .setRequestAction(action.toString())
860 .setServiceInstanceId(serviceInstanceId)
861 .setCorrelationId(correlationId)
863 .setVfModuleId(vfModuleId)
864 .setVolumeGroupId(volumeGroupId)
865 .setNetworkId(networkId)
866 .setServiceType(serviceInstanceType)
868 .setVfModuleType(vfModuleType)
869 .setNetworkType(networkType)
870 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
871 .setApiVersion(apiVersion)
872 .setALaCarte(aLaCarte)
873 .setRequestUri(requestUri)
874 .setInstanceGroupId(instanceGroupId).build();
875 } catch (IOException e) {
876 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
877 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
878 .errorInfo(errorLoggerInfo).build();
880 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
882 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
883 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
884 Boolean aLaCarte = true;
885 long startTime = System.currentTimeMillis ();
886 String apiVersion = version.substring(1);
887 ServiceInstancesRequest sir = new ServiceInstancesRequest();
888 sir.setInstanceGroupId(instanceGroupId);
890 String requestScope = ModelType.instanceGroup.toString();
891 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
892 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
894 validateHeaders(requestContext);
895 } catch (ValidationException e) {
897 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
898 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
899 .errorInfo(errorLoggerInfo).build();
900 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
901 throw validateException;
904 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
905 boolean inProgress = false;
908 inProgress = camundaHistoryCheck(dup, currentActiveReq);
911 if (dup != null && inProgress) {
912 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
915 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
917 RequestReferences referencesResponse = new RequestReferences();
919 referencesResponse.setRequestId(requestId);
921 serviceResponse.setRequestReferences(referencesResponse);
922 Boolean isBaseVfModule = false;
924 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
927 infraActiveRequestsClient.save(currentActiveReq);
929 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
930 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
931 .errorInfo(errorLoggerInfo).build();
934 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
935 .setRequestId(requestId)
936 .setBaseVfModule(isBaseVfModule)
937 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
938 .setRequestAction(action.toString())
939 .setApiVersion(apiVersion)
940 .setALaCarte(aLaCarte)
941 .setRequestUri(requestUri)
942 .setInstanceGroupId(instanceGroupId).build();
944 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
947 private String getCorrelationId(ServiceInstancesRequest sir) {
948 return Optional.of(sir)
949 .map(ServiceInstancesRequest::getRequestDetails)
950 .map(RequestDetails::getRequestParameters)
951 .map(parameters -> parameters.getUserParamValue("pnfId"))
955 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
956 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
957 return (ModelType.vnf.name());
958 }else if(action == Action.addMembers || action == Action.removeMembers){
959 return(ModelType.instanceGroup.toString());
962 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
963 requestScope = requestScopeFromUri(requestUri);
965 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
970 private String requestScopeFromUri(String requestUri){
972 if(requestUri.contains(ModelType.network.name())){
973 requestScope = ModelType.network.name();
974 }else if(requestUri.contains(ModelType.vfModule.name())){
975 requestScope = ModelType.vfModule.name();
976 }else if(requestUri.contains(ModelType.volumeGroup.name())){
977 requestScope = ModelType.volumeGroup.name();
978 }else if(requestUri.contains(ModelType.configuration.name())){
979 requestScope = ModelType.configuration.name();
980 }else if(requestUri.contains(ModelType.vnf.name())){
981 requestScope = ModelType.vnf.name();
983 requestScope = ModelType.service.name();
987 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
988 RequestClient requestClient = null;
989 HttpResponse response = null;
991 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
992 response = requestClient.post(requestClientParameter);
993 } catch (Exception e) {
995 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
996 String url = requestClient != null ? requestClient.getUrl() : "";
997 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
998 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1000 throw clientException;
1003 if (response == null) {
1005 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1006 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1008 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1010 throw clientException;
1013 ResponseHandler respHandler = null;
1014 int bpelStatus = 500;
1016 respHandler = new ResponseHandler (response, requestClient.getType ());
1017 bpelStatus = respHandler.getStatus ();
1018 } catch (ApiException e) {
1020 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1021 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1022 .errorInfo(errorLoggerInfo).build();
1023 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1024 throw validateException;
1027 // BPEL accepted the request, the request is in progress
1028 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1029 ServiceInstancesResponse jsonResponse;
1030 CamundaResponse camundaResp = respHandler.getResponse();
1032 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1034 ObjectMapper mapper = new ObjectMapper();
1035 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1036 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1037 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1038 if(selfLinkUrl.isPresent()){
1039 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1041 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1043 } catch (IOException e) {
1045 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1046 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1047 .errorInfo(errorLoggerInfo).build();
1048 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1049 throw validateException;
1051 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1055 List<String> variables = new ArrayList<>();
1056 variables.add(bpelStatus + "");
1057 String camundaJSONResponseBody = respHandler.getResponseBody ();
1058 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1060 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1061 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1062 .errorInfo(errorLoggerInfo).build();
1064 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1066 throw bpmnException;
1069 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1072 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1073 .errorInfo(errorLoggerInfo).build();
1074 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1076 throw servException;
1080 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1081 if(StringUtils.isNotBlank(instanceId)) {
1082 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1083 currentActiveReq.setServiceInstanceId(instanceId);
1084 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1085 currentActiveReq.setVnfId(instanceId);
1086 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1087 currentActiveReq.setVfModuleId(instanceId);
1088 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1089 currentActiveReq.setVolumeGroupId(instanceId);
1090 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1091 currentActiveReq.setNetworkId(instanceId);
1092 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1093 currentActiveReq.setConfigurationId(instanceId);
1094 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1095 currentActiveReq.setInstanceGroupId(instanceId);
1097 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1098 if(instanceIdMap.get("serviceInstanceId") != null){
1099 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1101 if(instanceIdMap.get("vnfInstanceId") != null){
1102 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1104 if(instanceIdMap.get("vfModuleInstanceId") != null){
1105 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1107 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1108 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1110 if(instanceIdMap.get("networkInstanceId") != null){
1111 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1113 if(instanceIdMap.get("configurationInstanceId") != null){
1114 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1116 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1117 currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1122 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1123 ObjectMapper mapper = new ObjectMapper();
1124 mapper.setSerializationInclusion(Include.NON_NULL);
1125 if(msoRawRequest != null){
1126 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1127 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
1128 serviceInstRequest.getRequestDetails() != null &&
1129 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1130 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1131 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1133 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
1134 return mapper.writeValueAsString(sir);
1139 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1140 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1142 // Found the duplicate record. Return the appropriate error.
1143 String instance = null;
1144 if(instanceName != null){
1145 instance = instanceName;
1147 instance = instanceIdMap.get(requestScope + "InstanceId");
1149 //List<String> variables = new ArrayList<String>();
1150 //variables.add(dup.getRequestStatus());
1151 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1154 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1155 .errorInfo(errorLoggerInfo).build();
1157 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1162 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1163 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1164 InfraActiveRequests dup = null;
1166 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1167 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1169 } catch (Exception e) {
1170 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1171 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1172 .errorInfo(errorLoggerInfo).build();
1173 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1174 throw requestDbFailureException;
1178 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1179 String requestId = duplicateRecord.getRequestId();
1180 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1181 String targetUrl = env.getProperty("mso.camundaURL") + path;
1182 HttpHeaders headers = setCamundaHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1183 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1184 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1186 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1187 }catch(HttpStatusCodeException e){
1188 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1189 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1190 .errorInfo(errorLoggerInfo).build();
1191 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1192 throw contactCamundaException;
1194 if(response.getBody().isEmpty()){
1195 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1197 for(HistoricProcessInstance instance : response.getBody()){
1198 if(instance.getState().equals("ACTIVE")){
1201 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1206 protected HttpHeaders setCamundaHeaders(String auth, String msoKey) {
1207 HttpHeaders headers = new HttpHeaders();
1208 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1209 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1210 headers.setAccept(acceptableMediaTypes);
1212 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1213 if(userCredentials != null) {
1214 headers.add(HttpHeaders.AUTHORIZATION, "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));
1216 } catch(GeneralSecurityException e) {
1217 msoLogger.error("Security exception", e);
1222 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1223 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1225 ObjectMapper mapper = new ObjectMapper();
1226 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1228 } catch (IOException e) {
1230 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1232 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1233 .errorInfo(errorLoggerInfo).build();
1234 String requestScope = requestScopeFromUri(requestUri);
1236 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1238 throw validateException;
1242 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1243 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1244 int reqVersion = Integer.parseInt(version.substring(1));
1246 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1247 } catch (Exception e) {
1248 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1249 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1250 .errorInfo(errorLoggerInfo).build();
1252 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1254 throw validateException;
1258 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1259 InfraActiveRequests currentActiveReq) throws ApiException {
1260 RecipeLookupResult recipeLookupResult = null;
1261 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1262 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1263 // Query MSO Catalog DB
1265 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1266 recipeLookupResult = getDefaultVnfUri(sir, action);
1267 }else if(action == Action.addMembers || action == Action.removeMembers){
1268 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1269 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1271 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1272 } catch (IOException e) {
1273 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1276 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1277 .errorInfo(errorLoggerInfo).build();
1279 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1281 throw validateException;
1283 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1284 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1286 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1287 } catch (ValidationException e) {
1288 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1291 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1292 .errorInfo(errorLoggerInfo).build();
1294 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1296 throw validateException;
1298 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1300 recipeLookupResult = getNetworkUri( sir, action);
1301 } catch (ValidationException e) {
1303 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1306 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1307 .errorInfo(errorLoggerInfo).build();
1308 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1310 throw validateException;
1312 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1313 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1316 if (recipeLookupResult == null) {
1317 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1320 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1321 .errorInfo(errorLoggerInfo).build();
1323 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1324 throw recipeNotFoundExceptionException;
1326 return recipeLookupResult;
1329 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1331 // Construct the default service name
1332 // TODO need to make this a configurable property
1333 String defaultServiceModelName = getDefaultModel(servInstReq);
1334 RequestDetails requestDetails = servInstReq.getRequestDetails();
1335 ModelInfo modelInfo = requestDetails.getModelInfo();
1336 org.onap.so.db.catalog.beans.Service serviceRecord;
1337 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1338 ServiceRecipe recipe = null;
1341 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1342 if(serviceRecord !=null){
1343 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1346 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1347 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1348 if (recipe == null){
1349 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1350 if(!serviceRecordList.isEmpty()){
1351 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1352 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1361 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1362 RequestParameters reqParam = requestDetails.getRequestParameters();
1363 if(reqParam!=null && alaCarteFlag && recipe==null){
1365 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1366 mapToLegacyRequest(requestDetails);
1367 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1368 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1369 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1371 if(modelInfo.getModelVersionId() == null) {
1372 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1377 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1380 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1381 RequestParameters reqParam;
1382 if (requestDetails.getRequestParameters() == null) {
1383 reqParam = new RequestParameters();
1385 reqParam = requestDetails.getRequestParameters();
1387 if(requestDetails.getCloudConfiguration() == null) {
1388 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1389 if(cloudConfig != null) {
1390 requestDetails.setCloudConfiguration(cloudConfig);
1394 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1395 if(!userParams.isEmpty()) {
1396 if (reqParam == null) {
1397 requestDetails.setRequestParameters(new RequestParameters());
1399 requestDetails.getRequestParameters().setUserParams(userParams);
1403 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1405 for(Map<String, Object> params : reqParams.getUserParams()){
1406 if(params.containsKey("service")){
1407 Service service = serviceMapper(params);
1409 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1411 if (targetConfiguration.isPresent()) {
1412 return targetConfiguration.get();
1414 for(Networks network : service.getResources().getNetworks()) {
1415 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1416 if(targetConfiguration.isPresent()) {
1417 return targetConfiguration.get();
1421 for(Vnfs vnf : service.getResources().getVnfs()) {
1422 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1424 if(targetConfiguration.isPresent()) {
1425 return targetConfiguration.get();
1428 for(VfModules vfModule : vnf.getVfModules()) {
1429 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1431 if(targetConfiguration.isPresent()) {
1432 return targetConfiguration.get();
1443 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1444 CloudConfiguration targetConfiguration = new CloudConfiguration();
1445 if(sourceCloudConfiguration != null) {
1446 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1447 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1448 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1449 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1450 return Optional.of(targetConfiguration);
1452 return Optional.empty();
1455 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1456 msoLogger.debug("Configuring UserParams for Macro Request");
1457 Map<String, Object> userParams = new HashMap<>();
1459 for(Map<String, Object> params : reqParams.getUserParams()){
1460 if(params.containsKey("service")){
1461 Service service = serviceMapper(params);
1463 addUserParams(userParams, service.getInstanceParams());
1465 for(Networks network : service.getResources().getNetworks()) {
1466 addUserParams(userParams, network.getInstanceParams());
1469 for(Vnfs vnf: service.getResources().getVnfs()) {
1470 addUserParams(userParams, vnf.getInstanceParams());
1472 for(VfModules vfModule: vnf.getVfModules()) {
1473 addUserParams(userParams, vfModule.getInstanceParams());
1479 return mapFlatMapToNameValue(userParams);
1482 private Service serviceMapper(Map<String, Object> params)
1483 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1484 ObjectMapper obj = new ObjectMapper();
1485 String input = obj.writeValueAsString(params.get("service"));
1486 return obj.readValue(input, Service.class);
1489 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1490 for(Map<String, String> map : sourceUserParams) {
1491 for (Map.Entry<String, String> entry : map.entrySet()) {
1492 targetUserParams.put(entry.getKey(), entry.getValue());
1497 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1498 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1500 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1501 Map<String, Object> targetMap = new HashMap<>();
1502 targetMap.put(NAME, map.getKey());
1503 targetMap.put(VALUE, map.getValue());
1504 targetUserParams.add(targetMap);
1506 return targetUserParams;
1509 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1511 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1512 String vnfComponentType = modelInfo.getModelType().name();
1514 RelatedInstanceList[] instanceList = null;
1515 if (servInstReq.getRequestDetails() != null) {
1516 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1519 Recipe recipe = null;
1520 String defaultSource = getDefaultModel(servInstReq);
1521 String modelCustomizationId = modelInfo.getModelCustomizationId();
1522 String modelCustomizationName = modelInfo.getModelCustomizationName();
1523 String relatedInstanceModelVersionId = null;
1524 String relatedInstanceModelInvariantId = null;
1525 String relatedInstanceVersion = null;
1526 String relatedInstanceModelCustomizationName = null;
1528 if (instanceList != null) {
1530 for(RelatedInstanceList relatedInstanceList : instanceList){
1532 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1533 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1534 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1535 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1536 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1539 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1540 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1541 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1542 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1543 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1547 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1548 // a. For a vnf request (only create, no update currently):
1549 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1550 // 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
1551 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1552 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1553 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1554 // (MODEL_UUID) in SERVICE table.
1555 // 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
1556 // during 1707 data migration if VID did not provide it originally on request.
1557 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1558 // 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.
1560 VnfResource vnfResource = null;
1561 VnfResourceCustomization vrc=null;
1562 // Validation for vnfResource
1564 if(modelCustomizationId!=null) {
1565 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1567 vnfResource = vrc.getVnfResources();
1570 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1571 if(service == null) {
1572 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1575 if(service == null) {
1576 throw new ValidationException("service in relatedInstance");
1578 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1579 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1580 vrc=vnfResourceCustom;
1585 vnfResource = vrc.getVnfResources();
1586 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1587 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1591 if(vnfResource==null){
1592 throw new ValidationException("vnfResource");
1594 if(modelInfo.getModelVersionId() == null) {
1595 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1599 VnfRecipe vnfRecipe = null;
1602 String nfRole = vrc.getNfRole();
1603 if(nfRole != null) {
1604 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1608 if(vnfRecipe == null) {
1609 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1612 if (vnfRecipe == null) {
1616 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1618 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1619 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1620 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1621 // 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.
1622 // 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
1623 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1624 // 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)
1625 // and MODEL_VERSION (modelVersion).
1627 VfModuleCustomization vfmc = null;
1629 VnfResourceCustomization vnfrc;
1630 VfModule vfModule = null;
1632 if(modelInfo.getModelCustomizationId() != null) {
1633 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1635 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1637 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1639 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1641 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1643 String vfModuleModelUUID = modelInfo.getModelVersionId();
1644 for(VfModuleCustomization vf : list) {
1645 VfModuleCustomization vfmCustom;
1646 if(vfModuleModelUUID != null){
1647 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1648 if(vfmCustom != null){
1649 vfModule = vfmCustom.getVfModule();
1652 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1653 if(vfmCustom != null){
1654 vfModule = vfmCustom.getVfModule();
1656 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1660 if(vfModule != null) {
1661 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1662 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1668 if(vfmc == null && vfModule == null) {
1669 throw new ValidationException("vfModuleCustomization");
1670 } else if (vfModule == null && vfmc != null) {
1671 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1674 if(modelInfo.getModelVersionId() == null) {
1675 modelInfo.setModelVersionId(vfModule.getModelUUID());
1679 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1681 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1682 if(!vfModuleRecords.isEmpty()){
1683 for(VfModule record : vfModuleRecords){
1684 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1691 if(recipe == null) {
1692 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1693 if (recipe == null) {
1694 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1697 if(recipe == null) {
1704 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1705 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1706 if (recipe == null) {
1710 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1712 if (recipe == null) {
1718 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1721 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1723 String defaultSource = getDefaultModel(sir);
1725 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1727 if (vnfRecipe == null) {
1731 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1735 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1737 String defaultNetworkType = getDefaultModel(sir);
1739 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1740 String modelName = modelInfo.getModelName();
1741 Recipe recipe = null;
1743 if(modelInfo.getModelCustomizationId()!=null){
1744 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1745 if(networkResourceCustomization != null){
1746 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1747 if(networkResource!=null){
1748 if(modelInfo.getModelVersionId() == null) {
1749 modelInfo.setModelVersionId(networkResource.getModelUUID());
1751 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1753 throw new ValidationException("no catalog entry found");
1755 }else if(action != Action.deleteInstance){
1756 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1759 //ok for version < 3 and action delete
1760 if(modelName != null){
1761 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1766 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1769 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1772 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1773 String requestTestApi = null;
1774 TestApi testApi = null;
1776 if (requestParams != null) {
1777 requestTestApi = requestParams.getTestApi();
1780 if (requestTestApi == null) {
1781 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1782 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1784 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1789 testApi = TestApi.valueOf(requestTestApi);
1790 return Optional.of(testApi.getModelName());
1791 } catch (Exception e) {
1792 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1793 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1797 private String getDefaultModel(ServiceInstancesRequest sir) {
1798 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1799 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1800 if (oModelName.isPresent()) {
1801 defaultModel = oModelName.get();
1803 return defaultModel;
1806 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1807 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1808 Boolean aLaCarte = null;
1809 String apiVersion = version.substring(1);
1810 boolean inProgress = false;
1812 long startTime = System.currentTimeMillis ();
1813 ServiceInstancesRequest sir = null;
1815 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1816 String requestScope = deriveRequestScope(action,sir, requestUri);
1817 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1818 if(sir.getRequestDetails().getRequestParameters() != null){
1819 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1821 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1822 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1823 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1825 InfraActiveRequests dup = null;
1827 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1830 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1833 if (instanceIdMap != null && dup != null && inProgress) {
1834 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1837 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1838 RequestReferences referencesResponse = new RequestReferences();
1839 referencesResponse.setRequestId(requestId);
1840 serviceResponse.setRequestReferences(referencesResponse);
1843 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1844 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1846 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1847 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1849 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1852 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1853 .errorInfo(errorLoggerInfo).build();
1855 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1857 throw validateException;
1861 serviceInstanceId = "";
1862 String configurationId = "";
1863 String correlationId = "";
1865 if(sir.getServiceInstanceId () != null){
1866 serviceInstanceId = sir.getServiceInstanceId ();
1869 if(sir.getConfigurationId() != null){
1870 configurationId = sir.getConfigurationId();
1873 correlationId = getCorrelationId(sir);
1876 infraActiveRequestsClient.save(currentActiveReq);
1877 }catch(Exception e){
1878 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1879 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1880 .errorInfo(errorLoggerInfo).build();
1883 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1885 }else if(aLaCarte == null){
1888 RequestClientParameter requestClientParameter = null;
1890 requestClientParameter = new RequestClientParameter.Builder()
1891 .setRequestId(requestId)
1892 .setBaseVfModule(false)
1893 .setRecipeTimeout(Integer.parseInt(timeOut))
1894 .setRequestAction(action.toString())
1895 .setServiceInstanceId(serviceInstanceId)
1896 .setCorrelationId(correlationId)
1897 .setConfigurationId(configurationId)
1898 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1899 .setApiVersion(apiVersion)
1900 .setALaCarte(aLaCarte)
1901 .setRequestUri(requestUri).build();
1902 } catch (IOException e) {
1903 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1904 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1905 .errorInfo(errorLoggerInfo).build();
1908 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1911 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1912 String requestId = null;
1913 if (requestContext.getProperty("requestId") != null) {
1914 requestId = requestContext.getProperty("requestId").toString();
1916 if (UUIDChecker.isValidUUID(requestId)) {
1919 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1920 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1921 .errorInfo(errorLoggerInfo).build();
1923 throw validateException;
1926 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1927 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1928 aq.setStatusMessage (errorMessage);
1929 aq.setProgress(new Long(100));
1930 aq.setRequestStatus(status.toString());
1931 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1932 aq.setEndTime (endTimeStamp);
1934 infraActiveRequestsClient.save(aq);
1935 }catch(Exception e){
1936 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1937 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1938 .errorInfo(errorLoggerInfo).build();
1942 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1943 String serviceType = null;
1944 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1945 String defaultServiceModelName = getDefaultModel(sir);
1946 org.onap.so.db.catalog.beans.Service serviceRecord;
1948 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1949 if(serviceRecord != null){
1950 serviceType = serviceRecord.getServiceType();
1953 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1954 if(serviceRecord != null){
1955 serviceType = serviceRecord.getServiceType();
1957 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1958 if(serviceRecord != null){
1959 serviceType = serviceRecord.getServiceType();
1964 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);