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));
530 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
531 @Consumes(MediaType.APPLICATION_JSON)
532 @Produces(MediaType.APPLICATION_JSON)
533 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
535 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
536 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
537 String requestId = getRequestId(requestContext);
538 HashMap<String, String> instanceIdMap = new HashMap<>();
539 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
540 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
541 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
546 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
547 @Consumes(MediaType.APPLICATION_JSON)
548 @Produces(MediaType.APPLICATION_JSON)
549 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
551 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
552 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
553 String requestId = getRequestId(requestContext);
554 HashMap<String, String> instanceIdMap = new HashMap<>();
555 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
556 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
557 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
561 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
562 @Consumes(MediaType.APPLICATION_JSON)
563 @Produces(MediaType.APPLICATION_JSON)
564 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
566 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
567 @PathParam("vnfInstanceId") String vnfInstanceId,
568 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
569 String requestId = getRequestId(requestContext);
570 HashMap<String, String> instanceIdMap = new HashMap<>();
571 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
572 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
573 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
574 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
578 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
579 @Consumes(MediaType.APPLICATION_JSON)
580 @Produces(MediaType.APPLICATION_JSON)
581 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
583 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
584 @PathParam("vnfInstanceId") String vnfInstanceId,
585 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
586 String requestId = getRequestId(requestContext);
587 HashMap<String, String> instanceIdMap = new HashMap<>();
588 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
589 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
590 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
591 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
595 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
596 @Consumes(MediaType.APPLICATION_JSON)
597 @Produces(MediaType.APPLICATION_JSON)
598 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
600 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
601 String requestId = getRequestId(requestContext);
602 HashMap<String, String> instanceIdMap = new HashMap<>();
603 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
604 return serviceInstances(request, Action.createInstance, 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="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
613 public Response updateNetworkInstance(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.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
623 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
624 @Consumes(MediaType.APPLICATION_JSON)
625 @Produces(MediaType.APPLICATION_JSON)
626 @ApiOperation(value="Delete provided Network instance",response=Response.class)
628 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
629 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
630 String requestId = getRequestId(requestContext);
631 HashMap<String, String> instanceIdMap = new HashMap<>();
632 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
633 instanceIdMap.put("networkInstanceId", networkInstanceId);
634 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
637 public String getRequestUri(ContainerRequestContext context){
638 String requestUri = context.getUriInfo().getPath();
639 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
643 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
644 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
645 Boolean aLaCarte = null;
646 long startTime = System.currentTimeMillis ();
647 ServiceInstancesRequest sir = null;
648 String apiVersion = version.substring(1);
650 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
651 String requestScope = deriveRequestScope(action, sir, requestUri);
652 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
653 if(sir.getRequestDetails().getRequestParameters() != null){
654 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
656 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
657 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
659 int requestVersion = Integer.parseInt(version.substring(1));
660 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
661 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
662 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
663 String networkType = msoRequest.getNetworkType(sir,requestScope);
664 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
665 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
666 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
668 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
669 currentActiveReq.setVnfType(vnfType);
670 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
671 currentActiveReq.setNetworkType(networkType);
674 InfraActiveRequests dup = null;
677 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
680 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
682 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
684 RequestReferences referencesResponse = new RequestReferences();
686 referencesResponse.setRequestId(requestId);
688 serviceResponse.setRequestReferences(referencesResponse);
689 Boolean isBaseVfModule = false;
691 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
694 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
695 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
696 modelType = ModelType.vnf;
698 modelType =modelInfo.getModelType();
701 if (modelType.equals(ModelType.vfModule)) {
704 // Get VF Module-specific base module indicator
707 String modelVersionId = modelInfo.getModelVersionId();
709 if(modelVersionId != null) {
710 vfm = vfModuleRepo.findByModelUUID(modelVersionId);
712 vfm = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
716 if (vfm.getIsBase()) {
717 isBaseVfModule = true;
719 } else if (action == Action.createInstance || action == Action.updateInstance) {
720 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
721 // This request cannot proceed
723 String serviceVersionText = "";
724 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
725 serviceVersionText = " with version " + sdcServiceModelVersion;
728 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
729 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
730 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
731 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
733 throw vfModuleException;
738 serviceInstanceId = "";
740 String vfModuleId = "";
741 String volumeGroupId = "";
742 String networkId = "";
743 String correlationId = "";
745 if(sir.getServiceInstanceId () != null){
746 serviceInstanceId = sir.getServiceInstanceId ();
749 if(sir.getVnfInstanceId () != null){
750 vnfId = sir.getVnfInstanceId ();
753 if(sir.getVfModuleInstanceId () != null){
754 vfModuleId = sir.getVfModuleInstanceId ();
757 if(sir.getVolumeGroupInstanceId () != null){
758 volumeGroupId = sir.getVolumeGroupInstanceId ();
761 if(sir.getNetworkInstanceId () != null){
762 networkId = sir.getNetworkInstanceId ();
765 if (sir.getCorrelationId() != null) {
766 correlationId = sir.getCorrelationId();
768 iar.save(currentActiveReq);
770 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
772 }else if(aLaCarte == null){
776 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
777 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
778 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
781 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
782 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
783 return (ModelType.vnf.name());
786 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
787 requestScope = requestScopeFromUri(requestUri);
789 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
794 private String requestScopeFromUri(String requestUri){
796 if(requestUri.contains(ModelType.network.name())){
797 requestScope = ModelType.network.name();
798 }else if(requestUri.contains(ModelType.vfModule.name())){
799 requestScope = ModelType.vfModule.name();
800 }else if(requestUri.contains(ModelType.volumeGroup.name())){
801 requestScope = ModelType.volumeGroup.name();
802 }else if(requestUri.contains(ModelType.configuration.name())){
803 requestScope = ModelType.configuration.name();
804 }else if(requestUri.contains(ModelType.vnf.name())){
805 requestScope = ModelType.vnf.name();
807 requestScope = ModelType.service.name();
811 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
812 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
813 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
814 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
815 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
816 RequestClient requestClient = null;
817 HttpResponse response = null;
819 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
820 response = requestClient.post(new RequestClientParameter.Builder()
821 .setRequestId(requestId)
822 .setBaseVfModule(isBaseVfModule)
823 .setRecipeTimeout(timeOut)
824 .setRequestAction(action.toString())
825 .setServiceInstanceId(serviceInstanceId)
826 .setCorrelationId(correlationId)
828 .setVfModuleId(vfModuleId)
829 .setVolumeGroupId(volumeGroupId)
830 .setNetworkId(networkId)
831 .setConfigurationId(configurationId)
832 .setServiceType(serviceInstanceType)
834 .setVfModuleType(vfModuleType)
835 .setNetworkType(networkType)
836 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
837 .setApiVersion(apiVersion)
838 .setALaCarte(aLaCarte)
839 .setRecipeParamXsd(paramXsd)
840 .setRequestUri(requestUri).build());
843 } catch (Exception e) {
845 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846 String url = requestClient != null ? requestClient.getUrl() : "";
847 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
848 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
850 throw clientException;
853 if (response == null) {
855 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
856 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
858 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
860 throw clientException;
863 ResponseHandler respHandler = null;
864 int bpelStatus = 500;
866 respHandler = new ResponseHandler (response, requestClient.getType ());
867 bpelStatus = respHandler.getStatus ();
868 } catch (ApiException e) {
870 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
871 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
872 .errorInfo(errorLoggerInfo).build();
873 currentActiveReq.setRequestStatus(Status.FAILED.name());
874 currentActiveReq.setStatusMessage(validateException.getMessage());
875 throw validateException;
878 // BPEL accepted the request, the request is in progress
879 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
880 ServiceInstancesResponse jsonResponse;
881 CamundaResponse camundaResp = respHandler.getResponse();
883 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
885 ObjectMapper mapper = new ObjectMapper();
886 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
887 } catch (IOException e) {
889 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
890 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
891 .errorInfo(errorLoggerInfo).build();
892 currentActiveReq.setRequestStatus(Status.FAILED.name());
893 currentActiveReq.setStatusMessage(validateException.getMessage());
894 throw validateException;
897 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
898 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
900 iar.save(currentActiveReq);
901 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
905 List<String> variables = new ArrayList<>();
906 variables.add(bpelStatus + "");
907 String camundaJSONResponseBody = respHandler.getResponseBody ();
908 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
910 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
911 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
912 .errorInfo(errorLoggerInfo).build();
914 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
919 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
922 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
923 .errorInfo(errorLoggerInfo).build();
924 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
930 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
931 if(StringUtils.isNotBlank(instanceId)) {
932 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
933 currentActiveReq.setServiceInstanceId(instanceId);
934 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
935 currentActiveReq.setVnfId(instanceId);
936 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
937 currentActiveReq.setVfModuleId(instanceId);
938 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
939 currentActiveReq.setVolumeGroupId(instanceId);
940 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
941 currentActiveReq.setNetworkId(instanceId);
942 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
943 currentActiveReq.setConfigurationId(instanceId);
945 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
946 if(instanceIdMap.get("serviceInstanceId") != null){
947 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
949 if(instanceIdMap.get("vnfInstanceId") != null){
950 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
952 if(instanceIdMap.get("vfModuleInstanceId") != null){
953 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
955 if(instanceIdMap.get("volumeGroupInstanceId") != null){
956 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
958 if(instanceIdMap.get("networkInstanceId") != null){
959 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
961 if(instanceIdMap.get("configurationInstanceId") != null){
962 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
967 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
968 ObjectMapper mapper = new ObjectMapper();
969 mapper.setSerializationInclusion(Include.NON_NULL);
970 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
971 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
972 serviceInstRequest.getRequestDetails() != null &&
973 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
974 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
975 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
977 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
978 return mapper.writeValueAsString(sir);
981 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
982 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
984 // Found the duplicate record. Return the appropriate error.
985 String instance = null;
986 if(instanceName != null){
987 instance = instanceName;
989 instance = instanceIdMap.get(requestScope + "InstanceId");
991 //List<String> variables = new ArrayList<String>();
992 //variables.add(dup.getRequestStatus());
993 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
996 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
997 .errorInfo(errorLoggerInfo).build();
999 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1004 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1005 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1006 InfraActiveRequests dup = null;
1008 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1009 dup = iar.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1011 } catch (Exception e) {
1012 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1015 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1016 .errorInfo(errorLoggerInfo).build();
1018 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1020 throw validateException;
1025 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1026 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1028 ObjectMapper mapper = new ObjectMapper();
1029 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1031 } catch (IOException e) {
1033 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1035 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1036 .errorInfo(errorLoggerInfo).build();
1037 String requestScope = requestScopeFromUri(requestUri);
1039 createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1041 throw validateException;
1044 //TODO MSO-4177 -- remove this and call the msoRequest instead
1045 public void createErrorRequestRecord (Status status, String requestId, String errorMessage, Actions action, String requestScope, String requestJSON) {
1047 InfraActiveRequests request = new InfraActiveRequests(requestId);
1048 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
1049 request.setStartTime (startTimeStamp);
1050 request.setRequestStatus(status.toString());
1051 request.setStatusMessage(errorMessage);
1052 request.setProgress((long) 100);
1053 request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
1054 request.setRequestAction(action.toString());
1055 request.setRequestScope(requestScope);
1056 request.setRequestBody(requestJSON);
1057 Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
1058 request.setEndTime(endTimeStamp);
1060 } catch (Exception e) {
1061 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
1062 msoLogger.debug ("Exception: ", e);
1065 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1066 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1067 int reqVersion = Integer.parseInt(version.substring(1));
1069 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1070 } catch (Exception e) {
1071 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1072 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1073 .errorInfo(errorLoggerInfo).build();
1075 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1077 throw validateException;
1081 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1082 InfraActiveRequests currentActiveReq) throws ApiException {
1083 RecipeLookupResult recipeLookupResult = null;
1084 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1085 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1086 // Query MSO Catalog DB
1088 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1089 recipeLookupResult = getDefaultVnfUri(sir, action);
1090 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1092 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1093 } catch (IOException 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.vfModule) ||
1105 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1107 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1108 } 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();
1115 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1117 throw validateException;
1119 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1121 recipeLookupResult = getNetworkUri( sir, action);
1122 } catch (ValidationException e) {
1124 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1127 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1128 .errorInfo(errorLoggerInfo).build();
1129 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1131 throw validateException;
1135 if (recipeLookupResult == null) {
1136 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1139 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1140 .errorInfo(errorLoggerInfo).build();
1142 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1143 throw recipeNotFoundExceptionException;
1145 return recipeLookupResult;
1149 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1151 // Construct the default service name
1152 // TODO need to make this a configurable property
1153 String defaultServiceModelName = getDefaultModel(servInstReq);
1154 RequestDetails requestDetails = servInstReq.getRequestDetails();
1155 ModelInfo modelInfo = requestDetails.getModelInfo();
1156 org.onap.so.db.catalog.beans.Service serviceRecord;
1157 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1158 ServiceRecipe recipe = null;
1161 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1162 if(serviceRecord !=null){
1163 recipe = serviceRecord.getRecipes().get(action.toString());
1166 serviceRecord = serviceRepo.findOneByModelUUID(modelInfo.getModelVersionId());
1167 recipe = serviceRecipeRepo.findFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1168 if (recipe == null){
1169 serviceRecordList = serviceRepo.findByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1170 if(!serviceRecordList.isEmpty()){
1171 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1172 recipe = record.getRecipes().get(action.toString());
1181 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1182 RequestParameters reqParam = requestDetails.getRequestParameters();
1183 if(reqParam!=null && alaCarteFlag && recipe==null){
1185 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1186 mapToLegacyRequest(requestDetails);
1187 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1188 serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1189 recipe = serviceRecord.getRecipes().get( action.toString());
1191 if(modelInfo.getModelVersionId() == null) {
1192 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1197 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1200 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1201 RequestParameters reqParam;
1202 if (requestDetails.getRequestParameters() == null) {
1203 reqParam = new RequestParameters();
1205 reqParam = requestDetails.getRequestParameters();
1207 if(requestDetails.getCloudConfiguration() == null) {
1208 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1209 if(cloudConfig != null) {
1210 requestDetails.setCloudConfiguration(cloudConfig);
1214 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1215 if(!userParams.isEmpty()) {
1216 if (reqParam == null) {
1217 requestDetails.setRequestParameters(new RequestParameters());
1219 requestDetails.getRequestParameters().setUserParams(userParams);
1223 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1225 for(Map<String, Object> params : reqParams.getUserParams()){
1226 if(params.containsKey("service")){
1227 Service service = serviceMapper(params);
1229 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1231 if (targetConfiguration.isPresent()) {
1232 return targetConfiguration.get();
1234 for(Networks network : service.getResources().getNetworks()) {
1235 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1236 if(targetConfiguration.isPresent()) {
1237 return targetConfiguration.get();
1241 for(Vnfs vnf : service.getResources().getVnfs()) {
1242 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1244 if(targetConfiguration.isPresent()) {
1245 return targetConfiguration.get();
1248 for(VfModules vfModule : vnf.getVfModules()) {
1249 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1251 if(targetConfiguration.isPresent()) {
1252 return targetConfiguration.get();
1263 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1264 CloudConfiguration targetConfiguration = new CloudConfiguration();
1265 if(sourceCloudConfiguration != null) {
1266 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1267 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1268 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1269 return Optional.of(targetConfiguration);
1271 return Optional.empty();
1274 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1275 msoLogger.debug("Configuring UserParams for Macro Request");
1276 Map<String, Object> userParams = new HashMap<>();
1278 for(Map<String, Object> params : reqParams.getUserParams()){
1279 if(params.containsKey("service")){
1280 Service service = serviceMapper(params);
1282 addUserParams(userParams, service.getInstanceParams());
1284 for(Networks network : service.getResources().getNetworks()) {
1285 addUserParams(userParams, network.getInstanceParams());
1288 for(Vnfs vnf: service.getResources().getVnfs()) {
1289 addUserParams(userParams, vnf.getInstanceParams());
1291 for(VfModules vfModule: vnf.getVfModules()) {
1292 addUserParams(userParams, vfModule.getInstanceParams());
1298 return mapFlatMapToNameValue(userParams);
1301 private Service serviceMapper(Map<String, Object> params)
1302 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1303 ObjectMapper obj = new ObjectMapper();
1304 String input = obj.writeValueAsString(params.get("service"));
1305 return obj.readValue(input, Service.class);
1308 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1309 for(Map<String, String> map : sourceUserParams) {
1310 for (Map.Entry<String, String> entry : map.entrySet()) {
1311 targetUserParams.put(entry.getKey(), entry.getValue());
1316 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1317 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1319 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1320 Map<String, Object> targetMap = new HashMap<>();
1321 targetMap.put(NAME, map.getKey());
1322 targetMap.put(VALUE, map.getValue());
1323 targetUserParams.add(targetMap);
1325 return targetUserParams;
1328 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1330 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1331 String vnfComponentType = modelInfo.getModelType().name();
1333 RelatedInstanceList[] instanceList = null;
1334 if (servInstReq.getRequestDetails() != null) {
1335 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1338 Recipe recipe = null;
1339 String defaultSource = getDefaultModel(servInstReq);
1340 String modelCustomizationId = modelInfo.getModelCustomizationId();
1341 String modelCustomizationName = modelInfo.getModelCustomizationName();
1342 String relatedInstanceModelVersionId = null;
1343 String relatedInstanceModelInvariantId = null;
1344 String relatedInstanceVersion = null;
1345 String relatedInstanceModelCustomizationName = null;
1347 if (instanceList != null) {
1349 for(RelatedInstanceList relatedInstanceList : instanceList){
1351 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1352 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1353 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1354 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1355 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1358 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1359 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1360 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1361 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1362 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1366 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1367 // a. For a vnf request (only create, no update currently):
1368 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1369 // 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
1370 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1371 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1372 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1373 // (MODEL_UUID) in SERVICE table.
1374 // 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
1375 // during 1707 data migration if VID did not provide it originally on request.
1376 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1377 // 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.
1379 VnfResource vnfResource = null;
1380 VnfResourceCustomization vrc=null;
1381 // Validation for vnfResource
1383 if(modelCustomizationId!=null) {
1384 vrc = vnfCustomRepo.findOneByModelCustomizationUUID(modelCustomizationId);
1386 vnfResource = vrc.getVnfResources();
1389 org.onap.so.db.catalog.beans.Service service = serviceRepo.findOneByModelUUID(relatedInstanceModelVersionId);
1390 if(service == null) {
1391 service = serviceRepo.findByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1394 if(service == null) {
1395 throw new ValidationException("service in relatedInstance");
1397 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1398 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1399 vrc=vnfResourceCustom;
1404 vnfResource = vrc.getVnfResources();
1405 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1406 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1410 if(vnfResource==null){
1411 throw new ValidationException("vnfResource");
1413 if(modelInfo.getModelVersionId() == null) {
1414 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1418 VnfRecipe vnfRecipe = null;
1421 String nfRole = vrc.getNfRole();
1422 if(nfRole != null) {
1423 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1427 if(vnfRecipe == null) {
1428 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1431 if (vnfRecipe == null) {
1435 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1437 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1438 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1439 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1440 // 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.
1441 // 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
1442 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1443 // 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)
1444 // and MODEL_VERSION (modelVersion).
1446 VfModuleCustomization vfmc = null;
1448 VnfResourceCustomization vnfrc;
1449 VfModule vfModule = null;
1451 if(modelInfo.getModelCustomizationId() != null) {
1452 vfmc = vfModuleCustomRepo.findByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1454 vnfr = vnfRepo.findResourceByModelUUID(relatedInstanceModelVersionId);
1456 vnfr = vnfRepo.findResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1458 vnfrc = vnfCustomRepo.findByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1460 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1462 String vfModuleModelUUID = modelInfo.getModelVersionId();
1463 for(VfModuleCustomization vf : list) {
1464 VfModuleCustomization vfmCustom;
1465 if(vfModuleModelUUID != null){
1466 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1467 if(vfmCustom != null){
1468 vfModule = vfmCustom.getVfModule();
1471 vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUID(vf.getModelCustomizationUUID());
1472 if(vfmCustom != null){
1473 vfModule = vfmCustom.getVfModule();
1475 vfModule = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1479 if(vfModule != null) {
1480 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1481 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1487 if(vfmc == null && vfModule == null) {
1488 throw new ValidationException("vfModuleCustomization");
1489 } else if (vfModule == null && vfmc != null) {
1490 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1493 if(modelInfo.getModelVersionId() == null) {
1494 modelInfo.setModelVersionId(vfModule.getModelUUID());
1498 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1500 List<VfModule> vfModuleRecords= vfModuleRepo.findByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1501 if(!vfModuleRecords.isEmpty()){
1502 for(VfModule record : vfModuleRecords){
1503 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1510 if(recipe == null) {
1511 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1512 if (recipe == null) {
1513 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1516 if(recipe == null) {
1523 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1524 recipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1525 if (recipe == null) {
1529 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1531 if (recipe == null) {
1537 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1540 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1542 String defaultSource = getDefaultModel(sir);
1544 VnfRecipe vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1546 if (vnfRecipe == null) {
1550 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1554 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1556 String defaultNetworkType = getDefaultModel(sir);
1558 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1559 String modelName = modelInfo.getModelName();
1560 Recipe recipe = null;
1562 if(modelInfo.getModelCustomizationId()!=null){
1563 NetworkResource networkResource = networkCustomizationRepo.findOneByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1564 if(networkResource!=null){
1565 if(modelInfo.getModelVersionId() == null) {
1566 modelInfo.setModelVersionId(networkResource.getModelUUID());
1568 recipe = networkRecipeRepo.findByModelNameAndAction(networkResource.getModelName(), action.toString());
1570 throw new ValidationException("no catalog entry found");
1573 //ok for version < 3 and action delete
1574 recipe = networkRecipeRepo.findByModelNameAndAction(modelName, action.toString());
1578 recipe = networkRecipeRepo.findByModelNameAndAction(defaultNetworkType, action.toString());
1581 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1584 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1585 String requestTestApi = null;
1586 TestApi testApi = null;
1588 if (requestParams != null) {
1589 requestTestApi = requestParams.getTestApi();
1592 if (requestTestApi == null) {
1593 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1594 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1596 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1601 testApi = TestApi.valueOf(requestTestApi);
1602 return Optional.of(testApi.getModelName());
1603 } catch (Exception e) {
1604 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1605 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1609 private String getDefaultModel(ServiceInstancesRequest sir) {
1610 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1611 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1612 if (oModelName.isPresent()) {
1613 defaultModel = oModelName.get();
1615 return defaultModel;
1618 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1619 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1620 Boolean aLaCarte = null;
1621 String apiVersion = version.substring(1);
1623 long startTime = System.currentTimeMillis ();
1624 ServiceInstancesRequest sir = null;
1626 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1627 String requestScope = deriveRequestScope(action,sir, requestUri);
1628 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1629 if(sir.getRequestDetails().getRequestParameters() != null){
1630 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1632 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1633 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1634 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1636 InfraActiveRequests dup = null;
1638 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1640 if (instanceIdMap != null && dup != null) {
1641 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1644 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1645 RequestReferences referencesResponse = new RequestReferences();
1646 referencesResponse.setRequestId(requestId);
1647 serviceResponse.setRequestReferences(referencesResponse);
1650 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1651 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1653 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1654 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1656 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1659 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1660 .errorInfo(errorLoggerInfo).build();
1662 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1664 throw validateException;
1668 serviceInstanceId = "";
1669 String configurationId = "";
1670 String correlationId = "";
1672 if(sir.getServiceInstanceId () != null){
1673 serviceInstanceId = sir.getServiceInstanceId ();
1676 if(sir.getConfigurationId() != null){
1677 configurationId = sir.getConfigurationId();
1679 if (sir.getCorrelationId() != null) {
1680 correlationId = sir.getCorrelationId();
1682 iar.save(currentActiveReq);
1684 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1686 }else if(aLaCarte == null){
1690 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1691 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1694 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1695 String requestId = null;
1696 if (requestContext.getProperty("requestId") != null) {
1697 requestId = requestContext.getProperty("requestId").toString();
1699 if (UUIDChecker.isValidUUID(requestId)) {
1702 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1703 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1704 .errorInfo(errorLoggerInfo).build();
1706 throw validateException;
1709 //TODO MSO-4177 -- remove this and call the msoRequest instead
1710 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1711 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1712 aq.setStatusMessage (errorMessage);
1713 aq.setProgress(new Long(100));
1714 aq.setRequestStatus(status.toString());
1715 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1716 aq.setEndTime (endTimeStamp);