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.sql.Timestamp;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
31 import java.util.Optional;
33 import javax.transaction.Transactional;
34 import javax.ws.rs.Consumes;
35 import javax.ws.rs.DELETE;
36 import javax.ws.rs.POST;
37 import javax.ws.rs.PUT;
38 import javax.ws.rs.Path;
39 import javax.ws.rs.PathParam;
40 import javax.ws.rs.Produces;
41 import javax.ws.rs.container.ContainerRequestContext;
42 import javax.ws.rs.core.Context;
43 import javax.ws.rs.core.MediaType;
44 import javax.ws.rs.core.Response;
46 import org.apache.commons.lang.StringUtils;
47 import org.apache.http.HttpResponse;
48 import org.apache.http.HttpStatus;
49 import org.onap.so.apihandler.camundabeans.CamundaResponse;
50 import org.onap.so.apihandler.common.CommonConstants;
51 import org.onap.so.apihandler.common.ErrorNumbers;
52 import org.onap.so.apihandler.common.RequestClient;
53 import org.onap.so.apihandler.common.RequestClientFactory;
54 import org.onap.so.apihandler.common.RequestClientParameter;
55 import org.onap.so.apihandler.common.ResponseBuilder;
56 import org.onap.so.apihandler.common.ResponseHandler;
57 import org.onap.so.apihandlerinfra.exceptions.ApiException;
58 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
59 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
60 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
61 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
62 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
63 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
64 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
65 import org.onap.so.db.catalog.beans.NetworkResource;
66 import org.onap.so.db.catalog.beans.Recipe;
67 import org.onap.so.db.catalog.beans.ServiceRecipe;
68 import org.onap.so.db.catalog.beans.VfModule;
69 import org.onap.so.db.catalog.beans.VfModuleCustomization;
70 import org.onap.so.db.catalog.beans.VnfRecipe;
71 import org.onap.so.db.catalog.beans.VnfResource;
72 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
73 import org.onap.so.db.catalog.data.repository.NetworkRecipeRepository;
74 import org.onap.so.db.catalog.data.repository.NetworkResourceCustomizationRepository;
75 import org.onap.so.db.catalog.data.repository.ServiceRecipeRepository;
76 import org.onap.so.db.catalog.data.repository.ServiceRepository;
77 import org.onap.so.db.catalog.data.repository.VFModuleCustomizationRepository;
78 import org.onap.so.db.catalog.data.repository.VFModuleRepository;
79 import org.onap.so.db.catalog.data.repository.VnfComponentRecipeRepository;
80 import org.onap.so.db.catalog.data.repository.VnfCustomizationRepository;
81 import org.onap.so.db.catalog.data.repository.VnfRecipeRepository;
82 import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
83 import org.onap.so.db.request.beans.InfraActiveRequests;
84 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
85 import org.onap.so.exceptions.ValidationException;
86 import org.onap.so.logger.MessageEnum;
87 import org.onap.so.logger.MsoLogger;
88 import org.onap.so.serviceinstancebeans.CloudConfiguration;
89 import org.onap.so.serviceinstancebeans.ModelInfo;
90 import org.onap.so.serviceinstancebeans.ModelType;
91 import org.onap.so.serviceinstancebeans.Networks;
92 import org.onap.so.serviceinstancebeans.RelatedInstance;
93 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
94 import org.onap.so.serviceinstancebeans.RequestDetails;
95 import org.onap.so.serviceinstancebeans.RequestParameters;
96 import org.onap.so.serviceinstancebeans.RequestReferences;
97 import org.onap.so.serviceinstancebeans.Service;
98 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
99 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
100 import org.onap.so.serviceinstancebeans.VfModules;
101 import org.onap.so.serviceinstancebeans.Vnfs;
102 import org.onap.so.utils.UUIDChecker;
103 import org.springframework.beans.factory.annotation.Autowired;
104 import org.springframework.core.env.Environment;
105 import org.springframework.stereotype.Component;
107 import com.fasterxml.jackson.annotation.JsonInclude.Include;
108 import com.fasterxml.jackson.core.JsonParseException;
109 import com.fasterxml.jackson.core.JsonProcessingException;
110 import com.fasterxml.jackson.databind.JsonMappingException;
111 import com.fasterxml.jackson.databind.ObjectMapper;
113 import io.swagger.annotations.Api;
114 import io.swagger.annotations.ApiOperation;
117 @Path("/onap/so/infra/serviceInstantiation")
118 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
119 public class ServiceInstances {
121 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
122 private static String NAME = "name";
123 private static String VALUE = "value";
126 private Environment env;
129 private RequestClientFactory reqClientFactory;
132 private ServiceRepository serviceRepo;
135 private ServiceRecipeRepository serviceRecipeRepo;
138 private NetworkRecipeRepository networkRecipeRepo;
141 private NetworkResourceCustomizationRepository networkCustomizationRepo;
144 private VnfResourceRepository vnfRepo;
147 private VnfCustomizationRepository vnfCustomRepo;
150 private VnfRecipeRepository vnfRecipeRepo;
153 private VFModuleCustomizationRepository vfModuleCustomRepo;
156 private VFModuleRepository vfModuleRepo;
159 private VnfComponentRecipeRepository vnfComponentRecipeRepo;
162 private InfraActiveRequestsRepository iar;
165 private ResponseBuilder builder;
168 private MsoRequest msoRequest;
171 @Path("/{version:[vV][5-7]}/serviceInstances")
172 @Consumes(MediaType.APPLICATION_JSON)
173 @Produces(MediaType.APPLICATION_JSON)
174 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
176 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
177 String requestId = getRequestId(requestContext);
178 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
182 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
183 @Consumes(MediaType.APPLICATION_JSON)
184 @Produces(MediaType.APPLICATION_JSON)
185 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
187 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
188 String requestId = getRequestId(requestContext);
189 HashMap<String, String> instanceIdMap = new HashMap<>();
190 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
191 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
195 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
196 @Consumes(MediaType.APPLICATION_JSON)
197 @Produces(MediaType.APPLICATION_JSON)
198 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
200 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
201 String requestId = getRequestId(requestContext);
202 HashMap<String, String> instanceIdMap = new HashMap<>();
203 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
204 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
208 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
209 @Consumes(MediaType.APPLICATION_JSON)
210 @Produces(MediaType.APPLICATION_JSON)
211 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
213 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
214 String requestId = getRequestId(requestContext);
215 HashMap<String, String> instanceIdMap = new HashMap<>();
216 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
217 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
221 @Path("/{version:[vV][7]}/serviceInstances/assign")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Assign Service Instance", response=Response.class)
226 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
227 String requestId = getRequestId(requestContext);
228 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
232 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
233 @Consumes(MediaType.APPLICATION_JSON)
234 @Produces(MediaType.APPLICATION_JSON)
235 @ApiOperation(value="Unassign Service Instance", response=Response.class)
237 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
238 String requestId = getRequestId(requestContext);
239 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
240 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
241 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
245 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
246 @Consumes(MediaType.APPLICATION_JSON)
247 @Produces(MediaType.APPLICATION_JSON)
248 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
250 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
251 String requestId = getRequestId(requestContext);
252 HashMap<String, String> instanceIdMap = new HashMap<>();
253 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
254 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
258 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
259 @Consumes(MediaType.APPLICATION_JSON)
260 @Produces(MediaType.APPLICATION_JSON)
261 @ApiOperation(value="Delete provided Port",response=Response.class)
263 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
264 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
265 String requestId = getRequestId(requestContext);
266 HashMap<String, String> instanceIdMap = new HashMap<>();
267 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
268 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
269 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
273 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
274 @Consumes(MediaType.APPLICATION_JSON)
275 @Produces(MediaType.APPLICATION_JSON)
276 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
278 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
279 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
280 String requestId = getRequestId(requestContext);
281 HashMap<String, String> instanceIdMap = new HashMap<>();
282 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
283 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
284 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
288 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
289 @Consumes(MediaType.APPLICATION_JSON)
290 @Produces(MediaType.APPLICATION_JSON)
291 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
293 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
294 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
295 String requestId = getRequestId(requestContext);
296 HashMap<String, String> instanceIdMap = new HashMap<>();
297 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
298 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
299 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
303 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
304 @Consumes(MediaType.APPLICATION_JSON)
305 @Produces(MediaType.APPLICATION_JSON)
306 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
308 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
309 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
310 String requestId = getRequestId(requestContext);
311 HashMap<String, String> instanceIdMap = new HashMap<>();
312 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
313 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
314 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
318 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
319 @Consumes(MediaType.APPLICATION_JSON)
320 @Produces(MediaType.APPLICATION_JSON)
321 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
323 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
324 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
325 String requestId = getRequestId(requestContext);
326 HashMap<String, String> instanceIdMap = new HashMap<>();
327 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
328 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
329 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
333 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
334 @Consumes(MediaType.APPLICATION_JSON)
335 @Produces(MediaType.APPLICATION_JSON)
336 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
338 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
339 String requestId = getRequestId(requestContext);
340 HashMap<String, String> instanceIdMap = new HashMap<>();
341 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
342 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
346 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
347 @Consumes(MediaType.APPLICATION_JSON)
348 @Produces(MediaType.APPLICATION_JSON)
349 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
351 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
352 String requestId = getRequestId(requestContext);
353 HashMap<String, String> instanceIdMap = new HashMap<>();
354 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
355 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
359 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
360 @Consumes(MediaType.APPLICATION_JSON)
361 @Produces(MediaType.APPLICATION_JSON)
362 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
364 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
365 String requestId = getRequestId(requestContext);
366 HashMap<String, String> instanceIdMap = new HashMap<>();
367 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
368 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
372 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
373 @Consumes(MediaType.APPLICATION_JSON)
374 @Produces(MediaType.APPLICATION_JSON)
375 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
377 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
378 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
379 String requestId = getRequestId(requestContext);
380 HashMap<String, String> instanceIdMap = new HashMap<>();
381 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
382 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
383 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
387 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
388 @Consumes(MediaType.APPLICATION_JSON)
389 @Produces(MediaType.APPLICATION_JSON)
390 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
392 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
393 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
394 String requestId = getRequestId(requestContext);
395 HashMap<String, String> instanceIdMap = new HashMap<>();
396 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
397 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
398 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
402 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
403 @Consumes(MediaType.APPLICATION_JSON)
404 @Produces(MediaType.APPLICATION_JSON)
405 @ApiOperation(value="Apply updated configuration",response=Response.class)
406 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
407 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
408 String requestId = getRequestId(requestContext);
409 HashMap<String, String> instanceIdMap = new HashMap<>();
410 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
411 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
412 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
417 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
418 @Consumes(MediaType.APPLICATION_JSON)
419 @Produces(MediaType.APPLICATION_JSON)
420 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
422 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
423 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
424 String requestId = getRequestId(requestContext);
425 HashMap<String, String> instanceIdMap = new HashMap<>();
426 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
427 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
428 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
432 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
433 @Consumes(MediaType.APPLICATION_JSON)
434 @Produces(MediaType.APPLICATION_JSON)
435 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
437 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
438 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
439 String requestId = getRequestId(requestContext);
440 HashMap<String, String> instanceIdMap = new HashMap<>();
441 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
442 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
443 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
447 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
448 @Consumes(MediaType.APPLICATION_JSON)
449 @Produces(MediaType.APPLICATION_JSON)
450 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
452 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
453 @PathParam("vnfInstanceId") String vnfInstanceId,
454 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
455 String requestId = getRequestId(requestContext);
456 HashMap<String, String> instanceIdMap = new HashMap<>();
457 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
458 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
459 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
460 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
464 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
465 @Consumes(MediaType.APPLICATION_JSON)
466 @Produces(MediaType.APPLICATION_JSON)
467 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
469 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
470 @PathParam("vnfInstanceId") String vnfInstanceId,
471 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
472 String requestId = getRequestId(requestContext);
473 HashMap<String, String> instanceIdMap = new HashMap<>();
474 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
475 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
476 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
477 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
481 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
482 @Consumes(MediaType.APPLICATION_JSON)
483 @Produces(MediaType.APPLICATION_JSON)
484 @ApiOperation(value="Perform VNF software update",response=Response.class)
486 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
487 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
488 String requestId = getRequestId(requestContext);
489 HashMap<String, String> instanceIdMap = new HashMap<>();
490 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
491 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
492 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
496 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
497 @Consumes(MediaType.APPLICATION_JSON)
498 @Produces(MediaType.APPLICATION_JSON)
499 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
501 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
502 @PathParam("vnfInstanceId") String vnfInstanceId,
503 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
504 String requestId = getRequestId(requestContext);
505 HashMap<String, String> instanceIdMap = new HashMap<>();
506 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
507 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
508 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
509 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
513 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
514 @Consumes(MediaType.APPLICATION_JSON)
515 @Produces(MediaType.APPLICATION_JSON)
516 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
518 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
519 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
520 String requestId = getRequestId(requestContext);
521 HashMap<String, String> instanceIdMap = new HashMap<>();
522 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
523 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
524 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
525 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
531 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
532 @Consumes(MediaType.APPLICATION_JSON)
533 @Produces(MediaType.APPLICATION_JSON)
534 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
536 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
537 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
538 String requestId = getRequestId(requestContext);
539 HashMap<String, String> instanceIdMap = new HashMap<>();
540 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
541 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
542 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
546 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
547 @Consumes(MediaType.APPLICATION_JSON)
548 @Produces(MediaType.APPLICATION_JSON)
549 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
551 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
552 @PathParam("vnfInstanceId") String vnfInstanceId,
553 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
554 String requestId = getRequestId(requestContext);
555 HashMap<String, String> instanceIdMap = new HashMap<>();
556 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
557 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
558 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
559 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
563 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
564 @Consumes(MediaType.APPLICATION_JSON)
565 @Produces(MediaType.APPLICATION_JSON)
566 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
568 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
569 @PathParam("vnfInstanceId") String vnfInstanceId,
570 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
571 String requestId = getRequestId(requestContext);
572 HashMap<String, String> instanceIdMap = new HashMap<>();
573 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
574 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
575 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
576 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
580 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
581 @Consumes(MediaType.APPLICATION_JSON)
582 @Produces(MediaType.APPLICATION_JSON)
583 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
585 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
586 String requestId = getRequestId(requestContext);
587 HashMap<String, String> instanceIdMap = new HashMap<>();
588 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
589 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
593 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
594 @Consumes(MediaType.APPLICATION_JSON)
595 @Produces(MediaType.APPLICATION_JSON)
596 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
598 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
599 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
600 String requestId = getRequestId(requestContext);
601 HashMap<String, String> instanceIdMap = new HashMap<>();
602 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
603 instanceIdMap.put("networkInstanceId", networkInstanceId);
604 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
608 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
609 @Consumes(MediaType.APPLICATION_JSON)
610 @Produces(MediaType.APPLICATION_JSON)
611 @ApiOperation(value="Delete provided Network instance",response=Response.class)
613 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
614 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
615 String requestId = getRequestId(requestContext);
616 HashMap<String, String> instanceIdMap = new HashMap<>();
617 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
618 instanceIdMap.put("networkInstanceId", networkInstanceId);
619 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
622 public String getRequestUri(ContainerRequestContext context){
623 String requestUri = context.getUriInfo().getPath();
624 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
628 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
629 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
630 Boolean aLaCarte = null;
631 long startTime = System.currentTimeMillis ();
632 ServiceInstancesRequest sir = null;
633 String apiVersion = version.substring(1);
635 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
636 String requestScope = deriveRequestScope(action, sir, requestUri);
637 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
638 if(sir.getRequestDetails().getRequestParameters() != null){
639 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
641 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
642 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
644 int requestVersion = Integer.parseInt(version.substring(1));
645 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
646 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
647 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
648 String networkType = msoRequest.getNetworkType(sir,requestScope);
649 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
650 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
651 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
653 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
654 currentActiveReq.setVnfType(vnfType);
655 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
656 currentActiveReq.setNetworkType(networkType);
659 InfraActiveRequests dup = null;
662 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
665 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
667 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
669 RequestReferences referencesResponse = new RequestReferences();
671 referencesResponse.setRequestId(requestId);
673 serviceResponse.setRequestReferences(referencesResponse);
674 Boolean isBaseVfModule = false;
676 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
679 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
680 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
681 modelType = ModelType.vnf;
683 modelType =modelInfo.getModelType();
686 if (modelType.equals(ModelType.vfModule)) {
689 // Get VF Module-specific base module indicator
692 String modelVersionId = modelInfo.getModelVersionId();
694 if(modelVersionId != null) {
695 vfm = vfModuleRepo.findByModelUUID(modelVersionId);
697 vfm = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
701 if (vfm.getIsBase()) {
702 isBaseVfModule = true;
704 } else if (action == Action.createInstance || action == Action.updateInstance) {
705 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
706 // This request cannot proceed
708 String serviceVersionText = "";
709 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
710 serviceVersionText = " with version " + sdcServiceModelVersion;
713 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
714 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
715 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
716 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
718 throw vfModuleException;
723 serviceInstanceId = "";
725 String vfModuleId = "";
726 String volumeGroupId = "";
727 String networkId = "";
728 String correlationId = "";
730 if(sir.getServiceInstanceId () != null){
731 serviceInstanceId = sir.getServiceInstanceId ();
734 if(sir.getVnfInstanceId () != null){
735 vnfId = sir.getVnfInstanceId ();
738 if(sir.getVfModuleInstanceId () != null){
739 vfModuleId = sir.getVfModuleInstanceId ();
742 if(sir.getVolumeGroupInstanceId () != null){
743 volumeGroupId = sir.getVolumeGroupInstanceId ();
746 if(sir.getNetworkInstanceId () != null){
747 networkId = sir.getNetworkInstanceId ();
750 if (sir.getCorrelationId() != null) {
751 correlationId = sir.getCorrelationId();
753 iar.save(currentActiveReq);
755 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
757 }else if(aLaCarte == null){
761 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
762 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
763 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
766 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
767 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
768 return (ModelType.vnf.name());
771 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
772 requestScope = requestScopeFromUri(requestUri);
774 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
779 private String requestScopeFromUri(String requestUri){
781 if(requestUri.contains(ModelType.network.name())){
782 requestScope = ModelType.network.name();
783 }else if(requestUri.contains(ModelType.vfModule.name())){
784 requestScope = ModelType.vfModule.name();
785 }else if(requestUri.contains(ModelType.volumeGroup.name())){
786 requestScope = ModelType.volumeGroup.name();
787 }else if(requestUri.contains(ModelType.configuration.name())){
788 requestScope = ModelType.configuration.name();
789 }else if(requestUri.contains(ModelType.vnf.name())){
790 requestScope = ModelType.vnf.name();
792 requestScope = ModelType.service.name();
796 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
797 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
798 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
799 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
800 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
801 RequestClient requestClient = null;
802 HttpResponse response = null;
804 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
805 response = requestClient.post(new RequestClientParameter.Builder()
806 .setRequestId(requestId)
807 .setBaseVfModule(isBaseVfModule)
808 .setRecipeTimeout(timeOut)
809 .setRequestAction(action.toString())
810 .setServiceInstanceId(serviceInstanceId)
811 .setCorrelationId(correlationId)
813 .setVfModuleId(vfModuleId)
814 .setVolumeGroupId(volumeGroupId)
815 .setNetworkId(networkId)
816 .setConfigurationId(configurationId)
817 .setServiceType(serviceInstanceType)
819 .setVfModuleType(vfModuleType)
820 .setNetworkType(networkType)
821 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
822 .setApiVersion(apiVersion)
823 .setALaCarte(aLaCarte)
824 .setRecipeParamXsd(paramXsd)
825 .setRequestUri(requestUri).build());
828 } catch (Exception e) {
830 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
831 String url = requestClient != null ? requestClient.getUrl() : "";
832 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
833 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
835 throw clientException;
838 if (response == null) {
840 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
841 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
843 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
845 throw clientException;
848 ResponseHandler respHandler = null;
849 int bpelStatus = 500;
851 respHandler = new ResponseHandler (response, requestClient.getType ());
852 bpelStatus = respHandler.getStatus ();
853 } catch (ApiException e) {
855 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
856 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
857 .errorInfo(errorLoggerInfo).build();
858 currentActiveReq.setRequestStatus(Status.FAILED.name());
859 currentActiveReq.setStatusMessage(validateException.getMessage());
860 throw validateException;
863 // BPEL accepted the request, the request is in progress
864 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
865 ServiceInstancesResponse jsonResponse;
866 CamundaResponse camundaResp = respHandler.getResponse();
868 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
870 ObjectMapper mapper = new ObjectMapper();
871 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
872 } catch (IOException e) {
874 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
875 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
876 .errorInfo(errorLoggerInfo).build();
877 currentActiveReq.setRequestStatus(Status.FAILED.name());
878 currentActiveReq.setStatusMessage(validateException.getMessage());
879 throw validateException;
882 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
883 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
885 iar.save(currentActiveReq);
886 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
890 List<String> variables = new ArrayList<>();
891 variables.add(bpelStatus + "");
892 String camundaJSONResponseBody = respHandler.getResponseBody ();
893 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
895 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
896 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
897 .errorInfo(errorLoggerInfo).build();
899 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
904 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
907 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
908 .errorInfo(errorLoggerInfo).build();
909 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
915 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
916 if(StringUtils.isNotBlank(instanceId)) {
917 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
918 currentActiveReq.setServiceInstanceId(instanceId);
919 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
920 currentActiveReq.setVnfId(instanceId);
921 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
922 currentActiveReq.setVfModuleId(instanceId);
923 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
924 currentActiveReq.setVolumeGroupId(instanceId);
925 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
926 currentActiveReq.setNetworkId(instanceId);
927 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
928 currentActiveReq.setConfigurationId(instanceId);
930 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
931 if(instanceIdMap.get("serviceInstanceId") != null){
932 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
934 if(instanceIdMap.get("vnfInstanceId") != null){
935 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
937 if(instanceIdMap.get("vfModuleInstanceId") != null){
938 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
940 if(instanceIdMap.get("volumeGroupInstanceId") != null){
941 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
943 if(instanceIdMap.get("networkInstanceId") != null){
944 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
946 if(instanceIdMap.get("configurationInstanceId") != null){
947 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
952 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
953 ObjectMapper mapper = new ObjectMapper();
954 mapper.setSerializationInclusion(Include.NON_NULL);
955 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
956 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
957 serviceInstRequest.getRequestDetails() != null &&
958 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
959 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
960 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
962 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
963 return mapper.writeValueAsString(sir);
966 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
967 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
969 // Found the duplicate record. Return the appropriate error.
970 String instance = null;
971 if(instanceName != null){
972 instance = instanceName;
974 instance = instanceIdMap.get(requestScope + "InstanceId");
976 //List<String> variables = new ArrayList<String>();
977 //variables.add(dup.getRequestStatus());
978 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
981 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
982 .errorInfo(errorLoggerInfo).build();
984 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
989 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
990 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
991 InfraActiveRequests dup = null;
993 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
994 dup = iar.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
996 } catch (Exception e) {
997 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1000 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1001 .errorInfo(errorLoggerInfo).build();
1003 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1005 throw validateException;
1010 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1011 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1013 ObjectMapper mapper = new ObjectMapper();
1014 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1016 } catch (IOException e) {
1018 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1020 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1021 .errorInfo(errorLoggerInfo).build();
1022 String requestScope = requestScopeFromUri(requestUri);
1024 createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1026 throw validateException;
1029 //TODO MSO-4177 -- remove this and call the msoRequest instead
1030 public void createErrorRequestRecord (Status status, String requestId, String errorMessage, Actions action, String requestScope, String requestJSON) {
1032 InfraActiveRequests request = new InfraActiveRequests(requestId);
1033 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
1034 request.setStartTime (startTimeStamp);
1035 request.setRequestStatus(status.toString());
1036 request.setStatusMessage(errorMessage);
1037 request.setProgress((long) 100);
1038 request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
1039 request.setRequestAction(action.toString());
1040 request.setRequestScope(requestScope);
1041 request.setRequestBody(requestJSON);
1042 Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
1043 request.setEndTime(endTimeStamp);
1045 } catch (Exception e) {
1046 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
1047 msoLogger.debug ("Exception: ", e);
1050 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1051 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1052 int reqVersion = Integer.parseInt(version.substring(1));
1054 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1055 } catch (Exception e) {
1056 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1057 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1058 .errorInfo(errorLoggerInfo).build();
1060 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1062 throw validateException;
1066 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1067 InfraActiveRequests currentActiveReq) throws ApiException {
1068 RecipeLookupResult recipeLookupResult = null;
1069 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1070 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1071 // Query MSO Catalog DB
1073 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1074 recipeLookupResult = getDefaultVnfUri(sir, action);
1075 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1077 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1078 } catch (IOException e) {
1079 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1082 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1083 .errorInfo(errorLoggerInfo).build();
1085 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1087 throw validateException;
1089 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1090 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1092 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1093 } catch (ValidationException e) {
1094 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1097 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1098 .errorInfo(errorLoggerInfo).build();
1100 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1102 throw validateException;
1104 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1106 recipeLookupResult = getNetworkUri( sir, action);
1107 } catch (ValidationException e) {
1109 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1112 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1113 .errorInfo(errorLoggerInfo).build();
1114 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1116 throw validateException;
1120 if (recipeLookupResult == null) {
1121 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1124 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1125 .errorInfo(errorLoggerInfo).build();
1127 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1128 throw recipeNotFoundExceptionException;
1130 return recipeLookupResult;
1134 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1136 // Construct the default service name
1137 // TODO need to make this a configurable property
1138 String defaultServiceModelName = getDefaultModel(servInstReq);
1139 RequestDetails requestDetails = servInstReq.getRequestDetails();
1140 ModelInfo modelInfo = requestDetails.getModelInfo();
1141 org.onap.so.db.catalog.beans.Service serviceRecord;
1142 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1143 ServiceRecipe recipe = null;
1146 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1147 if(serviceRecord !=null){
1148 recipe = serviceRecord.getRecipes().get(action.toString());
1151 serviceRecord = serviceRepo.findOneByModelUUID(modelInfo.getModelVersionId());
1152 recipe = serviceRecipeRepo.findFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1153 if (recipe == null){
1154 serviceRecordList = serviceRepo.findByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1155 if(!serviceRecordList.isEmpty()){
1156 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1157 recipe = record.getRecipes().get(action.toString());
1166 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1167 RequestParameters reqParam = requestDetails.getRequestParameters();
1168 if(reqParam!=null && alaCarteFlag && recipe==null){
1170 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1171 mapToLegacyRequest(requestDetails);
1172 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1173 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1174 recipe = serviceRecord.getRecipes().get( action.toString());
1176 if(modelInfo.getModelVersionId() == null) {
1177 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1182 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1185 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1186 RequestParameters reqParam;
1187 if (requestDetails.getRequestParameters() == null) {
1188 reqParam = new RequestParameters();
1190 reqParam = requestDetails.getRequestParameters();
1192 if(requestDetails.getCloudConfiguration() == null) {
1193 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1194 if(cloudConfig != null) {
1195 requestDetails.setCloudConfiguration(cloudConfig);
1199 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1200 if(!userParams.isEmpty()) {
1201 if (reqParam == null) {
1202 requestDetails.setRequestParameters(new RequestParameters());
1204 requestDetails.getRequestParameters().setUserParams(userParams);
1208 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1210 for(Map<String, Object> params : reqParams.getUserParams()){
1211 if(params.containsKey("service")){
1212 Service service = serviceMapper(params);
1214 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1216 if (targetConfiguration.isPresent()) {
1217 return targetConfiguration.get();
1219 for(Networks network : service.getResources().getNetworks()) {
1220 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1221 if(targetConfiguration.isPresent()) {
1222 return targetConfiguration.get();
1226 for(Vnfs vnf : service.getResources().getVnfs()) {
1227 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1229 if(targetConfiguration.isPresent()) {
1230 return targetConfiguration.get();
1233 for(VfModules vfModule : vnf.getVfModules()) {
1234 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1236 if(targetConfiguration.isPresent()) {
1237 return targetConfiguration.get();
1248 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1249 CloudConfiguration targetConfiguration = new CloudConfiguration();
1250 if(sourceCloudConfiguration != null) {
1251 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1252 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1253 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1254 return Optional.of(targetConfiguration);
1256 return Optional.empty();
1259 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1260 msoLogger.debug("Configuring UserParams for Macro Request");
1261 Map<String, Object> userParams = new HashMap<>();
1263 for(Map<String, Object> params : reqParams.getUserParams()){
1264 if(params.containsKey("service")){
1265 Service service = serviceMapper(params);
1267 addUserParams(userParams, service.getInstanceParams());
1269 for(Networks network : service.getResources().getNetworks()) {
1270 addUserParams(userParams, network.getInstanceParams());
1273 for(Vnfs vnf: service.getResources().getVnfs()) {
1274 addUserParams(userParams, vnf.getInstanceParams());
1276 for(VfModules vfModule: vnf.getVfModules()) {
1277 addUserParams(userParams, vfModule.getInstanceParams());
1283 return mapFlatMapToNameValue(userParams);
1286 private Service serviceMapper(Map<String, Object> params)
1287 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1288 ObjectMapper obj = new ObjectMapper();
1289 String input = obj.writeValueAsString(params.get("service"));
1290 return obj.readValue(input, Service.class);
1293 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1294 for(Map<String, String> map : sourceUserParams) {
1295 for (Map.Entry<String, String> entry : map.entrySet()) {
1296 targetUserParams.put(entry.getKey(), entry.getValue());
1301 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1302 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1304 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1305 Map<String, Object> targetMap = new HashMap<>();
1306 targetMap.put(NAME, map.getKey());
1307 targetMap.put(VALUE, map.getValue());
1308 targetUserParams.add(targetMap);
1310 return targetUserParams;
1313 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1315 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1316 String vnfComponentType = modelInfo.getModelType().name();
1318 RelatedInstanceList[] instanceList = null;
1319 if (servInstReq.getRequestDetails() != null) {
1320 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1323 Recipe recipe = null;
1324 String defaultSource = getDefaultModel(servInstReq);
1325 String modelCustomizationId = modelInfo.getModelCustomizationId();
1326 String modelCustomizationName = modelInfo.getModelCustomizationName();
1327 String relatedInstanceModelVersionId = null;
1328 String relatedInstanceModelInvariantId = null;
1329 String relatedInstanceVersion = null;
1330 String relatedInstanceModelCustomizationName = null;
1332 if (instanceList != null) {
1334 for(RelatedInstanceList relatedInstanceList : instanceList){
1336 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1337 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1338 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1339 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1340 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1343 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1344 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1345 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1346 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1347 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1351 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1352 // a. For a vnf request (only create, no update currently):
1353 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1354 // 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
1355 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1356 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1357 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1358 // (MODEL_UUID) in SERVICE table.
1359 // 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
1360 // during 1707 data migration if VID did not provide it originally on request.
1361 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1362 // 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.
1364 VnfResource vnfResource = null;
1365 VnfResourceCustomization vrc=null;
1366 // Validation for vnfResource
1368 if(modelCustomizationId!=null) {
1369 vrc = vnfCustomRepo.findOneByModelCustomizationUUID(modelCustomizationId);
1371 vnfResource = vrc.getVnfResources();
1374 org.onap.so.db.catalog.beans.Service service = serviceRepo.findOneByModelUUID(relatedInstanceModelVersionId);
1375 if(service == null) {
1376 service = serviceRepo.findByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1379 if(service == null) {
1380 throw new ValidationException("service in relatedInstance");
1382 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1383 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1384 vrc=vnfResourceCustom;
1389 vnfResource = vrc.getVnfResources();
1390 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1391 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1395 if(vnfResource==null){
1396 throw new ValidationException("vnfResource");
1398 if(modelInfo.getModelVersionId() == null) {
1399 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1403 VnfRecipe vnfRecipe = null;
1406 String nfRole = vrc.getNfRole();
1407 if(nfRole != null) {
1408 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1412 if(vnfRecipe == null) {
1413 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1416 if (vnfRecipe == null) {
1420 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1422 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1423 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1424 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1425 // 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.
1426 // 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
1427 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1428 // 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)
1429 // and MODEL_VERSION (modelVersion).
1431 VfModuleCustomization vfmc = null;
1433 VnfResourceCustomization vnfrc;
1434 VfModule vfModule = null;
1436 if(modelInfo.getModelCustomizationId() != null) {
1437 vfmc = vfModuleCustomRepo.findByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1439 vnfr = vnfRepo.findResourceByModelUUID(relatedInstanceModelVersionId);
1441 vnfr = vnfRepo.findResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1443 vnfrc = vnfCustomRepo.findByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1445 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1447 String vfModuleModelUUID = modelInfo.getModelVersionId();
1448 for(VfModuleCustomization vf : list) {
1449 VfModuleCustomization vfmCustom;
1450 if(vfModuleModelUUID != null){
1451 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1452 if(vfmCustom != null){
1453 vfModule = vfmCustom.getVfModule();
1456 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUID(vf.getModelCustomizationUUID());
1457 if(vfmCustom != null){
1458 vfModule = vfmCustom.getVfModule();
1460 vfModule = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1464 if(vfModule != null) {
1465 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1466 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1472 if(vfmc == null && vfModule == null) {
1473 throw new ValidationException("vfModuleCustomization");
1474 } else if (vfModule == null && vfmc != null) {
1475 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1478 if(modelInfo.getModelVersionId() == null) {
1479 modelInfo.setModelVersionId(vfModule.getModelUUID());
1483 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1485 List<VfModule> vfModuleRecords= vfModuleRepo.findByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1486 if(!vfModuleRecords.isEmpty()){
1487 for(VfModule record : vfModuleRecords){
1488 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1495 if(recipe == null) {
1496 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1497 if (recipe == null) {
1498 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1501 if(recipe == null) {
1508 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1509 recipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1510 if (recipe == null) {
1514 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1516 if (recipe == null) {
1522 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1525 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1527 String defaultSource = getDefaultModel(sir);
1529 VnfRecipe vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1531 if (vnfRecipe == null) {
1535 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1539 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1541 String defaultNetworkType = getDefaultModel(sir);
1543 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1544 String modelName = modelInfo.getModelName();
1545 Recipe recipe = null;
1547 if(modelInfo.getModelCustomizationId()!=null){
1548 NetworkResource networkResource = networkCustomizationRepo.findOneByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1549 if(networkResource!=null){
1550 if(modelInfo.getModelVersionId() == null) {
1551 modelInfo.setModelVersionId(networkResource.getModelUUID());
1553 recipe = networkRecipeRepo.findByModelNameAndAction(networkResource.getModelName(), action.toString());
1555 throw new ValidationException("no catalog entry found");
1558 //ok for version < 3 and action delete
1559 recipe = networkRecipeRepo.findByModelNameAndAction(modelName, action.toString());
1563 recipe = networkRecipeRepo.findByModelNameAndAction(defaultNetworkType, action.toString());
1566 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1569 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1570 String requestTestApi = null;
1571 TestApi testApi = null;
1573 if (requestParams != null) {
1574 requestTestApi = requestParams.getTestApi();
1577 if (requestTestApi == null) {
1578 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1579 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1581 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1586 testApi = TestApi.valueOf(requestTestApi);
1587 return Optional.of(testApi.getModelName());
1588 } catch (Exception e) {
1589 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1590 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1594 private String getDefaultModel(ServiceInstancesRequest sir) {
1595 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1596 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1597 if (oModelName.isPresent()) {
1598 defaultModel = oModelName.get();
1600 return defaultModel;
1603 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1604 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1605 Boolean aLaCarte = null;
1606 String apiVersion = version.substring(1);
1608 long startTime = System.currentTimeMillis ();
1609 ServiceInstancesRequest sir = null;
1611 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1612 String requestScope = deriveRequestScope(action,sir, requestUri);
1613 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1614 if(sir.getRequestDetails().getRequestParameters() != null){
1615 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1617 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1618 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1619 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1621 InfraActiveRequests dup = null;
1623 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1625 if (instanceIdMap != null && dup != null) {
1626 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1629 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1630 RequestReferences referencesResponse = new RequestReferences();
1631 referencesResponse.setRequestId(requestId);
1632 serviceResponse.setRequestReferences(referencesResponse);
1635 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1636 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1638 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1639 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1641 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1644 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1645 .errorInfo(errorLoggerInfo).build();
1647 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1649 throw validateException;
1653 serviceInstanceId = "";
1654 String configurationId = "";
1655 String correlationId = "";
1657 if(sir.getServiceInstanceId () != null){
1658 serviceInstanceId = sir.getServiceInstanceId ();
1661 if(sir.getConfigurationId() != null){
1662 configurationId = sir.getConfigurationId();
1664 if (sir.getCorrelationId() != null) {
1665 correlationId = sir.getCorrelationId();
1667 iar.save(currentActiveReq);
1669 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1671 }else if(aLaCarte == null){
1675 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1676 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1679 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1680 String requestId = null;
1681 if (requestContext.getProperty("requestId") != null) {
1682 requestId = requestContext.getProperty("requestId").toString();
1684 if (UUIDChecker.isValidUUID(requestId)) {
1687 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1688 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1689 .errorInfo(errorLoggerInfo).build();
1691 throw validateException;
1694 //TODO MSO-4177 -- remove this and call the msoRequest instead
1695 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1696 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1697 aq.setStatusMessage (errorMessage);
1698 aq.setProgress(new Long(100));
1699 aq.setRequestStatus(status.toString());
1700 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1701 aq.setEndTime (endTimeStamp);