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 = new ResponseHandler (response, requestClient.getType ());
849 int bpelStatus = respHandler.getStatus ();
851 // BPEL accepted the request, the request is in progress
852 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
853 ServiceInstancesResponse jsonResponse;
854 CamundaResponse camundaResp = respHandler.getResponse();
856 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
858 ObjectMapper mapper = new ObjectMapper();
859 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
860 } catch (IOException e) {
862 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
863 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
864 .errorInfo(errorLoggerInfo).build();
865 currentActiveReq.setRequestStatus(Status.FAILED.name());
866 currentActiveReq.setStatusMessage(validateException.getMessage());
867 throw validateException;
870 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
871 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
873 iar.save(currentActiveReq);
874 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
878 List<String> variables = new ArrayList<>();
879 variables.add(bpelStatus + "");
880 String camundaJSONResponseBody = respHandler.getResponseBody ();
881 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
883 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
884 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
885 .errorInfo(errorLoggerInfo).build();
887 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
892 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
895 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
896 .errorInfo(errorLoggerInfo).build();
897 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
903 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
904 if(StringUtils.isNotBlank(instanceId)) {
905 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
906 currentActiveReq.setServiceInstanceId(instanceId);
907 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
908 currentActiveReq.setVnfId(instanceId);
909 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
910 currentActiveReq.setVfModuleId(instanceId);
911 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
912 currentActiveReq.setVolumeGroupId(instanceId);
913 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
914 currentActiveReq.setNetworkId(instanceId);
915 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
916 currentActiveReq.setConfigurationId(instanceId);
918 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
919 if(instanceIdMap.get("serviceInstanceId") != null){
920 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
922 if(instanceIdMap.get("vnfInstanceId") != null){
923 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
925 if(instanceIdMap.get("vfModuleInstanceId") != null){
926 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
928 if(instanceIdMap.get("volumeGroupInstanceId") != null){
929 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
931 if(instanceIdMap.get("networkInstanceId") != null){
932 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
934 if(instanceIdMap.get("configurationInstanceId") != null){
935 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
940 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
941 ObjectMapper mapper = new ObjectMapper();
942 mapper.setSerializationInclusion(Include.NON_NULL);
943 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
944 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
945 serviceInstRequest.getRequestDetails() != null &&
946 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
947 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
948 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
950 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
951 return mapper.writeValueAsString(sir);
954 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
955 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
957 // Found the duplicate record. Return the appropriate error.
958 String instance = null;
959 if(instanceName != null){
960 instance = instanceName;
962 instance = instanceIdMap.get(requestScope + "InstanceId");
964 //List<String> variables = new ArrayList<String>();
965 //variables.add(dup.getRequestStatus());
966 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
969 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
970 .errorInfo(errorLoggerInfo).build();
972 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
977 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
978 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
979 InfraActiveRequests dup = null;
981 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
982 dup = iar.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
984 } catch (Exception e) {
985 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
988 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
989 .errorInfo(errorLoggerInfo).build();
991 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
993 throw validateException;
998 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
999 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1001 ObjectMapper mapper = new ObjectMapper();
1002 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1004 } catch (IOException e) {
1006 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1008 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1009 .errorInfo(errorLoggerInfo).build();
1010 String requestScope = requestScopeFromUri(requestUri);
1012 createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1014 throw validateException;
1017 //TODO MSO-4177 -- remove this and call the msoRequest instead
1018 public void createErrorRequestRecord (Status status, String requestId, String errorMessage, Actions action, String requestScope, String requestJSON) {
1020 InfraActiveRequests request = new InfraActiveRequests(requestId);
1021 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
1022 request.setStartTime (startTimeStamp);
1023 request.setRequestStatus(status.toString());
1024 request.setStatusMessage(errorMessage);
1025 request.setProgress((long) 100);
1026 request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
1027 request.setRequestAction(action.toString());
1028 request.setRequestScope(requestScope);
1029 request.setRequestBody(requestJSON);
1030 Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
1031 request.setEndTime(endTimeStamp);
1033 } catch (Exception e) {
1034 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
1035 msoLogger.debug ("Exception: ", e);
1038 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1039 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1040 int reqVersion = Integer.parseInt(version.substring(1));
1042 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1043 } catch (Exception e) {
1044 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1045 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1046 .errorInfo(errorLoggerInfo).build();
1048 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1050 throw validateException;
1054 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1055 InfraActiveRequests currentActiveReq) throws ApiException {
1056 RecipeLookupResult recipeLookupResult = null;
1057 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1058 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1059 // Query MSO Catalog DB
1061 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1062 recipeLookupResult = getDefaultVnfUri(sir, action);
1063 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1065 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1066 } catch (IOException e) {
1067 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1070 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1071 .errorInfo(errorLoggerInfo).build();
1073 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1075 throw validateException;
1077 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1078 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1080 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1081 } catch (ValidationException e) {
1082 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1085 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1086 .errorInfo(errorLoggerInfo).build();
1088 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1090 throw validateException;
1092 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1094 recipeLookupResult = getNetworkUri( sir, action);
1095 } catch (ValidationException e) {
1097 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1100 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1101 .errorInfo(errorLoggerInfo).build();
1102 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1104 throw validateException;
1108 if (recipeLookupResult == null) {
1109 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1112 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1113 .errorInfo(errorLoggerInfo).build();
1115 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1116 throw recipeNotFoundExceptionException;
1118 return recipeLookupResult;
1122 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1124 // Construct the default service name
1125 // TODO need to make this a configurable property
1126 String defaultServiceModelName = getDefaultModel(servInstReq);
1127 RequestDetails requestDetails = servInstReq.getRequestDetails();
1128 ModelInfo modelInfo = requestDetails.getModelInfo();
1129 org.onap.so.db.catalog.beans.Service serviceRecord;
1130 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1131 ServiceRecipe recipe = null;
1134 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1135 if(serviceRecord !=null){
1136 recipe = serviceRecord.getRecipes().get(action.toString());
1139 serviceRecord = serviceRepo.findOneByModelUUID(modelInfo.getModelVersionId());
1140 recipe = serviceRecipeRepo.findFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1141 if (recipe == null){
1142 serviceRecordList = serviceRepo.findByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1143 if(!serviceRecordList.isEmpty()){
1144 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1145 recipe = record.getRecipes().get(action.toString());
1154 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1155 RequestParameters reqParam = requestDetails.getRequestParameters();
1156 if(reqParam!=null && alaCarteFlag && recipe==null){
1158 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1159 mapToLegacyRequest(requestDetails);
1160 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1161 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1162 recipe = serviceRecord.getRecipes().get( action.toString());
1164 if(modelInfo.getModelVersionId() == null) {
1165 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1170 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1173 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1174 RequestParameters reqParam;
1175 if (requestDetails.getRequestParameters() == null) {
1176 reqParam = new RequestParameters();
1178 reqParam = requestDetails.getRequestParameters();
1180 if(requestDetails.getCloudConfiguration() == null) {
1181 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1182 if(cloudConfig != null) {
1183 requestDetails.setCloudConfiguration(cloudConfig);
1187 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1188 if(!userParams.isEmpty()) {
1189 if (reqParam == null) {
1190 requestDetails.setRequestParameters(new RequestParameters());
1192 requestDetails.getRequestParameters().setUserParams(userParams);
1196 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1198 for(Map<String, Object> params : reqParams.getUserParams()){
1199 if(params.containsKey("service")){
1200 Service service = serviceMapper(params);
1202 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1204 if (targetConfiguration.isPresent()) {
1205 return targetConfiguration.get();
1207 for(Networks network : service.getResources().getNetworks()) {
1208 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1209 if(targetConfiguration.isPresent()) {
1210 return targetConfiguration.get();
1214 for(Vnfs vnf : service.getResources().getVnfs()) {
1215 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1217 if(targetConfiguration.isPresent()) {
1218 return targetConfiguration.get();
1221 for(VfModules vfModule : vnf.getVfModules()) {
1222 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1224 if(targetConfiguration.isPresent()) {
1225 return targetConfiguration.get();
1236 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1237 CloudConfiguration targetConfiguration = new CloudConfiguration();
1238 if(sourceCloudConfiguration != null) {
1239 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1240 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1241 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1242 return Optional.of(targetConfiguration);
1244 return Optional.empty();
1247 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1248 msoLogger.debug("Configuring UserParams for Macro Request");
1249 Map<String, Object> userParams = new HashMap<>();
1251 for(Map<String, Object> params : reqParams.getUserParams()){
1252 if(params.containsKey("service")){
1253 Service service = serviceMapper(params);
1255 addUserParams(userParams, service.getInstanceParams());
1257 for(Networks network : service.getResources().getNetworks()) {
1258 addUserParams(userParams, network.getInstanceParams());
1261 for(Vnfs vnf: service.getResources().getVnfs()) {
1262 addUserParams(userParams, vnf.getInstanceParams());
1264 for(VfModules vfModule: vnf.getVfModules()) {
1265 addUserParams(userParams, vfModule.getInstanceParams());
1271 return mapFlatMapToNameValue(userParams);
1274 private Service serviceMapper(Map<String, Object> params)
1275 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1276 ObjectMapper obj = new ObjectMapper();
1277 String input = obj.writeValueAsString(params.get("service"));
1278 return obj.readValue(input, Service.class);
1281 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1282 for(Map<String, String> map : sourceUserParams) {
1283 for (Map.Entry<String, String> entry : map.entrySet()) {
1284 targetUserParams.put(entry.getKey(), entry.getValue());
1289 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1290 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1292 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1293 Map<String, Object> targetMap = new HashMap<>();
1294 targetMap.put(NAME, map.getKey());
1295 targetMap.put(VALUE, map.getValue());
1296 targetUserParams.add(targetMap);
1298 return targetUserParams;
1301 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1303 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1304 String vnfComponentType = modelInfo.getModelType().name();
1306 RelatedInstanceList[] instanceList = null;
1307 if (servInstReq.getRequestDetails() != null) {
1308 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1311 Recipe recipe = null;
1312 String defaultSource = getDefaultModel(servInstReq);
1313 String modelCustomizationId = modelInfo.getModelCustomizationId();
1314 String modelCustomizationName = modelInfo.getModelCustomizationName();
1315 String relatedInstanceModelVersionId = null;
1316 String relatedInstanceModelInvariantId = null;
1317 String relatedInstanceVersion = null;
1318 String relatedInstanceModelCustomizationName = null;
1320 if (instanceList != null) {
1322 for(RelatedInstanceList relatedInstanceList : instanceList){
1324 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1325 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1326 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1327 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1328 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1331 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1332 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1333 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1334 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1335 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1339 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1340 // a. For a vnf request (only create, no update currently):
1341 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1342 // 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
1343 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1344 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1345 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1346 // (MODEL_UUID) in SERVICE table.
1347 // 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
1348 // during 1707 data migration if VID did not provide it originally on request.
1349 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1350 // 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.
1352 VnfResource vnfResource = null;
1353 VnfResourceCustomization vrc=null;
1354 // Validation for vnfResource
1356 if(modelCustomizationId!=null) {
1357 vrc = vnfCustomRepo.findOneByModelCustomizationUUID(modelCustomizationId);
1359 vnfResource = vrc.getVnfResources();
1362 org.onap.so.db.catalog.beans.Service service = serviceRepo.findOneByModelUUID(relatedInstanceModelVersionId);
1363 if(service == null) {
1364 service = serviceRepo.findByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1367 if(service == null) {
1368 throw new ValidationException("service in relatedInstance");
1370 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1371 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1372 vrc=vnfResourceCustom;
1377 vnfResource = vrc.getVnfResources();
1378 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1379 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1383 if(vnfResource==null){
1384 throw new ValidationException("vnfResource");
1386 if(modelInfo.getModelVersionId() == null) {
1387 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1391 VnfRecipe vnfRecipe = null;
1394 String nfRole = vrc.getNfRole();
1395 if(nfRole != null) {
1396 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1400 if(vnfRecipe == null) {
1401 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1404 if (vnfRecipe == null) {
1408 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1410 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1411 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1412 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1413 // 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.
1414 // 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
1415 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1416 // 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)
1417 // and MODEL_VERSION (modelVersion).
1419 VfModuleCustomization vfmc = null;
1421 VnfResourceCustomization vnfrc;
1422 VfModule vfModule = null;
1424 if(modelInfo.getModelCustomizationId() != null) {
1425 vfmc = vfModuleCustomRepo.findByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1427 vnfr = vnfRepo.findResourceByModelUUID(relatedInstanceModelVersionId);
1429 vnfr = vnfRepo.findResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1431 vnfrc = vnfCustomRepo.findByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1433 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1435 String vfModuleModelUUID = modelInfo.getModelVersionId();
1436 for(VfModuleCustomization vf : list) {
1437 VfModuleCustomization vfmCustom;
1438 if(vfModuleModelUUID != null){
1439 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1440 if(vfmCustom != null){
1441 vfModule = vfmCustom.getVfModule();
1444 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUID(vf.getModelCustomizationUUID());
1445 if(vfmCustom != null){
1446 vfModule = vfmCustom.getVfModule();
1448 vfModule = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1452 if(vfModule != null) {
1453 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1454 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1460 if(vfmc == null && vfModule == null) {
1461 throw new ValidationException("vfModuleCustomization");
1462 } else if (vfModule == null && vfmc != null) {
1463 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1466 if(modelInfo.getModelVersionId() == null) {
1467 modelInfo.setModelVersionId(vfModule.getModelUUID());
1471 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1473 List<VfModule> vfModuleRecords= vfModuleRepo.findByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1474 if(!vfModuleRecords.isEmpty()){
1475 for(VfModule record : vfModuleRecords){
1476 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1483 if(recipe == null) {
1484 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1485 if (recipe == null) {
1486 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1489 if(recipe == null) {
1496 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1497 recipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1498 if (recipe == null) {
1502 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1504 if (recipe == null) {
1510 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1513 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1515 String defaultSource = getDefaultModel(sir);
1517 VnfRecipe vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1519 if (vnfRecipe == null) {
1523 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1527 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1529 String defaultNetworkType = getDefaultModel(sir);
1531 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1532 String modelName = modelInfo.getModelName();
1533 Recipe recipe = null;
1535 if(modelInfo.getModelCustomizationId()!=null){
1536 NetworkResource networkResource = networkCustomizationRepo.findOneByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1537 if(networkResource!=null){
1538 if(modelInfo.getModelVersionId() == null) {
1539 modelInfo.setModelVersionId(networkResource.getModelUUID());
1541 recipe = networkRecipeRepo.findByModelNameAndAction(networkResource.getModelName(), action.toString());
1543 throw new ValidationException("no catalog entry found");
1546 //ok for version < 3 and action delete
1547 recipe = networkRecipeRepo.findByModelNameAndAction(modelName, action.toString());
1551 recipe = networkRecipeRepo.findByModelNameAndAction(defaultNetworkType, action.toString());
1554 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1557 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1558 String requestTestApi = null;
1559 TestApi testApi = null;
1561 if (requestParams != null) {
1562 requestTestApi = requestParams.getTestApi();
1565 if (requestTestApi == null) {
1566 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1567 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1569 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1574 testApi = TestApi.valueOf(requestTestApi);
1575 return Optional.of(testApi.getModelName());
1576 } catch (Exception e) {
1577 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1578 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1582 private String getDefaultModel(ServiceInstancesRequest sir) {
1583 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1584 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1585 if (oModelName.isPresent()) {
1586 defaultModel = oModelName.get();
1588 return defaultModel;
1591 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1592 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1593 Boolean aLaCarte = null;
1594 String apiVersion = version.substring(1);
1596 long startTime = System.currentTimeMillis ();
1597 ServiceInstancesRequest sir = null;
1599 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1600 String requestScope = deriveRequestScope(action,sir, requestUri);
1601 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1602 if(sir.getRequestDetails().getRequestParameters() != null){
1603 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1605 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1606 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1607 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1609 InfraActiveRequests dup = null;
1611 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1613 if (instanceIdMap != null && dup != null) {
1614 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1617 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1618 RequestReferences referencesResponse = new RequestReferences();
1619 referencesResponse.setRequestId(requestId);
1620 serviceResponse.setRequestReferences(referencesResponse);
1623 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1624 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1626 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1627 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1629 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1632 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1633 .errorInfo(errorLoggerInfo).build();
1635 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1637 throw validateException;
1641 serviceInstanceId = "";
1642 String configurationId = "";
1643 String correlationId = "";
1645 if(sir.getServiceInstanceId () != null){
1646 serviceInstanceId = sir.getServiceInstanceId ();
1649 if(sir.getConfigurationId() != null){
1650 configurationId = sir.getConfigurationId();
1652 if (sir.getCorrelationId() != null) {
1653 correlationId = sir.getCorrelationId();
1655 iar.save(currentActiveReq);
1657 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1659 }else if(aLaCarte == null){
1663 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1664 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1667 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1668 String requestId = null;
1669 if (requestContext.getProperty("requestId") != null) {
1670 requestId = requestContext.getProperty("requestId").toString();
1672 if (UUIDChecker.isValidUUID(requestId)) {
1675 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1676 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1677 .errorInfo(errorLoggerInfo).build();
1679 throw validateException;
1682 //TODO MSO-4177 -- remove this and call the msoRequest instead
1683 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1684 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1685 aq.setStatusMessage (errorMessage);
1686 aq.setProgress(new Long(100));
1687 aq.setRequestStatus(status.toString());
1688 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1689 aq.setEndTime (endTimeStamp);