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 java.io.IOException;
115 import java.security.GeneralSecurityException;
116 import java.sql.Timestamp;
117 import java.util.ArrayList;
118 import java.util.HashMap;
119 import java.util.List;
120 import java.util.Map;
121 import java.util.Optional;
124 @Path("/onap/so/infra/serviceInstantiation")
125 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
126 public class ServiceInstances {
128 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
129 private static String NAME = "name";
130 private static String VALUE = "value";
131 private static final String SAVE_TO_DB = "save instance to db";
134 private Environment env;
137 private RequestClientFactory reqClientFactory;
140 private CatalogDbClient catalogDbClient;
143 private RequestsDbClient infraActiveRequestsClient;
146 private ResponseBuilder builder;
149 private MsoRequest msoRequest;
152 private RestTemplate restTemplate;
155 @Path("/{version:[vV][5-7]}/serviceInstances")
156 @Consumes(MediaType.APPLICATION_JSON)
157 @Produces(MediaType.APPLICATION_JSON)
158 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
160 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
161 String requestId = getRequestId(requestContext);
162 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
166 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
167 @Consumes(MediaType.APPLICATION_JSON)
168 @Produces(MediaType.APPLICATION_JSON)
169 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
171 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
172 String requestId = getRequestId(requestContext);
173 HashMap<String, String> instanceIdMap = new HashMap<>();
174 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
175 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
179 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
180 @Consumes(MediaType.APPLICATION_JSON)
181 @Produces(MediaType.APPLICATION_JSON)
182 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
184 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
185 String requestId = getRequestId(requestContext);
186 HashMap<String, String> instanceIdMap = new HashMap<>();
187 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
188 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
192 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
193 @Consumes(MediaType.APPLICATION_JSON)
194 @Produces(MediaType.APPLICATION_JSON)
195 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
197 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
198 String requestId = getRequestId(requestContext);
199 HashMap<String, String> instanceIdMap = new HashMap<>();
200 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
201 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
205 @Path("/{version:[vV][7]}/serviceInstances/assign")
206 @Consumes(MediaType.APPLICATION_JSON)
207 @Produces(MediaType.APPLICATION_JSON)
208 @ApiOperation(value="Assign Service Instance", response=Response.class)
210 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
211 String requestId = getRequestId(requestContext);
212 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
216 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
217 @Consumes(MediaType.APPLICATION_JSON)
218 @Produces(MediaType.APPLICATION_JSON)
219 @ApiOperation(value="Unassign Service Instance", response=Response.class)
221 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
222 String requestId = getRequestId(requestContext);
223 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
224 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
225 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
229 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
230 @Consumes(MediaType.APPLICATION_JSON)
231 @Produces(MediaType.APPLICATION_JSON)
232 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
234 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
235 String requestId = getRequestId(requestContext);
236 HashMap<String, String> instanceIdMap = new HashMap<>();
237 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
238 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
242 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
243 @Consumes(MediaType.APPLICATION_JSON)
244 @Produces(MediaType.APPLICATION_JSON)
245 @ApiOperation(value="Delete provided Port",response=Response.class)
247 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
248 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
249 String requestId = getRequestId(requestContext);
250 HashMap<String, String> instanceIdMap = new HashMap<>();
251 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
252 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
253 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
257 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
258 @Consumes(MediaType.APPLICATION_JSON)
259 @Produces(MediaType.APPLICATION_JSON)
260 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
262 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
263 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
264 String requestId = getRequestId(requestContext);
265 HashMap<String, String> instanceIdMap = new HashMap<>();
266 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
267 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
268 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
272 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
273 @Consumes(MediaType.APPLICATION_JSON)
274 @Produces(MediaType.APPLICATION_JSON)
275 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
277 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
278 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
279 String requestId = getRequestId(requestContext);
280 HashMap<String, String> instanceIdMap = new HashMap<>();
281 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
282 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
283 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
287 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
288 @Consumes(MediaType.APPLICATION_JSON)
289 @Produces(MediaType.APPLICATION_JSON)
290 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
292 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
293 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
294 String requestId = getRequestId(requestContext);
295 HashMap<String, String> instanceIdMap = new HashMap<>();
296 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
297 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
298 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
302 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
303 @Consumes(MediaType.APPLICATION_JSON)
304 @Produces(MediaType.APPLICATION_JSON)
305 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
307 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
308 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
309 String requestId = getRequestId(requestContext);
310 HashMap<String, String> instanceIdMap = new HashMap<>();
311 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
312 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
313 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
317 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
318 @Consumes(MediaType.APPLICATION_JSON)
319 @Produces(MediaType.APPLICATION_JSON)
320 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
322 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
323 String requestId = getRequestId(requestContext);
324 HashMap<String, String> instanceIdMap = new HashMap<>();
325 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
326 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
330 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
331 @Consumes(MediaType.APPLICATION_JSON)
332 @Produces(MediaType.APPLICATION_JSON)
333 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
335 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
336 String requestId = getRequestId(requestContext);
337 HashMap<String, String> instanceIdMap = new HashMap<>();
338 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
339 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
343 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
344 @Consumes(MediaType.APPLICATION_JSON)
345 @Produces(MediaType.APPLICATION_JSON)
346 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
348 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
349 String requestId = getRequestId(requestContext);
350 HashMap<String, String> instanceIdMap = new HashMap<>();
351 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
352 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
356 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
357 @Consumes(MediaType.APPLICATION_JSON)
358 @Produces(MediaType.APPLICATION_JSON)
359 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
361 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
362 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
363 String requestId = getRequestId(requestContext);
364 HashMap<String, String> instanceIdMap = new HashMap<>();
365 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
366 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
367 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
371 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
372 @Consumes(MediaType.APPLICATION_JSON)
373 @Produces(MediaType.APPLICATION_JSON)
374 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
376 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
377 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
378 String requestId = getRequestId(requestContext);
379 HashMap<String, String> instanceIdMap = new HashMap<>();
380 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
381 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
382 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
386 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
387 @Consumes(MediaType.APPLICATION_JSON)
388 @Produces(MediaType.APPLICATION_JSON)
389 @ApiOperation(value="Apply updated configuration",response=Response.class)
390 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
391 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
392 String requestId = getRequestId(requestContext);
393 HashMap<String, String> instanceIdMap = new HashMap<>();
394 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
395 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
396 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
400 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
401 @Consumes(MediaType.APPLICATION_JSON)
402 @Produces(MediaType.APPLICATION_JSON)
403 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
404 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
405 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
406 String requestId = getRequestId(requestContext);
407 HashMap<String, String> instanceIdMap = new HashMap<>();
408 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
409 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
410 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
415 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
416 @Consumes(MediaType.APPLICATION_JSON)
417 @Produces(MediaType.APPLICATION_JSON)
418 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
420 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
421 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
422 String requestId = getRequestId(requestContext);
423 HashMap<String, String> instanceIdMap = new HashMap<>();
424 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
425 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
426 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
430 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
431 @Consumes(MediaType.APPLICATION_JSON)
432 @Produces(MediaType.APPLICATION_JSON)
433 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
435 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
436 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
437 String requestId = getRequestId(requestContext);
438 HashMap<String, String> instanceIdMap = new HashMap<>();
439 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
440 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
441 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
445 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
446 @Consumes(MediaType.APPLICATION_JSON)
447 @Produces(MediaType.APPLICATION_JSON)
448 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
450 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
451 @PathParam("vnfInstanceId") String vnfInstanceId,
452 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
453 String requestId = getRequestId(requestContext);
454 HashMap<String, String> instanceIdMap = new HashMap<>();
455 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
456 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
457 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
458 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
462 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
463 @Consumes(MediaType.APPLICATION_JSON)
464 @Produces(MediaType.APPLICATION_JSON)
465 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
467 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
468 @PathParam("vnfInstanceId") String vnfInstanceId,
469 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
470 String requestId = getRequestId(requestContext);
471 HashMap<String, String> instanceIdMap = new HashMap<>();
472 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
473 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
474 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
475 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
479 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
480 @Consumes(MediaType.APPLICATION_JSON)
481 @Produces(MediaType.APPLICATION_JSON)
482 @ApiOperation(value="Perform VNF software update",response=Response.class)
484 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
485 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
486 String requestId = getRequestId(requestContext);
487 HashMap<String, String> instanceIdMap = new HashMap<>();
488 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
489 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
490 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
494 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
495 @Consumes(MediaType.APPLICATION_JSON)
496 @Produces(MediaType.APPLICATION_JSON)
497 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
499 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
500 @PathParam("vnfInstanceId") String vnfInstanceId,
501 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
502 String requestId = getRequestId(requestContext);
503 HashMap<String, String> instanceIdMap = new HashMap<>();
504 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
505 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
506 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
507 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
511 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
512 @Consumes(MediaType.APPLICATION_JSON)
513 @Produces(MediaType.APPLICATION_JSON)
514 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
516 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
517 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
518 String requestId = getRequestId(requestContext);
519 HashMap<String, String> instanceIdMap = new HashMap<>();
520 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
521 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
522 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
523 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
528 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
529 @Consumes(MediaType.APPLICATION_JSON)
530 @Produces(MediaType.APPLICATION_JSON)
531 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
533 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
534 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
535 String requestId = getRequestId(requestContext);
536 HashMap<String, String> instanceIdMap = new HashMap<>();
537 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
538 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
539 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
544 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
545 @Consumes(MediaType.APPLICATION_JSON)
546 @Produces(MediaType.APPLICATION_JSON)
547 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
549 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
550 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
551 String requestId = getRequestId(requestContext);
552 HashMap<String, String> instanceIdMap = new HashMap<>();
553 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
554 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
555 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
559 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
560 @Consumes(MediaType.APPLICATION_JSON)
561 @Produces(MediaType.APPLICATION_JSON)
562 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
564 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
565 @PathParam("vnfInstanceId") String vnfInstanceId,
566 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
567 String requestId = getRequestId(requestContext);
568 HashMap<String, String> instanceIdMap = new HashMap<>();
569 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
570 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
571 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
572 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
576 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
577 @Consumes(MediaType.APPLICATION_JSON)
578 @Produces(MediaType.APPLICATION_JSON)
579 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
581 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
582 @PathParam("vnfInstanceId") String vnfInstanceId,
583 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
584 String requestId = getRequestId(requestContext);
585 HashMap<String, String> instanceIdMap = new HashMap<>();
586 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
587 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
588 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
589 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
593 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
594 @Consumes(MediaType.APPLICATION_JSON)
595 @Produces(MediaType.APPLICATION_JSON)
596 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
598 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
599 String requestId = getRequestId(requestContext);
600 HashMap<String, String> instanceIdMap = new HashMap<>();
601 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
602 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
606 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
607 @Consumes(MediaType.APPLICATION_JSON)
608 @Produces(MediaType.APPLICATION_JSON)
609 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
611 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
612 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
613 String requestId = getRequestId(requestContext);
614 HashMap<String, String> instanceIdMap = new HashMap<>();
615 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
616 instanceIdMap.put("networkInstanceId", networkInstanceId);
617 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
621 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
622 @Consumes(MediaType.APPLICATION_JSON)
623 @Produces(MediaType.APPLICATION_JSON)
624 @ApiOperation(value="Delete provided Network instance",response=Response.class)
626 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
627 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
628 String requestId = getRequestId(requestContext);
629 HashMap<String, String> instanceIdMap = new HashMap<>();
630 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
631 instanceIdMap.put("networkInstanceId", networkInstanceId);
632 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
636 @Path("/{version:[vV][7]}/instanceGroups")
637 @Consumes(MediaType.APPLICATION_JSON)
638 @Produces(MediaType.APPLICATION_JSON)
639 @ApiOperation(value="Create instanceGroups",response=Response.class)
641 public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
642 String requestId = getRequestId(requestContext);
643 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
647 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
648 @Consumes(MediaType.APPLICATION_JSON)
649 @Produces(MediaType.APPLICATION_JSON)
650 @ApiOperation(value="Delete instanceGroup",response=Response.class)
652 public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
653 String requestId = getRequestId(requestContext);
654 HashMap<String, String> instanceIdMap = new HashMap<>();
655 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
656 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext), requestContext);
660 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
661 @Consumes(MediaType.APPLICATION_JSON)
662 @Produces(MediaType.APPLICATION_JSON)
663 @ApiOperation(value="Add instanceGroup members",response=Response.class)
665 public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
666 String requestId = getRequestId(requestContext);
667 HashMap<String, String> instanceIdMap = new HashMap<>();
668 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
669 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
673 @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
674 @Consumes(MediaType.APPLICATION_JSON)
675 @Produces(MediaType.APPLICATION_JSON)
676 @ApiOperation(value="Remove instanceGroup members",response=Response.class)
678 public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
679 String requestId = getRequestId(requestContext);
680 HashMap<String, String> instanceIdMap = new HashMap<>();
681 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_ID, instanceGroupId);
682 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, getRequestUri(requestContext));
685 public String getRequestUri(ContainerRequestContext context){
686 String requestUri = context.getUriInfo().getPath();
687 String httpUrl = MDC.get(LogConstants.URI_BASE).concat(requestUri);
688 MDC.put(LogConstants.HTTP_URL, httpUrl);
689 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
693 public void validateHeaders(ContainerRequestContext context) throws ValidationException{
694 MultivaluedMap<String, String> headers = context.getHeaders();
695 if(!headers.containsKey(ONAPLogConstants.Headers.REQUEST_ID)){
696 throw new ValidationException(ONAPLogConstants.Headers.REQUEST_ID + " header", true);
698 if(!headers.containsKey(ONAPLogConstants.Headers.PARTNER_NAME)){
699 throw new ValidationException(ONAPLogConstants.Headers.PARTNER_NAME + " header", true);
701 if(!headers.containsKey(MsoLogger.REQUESTOR_ID)){
702 throw new ValidationException(MsoLogger.REQUESTOR_ID + " header", true);
706 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
707 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
708 Boolean aLaCarte = null;
709 long startTime = System.currentTimeMillis ();
710 ServiceInstancesRequest sir = null;
711 String apiVersion = version.substring(1);
713 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
714 String requestScope = deriveRequestScope(action, sir, requestUri);
715 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
716 if(sir.getRequestDetails().getRequestParameters() != null){
717 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
719 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
720 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
722 int requestVersion = Integer.parseInt(version.substring(1));
723 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
724 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
725 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
726 String networkType = msoRequest.getNetworkType(sir,requestScope);
727 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
728 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
730 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
731 currentActiveReq.setVnfType(vnfType);
732 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
733 currentActiveReq.setNetworkType(networkType);
736 InfraActiveRequests dup = null;
737 boolean inProgress = false;
739 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
742 inProgress = camundaHistoryCheck(dup, currentActiveReq);
745 if (dup != null && inProgress) {
746 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
748 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
750 RequestReferences referencesResponse = new RequestReferences();
752 referencesResponse.setRequestId(requestId);
754 serviceResponse.setRequestReferences(referencesResponse);
755 Boolean isBaseVfModule = false;
757 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
758 String serviceInstanceType = getServiceType(requestScope, sir, alaCarteFlag);
760 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
761 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
762 modelType = ModelType.vnf;
763 }else if(action == Action.addMembers || action == Action.removeMembers){
764 modelType = ModelType.instanceGroup;
766 modelType =modelInfo.getModelType();
769 if (modelType.equals(ModelType.vfModule)) {
772 // Get VF Module-specific base module indicator
775 String modelVersionId = modelInfo.getModelVersionId();
777 if(modelVersionId != null) {
778 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
779 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
780 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
784 if (vfm.getIsBase()) {
785 isBaseVfModule = true;
787 } else if (action == Action.createInstance || action == Action.updateInstance) {
788 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
789 // This request cannot proceed
791 String serviceVersionText = "";
792 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
793 serviceVersionText = " with version " + sdcServiceModelVersion;
796 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
797 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
798 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
799 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
801 throw vfModuleException;
806 serviceInstanceId = "";
808 String vfModuleId = "";
809 String volumeGroupId = "";
810 String networkId = "";
811 String correlationId = "";
812 String instanceGroupId = null;
813 if(sir.getServiceInstanceId () != null){
814 serviceInstanceId = sir.getServiceInstanceId ();
817 if(sir.getVnfInstanceId () != null){
818 vnfId = sir.getVnfInstanceId ();
821 if(sir.getVfModuleInstanceId () != null){
822 vfModuleId = sir.getVfModuleInstanceId ();
825 if(sir.getVolumeGroupInstanceId () != null){
826 volumeGroupId = sir.getVolumeGroupInstanceId ();
829 if(sir.getNetworkInstanceId () != null){
830 networkId = sir.getNetworkInstanceId ();
832 if(sir.getInstanceGroupId() != null){
833 instanceGroupId = sir.getInstanceGroupId();
836 correlationId = getCorrelationId(sir);
839 infraActiveRequestsClient.save(currentActiveReq);
841 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
842 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
843 .errorInfo(errorLoggerInfo).build();
846 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
848 }else if(aLaCarte == null){
852 RequestClientParameter requestClientParameter = null;
854 requestClientParameter = new RequestClientParameter.Builder()
855 .setRequestId(requestId)
856 .setBaseVfModule(isBaseVfModule)
857 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
858 .setRequestAction(action.toString())
859 .setServiceInstanceId(serviceInstanceId)
860 .setCorrelationId(correlationId)
862 .setVfModuleId(vfModuleId)
863 .setVolumeGroupId(volumeGroupId)
864 .setNetworkId(networkId)
865 .setServiceType(serviceInstanceType)
867 .setVfModuleType(vfModuleType)
868 .setNetworkType(networkType)
869 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
870 .setApiVersion(apiVersion)
871 .setALaCarte(aLaCarte)
872 .setRequestUri(requestUri)
873 .setInstanceGroupId(instanceGroupId).build();
874 } catch (IOException e) {
875 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
876 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
877 .errorInfo(errorLoggerInfo).build();
879 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
881 public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
882 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
883 Boolean aLaCarte = true;
884 long startTime = System.currentTimeMillis ();
885 String apiVersion = version.substring(1);
886 ServiceInstancesRequest sir = new ServiceInstancesRequest();
887 sir.setInstanceGroupId(instanceGroupId);
889 String requestScope = ModelType.instanceGroup.toString();
890 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
891 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
893 validateHeaders(requestContext);
894 } catch (ValidationException e) {
896 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
897 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
898 .errorInfo(errorLoggerInfo).build();
899 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
900 throw validateException;
903 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
904 boolean inProgress = false;
907 inProgress = camundaHistoryCheck(dup, currentActiveReq);
910 if (dup != null && inProgress) {
911 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
914 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
916 RequestReferences referencesResponse = new RequestReferences();
918 referencesResponse.setRequestId(requestId);
920 serviceResponse.setRequestReferences(referencesResponse);
921 Boolean isBaseVfModule = false;
923 RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
926 infraActiveRequestsClient.save(currentActiveReq);
928 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
929 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
930 .errorInfo(errorLoggerInfo).build();
933 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
934 .setRequestId(requestId)
935 .setBaseVfModule(isBaseVfModule)
936 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
937 .setRequestAction(action.toString())
938 .setApiVersion(apiVersion)
939 .setALaCarte(aLaCarte)
940 .setRequestUri(requestUri)
941 .setInstanceGroupId(instanceGroupId).build();
943 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
946 private String getCorrelationId(ServiceInstancesRequest sir) {
947 return Optional.of(sir)
948 .map(ServiceInstancesRequest::getRequestDetails)
949 .map(RequestDetails::getRequestParameters)
950 .map(parameters -> parameters.getUserParamValue("pnfId"))
954 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
955 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
956 return (ModelType.vnf.name());
957 }else if(action == Action.addMembers || action == Action.removeMembers){
958 return(ModelType.instanceGroup.toString());
961 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
962 requestScope = requestScopeFromUri(requestUri);
964 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
969 private String requestScopeFromUri(String requestUri){
971 if(requestUri.contains(ModelType.network.name())){
972 requestScope = ModelType.network.name();
973 }else if(requestUri.contains(ModelType.vfModule.name())){
974 requestScope = ModelType.vfModule.name();
975 }else if(requestUri.contains(ModelType.volumeGroup.name())){
976 requestScope = ModelType.volumeGroup.name();
977 }else if(requestUri.contains(ModelType.configuration.name())){
978 requestScope = ModelType.configuration.name();
979 }else if(requestUri.contains(ModelType.vnf.name())){
980 requestScope = ModelType.vnf.name();
982 requestScope = ModelType.service.name();
986 private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
987 RequestClient requestClient = null;
988 HttpResponse response = null;
990 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
991 response = requestClient.post(requestClientParameter);
992 } catch (Exception e) {
994 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
995 String url = requestClient != null ? requestClient.getUrl() : "";
996 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
997 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
999 throw clientException;
1002 if (response == null) {
1004 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1005 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
1007 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
1009 throw clientException;
1012 ResponseHandler respHandler = null;
1013 int bpelStatus = 500;
1015 respHandler = new ResponseHandler (response, requestClient.getType ());
1016 bpelStatus = respHandler.getStatus ();
1017 } catch (ApiException e) {
1019 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1020 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1021 .errorInfo(errorLoggerInfo).build();
1022 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1023 throw validateException;
1026 // BPEL accepted the request, the request is in progress
1027 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1028 ServiceInstancesResponse jsonResponse;
1029 CamundaResponse camundaResp = respHandler.getResponse();
1031 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1033 ObjectMapper mapper = new ObjectMapper();
1034 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1035 jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1036 Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1037 if(selfLinkUrl.isPresent()){
1038 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1040 jsonResponse.getRequestReferences().setRequestSelfLink(null);
1042 } catch (IOException e) {
1044 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1045 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1046 .errorInfo(errorLoggerInfo).build();
1047 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1048 throw validateException;
1050 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1054 List<String> variables = new ArrayList<>();
1055 variables.add(bpelStatus + "");
1056 String camundaJSONResponseBody = respHandler.getResponseBody ();
1057 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1059 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1060 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1061 .errorInfo(errorLoggerInfo).build();
1063 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1065 throw bpmnException;
1068 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1071 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1072 .errorInfo(errorLoggerInfo).build();
1073 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1075 throw servException;
1079 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1080 if(StringUtils.isNotBlank(instanceId)) {
1081 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1082 currentActiveReq.setServiceInstanceId(instanceId);
1083 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1084 currentActiveReq.setVnfId(instanceId);
1085 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1086 currentActiveReq.setVfModuleId(instanceId);
1087 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1088 currentActiveReq.setVolumeGroupId(instanceId);
1089 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1090 currentActiveReq.setNetworkId(instanceId);
1091 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1092 currentActiveReq.setConfigurationId(instanceId);
1093 }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1094 currentActiveReq.setInstanceGroupId(instanceId);
1096 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1097 if(instanceIdMap.get("serviceInstanceId") != null){
1098 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1100 if(instanceIdMap.get("vnfInstanceId") != null){
1101 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1103 if(instanceIdMap.get("vfModuleInstanceId") != null){
1104 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1106 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1107 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1109 if(instanceIdMap.get("networkInstanceId") != null){
1110 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1112 if(instanceIdMap.get("configurationInstanceId") != null){
1113 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1115 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1116 currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1121 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1122 ObjectMapper mapper = new ObjectMapper();
1123 mapper.setSerializationInclusion(Include.NON_NULL);
1124 if(msoRawRequest != null){
1125 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
1126 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
1127 serviceInstRequest.getRequestDetails() != null &&
1128 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1129 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1130 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1132 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
1133 return mapper.writeValueAsString(sir);
1138 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1139 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1141 // Found the duplicate record. Return the appropriate error.
1142 String instance = null;
1143 if(instanceName != null){
1144 instance = instanceName;
1146 instance = instanceIdMap.get(requestScope + "InstanceId");
1148 //List<String> variables = new ArrayList<String>();
1149 //variables.add(dup.getRequestStatus());
1150 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1153 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1154 .errorInfo(errorLoggerInfo).build();
1156 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1161 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1162 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1163 InfraActiveRequests dup = null;
1165 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1166 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1168 } catch (Exception e) {
1169 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1170 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1171 .errorInfo(errorLoggerInfo).build();
1172 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1173 throw requestDbFailureException;
1177 protected boolean camundaHistoryCheck(InfraActiveRequests duplicateRecord, InfraActiveRequests currentActiveReq) throws RequestDbFailureException, ContactCamundaException{
1178 String requestId = duplicateRecord.getRequestId();
1179 String path = env.getProperty("mso.camunda.rest.history.uri") + requestId;
1180 String targetUrl = env.getProperty("mso.camundaURL") + path;
1181 HttpHeaders headers = setHeaders(env.getRequiredProperty("mso.camundaAuth"), env.getRequiredProperty("mso.msoKey"));
1182 HttpEntity<?> requestEntity = new HttpEntity<>(headers);
1183 ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
1185 response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<List<HistoricProcessInstanceEntity>>(){});
1186 }catch(HttpStatusCodeException e){
1187 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1188 ContactCamundaException contactCamundaException= new ContactCamundaException.Builder(requestId, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1189 .errorInfo(errorLoggerInfo).build();
1190 updateStatus(currentActiveReq, Status.FAILED, contactCamundaException.getMessage());
1191 throw contactCamundaException;
1193 if(response.getBody().isEmpty()){
1194 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1196 for(HistoricProcessInstance instance : response.getBody()){
1197 if(instance.getState().equals("ACTIVE")){
1200 updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
1205 private HttpHeaders setHeaders(String auth, String msoKey) {
1206 HttpHeaders headers = new HttpHeaders();
1207 List<org.springframework.http.MediaType> acceptableMediaTypes = new ArrayList<>();
1208 acceptableMediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON);
1209 headers.setAccept(acceptableMediaTypes);
1211 String userCredentials = CryptoUtils.decrypt(auth, msoKey);
1212 if(userCredentials != null) {
1213 headers.add(HttpHeaders.AUTHORIZATION, userCredentials);
1215 } catch(GeneralSecurityException e) {
1216 msoLogger.error("Security exception", e);
1221 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1222 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1224 ObjectMapper mapper = new ObjectMapper();
1225 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1227 } catch (IOException e) {
1229 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1231 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1232 .errorInfo(errorLoggerInfo).build();
1233 String requestScope = requestScopeFromUri(requestUri);
1235 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1237 throw validateException;
1241 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1242 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1243 int reqVersion = Integer.parseInt(version.substring(1));
1245 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1246 } catch (Exception e) {
1247 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1248 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1249 .errorInfo(errorLoggerInfo).build();
1251 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1253 throw validateException;
1257 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1258 InfraActiveRequests currentActiveReq) throws ApiException {
1259 RecipeLookupResult recipeLookupResult = null;
1260 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1261 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1262 // Query MSO Catalog DB
1264 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1265 recipeLookupResult = getDefaultVnfUri(sir, action);
1266 }else if(action == Action.addMembers || action == Action.removeMembers){
1267 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1268 }else if (modelInfo.getModelType().equals(ModelType.service)) {
1270 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1271 } catch (IOException e) {
1272 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1275 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1276 .errorInfo(errorLoggerInfo).build();
1278 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1280 throw validateException;
1282 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1283 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1285 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1286 } catch (ValidationException e) {
1287 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1290 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1291 .errorInfo(errorLoggerInfo).build();
1293 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1295 throw validateException;
1297 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1299 recipeLookupResult = getNetworkUri( sir, action);
1300 } catch (ValidationException e) {
1302 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1305 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1306 .errorInfo(errorLoggerInfo).build();
1307 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1309 throw validateException;
1311 }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1312 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1315 if (recipeLookupResult == null) {
1316 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1319 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1320 .errorInfo(errorLoggerInfo).build();
1322 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1323 throw recipeNotFoundExceptionException;
1325 return recipeLookupResult;
1328 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1330 // Construct the default service name
1331 // TODO need to make this a configurable property
1332 String defaultServiceModelName = getDefaultModel(servInstReq);
1333 RequestDetails requestDetails = servInstReq.getRequestDetails();
1334 ModelInfo modelInfo = requestDetails.getModelInfo();
1335 org.onap.so.db.catalog.beans.Service serviceRecord;
1336 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1337 ServiceRecipe recipe = null;
1340 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1341 if(serviceRecord !=null){
1342 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1345 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1346 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1347 if (recipe == null){
1348 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1349 if(!serviceRecordList.isEmpty()){
1350 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1351 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1360 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1361 RequestParameters reqParam = requestDetails.getRequestParameters();
1362 if(reqParam!=null && alaCarteFlag && recipe==null){
1364 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1365 mapToLegacyRequest(requestDetails);
1366 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1367 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1368 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1370 if(modelInfo.getModelVersionId() == null) {
1371 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1376 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1379 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1380 RequestParameters reqParam;
1381 if (requestDetails.getRequestParameters() == null) {
1382 reqParam = new RequestParameters();
1384 reqParam = requestDetails.getRequestParameters();
1386 if(requestDetails.getCloudConfiguration() == null) {
1387 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1388 if(cloudConfig != null) {
1389 requestDetails.setCloudConfiguration(cloudConfig);
1393 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1394 if(!userParams.isEmpty()) {
1395 if (reqParam == null) {
1396 requestDetails.setRequestParameters(new RequestParameters());
1398 requestDetails.getRequestParameters().setUserParams(userParams);
1402 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1404 for(Map<String, Object> params : reqParams.getUserParams()){
1405 if(params.containsKey("service")){
1406 Service service = serviceMapper(params);
1408 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1410 if (targetConfiguration.isPresent()) {
1411 return targetConfiguration.get();
1413 for(Networks network : service.getResources().getNetworks()) {
1414 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1415 if(targetConfiguration.isPresent()) {
1416 return targetConfiguration.get();
1420 for(Vnfs vnf : service.getResources().getVnfs()) {
1421 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1423 if(targetConfiguration.isPresent()) {
1424 return targetConfiguration.get();
1427 for(VfModules vfModule : vnf.getVfModules()) {
1428 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1430 if(targetConfiguration.isPresent()) {
1431 return targetConfiguration.get();
1442 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1443 CloudConfiguration targetConfiguration = new CloudConfiguration();
1444 if(sourceCloudConfiguration != null) {
1445 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1446 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1447 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1448 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1449 return Optional.of(targetConfiguration);
1451 return Optional.empty();
1454 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1455 msoLogger.debug("Configuring UserParams for Macro Request");
1456 Map<String, Object> userParams = new HashMap<>();
1458 for(Map<String, Object> params : reqParams.getUserParams()){
1459 if(params.containsKey("service")){
1460 Service service = serviceMapper(params);
1462 addUserParams(userParams, service.getInstanceParams());
1464 for(Networks network : service.getResources().getNetworks()) {
1465 addUserParams(userParams, network.getInstanceParams());
1468 for(Vnfs vnf: service.getResources().getVnfs()) {
1469 addUserParams(userParams, vnf.getInstanceParams());
1471 for(VfModules vfModule: vnf.getVfModules()) {
1472 addUserParams(userParams, vfModule.getInstanceParams());
1478 return mapFlatMapToNameValue(userParams);
1481 private Service serviceMapper(Map<String, Object> params)
1482 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1483 ObjectMapper obj = new ObjectMapper();
1484 String input = obj.writeValueAsString(params.get("service"));
1485 return obj.readValue(input, Service.class);
1488 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1489 for(Map<String, String> map : sourceUserParams) {
1490 for (Map.Entry<String, String> entry : map.entrySet()) {
1491 targetUserParams.put(entry.getKey(), entry.getValue());
1496 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1497 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1499 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1500 Map<String, Object> targetMap = new HashMap<>();
1501 targetMap.put(NAME, map.getKey());
1502 targetMap.put(VALUE, map.getValue());
1503 targetUserParams.add(targetMap);
1505 return targetUserParams;
1508 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1510 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1511 String vnfComponentType = modelInfo.getModelType().name();
1513 RelatedInstanceList[] instanceList = null;
1514 if (servInstReq.getRequestDetails() != null) {
1515 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1518 Recipe recipe = null;
1519 String defaultSource = getDefaultModel(servInstReq);
1520 String modelCustomizationId = modelInfo.getModelCustomizationId();
1521 String modelCustomizationName = modelInfo.getModelCustomizationName();
1522 String relatedInstanceModelVersionId = null;
1523 String relatedInstanceModelInvariantId = null;
1524 String relatedInstanceVersion = null;
1525 String relatedInstanceModelCustomizationName = null;
1527 if (instanceList != null) {
1529 for(RelatedInstanceList relatedInstanceList : instanceList){
1531 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1532 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1533 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1534 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1535 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1538 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1539 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1540 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1541 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1542 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1546 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1547 // a. For a vnf request (only create, no update currently):
1548 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1549 // 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
1550 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1551 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1552 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1553 // (MODEL_UUID) in SERVICE table.
1554 // 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
1555 // during 1707 data migration if VID did not provide it originally on request.
1556 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1557 // 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.
1559 VnfResource vnfResource = null;
1560 VnfResourceCustomization vrc=null;
1561 // Validation for vnfResource
1563 if(modelCustomizationId!=null) {
1564 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1566 vnfResource = vrc.getVnfResources();
1569 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1570 if(service == null) {
1571 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1574 if(service == null) {
1575 throw new ValidationException("service in relatedInstance");
1577 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1578 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1579 vrc=vnfResourceCustom;
1584 vnfResource = vrc.getVnfResources();
1585 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1586 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1590 if(vnfResource==null){
1591 throw new ValidationException("vnfResource");
1593 if(modelInfo.getModelVersionId() == null) {
1594 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1598 VnfRecipe vnfRecipe = null;
1601 String nfRole = vrc.getNfRole();
1602 if(nfRole != null) {
1603 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1607 if(vnfRecipe == null) {
1608 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1611 if (vnfRecipe == null) {
1615 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1617 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1618 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1619 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1620 // 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.
1621 // 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
1622 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1623 // 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)
1624 // and MODEL_VERSION (modelVersion).
1626 VfModuleCustomization vfmc = null;
1628 VnfResourceCustomization vnfrc;
1629 VfModule vfModule = null;
1631 if(modelInfo.getModelCustomizationId() != null) {
1632 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1634 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1636 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1638 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1640 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1642 String vfModuleModelUUID = modelInfo.getModelVersionId();
1643 for(VfModuleCustomization vf : list) {
1644 VfModuleCustomization vfmCustom;
1645 if(vfModuleModelUUID != null){
1646 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1647 if(vfmCustom != null){
1648 vfModule = vfmCustom.getVfModule();
1651 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1652 if(vfmCustom != null){
1653 vfModule = vfmCustom.getVfModule();
1655 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1659 if(vfModule != null) {
1660 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1661 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1667 if(vfmc == null && vfModule == null) {
1668 throw new ValidationException("vfModuleCustomization");
1669 } else if (vfModule == null && vfmc != null) {
1670 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1673 if(modelInfo.getModelVersionId() == null) {
1674 modelInfo.setModelVersionId(vfModule.getModelUUID());
1678 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1680 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1681 if(!vfModuleRecords.isEmpty()){
1682 for(VfModule record : vfModuleRecords){
1683 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1690 if(recipe == null) {
1691 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1692 if (recipe == null) {
1693 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1696 if(recipe == null) {
1703 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1704 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1705 if (recipe == null) {
1709 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1711 if (recipe == null) {
1717 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1720 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1722 String defaultSource = getDefaultModel(sir);
1724 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1726 if (vnfRecipe == null) {
1730 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1734 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1736 String defaultNetworkType = getDefaultModel(sir);
1738 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1739 String modelName = modelInfo.getModelName();
1740 Recipe recipe = null;
1742 if(modelInfo.getModelCustomizationId()!=null){
1743 NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1744 if(networkResourceCustomization != null){
1745 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1746 if(networkResource!=null){
1747 if(modelInfo.getModelVersionId() == null) {
1748 modelInfo.setModelVersionId(networkResource.getModelUUID());
1750 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1752 throw new ValidationException("no catalog entry found");
1754 }else if(action != Action.deleteInstance){
1755 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1758 //ok for version < 3 and action delete
1759 if(modelName != null){
1760 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1765 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1768 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1771 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1772 String requestTestApi = null;
1773 TestApi testApi = null;
1775 if (requestParams != null) {
1776 requestTestApi = requestParams.getTestApi();
1779 if (requestTestApi == null) {
1780 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1781 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1783 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1788 testApi = TestApi.valueOf(requestTestApi);
1789 return Optional.of(testApi.getModelName());
1790 } catch (Exception e) {
1791 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1792 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1796 private String getDefaultModel(ServiceInstancesRequest sir) {
1797 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1798 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1799 if (oModelName.isPresent()) {
1800 defaultModel = oModelName.get();
1802 return defaultModel;
1805 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1806 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1807 Boolean aLaCarte = null;
1808 String apiVersion = version.substring(1);
1809 boolean inProgress = false;
1811 long startTime = System.currentTimeMillis ();
1812 ServiceInstancesRequest sir = null;
1814 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1815 String requestScope = deriveRequestScope(action,sir, requestUri);
1816 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1817 if(sir.getRequestDetails().getRequestParameters() != null){
1818 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1820 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1821 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1822 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1824 InfraActiveRequests dup = null;
1826 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1829 inProgress = camundaHistoryCheck(dup, currentActiveReq);
1832 if (instanceIdMap != null && dup != null && inProgress) {
1833 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1836 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1837 RequestReferences referencesResponse = new RequestReferences();
1838 referencesResponse.setRequestId(requestId);
1839 serviceResponse.setRequestReferences(referencesResponse);
1842 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1843 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1845 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1846 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1848 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1851 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1852 .errorInfo(errorLoggerInfo).build();
1854 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1856 throw validateException;
1860 serviceInstanceId = "";
1861 String configurationId = "";
1862 String correlationId = "";
1864 if(sir.getServiceInstanceId () != null){
1865 serviceInstanceId = sir.getServiceInstanceId ();
1868 if(sir.getConfigurationId() != null){
1869 configurationId = sir.getConfigurationId();
1872 correlationId = getCorrelationId(sir);
1875 infraActiveRequestsClient.save(currentActiveReq);
1876 }catch(Exception e){
1877 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1878 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1879 .errorInfo(errorLoggerInfo).build();
1882 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1884 }else if(aLaCarte == null){
1887 RequestClientParameter requestClientParameter = null;
1889 requestClientParameter = new RequestClientParameter.Builder()
1890 .setRequestId(requestId)
1891 .setBaseVfModule(false)
1892 .setRecipeTimeout(Integer.parseInt(timeOut))
1893 .setRequestAction(action.toString())
1894 .setServiceInstanceId(serviceInstanceId)
1895 .setCorrelationId(correlationId)
1896 .setConfigurationId(configurationId)
1897 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1898 .setApiVersion(apiVersion)
1899 .setALaCarte(aLaCarte)
1900 .setRequestUri(requestUri).build();
1901 } catch (IOException e) {
1902 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1903 throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1904 .errorInfo(errorLoggerInfo).build();
1907 return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1910 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1911 String requestId = null;
1912 if (requestContext.getProperty("requestId") != null) {
1913 requestId = requestContext.getProperty("requestId").toString();
1915 if (UUIDChecker.isValidUUID(requestId)) {
1918 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1919 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1920 .errorInfo(errorLoggerInfo).build();
1922 throw validateException;
1925 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1926 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1927 aq.setStatusMessage (errorMessage);
1928 aq.setProgress(new Long(100));
1929 aq.setRequestStatus(status.toString());
1930 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1931 aq.setEndTime (endTimeStamp);
1933 infraActiveRequestsClient.save(aq);
1934 }catch(Exception e){
1935 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1936 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1937 .errorInfo(errorLoggerInfo).build();
1941 protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1942 String serviceType = null;
1943 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1944 String defaultServiceModelName = getDefaultModel(sir);
1945 org.onap.so.db.catalog.beans.Service serviceRecord;
1947 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1948 if(serviceRecord != null){
1949 serviceType = serviceRecord.getServiceType();
1952 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1953 if(serviceRecord != null){
1954 serviceType = serviceRecord.getServiceType();
1956 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1957 if(serviceRecord != null){
1958 serviceType = serviceRecord.getServiceType();
1963 serviceType = msoRequest.getServiceInstanceType(sir, requestScope);