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 java.io.IOException;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.List;
30 import java.util.Optional;
32 import javax.transaction.Transactional;
33 import javax.ws.rs.Consumes;
34 import javax.ws.rs.DELETE;
35 import javax.ws.rs.POST;
36 import javax.ws.rs.PUT;
37 import javax.ws.rs.Path;
38 import javax.ws.rs.PathParam;
39 import javax.ws.rs.Produces;
40 import javax.ws.rs.container.ContainerRequestContext;
41 import javax.ws.rs.core.Context;
42 import javax.ws.rs.core.MediaType;
43 import javax.ws.rs.core.Response;
45 import org.apache.commons.lang.StringUtils;
46 import org.apache.http.HttpResponse;
47 import org.apache.http.HttpStatus;
48 import org.onap.so.apihandler.camundabeans.CamundaResponse;
49 import org.onap.so.apihandler.common.CommonConstants;
50 import org.onap.so.apihandler.common.ErrorNumbers;
51 import org.onap.so.apihandler.common.RequestClient;
52 import org.onap.so.apihandler.common.RequestClientFactory;
53 import org.onap.so.apihandler.common.RequestClientParameter;
54 import org.onap.so.apihandler.common.ResponseBuilder;
55 import org.onap.so.apihandler.common.ResponseHandler;
56 import org.onap.so.apihandlerinfra.exceptions.ApiException;
57 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
58 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
59 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
60 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
61 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
62 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
63 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
64 import org.onap.so.db.catalog.beans.NetworkResource;
65 import org.onap.so.db.catalog.beans.Recipe;
66 import org.onap.so.db.catalog.beans.ServiceRecipe;
67 import org.onap.so.db.catalog.beans.VfModule;
68 import org.onap.so.db.catalog.beans.VfModuleCustomization;
69 import org.onap.so.db.catalog.beans.VnfRecipe;
70 import org.onap.so.db.catalog.beans.VnfResource;
71 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
72 import org.onap.so.db.catalog.data.repository.NetworkRecipeRepository;
73 import org.onap.so.db.catalog.data.repository.NetworkResourceCustomizationRepository;
74 import org.onap.so.db.catalog.data.repository.ServiceRecipeRepository;
75 import org.onap.so.db.catalog.data.repository.ServiceRepository;
76 import org.onap.so.db.catalog.data.repository.VFModuleCustomizationRepository;
77 import org.onap.so.db.catalog.data.repository.VFModuleRepository;
78 import org.onap.so.db.catalog.data.repository.VnfComponentRecipeRepository;
79 import org.onap.so.db.catalog.data.repository.VnfCustomizationRepository;
80 import org.onap.so.db.catalog.data.repository.VnfRecipeRepository;
81 import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
82 import org.onap.so.db.request.beans.InfraActiveRequests;
83 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
84 import org.onap.so.exceptions.ValidationException;
85 import org.onap.so.logger.MessageEnum;
86 import org.onap.so.logger.MsoLogger;
87 import org.onap.so.serviceinstancebeans.CloudConfiguration;
88 import org.onap.so.serviceinstancebeans.ModelInfo;
89 import org.onap.so.serviceinstancebeans.ModelType;
90 import org.onap.so.serviceinstancebeans.Networks;
91 import org.onap.so.serviceinstancebeans.RelatedInstance;
92 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
93 import org.onap.so.serviceinstancebeans.RequestDetails;
94 import org.onap.so.serviceinstancebeans.RequestParameters;
95 import org.onap.so.serviceinstancebeans.RequestReferences;
96 import org.onap.so.serviceinstancebeans.Service;
97 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
98 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
99 import org.onap.so.serviceinstancebeans.VfModules;
100 import org.onap.so.serviceinstancebeans.Vnfs;
101 import org.onap.so.utils.UUIDChecker;
102 import org.springframework.beans.factory.annotation.Autowired;
103 import org.springframework.core.env.Environment;
104 import org.springframework.stereotype.Component;
106 import com.fasterxml.jackson.annotation.JsonInclude.Include;
107 import com.fasterxml.jackson.core.JsonParseException;
108 import com.fasterxml.jackson.core.JsonProcessingException;
109 import com.fasterxml.jackson.databind.JsonMappingException;
110 import com.fasterxml.jackson.databind.ObjectMapper;
112 import io.swagger.annotations.Api;
113 import io.swagger.annotations.ApiOperation;
116 @Path("/onap/so/infra/serviceInstantiation")
117 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
118 public class ServiceInstances {
120 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
121 private static String NAME = "name";
122 private static String VALUE = "value";
125 private Environment env;
128 private RequestClientFactory reqClientFactory;
131 private ServiceRepository serviceRepo;
134 private ServiceRecipeRepository serviceRecipeRepo;
137 private NetworkRecipeRepository networkRecipeRepo;
140 private NetworkResourceCustomizationRepository networkCustomizationRepo;
143 private VnfResourceRepository vnfRepo;
146 private VnfCustomizationRepository vnfCustomRepo;
149 private VnfRecipeRepository vnfRecipeRepo;
152 private VFModuleCustomizationRepository vfModuleCustomRepo;
155 private VFModuleRepository vfModuleRepo;
158 private VnfComponentRecipeRepository vnfComponentRecipeRepo;
161 private InfraActiveRequestsRepository iar;
164 private ResponseBuilder builder;
167 private MsoRequest msoRequest;
170 @Path("/{version:[vV][5-7]}/serviceInstances")
171 @Consumes(MediaType.APPLICATION_JSON)
172 @Produces(MediaType.APPLICATION_JSON)
173 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
175 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
176 String requestId = getRequestId(requestContext);
177 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
181 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
182 @Consumes(MediaType.APPLICATION_JSON)
183 @Produces(MediaType.APPLICATION_JSON)
184 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
186 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
187 String requestId = getRequestId(requestContext);
188 HashMap<String, String> instanceIdMap = new HashMap<>();
189 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
190 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
194 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
195 @Consumes(MediaType.APPLICATION_JSON)
196 @Produces(MediaType.APPLICATION_JSON)
197 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
199 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
200 String requestId = getRequestId(requestContext);
201 HashMap<String, String> instanceIdMap = new HashMap<>();
202 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
203 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
207 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
208 @Consumes(MediaType.APPLICATION_JSON)
209 @Produces(MediaType.APPLICATION_JSON)
210 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
212 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
213 String requestId = getRequestId(requestContext);
214 HashMap<String, String> instanceIdMap = new HashMap<>();
215 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
216 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
220 @Path("/{version:[vV][7]}/serviceInstances/assign")
221 @Consumes(MediaType.APPLICATION_JSON)
222 @Produces(MediaType.APPLICATION_JSON)
223 @ApiOperation(value="Assign Service Instance", response=Response.class)
225 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
226 String requestId = getRequestId(requestContext);
227 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
231 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
232 @Consumes(MediaType.APPLICATION_JSON)
233 @Produces(MediaType.APPLICATION_JSON)
234 @ApiOperation(value="Unassign Service Instance", response=Response.class)
236 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
237 String requestId = getRequestId(requestContext);
238 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
239 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
240 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
244 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
245 @Consumes(MediaType.APPLICATION_JSON)
246 @Produces(MediaType.APPLICATION_JSON)
247 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
249 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
250 String requestId = getRequestId(requestContext);
251 HashMap<String, String> instanceIdMap = new HashMap<>();
252 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
253 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
257 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
258 @Consumes(MediaType.APPLICATION_JSON)
259 @Produces(MediaType.APPLICATION_JSON)
260 @ApiOperation(value="Delete provided Port",response=Response.class)
262 public Response deletePortConfiguration(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.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
272 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
273 @Consumes(MediaType.APPLICATION_JSON)
274 @Produces(MediaType.APPLICATION_JSON)
275 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
277 public Response enablePort(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.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
287 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
288 @Consumes(MediaType.APPLICATION_JSON)
289 @Produces(MediaType.APPLICATION_JSON)
290 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
292 public Response disablePort(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.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
302 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
303 @Consumes(MediaType.APPLICATION_JSON)
304 @Produces(MediaType.APPLICATION_JSON)
305 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
307 public Response activatePort(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.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
317 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
318 @Consumes(MediaType.APPLICATION_JSON)
319 @Produces(MediaType.APPLICATION_JSON)
320 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
322 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
323 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
324 String requestId = getRequestId(requestContext);
325 HashMap<String, String> instanceIdMap = new HashMap<>();
326 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
327 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
328 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
332 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
333 @Consumes(MediaType.APPLICATION_JSON)
334 @Produces(MediaType.APPLICATION_JSON)
335 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
337 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
338 String requestId = getRequestId(requestContext);
339 HashMap<String, String> instanceIdMap = new HashMap<>();
340 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
341 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
345 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
346 @Consumes(MediaType.APPLICATION_JSON)
347 @Produces(MediaType.APPLICATION_JSON)
348 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
350 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
351 String requestId = getRequestId(requestContext);
352 HashMap<String, String> instanceIdMap = new HashMap<>();
353 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
354 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
358 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
359 @Consumes(MediaType.APPLICATION_JSON)
360 @Produces(MediaType.APPLICATION_JSON)
361 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
363 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
364 String requestId = getRequestId(requestContext);
365 HashMap<String, String> instanceIdMap = new HashMap<>();
366 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
367 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
371 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
372 @Consumes(MediaType.APPLICATION_JSON)
373 @Produces(MediaType.APPLICATION_JSON)
374 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
376 public Response replaceVnfInstance(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.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
386 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
387 @Consumes(MediaType.APPLICATION_JSON)
388 @Produces(MediaType.APPLICATION_JSON)
389 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
391 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
392 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
393 String requestId = getRequestId(requestContext);
394 HashMap<String, String> instanceIdMap = new HashMap<>();
395 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
396 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
397 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
401 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
402 @Consumes(MediaType.APPLICATION_JSON)
403 @Produces(MediaType.APPLICATION_JSON)
404 @ApiOperation(value="Apply updated configuration",response=Response.class)
405 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
406 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
407 String requestId = getRequestId(requestContext);
408 HashMap<String, String> instanceIdMap = new HashMap<>();
409 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
410 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
411 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
416 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
417 @Consumes(MediaType.APPLICATION_JSON)
418 @Produces(MediaType.APPLICATION_JSON)
419 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
421 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
422 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
423 String requestId = getRequestId(requestContext);
424 HashMap<String, String> instanceIdMap = new HashMap<>();
425 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
426 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
427 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
431 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
432 @Consumes(MediaType.APPLICATION_JSON)
433 @Produces(MediaType.APPLICATION_JSON)
434 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
436 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
437 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
438 String requestId = getRequestId(requestContext);
439 HashMap<String, String> instanceIdMap = new HashMap<>();
440 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
441 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
442 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
446 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
447 @Consumes(MediaType.APPLICATION_JSON)
448 @Produces(MediaType.APPLICATION_JSON)
449 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
451 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
452 @PathParam("vnfInstanceId") String vnfInstanceId,
453 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
454 String requestId = getRequestId(requestContext);
455 HashMap<String, String> instanceIdMap = new HashMap<>();
456 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
457 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
458 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
459 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
463 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
464 @Consumes(MediaType.APPLICATION_JSON)
465 @Produces(MediaType.APPLICATION_JSON)
466 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
468 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
469 @PathParam("vnfInstanceId") String vnfInstanceId,
470 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
471 String requestId = getRequestId(requestContext);
472 HashMap<String, String> instanceIdMap = new HashMap<>();
473 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
474 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
475 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
476 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
480 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
481 @Consumes(MediaType.APPLICATION_JSON)
482 @Produces(MediaType.APPLICATION_JSON)
483 @ApiOperation(value="Perform VNF software update",response=Response.class)
485 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
486 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
487 String requestId = getRequestId(requestContext);
488 HashMap<String, String> instanceIdMap = new HashMap<>();
489 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
490 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
491 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
495 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
496 @Consumes(MediaType.APPLICATION_JSON)
497 @Produces(MediaType.APPLICATION_JSON)
498 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
500 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
501 @PathParam("vnfInstanceId") String vnfInstanceId,
502 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
503 String requestId = getRequestId(requestContext);
504 HashMap<String, String> instanceIdMap = new HashMap<>();
505 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
506 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
507 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
508 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
512 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
513 @Consumes(MediaType.APPLICATION_JSON)
514 @Produces(MediaType.APPLICATION_JSON)
515 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
517 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
518 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
519 String requestId = getRequestId(requestContext);
520 HashMap<String, String> instanceIdMap = new HashMap<>();
521 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
522 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
523 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
524 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
530 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
531 @Consumes(MediaType.APPLICATION_JSON)
532 @Produces(MediaType.APPLICATION_JSON)
533 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
535 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
536 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
537 String requestId = getRequestId(requestContext);
538 HashMap<String, String> instanceIdMap = new HashMap<>();
539 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
540 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
541 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
545 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
546 @Consumes(MediaType.APPLICATION_JSON)
547 @Produces(MediaType.APPLICATION_JSON)
548 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
550 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
551 @PathParam("vnfInstanceId") String vnfInstanceId,
552 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
553 String requestId = getRequestId(requestContext);
554 HashMap<String, String> instanceIdMap = new HashMap<>();
555 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
556 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
557 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
558 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
562 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
563 @Consumes(MediaType.APPLICATION_JSON)
564 @Produces(MediaType.APPLICATION_JSON)
565 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
567 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
568 @PathParam("vnfInstanceId") String vnfInstanceId,
569 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
570 String requestId = getRequestId(requestContext);
571 HashMap<String, String> instanceIdMap = new HashMap<>();
572 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
573 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
574 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
575 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
579 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
580 @Consumes(MediaType.APPLICATION_JSON)
581 @Produces(MediaType.APPLICATION_JSON)
582 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
584 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
585 String requestId = getRequestId(requestContext);
586 HashMap<String, String> instanceIdMap = new HashMap<>();
587 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
588 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
592 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
593 @Consumes(MediaType.APPLICATION_JSON)
594 @Produces(MediaType.APPLICATION_JSON)
595 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
597 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
598 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
599 String requestId = getRequestId(requestContext);
600 HashMap<String, String> instanceIdMap = new HashMap<>();
601 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
602 instanceIdMap.put("networkInstanceId", networkInstanceId);
603 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
607 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
608 @Consumes(MediaType.APPLICATION_JSON)
609 @Produces(MediaType.APPLICATION_JSON)
610 @ApiOperation(value="Delete provided Network instance",response=Response.class)
612 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
613 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
614 String requestId = getRequestId(requestContext);
615 HashMap<String, String> instanceIdMap = new HashMap<>();
616 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
617 instanceIdMap.put("networkInstanceId", networkInstanceId);
618 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
621 public String getRequestUri(ContainerRequestContext context){
622 String requestUri = context.getUriInfo().getPath();
623 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
627 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
628 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
629 Boolean aLaCarte = null;
630 long startTime = System.currentTimeMillis ();
631 ServiceInstancesRequest sir = null;
632 String apiVersion = version.substring(1);
634 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
635 String requestScope = deriveRequestScope(action, sir, requestUri);
636 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
637 if(sir.getRequestDetails().getRequestParameters() != null){
638 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
640 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
641 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
643 int requestVersion = Integer.parseInt(version.substring(1));
644 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
645 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
646 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
647 String networkType = msoRequest.getNetworkType(sir,requestScope);
648 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
649 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
650 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
652 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
653 currentActiveReq.setVnfType(vnfType);
654 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
655 currentActiveReq.setNetworkType(networkType);
658 InfraActiveRequests dup = null;
661 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
664 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
666 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
668 RequestReferences referencesResponse = new RequestReferences();
670 referencesResponse.setRequestId(requestId);
672 serviceResponse.setRequestReferences(referencesResponse);
673 Boolean isBaseVfModule = false;
675 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
678 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
679 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
680 modelType = ModelType.vnf;
682 modelType =modelInfo.getModelType();
685 if (modelType.equals(ModelType.vfModule)) {
688 // Get VF Module-specific base module indicator
691 String modelVersionId = modelInfo.getModelVersionId();
693 if(modelVersionId != null) {
694 vfm = vfModuleRepo.findByModelUUID(modelVersionId);
696 vfm = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
700 if (vfm.getIsBase()) {
701 isBaseVfModule = true;
703 } else if (action == Action.createInstance || action == Action.updateInstance) {
704 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
705 // This request cannot proceed
707 String serviceVersionText = "";
708 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
709 serviceVersionText = " with version " + sdcServiceModelVersion;
712 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
713 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
714 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
715 msoRequest.updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
717 throw vfModuleException;
722 serviceInstanceId = "";
724 String vfModuleId = "";
725 String volumeGroupId = "";
726 String networkId = "";
727 String correlationId = "";
729 if(sir.getServiceInstanceId () != null){
730 serviceInstanceId = sir.getServiceInstanceId ();
733 if(sir.getVnfInstanceId () != null){
734 vnfId = sir.getVnfInstanceId ();
737 if(sir.getVfModuleInstanceId () != null){
738 vfModuleId = sir.getVfModuleInstanceId ();
741 if(sir.getVolumeGroupInstanceId () != null){
742 volumeGroupId = sir.getVolumeGroupInstanceId ();
745 if(sir.getNetworkInstanceId () != null){
746 networkId = sir.getNetworkInstanceId ();
749 if (sir.getCorrelationId() != null) {
750 correlationId = sir.getCorrelationId();
752 iar.save(currentActiveReq);
754 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
756 }else if(aLaCarte == null){
760 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
761 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
762 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
765 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
766 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
767 return (ModelType.vnf.name());
770 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
771 requestScope = requestScopeFromUri(requestUri);
773 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
778 private String requestScopeFromUri(String requestUri){
780 if(requestUri.contains(ModelType.network.name())){
781 requestScope = ModelType.network.name();
782 }else if(requestUri.contains(ModelType.vfModule.name())){
783 requestScope = ModelType.vfModule.name();
784 }else if(requestUri.contains(ModelType.volumeGroup.name())){
785 requestScope = ModelType.volumeGroup.name();
786 }else if(requestUri.contains(ModelType.configuration.name())){
787 requestScope = ModelType.configuration.name();
788 }else if(requestUri.contains(ModelType.vnf.name())){
789 requestScope = ModelType.vnf.name();
791 requestScope = ModelType.service.name();
795 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
796 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
797 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
798 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
799 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
800 RequestClient requestClient = null;
801 HttpResponse response = null;
803 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
804 response = requestClient.post(new RequestClientParameter.Builder()
805 .setRequestId(requestId)
806 .setBaseVfModule(isBaseVfModule)
807 .setRecipeTimeout(timeOut)
808 .setRequestAction(action.toString())
809 .setServiceInstanceId(serviceInstanceId)
810 .setCorrelationId(correlationId)
812 .setVfModuleId(vfModuleId)
813 .setVolumeGroupId(volumeGroupId)
814 .setNetworkId(networkId)
815 .setConfigurationId(configurationId)
816 .setServiceType(serviceInstanceType)
818 .setVfModuleType(vfModuleType)
819 .setNetworkType(networkType)
820 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
821 .setApiVersion(apiVersion)
822 .setALaCarte(aLaCarte)
823 .setRecipeParamXsd(paramXsd)
824 .setRequestUri(requestUri).build());
827 } catch (Exception e) {
829 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
830 String url = requestClient != null ? requestClient.getUrl() : "";
831 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
832 msoRequest.updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
834 throw clientException;
837 if (response == null) {
839 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
840 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
842 msoRequest.updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
844 throw clientException;
847 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
848 int bpelStatus = respHandler.getStatus ();
850 // BPEL accepted the request, the request is in progress
851 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
852 ServiceInstancesResponse jsonResponse;
853 CamundaResponse camundaResp = respHandler.getResponse();
855 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
857 ObjectMapper mapper = new ObjectMapper();
858 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
859 } catch (IOException e) {
861 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
862 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
863 .errorInfo(errorLoggerInfo).build();
864 currentActiveReq.setRequestStatus(Status.FAILED.name());
865 currentActiveReq.setStatusMessage(validateException.getMessage());
866 throw validateException;
869 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
870 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
872 iar.save(currentActiveReq);
873 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
877 List<String> variables = new ArrayList<>();
878 variables.add(bpelStatus + "");
879 String camundaJSONResponseBody = respHandler.getResponseBody ();
880 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
882 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
883 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
884 .errorInfo(errorLoggerInfo).build();
886 msoRequest.updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
891 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
894 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
895 .errorInfo(errorLoggerInfo).build();
896 msoRequest.updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
902 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
903 if(StringUtils.isNotBlank(instanceId)) {
904 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
905 currentActiveReq.setServiceInstanceId(instanceId);
906 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
907 currentActiveReq.setVnfId(instanceId);
908 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
909 currentActiveReq.setVfModuleId(instanceId);
910 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
911 currentActiveReq.setVolumeGroupId(instanceId);
912 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
913 currentActiveReq.setNetworkId(instanceId);
914 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
915 currentActiveReq.setConfigurationId(instanceId);
917 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
918 if(instanceIdMap.get("serviceInstanceId") != null){
919 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
921 if(instanceIdMap.get("vnfInstanceId") != null){
922 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
924 if(instanceIdMap.get("vfModuleInstanceId") != null){
925 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
927 if(instanceIdMap.get("volumeGroupInstanceId") != null){
928 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
930 if(instanceIdMap.get("networkInstanceId") != null){
931 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
933 if(instanceIdMap.get("configurationInstanceId") != null){
934 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
939 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
940 ObjectMapper mapper = new ObjectMapper();
941 mapper.setSerializationInclusion(Include.NON_NULL);
942 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
943 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
944 serviceInstRequest.getRequestDetails() != null &&
945 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
946 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
947 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
949 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
950 return mapper.writeValueAsString(sir);
953 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
954 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
956 // Found the duplicate record. Return the appropriate error.
957 String instance = null;
958 if(instanceName != null){
959 instance = instanceName;
961 instance = instanceIdMap.get(requestScope + "InstanceId");
963 //List<String> variables = new ArrayList<String>();
964 //variables.add(dup.getRequestStatus());
965 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
968 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
969 .errorInfo(errorLoggerInfo).build();
971 msoRequest.updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
976 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
977 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
978 InfraActiveRequests dup = null;
980 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
981 dup = iar.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
983 } catch (Exception e) {
984 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
987 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
988 .errorInfo(errorLoggerInfo).build();
990 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
992 throw validateException;
997 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
998 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1000 ObjectMapper mapper = new ObjectMapper();
1001 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1003 } catch (IOException e) {
1005 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1007 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1008 .errorInfo(errorLoggerInfo).build();
1009 String requestScope = requestScopeFromUri(requestUri);
1011 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1013 throw validateException;
1017 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1018 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1019 int reqVersion = Integer.parseInt(version.substring(1));
1021 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1022 } catch (Exception e) {
1023 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1024 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1025 .errorInfo(errorLoggerInfo).build();
1027 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1029 throw validateException;
1033 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1034 InfraActiveRequests currentActiveReq) throws ApiException {
1035 RecipeLookupResult recipeLookupResult = null;
1036 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1037 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1038 // Query MSO Catalog DB
1040 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1041 recipeLookupResult = getDefaultVnfUri(sir, action);
1042 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1044 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1045 } catch (IOException e) {
1046 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1049 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1050 .errorInfo(errorLoggerInfo).build();
1052 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1054 throw validateException;
1056 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1057 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1059 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1060 } catch (ValidationException e) {
1061 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1064 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1065 .errorInfo(errorLoggerInfo).build();
1067 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1069 throw validateException;
1071 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1073 recipeLookupResult = getNetworkUri( sir, action);
1074 } catch (ValidationException e) {
1076 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1079 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1080 .errorInfo(errorLoggerInfo).build();
1081 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1083 throw validateException;
1087 if (recipeLookupResult == null) {
1088 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1091 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1092 .errorInfo(errorLoggerInfo).build();
1094 msoRequest.updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1095 throw recipeNotFoundExceptionException;
1097 return recipeLookupResult;
1101 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1103 // Construct the default service name
1104 // TODO need to make this a configurable property
1105 String defaultServiceModelName = getDefaultModel(servInstReq);
1106 RequestDetails requestDetails = servInstReq.getRequestDetails();
1107 ModelInfo modelInfo = requestDetails.getModelInfo();
1108 org.onap.so.db.catalog.beans.Service serviceRecord;
1109 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1110 ServiceRecipe recipe = null;
1113 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1114 if(serviceRecord !=null){
1115 recipe = serviceRecord.getRecipes().get(action.toString());
1118 serviceRecord = serviceRepo.findOneByModelUUID(modelInfo.getModelVersionId());
1119 recipe = serviceRecipeRepo.findFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1120 if (recipe == null){
1121 serviceRecordList = serviceRepo.findByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1122 if(!serviceRecordList.isEmpty()){
1123 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1124 recipe = record.getRecipes().get(action.toString());
1133 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1134 RequestParameters reqParam = requestDetails.getRequestParameters();
1135 if(reqParam!=null && alaCarteFlag && recipe==null){
1137 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1138 mapToLegacyRequest(requestDetails);
1139 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1140 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1141 recipe = serviceRecord.getRecipes().get( action.toString());
1143 if(modelInfo.getModelVersionId() == null) {
1144 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1149 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1152 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1153 RequestParameters reqParam;
1154 if (requestDetails.getRequestParameters() == null) {
1155 reqParam = new RequestParameters();
1157 reqParam = requestDetails.getRequestParameters();
1159 if(requestDetails.getCloudConfiguration() == null) {
1160 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1161 if(cloudConfig != null) {
1162 requestDetails.setCloudConfiguration(cloudConfig);
1166 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1167 if(!userParams.isEmpty()) {
1168 if (reqParam == null) {
1169 requestDetails.setRequestParameters(new RequestParameters());
1171 requestDetails.getRequestParameters().setUserParams(userParams);
1175 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1177 for(Map<String, Object> params : reqParams.getUserParams()){
1178 if(params.containsKey("service")){
1179 Service service = serviceMapper(params);
1181 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1183 if (targetConfiguration.isPresent()) {
1184 return targetConfiguration.get();
1186 for(Networks network : service.getResources().getNetworks()) {
1187 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1188 if(targetConfiguration.isPresent()) {
1189 return targetConfiguration.get();
1193 for(Vnfs vnf : service.getResources().getVnfs()) {
1194 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1196 if(targetConfiguration.isPresent()) {
1197 return targetConfiguration.get();
1200 for(VfModules vfModule : vnf.getVfModules()) {
1201 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1203 if(targetConfiguration.isPresent()) {
1204 return targetConfiguration.get();
1215 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1216 CloudConfiguration targetConfiguration = new CloudConfiguration();
1217 if(sourceCloudConfiguration != null) {
1218 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1219 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1220 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1221 return Optional.of(targetConfiguration);
1223 return Optional.empty();
1226 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1227 msoLogger.debug("Configuring UserParams for Macro Request");
1228 Map<String, Object> userParams = new HashMap<>();
1230 for(Map<String, Object> params : reqParams.getUserParams()){
1231 if(params.containsKey("service")){
1232 Service service = serviceMapper(params);
1234 addUserParams(userParams, service.getInstanceParams());
1236 for(Networks network : service.getResources().getNetworks()) {
1237 addUserParams(userParams, network.getInstanceParams());
1240 for(Vnfs vnf: service.getResources().getVnfs()) {
1241 addUserParams(userParams, vnf.getInstanceParams());
1243 for(VfModules vfModule: vnf.getVfModules()) {
1244 addUserParams(userParams, vfModule.getInstanceParams());
1250 return mapFlatMapToNameValue(userParams);
1253 private Service serviceMapper(Map<String, Object> params)
1254 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1255 ObjectMapper obj = new ObjectMapper();
1256 String input = obj.writeValueAsString(params.get("service"));
1257 return obj.readValue(input, Service.class);
1260 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1261 for(Map<String, String> map : sourceUserParams) {
1262 for (Map.Entry<String, String> entry : map.entrySet()) {
1263 targetUserParams.put(entry.getKey(), entry.getValue());
1268 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1269 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1271 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1272 Map<String, Object> targetMap = new HashMap<>();
1273 targetMap.put(NAME, map.getKey());
1274 targetMap.put(VALUE, map.getValue());
1275 targetUserParams.add(targetMap);
1277 return targetUserParams;
1280 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1282 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1283 String vnfComponentType = modelInfo.getModelType().name();
1285 RelatedInstanceList[] instanceList = null;
1286 if (servInstReq.getRequestDetails() != null) {
1287 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1290 Recipe recipe = null;
1291 String defaultSource = getDefaultModel(servInstReq);
1292 String modelCustomizationId = modelInfo.getModelCustomizationId();
1293 String modelCustomizationName = modelInfo.getModelCustomizationName();
1294 String relatedInstanceModelVersionId = null;
1295 String relatedInstanceModelInvariantId = null;
1296 String relatedInstanceVersion = null;
1297 String relatedInstanceModelCustomizationName = null;
1299 if (instanceList != null) {
1301 for(RelatedInstanceList relatedInstanceList : instanceList){
1303 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1304 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1305 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1306 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1307 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1310 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1311 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1312 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1313 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1314 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1318 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1319 // a. For a vnf request (only create, no update currently):
1320 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1321 // 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
1322 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1323 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1324 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1325 // (MODEL_UUID) in SERVICE table.
1326 // 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
1327 // during 1707 data migration if VID did not provide it originally on request.
1328 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1329 // 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.
1331 VnfResource vnfResource = null;
1332 VnfResourceCustomization vrc=null;
1333 // Validation for vnfResource
1335 if(modelCustomizationId!=null) {
1336 vrc = vnfCustomRepo.findOneByModelCustomizationUUID(modelCustomizationId);
1338 vnfResource = vrc.getVnfResources();
1341 org.onap.so.db.catalog.beans.Service service = serviceRepo.findOneByModelUUID(relatedInstanceModelVersionId);
1342 if(service == null) {
1343 service = serviceRepo.findByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1346 if(service == null) {
1347 throw new ValidationException("service in relatedInstance");
1349 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1350 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1351 vrc=vnfResourceCustom;
1356 vnfResource = vrc.getVnfResources();
1357 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1358 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1362 if(vnfResource==null){
1363 throw new ValidationException("vnfResource");
1365 if(modelInfo.getModelVersionId() == null) {
1366 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1370 VnfRecipe vnfRecipe = null;
1373 String nfRole = vrc.getNfRole();
1374 if(nfRole != null) {
1375 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1379 if(vnfRecipe == null) {
1380 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1383 if (vnfRecipe == null) {
1387 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1389 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1390 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1391 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1392 // 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.
1393 // 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
1394 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1395 // 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)
1396 // and MODEL_VERSION (modelVersion).
1398 VfModuleCustomization vfmc = null;
1400 VnfResourceCustomization vnfrc;
1401 VfModule vfModule = null;
1403 if(modelInfo.getModelCustomizationId() != null) {
1404 vfmc = vfModuleCustomRepo.findByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1406 vnfr = vnfRepo.findResourceByModelUUID(relatedInstanceModelVersionId);
1408 vnfr = vnfRepo.findResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1410 vnfrc = vnfCustomRepo.findByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1412 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1414 String vfModuleModelUUID = modelInfo.getModelVersionId();
1415 for(VfModuleCustomization vf : list) {
1416 VfModuleCustomization vfmCustom;
1417 if(vfModuleModelUUID != null){
1418 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1419 if(vfmCustom != null){
1420 vfModule = vfmCustom.getVfModule();
1423 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUID(vf.getModelCustomizationUUID());
1424 if(vfmCustom != null){
1425 vfModule = vfmCustom.getVfModule();
1427 vfModule = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1431 if(vfModule != null) {
1432 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1433 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1439 if(vfmc == null && vfModule == null) {
1440 throw new ValidationException("vfModuleCustomization");
1441 } else if (vfModule == null && vfmc != null) {
1442 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1445 if(modelInfo.getModelVersionId() == null) {
1446 modelInfo.setModelVersionId(vfModule.getModelUUID());
1450 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1452 List<VfModule> vfModuleRecords= vfModuleRepo.findByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1453 if(!vfModuleRecords.isEmpty()){
1454 for(VfModule record : vfModuleRecords){
1455 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1462 if(recipe == null) {
1463 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1464 if (recipe == null) {
1465 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1468 if(recipe == null) {
1475 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1476 recipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1477 if (recipe == null) {
1481 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1483 if (recipe == null) {
1489 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1492 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1494 String defaultSource = getDefaultModel(sir);
1496 VnfRecipe vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1498 if (vnfRecipe == null) {
1502 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1506 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1508 String defaultNetworkType = getDefaultModel(sir);
1510 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1511 String modelName = modelInfo.getModelName();
1512 Recipe recipe = null;
1514 if(modelInfo.getModelCustomizationId()!=null){
1515 NetworkResource networkResource = networkCustomizationRepo.findOneByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1516 if(networkResource!=null){
1517 if(modelInfo.getModelVersionId() == null) {
1518 modelInfo.setModelVersionId(networkResource.getModelUUID());
1520 recipe = networkRecipeRepo.findByModelNameAndAction(networkResource.getModelName(), action.toString());
1522 throw new ValidationException("no catalog entry found");
1525 //ok for version < 3 and action delete
1526 recipe = networkRecipeRepo.findByModelNameAndAction(modelName, action.toString());
1530 recipe = networkRecipeRepo.findByModelNameAndAction(defaultNetworkType, action.toString());
1533 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1536 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1537 String requestTestApi = null;
1538 TestApi testApi = null;
1540 if (requestParams != null) {
1541 requestTestApi = requestParams.getTestApi();
1544 if (requestTestApi == null) {
1545 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1546 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1548 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1553 testApi = TestApi.valueOf(requestTestApi);
1554 return Optional.of(testApi.getModelName());
1555 } catch (Exception e) {
1556 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1557 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1561 private String getDefaultModel(ServiceInstancesRequest sir) {
1562 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1563 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1564 if (oModelName.isPresent()) {
1565 defaultModel = oModelName.get();
1567 return defaultModel;
1570 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1571 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1572 Boolean aLaCarte = null;
1573 String apiVersion = version.substring(1);
1575 long startTime = System.currentTimeMillis ();
1576 ServiceInstancesRequest sir = null;
1578 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1579 String requestScope = deriveRequestScope(action,sir, requestUri);
1580 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1581 if(sir.getRequestDetails().getRequestParameters() != null){
1582 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1584 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1585 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1586 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1588 InfraActiveRequests dup = null;
1590 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1592 if (instanceIdMap != null && dup != null) {
1593 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1596 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1597 RequestReferences referencesResponse = new RequestReferences();
1598 referencesResponse.setRequestId(requestId);
1599 serviceResponse.setRequestReferences(referencesResponse);
1602 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1603 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1605 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1606 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1608 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1611 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1612 .errorInfo(errorLoggerInfo).build();
1614 msoRequest.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1616 throw validateException;
1620 serviceInstanceId = "";
1621 String configurationId = "";
1622 String correlationId = "";
1624 if(sir.getServiceInstanceId () != null){
1625 serviceInstanceId = sir.getServiceInstanceId ();
1628 if(sir.getConfigurationId() != null){
1629 configurationId = sir.getConfigurationId();
1631 if (sir.getCorrelationId() != null) {
1632 correlationId = sir.getCorrelationId();
1634 iar.save(currentActiveReq);
1636 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1638 }else if(aLaCarte == null){
1642 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1643 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1646 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1647 String requestId = null;
1648 if (requestContext.getProperty("requestId") != null) {
1649 requestId = requestContext.getProperty("requestId").toString();
1651 if (UUIDChecker.isValidUUID(requestId)) {
1654 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1655 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1656 .errorInfo(errorLoggerInfo).build();
1658 throw validateException;