2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.so.apihandlerinfra;
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
26 import com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.so.apihandler.camundabeans.CamundaResponse;
36 import org.onap.so.apihandler.common.CommonConstants;
37 import org.onap.so.apihandler.common.ErrorNumbers;
38 import org.onap.so.apihandler.common.RequestClient;
39 import org.onap.so.apihandler.common.RequestClientFactory;
40 import org.onap.so.apihandler.common.RequestClientParameter;
41 import org.onap.so.apihandler.common.ResponseBuilder;
42 import org.onap.so.apihandler.common.ResponseHandler;
43 import org.onap.so.apihandlerinfra.exceptions.ApiException;
44 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
45 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
46 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
47 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
48 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
49 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
50 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
51 import org.onap.so.db.catalog.beans.NetworkResource;
52 import org.onap.so.db.catalog.beans.Recipe;
53 import org.onap.so.db.catalog.beans.ServiceRecipe;
54 import org.onap.so.db.catalog.beans.VfModule;
55 import org.onap.so.db.catalog.beans.VfModuleCustomization;
56 import org.onap.so.db.catalog.beans.VnfRecipe;
57 import org.onap.so.db.catalog.beans.VnfResource;
58 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
59 import org.onap.so.db.catalog.client.CatalogDbClient;
60 import org.onap.so.db.request.beans.InfraActiveRequests;
61 import org.onap.so.db.request.client.RequestsDbClient;
62 import org.onap.so.exceptions.ValidationException;
63 import org.onap.so.logger.MessageEnum;
64 import org.onap.so.logger.MsoLogger;
65 import org.onap.so.serviceinstancebeans.CloudConfiguration;
66 import org.onap.so.serviceinstancebeans.ModelInfo;
67 import org.onap.so.serviceinstancebeans.ModelType;
68 import org.onap.so.serviceinstancebeans.Networks;
69 import org.onap.so.serviceinstancebeans.RelatedInstance;
70 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
71 import org.onap.so.serviceinstancebeans.RequestDetails;
72 import org.onap.so.serviceinstancebeans.RequestParameters;
73 import org.onap.so.serviceinstancebeans.RequestReferences;
74 import org.onap.so.serviceinstancebeans.Service;
75 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
76 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
77 import org.onap.so.serviceinstancebeans.VfModules;
78 import org.onap.so.serviceinstancebeans.Vnfs;
79 import org.onap.so.utils.UUIDChecker;
80 import org.springframework.beans.factory.annotation.Autowired;
81 import org.springframework.core.env.Environment;
82 import org.springframework.stereotype.Component;
84 import javax.transaction.Transactional;
85 import javax.ws.rs.Consumes;
86 import javax.ws.rs.DELETE;
87 import javax.ws.rs.POST;
88 import javax.ws.rs.PUT;
89 import javax.ws.rs.Path;
90 import javax.ws.rs.PathParam;
91 import javax.ws.rs.Produces;
92 import javax.ws.rs.container.ContainerRequestContext;
93 import javax.ws.rs.core.Context;
94 import javax.ws.rs.core.MediaType;
95 import javax.ws.rs.core.Response;
96 import java.io.IOException;
97 import java.sql.Timestamp;
98 import java.util.ArrayList;
99 import java.util.HashMap;
100 import java.util.List;
101 import java.util.Map;
102 import java.util.Optional;
105 @Path("/onap/so/infra/serviceInstantiation")
106 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
107 public class ServiceInstances {
109 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
110 private static String NAME = "name";
111 private static String VALUE = "value";
114 private Environment env;
117 private RequestClientFactory reqClientFactory;
120 private CatalogDbClient catalogDbClient;
123 private RequestsDbClient infraActiveRequestsClient;
126 private ResponseBuilder builder;
129 private MsoRequest msoRequest;
132 @Path("/{version:[vV][5-7]}/serviceInstances")
133 @Consumes(MediaType.APPLICATION_JSON)
134 @Produces(MediaType.APPLICATION_JSON)
135 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
137 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
138 String requestId = getRequestId(requestContext);
139 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
143 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
144 @Consumes(MediaType.APPLICATION_JSON)
145 @Produces(MediaType.APPLICATION_JSON)
146 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
148 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
149 String requestId = getRequestId(requestContext);
150 HashMap<String, String> instanceIdMap = new HashMap<>();
151 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
152 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
156 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
157 @Consumes(MediaType.APPLICATION_JSON)
158 @Produces(MediaType.APPLICATION_JSON)
159 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
161 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
162 String requestId = getRequestId(requestContext);
163 HashMap<String, String> instanceIdMap = new HashMap<>();
164 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
165 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
169 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
170 @Consumes(MediaType.APPLICATION_JSON)
171 @Produces(MediaType.APPLICATION_JSON)
172 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
174 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
175 String requestId = getRequestId(requestContext);
176 HashMap<String, String> instanceIdMap = new HashMap<>();
177 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
178 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
182 @Path("/{version:[vV][7]}/serviceInstances/assign")
183 @Consumes(MediaType.APPLICATION_JSON)
184 @Produces(MediaType.APPLICATION_JSON)
185 @ApiOperation(value="Assign Service Instance", response=Response.class)
187 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
188 String requestId = getRequestId(requestContext);
189 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
193 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
194 @Consumes(MediaType.APPLICATION_JSON)
195 @Produces(MediaType.APPLICATION_JSON)
196 @ApiOperation(value="Unassign Service Instance", response=Response.class)
198 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
199 String requestId = getRequestId(requestContext);
200 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
201 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
202 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
206 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
207 @Consumes(MediaType.APPLICATION_JSON)
208 @Produces(MediaType.APPLICATION_JSON)
209 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
211 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
212 String requestId = getRequestId(requestContext);
213 HashMap<String, String> instanceIdMap = new HashMap<>();
214 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
215 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
219 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
220 @Consumes(MediaType.APPLICATION_JSON)
221 @Produces(MediaType.APPLICATION_JSON)
222 @ApiOperation(value="Delete provided Port",response=Response.class)
224 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
225 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
226 String requestId = getRequestId(requestContext);
227 HashMap<String, String> instanceIdMap = new HashMap<>();
228 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
229 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
230 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
234 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
235 @Consumes(MediaType.APPLICATION_JSON)
236 @Produces(MediaType.APPLICATION_JSON)
237 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
239 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
240 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
241 String requestId = getRequestId(requestContext);
242 HashMap<String, String> instanceIdMap = new HashMap<>();
243 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
244 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
245 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
249 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
250 @Consumes(MediaType.APPLICATION_JSON)
251 @Produces(MediaType.APPLICATION_JSON)
252 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
254 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
255 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
256 String requestId = getRequestId(requestContext);
257 HashMap<String, String> instanceIdMap = new HashMap<>();
258 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
260 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
264 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
265 @Consumes(MediaType.APPLICATION_JSON)
266 @Produces(MediaType.APPLICATION_JSON)
267 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
269 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
270 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
271 String requestId = getRequestId(requestContext);
272 HashMap<String, String> instanceIdMap = new HashMap<>();
273 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
274 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
275 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
279 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
280 @Consumes(MediaType.APPLICATION_JSON)
281 @Produces(MediaType.APPLICATION_JSON)
282 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
284 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
285 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
286 String requestId = getRequestId(requestContext);
287 HashMap<String, String> instanceIdMap = new HashMap<>();
288 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
290 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
294 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
295 @Consumes(MediaType.APPLICATION_JSON)
296 @Produces(MediaType.APPLICATION_JSON)
297 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
299 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
300 String requestId = getRequestId(requestContext);
301 HashMap<String, String> instanceIdMap = new HashMap<>();
302 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
303 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
307 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
308 @Consumes(MediaType.APPLICATION_JSON)
309 @Produces(MediaType.APPLICATION_JSON)
310 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
312 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
313 String requestId = getRequestId(requestContext);
314 HashMap<String, String> instanceIdMap = new HashMap<>();
315 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
316 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
320 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
321 @Consumes(MediaType.APPLICATION_JSON)
322 @Produces(MediaType.APPLICATION_JSON)
323 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
325 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
326 String requestId = getRequestId(requestContext);
327 HashMap<String, String> instanceIdMap = new HashMap<>();
328 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
329 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
333 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
334 @Consumes(MediaType.APPLICATION_JSON)
335 @Produces(MediaType.APPLICATION_JSON)
336 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
338 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
339 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
340 String requestId = getRequestId(requestContext);
341 HashMap<String, String> instanceIdMap = new HashMap<>();
342 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
343 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
344 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
348 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
349 @Consumes(MediaType.APPLICATION_JSON)
350 @Produces(MediaType.APPLICATION_JSON)
351 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
353 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
354 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
355 String requestId = getRequestId(requestContext);
356 HashMap<String, String> instanceIdMap = new HashMap<>();
357 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
358 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
359 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
363 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
364 @Consumes(MediaType.APPLICATION_JSON)
365 @Produces(MediaType.APPLICATION_JSON)
366 @ApiOperation(value="Apply updated configuration",response=Response.class)
367 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
368 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
369 String requestId = getRequestId(requestContext);
370 HashMap<String, String> instanceIdMap = new HashMap<>();
371 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
372 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
373 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
377 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
378 @Consumes(MediaType.APPLICATION_JSON)
379 @Produces(MediaType.APPLICATION_JSON)
380 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
381 public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
382 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
383 String requestId = getRequestId(requestContext);
384 HashMap<String, String> instanceIdMap = new HashMap<>();
385 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
387 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
392 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
393 @Consumes(MediaType.APPLICATION_JSON)
394 @Produces(MediaType.APPLICATION_JSON)
395 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
397 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
398 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
399 String requestId = getRequestId(requestContext);
400 HashMap<String, String> instanceIdMap = new HashMap<>();
401 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
402 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
403 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
407 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
408 @Consumes(MediaType.APPLICATION_JSON)
409 @Produces(MediaType.APPLICATION_JSON)
410 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
412 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
413 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
414 String requestId = getRequestId(requestContext);
415 HashMap<String, String> instanceIdMap = new HashMap<>();
416 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
417 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
418 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
422 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
423 @Consumes(MediaType.APPLICATION_JSON)
424 @Produces(MediaType.APPLICATION_JSON)
425 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
427 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
428 @PathParam("vnfInstanceId") String vnfInstanceId,
429 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
430 String requestId = getRequestId(requestContext);
431 HashMap<String, String> instanceIdMap = new HashMap<>();
432 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
433 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
434 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
435 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
439 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
440 @Consumes(MediaType.APPLICATION_JSON)
441 @Produces(MediaType.APPLICATION_JSON)
442 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
444 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
445 @PathParam("vnfInstanceId") String vnfInstanceId,
446 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
447 String requestId = getRequestId(requestContext);
448 HashMap<String, String> instanceIdMap = new HashMap<>();
449 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
450 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
451 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
452 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
456 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
457 @Consumes(MediaType.APPLICATION_JSON)
458 @Produces(MediaType.APPLICATION_JSON)
459 @ApiOperation(value="Perform VNF software update",response=Response.class)
461 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
462 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
463 String requestId = getRequestId(requestContext);
464 HashMap<String, String> instanceIdMap = new HashMap<>();
465 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
466 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
467 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
471 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
472 @Consumes(MediaType.APPLICATION_JSON)
473 @Produces(MediaType.APPLICATION_JSON)
474 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
476 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
477 @PathParam("vnfInstanceId") String vnfInstanceId,
478 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
479 String requestId = getRequestId(requestContext);
480 HashMap<String, String> instanceIdMap = new HashMap<>();
481 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
482 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
483 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
484 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
488 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
489 @Consumes(MediaType.APPLICATION_JSON)
490 @Produces(MediaType.APPLICATION_JSON)
491 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
493 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
494 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
495 String requestId = getRequestId(requestContext);
496 HashMap<String, String> instanceIdMap = new HashMap<>();
497 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
498 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
499 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
500 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
505 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
506 @Consumes(MediaType.APPLICATION_JSON)
507 @Produces(MediaType.APPLICATION_JSON)
508 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
510 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
511 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
512 String requestId = getRequestId(requestContext);
513 HashMap<String, String> instanceIdMap = new HashMap<>();
514 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
515 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
516 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
521 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
522 @Consumes(MediaType.APPLICATION_JSON)
523 @Produces(MediaType.APPLICATION_JSON)
524 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
526 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
527 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
528 String requestId = getRequestId(requestContext);
529 HashMap<String, String> instanceIdMap = new HashMap<>();
530 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
531 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
532 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
536 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
537 @Consumes(MediaType.APPLICATION_JSON)
538 @Produces(MediaType.APPLICATION_JSON)
539 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
541 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
542 @PathParam("vnfInstanceId") String vnfInstanceId,
543 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
544 String requestId = getRequestId(requestContext);
545 HashMap<String, String> instanceIdMap = new HashMap<>();
546 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
547 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
548 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
549 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
553 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
554 @Consumes(MediaType.APPLICATION_JSON)
555 @Produces(MediaType.APPLICATION_JSON)
556 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
558 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
559 @PathParam("vnfInstanceId") String vnfInstanceId,
560 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
561 String requestId = getRequestId(requestContext);
562 HashMap<String, String> instanceIdMap = new HashMap<>();
563 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
564 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
565 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
566 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
570 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
571 @Consumes(MediaType.APPLICATION_JSON)
572 @Produces(MediaType.APPLICATION_JSON)
573 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
575 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
576 String requestId = getRequestId(requestContext);
577 HashMap<String, String> instanceIdMap = new HashMap<>();
578 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
579 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
583 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
584 @Consumes(MediaType.APPLICATION_JSON)
585 @Produces(MediaType.APPLICATION_JSON)
586 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
588 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
589 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
590 String requestId = getRequestId(requestContext);
591 HashMap<String, String> instanceIdMap = new HashMap<>();
592 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
593 instanceIdMap.put("networkInstanceId", networkInstanceId);
594 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
598 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
599 @Consumes(MediaType.APPLICATION_JSON)
600 @Produces(MediaType.APPLICATION_JSON)
601 @ApiOperation(value="Delete provided Network instance",response=Response.class)
603 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
604 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
605 String requestId = getRequestId(requestContext);
606 HashMap<String, String> instanceIdMap = new HashMap<>();
607 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
608 instanceIdMap.put("networkInstanceId", networkInstanceId);
609 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
612 public String getRequestUri(ContainerRequestContext context){
613 String requestUri = context.getUriInfo().getPath();
614 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
618 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
619 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
620 Boolean aLaCarte = null;
621 long startTime = System.currentTimeMillis ();
622 ServiceInstancesRequest sir = null;
623 String apiVersion = version.substring(1);
625 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
626 String requestScope = deriveRequestScope(action, sir, requestUri);
627 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
628 if(sir.getRequestDetails().getRequestParameters() != null){
629 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
631 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
632 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
634 int requestVersion = Integer.parseInt(version.substring(1));
635 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
636 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
637 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
638 String networkType = msoRequest.getNetworkType(sir,requestScope);
639 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
640 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
641 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
643 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
644 currentActiveReq.setVnfType(vnfType);
645 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
646 currentActiveReq.setNetworkType(networkType);
649 InfraActiveRequests dup = null;
652 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
655 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
657 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
659 RequestReferences referencesResponse = new RequestReferences();
661 referencesResponse.setRequestId(requestId);
663 serviceResponse.setRequestReferences(referencesResponse);
664 Boolean isBaseVfModule = false;
666 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
669 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
670 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
671 modelType = ModelType.vnf;
673 modelType =modelInfo.getModelType();
676 if (modelType.equals(ModelType.vfModule)) {
679 // Get VF Module-specific base module indicator
682 String modelVersionId = modelInfo.getModelVersionId();
684 if(modelVersionId != null) {
685 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
686 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
687 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
691 if (vfm.getIsBase()) {
692 isBaseVfModule = true;
694 } else if (action == Action.createInstance || action == Action.updateInstance) {
695 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
696 // This request cannot proceed
698 String serviceVersionText = "";
699 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
700 serviceVersionText = " with version " + sdcServiceModelVersion;
703 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
704 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
705 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
706 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
708 throw vfModuleException;
713 serviceInstanceId = "";
715 String vfModuleId = "";
716 String volumeGroupId = "";
717 String networkId = "";
718 String correlationId = "";
720 if(sir.getServiceInstanceId () != null){
721 serviceInstanceId = sir.getServiceInstanceId ();
724 if(sir.getVnfInstanceId () != null){
725 vnfId = sir.getVnfInstanceId ();
728 if(sir.getVfModuleInstanceId () != null){
729 vfModuleId = sir.getVfModuleInstanceId ();
732 if(sir.getVolumeGroupInstanceId () != null){
733 volumeGroupId = sir.getVolumeGroupInstanceId ();
736 if(sir.getNetworkInstanceId () != null){
737 networkId = sir.getNetworkInstanceId ();
740 if (sir.getCorrelationId() != null) {
741 correlationId = sir.getCorrelationId();
743 infraActiveRequestsClient.save(currentActiveReq);
745 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
747 }else if(aLaCarte == null){
751 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
752 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
753 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
756 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
757 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
758 return (ModelType.vnf.name());
761 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
762 requestScope = requestScopeFromUri(requestUri);
764 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
769 private String requestScopeFromUri(String requestUri){
771 if(requestUri.contains(ModelType.network.name())){
772 requestScope = ModelType.network.name();
773 }else if(requestUri.contains(ModelType.vfModule.name())){
774 requestScope = ModelType.vfModule.name();
775 }else if(requestUri.contains(ModelType.volumeGroup.name())){
776 requestScope = ModelType.volumeGroup.name();
777 }else if(requestUri.contains(ModelType.configuration.name())){
778 requestScope = ModelType.configuration.name();
779 }else if(requestUri.contains(ModelType.vnf.name())){
780 requestScope = ModelType.vnf.name();
782 requestScope = ModelType.service.name();
786 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
787 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
788 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
789 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
790 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
791 RequestClient requestClient = null;
792 HttpResponse response = null;
794 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
795 response = requestClient.post(new RequestClientParameter.Builder()
796 .setRequestId(requestId)
797 .setBaseVfModule(isBaseVfModule)
798 .setRecipeTimeout(timeOut)
799 .setRequestAction(action.toString())
800 .setServiceInstanceId(serviceInstanceId)
801 .setCorrelationId(correlationId)
803 .setVfModuleId(vfModuleId)
804 .setVolumeGroupId(volumeGroupId)
805 .setNetworkId(networkId)
806 .setConfigurationId(configurationId)
807 .setServiceType(serviceInstanceType)
809 .setVfModuleType(vfModuleType)
810 .setNetworkType(networkType)
811 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
812 .setApiVersion(apiVersion)
813 .setALaCarte(aLaCarte)
814 .setRecipeParamXsd(paramXsd)
815 .setRequestUri(requestUri).build());
818 } catch (Exception e) {
820 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
821 String url = requestClient != null ? requestClient.getUrl() : "";
822 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
823 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
825 throw clientException;
828 if (response == null) {
830 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
831 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
833 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
835 throw clientException;
838 ResponseHandler respHandler = null;
839 int bpelStatus = 500;
841 respHandler = new ResponseHandler (response, requestClient.getType ());
842 bpelStatus = respHandler.getStatus ();
843 } catch (ApiException e) {
845 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
847 .errorInfo(errorLoggerInfo).build();
848 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
849 throw validateException;
852 // BPEL accepted the request, the request is in progress
853 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
854 ServiceInstancesResponse jsonResponse;
855 CamundaResponse camundaResp = respHandler.getResponse();
857 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
859 ObjectMapper mapper = new ObjectMapper();
860 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
861 } catch (IOException e) {
863 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
864 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
865 .errorInfo(errorLoggerInfo).build();
866 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
867 throw validateException;
870 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
871 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
873 infraActiveRequestsClient.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 = infraActiveRequestsClient.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 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1014 throw validateException;
1018 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1019 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1020 int reqVersion = Integer.parseInt(version.substring(1));
1022 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1023 } catch (Exception e) {
1024 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1025 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1026 .errorInfo(errorLoggerInfo).build();
1028 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1030 throw validateException;
1034 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1035 InfraActiveRequests currentActiveReq) throws ApiException {
1036 RecipeLookupResult recipeLookupResult = null;
1037 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1038 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1039 // Query MSO Catalog DB
1041 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1042 recipeLookupResult = getDefaultVnfUri(sir, action);
1043 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1045 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1046 } catch (IOException e) {
1047 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1050 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1051 .errorInfo(errorLoggerInfo).build();
1053 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1055 throw validateException;
1057 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1058 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1060 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1061 } catch (ValidationException e) {
1062 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1065 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1066 .errorInfo(errorLoggerInfo).build();
1068 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1070 throw validateException;
1072 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1074 recipeLookupResult = getNetworkUri( sir, action);
1075 } catch (ValidationException e) {
1077 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1080 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1081 .errorInfo(errorLoggerInfo).build();
1082 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1084 throw validateException;
1088 if (recipeLookupResult == null) {
1089 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1092 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1093 .errorInfo(errorLoggerInfo).build();
1095 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1096 throw recipeNotFoundExceptionException;
1098 return recipeLookupResult;
1101 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1103 // Construct the default service name
1104 // TODO need to make this a configurable property
1105 String defaultServiceModelName = getDefaultModel(servInstReq);
1106 RequestDetails requestDetails = servInstReq.getRequestDetails();
1107 ModelInfo modelInfo = requestDetails.getModelInfo();
1108 org.onap.so.db.catalog.beans.Service serviceRecord;
1109 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1110 ServiceRecipe recipe = null;
1113 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1114 if(serviceRecord !=null){
1115 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1118 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1119 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1120 if (recipe == null){
1121 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1122 if(!serviceRecordList.isEmpty()){
1123 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1124 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1133 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1134 RequestParameters reqParam = requestDetails.getRequestParameters();
1135 if(reqParam!=null && alaCarteFlag && recipe==null){
1137 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1138 mapToLegacyRequest(requestDetails);
1139 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1140 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1141 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1143 if(modelInfo.getModelVersionId() == null) {
1144 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1149 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1152 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1153 RequestParameters reqParam;
1154 if (requestDetails.getRequestParameters() == null) {
1155 reqParam = new RequestParameters();
1157 reqParam = requestDetails.getRequestParameters();
1159 if(requestDetails.getCloudConfiguration() == null) {
1160 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1161 if(cloudConfig != null) {
1162 requestDetails.setCloudConfiguration(cloudConfig);
1166 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1167 if(!userParams.isEmpty()) {
1168 if (reqParam == null) {
1169 requestDetails.setRequestParameters(new RequestParameters());
1171 requestDetails.getRequestParameters().setUserParams(userParams);
1175 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1177 for(Map<String, Object> params : reqParams.getUserParams()){
1178 if(params.containsKey("service")){
1179 Service service = serviceMapper(params);
1181 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1183 if (targetConfiguration.isPresent()) {
1184 return targetConfiguration.get();
1186 for(Networks network : service.getResources().getNetworks()) {
1187 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1188 if(targetConfiguration.isPresent()) {
1189 return targetConfiguration.get();
1193 for(Vnfs vnf : service.getResources().getVnfs()) {
1194 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1196 if(targetConfiguration.isPresent()) {
1197 return targetConfiguration.get();
1200 for(VfModules vfModule : vnf.getVfModules()) {
1201 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1203 if(targetConfiguration.isPresent()) {
1204 return targetConfiguration.get();
1215 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1216 CloudConfiguration targetConfiguration = new CloudConfiguration();
1217 if(sourceCloudConfiguration != null) {
1218 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1219 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1220 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1221 return Optional.of(targetConfiguration);
1223 return Optional.empty();
1226 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1227 msoLogger.debug("Configuring UserParams for Macro Request");
1228 Map<String, Object> userParams = new HashMap<>();
1230 for(Map<String, Object> params : reqParams.getUserParams()){
1231 if(params.containsKey("service")){
1232 Service service = serviceMapper(params);
1234 addUserParams(userParams, service.getInstanceParams());
1236 for(Networks network : service.getResources().getNetworks()) {
1237 addUserParams(userParams, network.getInstanceParams());
1240 for(Vnfs vnf: service.getResources().getVnfs()) {
1241 addUserParams(userParams, vnf.getInstanceParams());
1243 for(VfModules vfModule: vnf.getVfModules()) {
1244 addUserParams(userParams, vfModule.getInstanceParams());
1250 return mapFlatMapToNameValue(userParams);
1253 private Service serviceMapper(Map<String, Object> params)
1254 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1255 ObjectMapper obj = new ObjectMapper();
1256 String input = obj.writeValueAsString(params.get("service"));
1257 return obj.readValue(input, Service.class);
1260 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1261 for(Map<String, String> map : sourceUserParams) {
1262 for (Map.Entry<String, String> entry : map.entrySet()) {
1263 targetUserParams.put(entry.getKey(), entry.getValue());
1268 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1269 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1271 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1272 Map<String, Object> targetMap = new HashMap<>();
1273 targetMap.put(NAME, map.getKey());
1274 targetMap.put(VALUE, map.getValue());
1275 targetUserParams.add(targetMap);
1277 return targetUserParams;
1280 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1282 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1283 String vnfComponentType = modelInfo.getModelType().name();
1285 RelatedInstanceList[] instanceList = null;
1286 if (servInstReq.getRequestDetails() != null) {
1287 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1290 Recipe recipe = null;
1291 String defaultSource = getDefaultModel(servInstReq);
1292 String modelCustomizationId = modelInfo.getModelCustomizationId();
1293 String modelCustomizationName = modelInfo.getModelCustomizationName();
1294 String relatedInstanceModelVersionId = null;
1295 String relatedInstanceModelInvariantId = null;
1296 String relatedInstanceVersion = null;
1297 String relatedInstanceModelCustomizationName = null;
1299 if (instanceList != null) {
1301 for(RelatedInstanceList relatedInstanceList : instanceList){
1303 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1304 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1305 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1306 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1307 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1310 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1311 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1312 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1313 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1314 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1318 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1319 // a. For a vnf request (only create, no update currently):
1320 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1321 // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1322 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1323 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1324 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1325 // (MODEL_UUID) in SERVICE table.
1326 // iii. Regardless of how the value was provided/obtained above, APIH must always populate vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
1327 // during 1707 data migration if VID did not provide it originally on request.
1328 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1329 // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to look it up in our catalog to construct vnf-type value to pass to BPMN.
1331 VnfResource vnfResource = null;
1332 VnfResourceCustomization vrc=null;
1333 // Validation for vnfResource
1335 if(modelCustomizationId!=null) {
1336 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1338 vnfResource = vrc.getVnfResources();
1341 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1342 if(service == null) {
1343 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1346 if(service == null) {
1347 throw new ValidationException("service in relatedInstance");
1349 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1350 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1351 vrc=vnfResourceCustom;
1356 vnfResource = vrc.getVnfResources();
1357 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1358 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1362 if(vnfResource==null){
1363 throw new ValidationException("vnfResource");
1365 if(modelInfo.getModelVersionId() == null) {
1366 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1370 VnfRecipe vnfRecipe = null;
1373 String nfRole = vrc.getNfRole();
1374 if(nfRole != null) {
1375 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1379 if(vnfRecipe == null) {
1380 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1383 if (vnfRecipe == null) {
1387 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1389 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1390 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1391 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1392 // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table.
1393 // For each vf_module_cust_model_customization_uuid value returned, use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to
1394 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1395 // in vf_module_customization and looking up in vf_module (using vf_module_customization’s FK into vf_module) to find a match on MODEL_INVARIANT_UUID (modelInvariantId)
1396 // and MODEL_VERSION (modelVersion).
1398 VfModuleCustomization vfmc = null;
1400 VnfResourceCustomization vnfrc;
1401 VfModule vfModule = null;
1403 if(modelInfo.getModelCustomizationId() != null) {
1404 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1406 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1408 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1410 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1412 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1414 String vfModuleModelUUID = modelInfo.getModelVersionId();
1415 for(VfModuleCustomization vf : list) {
1416 VfModuleCustomization vfmCustom;
1417 if(vfModuleModelUUID != null){
1418 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1419 if(vfmCustom != null){
1420 vfModule = vfmCustom.getVfModule();
1423 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1424 if(vfmCustom != null){
1425 vfModule = vfmCustom.getVfModule();
1427 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1431 if(vfModule != null) {
1432 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1433 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1439 if(vfmc == null && vfModule == null) {
1440 throw new ValidationException("vfModuleCustomization");
1441 } else if (vfModule == null && vfmc != null) {
1442 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1445 if(modelInfo.getModelVersionId() == null) {
1446 modelInfo.setModelVersionId(vfModule.getModelUUID());
1450 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1452 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1453 if(!vfModuleRecords.isEmpty()){
1454 for(VfModule record : vfModuleRecords){
1455 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1462 if(recipe == null) {
1463 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1464 if (recipe == null) {
1465 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1468 if(recipe == null) {
1475 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1476 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1477 if (recipe == null) {
1481 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1483 if (recipe == null) {
1489 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1492 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1494 String defaultSource = getDefaultModel(sir);
1496 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1498 if (vnfRecipe == null) {
1502 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1506 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1508 String defaultNetworkType = getDefaultModel(sir);
1510 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1511 String modelName = modelInfo.getModelName();
1512 Recipe recipe = null;
1514 if(modelInfo.getModelCustomizationId()!=null){
1515 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1516 if(networkResource!=null){
1517 if(modelInfo.getModelVersionId() == null) {
1518 modelInfo.setModelVersionId(networkResource.getModelUUID());
1520 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1522 throw new ValidationException("no catalog entry found");
1525 //ok for version < 3 and action delete
1526 if(modelName != null){
1527 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1532 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1535 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1538 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1539 String requestTestApi = null;
1540 TestApi testApi = null;
1542 if (requestParams != null) {
1543 requestTestApi = requestParams.getTestApi();
1546 if (requestTestApi == null) {
1547 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1548 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1550 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1555 testApi = TestApi.valueOf(requestTestApi);
1556 return Optional.of(testApi.getModelName());
1557 } catch (Exception e) {
1558 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1559 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1563 private String getDefaultModel(ServiceInstancesRequest sir) {
1564 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1565 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1566 if (oModelName.isPresent()) {
1567 defaultModel = oModelName.get();
1569 return defaultModel;
1572 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1573 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1574 Boolean aLaCarte = null;
1575 String apiVersion = version.substring(1);
1577 long startTime = System.currentTimeMillis ();
1578 ServiceInstancesRequest sir = null;
1580 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1581 String requestScope = deriveRequestScope(action,sir, requestUri);
1582 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1583 if(sir.getRequestDetails().getRequestParameters() != null){
1584 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1586 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1587 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1588 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1590 InfraActiveRequests dup = null;
1592 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1594 if (instanceIdMap != null && dup != null) {
1595 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1598 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1599 RequestReferences referencesResponse = new RequestReferences();
1600 referencesResponse.setRequestId(requestId);
1601 serviceResponse.setRequestReferences(referencesResponse);
1604 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1605 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1607 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1608 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1610 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1613 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1614 .errorInfo(errorLoggerInfo).build();
1616 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1618 throw validateException;
1622 serviceInstanceId = "";
1623 String configurationId = "";
1624 String correlationId = "";
1626 if(sir.getServiceInstanceId () != null){
1627 serviceInstanceId = sir.getServiceInstanceId ();
1630 if(sir.getConfigurationId() != null){
1631 configurationId = sir.getConfigurationId();
1633 if (sir.getCorrelationId() != null) {
1634 correlationId = sir.getCorrelationId();
1636 infraActiveRequestsClient.save(currentActiveReq);
1638 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1640 }else if(aLaCarte == null){
1644 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1645 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1648 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1649 String requestId = null;
1650 if (requestContext.getProperty("requestId") != null) {
1651 requestId = requestContext.getProperty("requestId").toString();
1653 if (UUIDChecker.isValidUUID(requestId)) {
1656 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1657 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1658 .errorInfo(errorLoggerInfo).build();
1660 throw validateException;
1663 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1664 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1665 aq.setStatusMessage (errorMessage);
1666 aq.setProgress(new Long(100));
1667 aq.setRequestStatus(status.toString());
1668 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1669 aq.setEndTime (endTimeStamp);
1670 infraActiveRequestsClient.save(aq);