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));
378 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
379 @Consumes(MediaType.APPLICATION_JSON)
380 @Produces(MediaType.APPLICATION_JSON)
381 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
383 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
384 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
385 String requestId = getRequestId(requestContext);
386 HashMap<String, String> instanceIdMap = new HashMap<>();
387 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
388 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
389 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
393 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
394 @Consumes(MediaType.APPLICATION_JSON)
395 @Produces(MediaType.APPLICATION_JSON)
396 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
398 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
399 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
400 String requestId = getRequestId(requestContext);
401 HashMap<String, String> instanceIdMap = new HashMap<>();
402 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
403 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
404 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
408 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
409 @Consumes(MediaType.APPLICATION_JSON)
410 @Produces(MediaType.APPLICATION_JSON)
411 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
413 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
414 @PathParam("vnfInstanceId") String vnfInstanceId,
415 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
416 String requestId = getRequestId(requestContext);
417 HashMap<String, String> instanceIdMap = new HashMap<>();
418 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
419 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
420 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
421 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
425 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
426 @Consumes(MediaType.APPLICATION_JSON)
427 @Produces(MediaType.APPLICATION_JSON)
428 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
430 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
431 @PathParam("vnfInstanceId") String vnfInstanceId,
432 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
433 String requestId = getRequestId(requestContext);
434 HashMap<String, String> instanceIdMap = new HashMap<>();
435 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
436 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
437 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
438 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
442 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
443 @Consumes(MediaType.APPLICATION_JSON)
444 @Produces(MediaType.APPLICATION_JSON)
445 @ApiOperation(value="Perform VNF software update",response=Response.class)
447 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
448 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
449 String requestId = getRequestId(requestContext);
450 HashMap<String, String> instanceIdMap = new HashMap<>();
451 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
452 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
453 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
457 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
458 @Consumes(MediaType.APPLICATION_JSON)
459 @Produces(MediaType.APPLICATION_JSON)
460 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
462 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
463 @PathParam("vnfInstanceId") String vnfInstanceId,
464 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
465 String requestId = getRequestId(requestContext);
466 HashMap<String, String> instanceIdMap = new HashMap<>();
467 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
468 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
469 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
470 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
474 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
475 @Consumes(MediaType.APPLICATION_JSON)
476 @Produces(MediaType.APPLICATION_JSON)
477 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
479 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
480 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
481 String requestId = getRequestId(requestContext);
482 HashMap<String, String> instanceIdMap = new HashMap<>();
483 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
484 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
485 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
486 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
491 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
492 @Consumes(MediaType.APPLICATION_JSON)
493 @Produces(MediaType.APPLICATION_JSON)
494 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
496 public Response scaleOutVfModule(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
497 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
498 String requestId = getRequestId(requestContext);
499 HashMap<String, String> instanceIdMap = new HashMap<>();
500 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
501 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
502 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
507 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
508 @Consumes(MediaType.APPLICATION_JSON)
509 @Produces(MediaType.APPLICATION_JSON)
510 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
512 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
513 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
514 String requestId = getRequestId(requestContext);
515 HashMap<String, String> instanceIdMap = new HashMap<>();
516 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
517 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
518 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
522 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
523 @Consumes(MediaType.APPLICATION_JSON)
524 @Produces(MediaType.APPLICATION_JSON)
525 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
527 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
528 @PathParam("vnfInstanceId") String vnfInstanceId,
529 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
530 String requestId = getRequestId(requestContext);
531 HashMap<String, String> instanceIdMap = new HashMap<>();
532 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
533 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
534 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
535 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
539 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
540 @Consumes(MediaType.APPLICATION_JSON)
541 @Produces(MediaType.APPLICATION_JSON)
542 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
544 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
545 @PathParam("vnfInstanceId") String vnfInstanceId,
546 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
547 String requestId = getRequestId(requestContext);
548 HashMap<String, String> instanceIdMap = new HashMap<>();
549 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
550 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
551 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
552 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
556 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
557 @Consumes(MediaType.APPLICATION_JSON)
558 @Produces(MediaType.APPLICATION_JSON)
559 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
561 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
562 String requestId = getRequestId(requestContext);
563 HashMap<String, String> instanceIdMap = new HashMap<>();
564 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
565 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
569 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
570 @Consumes(MediaType.APPLICATION_JSON)
571 @Produces(MediaType.APPLICATION_JSON)
572 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
574 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
575 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
576 String requestId = getRequestId(requestContext);
577 HashMap<String, String> instanceIdMap = new HashMap<>();
578 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
579 instanceIdMap.put("networkInstanceId", networkInstanceId);
580 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
584 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
585 @Consumes(MediaType.APPLICATION_JSON)
586 @Produces(MediaType.APPLICATION_JSON)
587 @ApiOperation(value="Delete provided Network instance",response=Response.class)
589 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
590 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
591 String requestId = getRequestId(requestContext);
592 HashMap<String, String> instanceIdMap = new HashMap<>();
593 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
594 instanceIdMap.put("networkInstanceId", networkInstanceId);
595 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
598 public String getRequestUri(ContainerRequestContext context){
599 String requestUri = context.getUriInfo().getPath();
600 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
604 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
605 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
606 Boolean aLaCarte = null;
607 long startTime = System.currentTimeMillis ();
608 ServiceInstancesRequest sir = null;
609 String apiVersion = version.substring(1);
611 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
612 String requestScope = deriveRequestScope(action, sir, requestUri);
613 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
614 if(sir.getRequestDetails().getRequestParameters() != null){
615 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
617 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
618 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
620 int requestVersion = Integer.parseInt(version.substring(1));
621 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
622 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
623 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
624 String networkType = msoRequest.getNetworkType(sir,requestScope);
625 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
626 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
627 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
629 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
630 currentActiveReq.setVnfType(vnfType);
631 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
632 currentActiveReq.setNetworkType(networkType);
635 InfraActiveRequests dup = null;
638 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
641 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
643 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
645 RequestReferences referencesResponse = new RequestReferences();
647 referencesResponse.setRequestId(requestId);
649 serviceResponse.setRequestReferences(referencesResponse);
650 Boolean isBaseVfModule = false;
652 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
655 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
656 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
657 modelType = ModelType.vnf;
659 modelType =modelInfo.getModelType();
662 if (modelType.equals(ModelType.vfModule)) {
665 // Get VF Module-specific base module indicator
668 String modelVersionId = modelInfo.getModelVersionId();
670 if(modelVersionId != null) {
671 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
673 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
677 if (vfm.getIsBase()) {
678 isBaseVfModule = true;
680 } else if (action == Action.createInstance || action == Action.updateInstance) {
681 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
682 // This request cannot proceed
684 String serviceVersionText = "";
685 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
686 serviceVersionText = " with version " + sdcServiceModelVersion;
689 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
690 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
691 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
692 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
694 throw vfModuleException;
699 serviceInstanceId = "";
701 String vfModuleId = "";
702 String volumeGroupId = "";
703 String networkId = "";
704 String correlationId = "";
706 if(sir.getServiceInstanceId () != null){
707 serviceInstanceId = sir.getServiceInstanceId ();
710 if(sir.getVnfInstanceId () != null){
711 vnfId = sir.getVnfInstanceId ();
714 if(sir.getVfModuleInstanceId () != null){
715 vfModuleId = sir.getVfModuleInstanceId ();
718 if(sir.getVolumeGroupInstanceId () != null){
719 volumeGroupId = sir.getVolumeGroupInstanceId ();
722 if(sir.getNetworkInstanceId () != null){
723 networkId = sir.getNetworkInstanceId ();
726 if (sir.getCorrelationId() != null) {
727 correlationId = sir.getCorrelationId();
729 infraActiveRequestsClient.save(currentActiveReq);
731 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
733 }else if(aLaCarte == null){
737 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
738 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
739 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
742 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
743 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
744 return (ModelType.vnf.name());
747 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
748 requestScope = requestScopeFromUri(requestUri);
750 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
755 private String requestScopeFromUri(String requestUri){
757 if(requestUri.contains(ModelType.network.name())){
758 requestScope = ModelType.network.name();
759 }else if(requestUri.contains(ModelType.vfModule.name())){
760 requestScope = ModelType.vfModule.name();
761 }else if(requestUri.contains(ModelType.volumeGroup.name())){
762 requestScope = ModelType.volumeGroup.name();
763 }else if(requestUri.contains(ModelType.configuration.name())){
764 requestScope = ModelType.configuration.name();
765 }else if(requestUri.contains(ModelType.vnf.name())){
766 requestScope = ModelType.vnf.name();
768 requestScope = ModelType.service.name();
772 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
773 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
774 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
775 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
776 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
777 RequestClient requestClient = null;
778 HttpResponse response = null;
780 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
781 response = requestClient.post(new RequestClientParameter.Builder()
782 .setRequestId(requestId)
783 .setBaseVfModule(isBaseVfModule)
784 .setRecipeTimeout(timeOut)
785 .setRequestAction(action.toString())
786 .setServiceInstanceId(serviceInstanceId)
787 .setCorrelationId(correlationId)
789 .setVfModuleId(vfModuleId)
790 .setVolumeGroupId(volumeGroupId)
791 .setNetworkId(networkId)
792 .setConfigurationId(configurationId)
793 .setServiceType(serviceInstanceType)
795 .setVfModuleType(vfModuleType)
796 .setNetworkType(networkType)
797 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
798 .setApiVersion(apiVersion)
799 .setALaCarte(aLaCarte)
800 .setRecipeParamXsd(paramXsd)
801 .setRequestUri(requestUri).build());
804 } catch (Exception e) {
806 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
807 String url = requestClient != null ? requestClient.getUrl() : "";
808 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
809 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
811 throw clientException;
814 if (response == null) {
816 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
817 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
819 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
821 throw clientException;
824 ResponseHandler respHandler = null;
825 int bpelStatus = 500;
827 respHandler = new ResponseHandler (response, requestClient.getType ());
828 bpelStatus = respHandler.getStatus ();
829 } catch (ApiException e) {
831 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
832 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
833 .errorInfo(errorLoggerInfo).build();
834 currentActiveReq.setRequestStatus(Status.FAILED.name());
835 currentActiveReq.setStatusMessage(validateException.getMessage());
836 throw validateException;
839 // BPEL accepted the request, the request is in progress
840 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
841 ServiceInstancesResponse jsonResponse;
842 CamundaResponse camundaResp = respHandler.getResponse();
844 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
846 ObjectMapper mapper = new ObjectMapper();
847 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
848 } catch (IOException e) {
850 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
851 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
852 .errorInfo(errorLoggerInfo).build();
853 currentActiveReq.setRequestStatus(Status.FAILED.name());
854 currentActiveReq.setStatusMessage(validateException.getMessage());
855 throw validateException;
858 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
859 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
861 infraActiveRequestsClient.save(currentActiveReq);
862 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
866 List<String> variables = new ArrayList<>();
867 variables.add(bpelStatus + "");
868 String camundaJSONResponseBody = respHandler.getResponseBody ();
869 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
871 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
872 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
873 .errorInfo(errorLoggerInfo).build();
875 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
880 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
883 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
884 .errorInfo(errorLoggerInfo).build();
885 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
891 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
892 if(StringUtils.isNotBlank(instanceId)) {
893 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
894 currentActiveReq.setServiceInstanceId(instanceId);
895 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
896 currentActiveReq.setVnfId(instanceId);
897 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
898 currentActiveReq.setVfModuleId(instanceId);
899 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
900 currentActiveReq.setVolumeGroupId(instanceId);
901 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
902 currentActiveReq.setNetworkId(instanceId);
903 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
904 currentActiveReq.setConfigurationId(instanceId);
906 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
907 if(instanceIdMap.get("serviceInstanceId") != null){
908 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
910 if(instanceIdMap.get("vnfInstanceId") != null){
911 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
913 if(instanceIdMap.get("vfModuleInstanceId") != null){
914 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
916 if(instanceIdMap.get("volumeGroupInstanceId") != null){
917 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
919 if(instanceIdMap.get("networkInstanceId") != null){
920 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
922 if(instanceIdMap.get("configurationInstanceId") != null){
923 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
928 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
929 ObjectMapper mapper = new ObjectMapper();
930 mapper.setSerializationInclusion(Include.NON_NULL);
931 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
932 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
933 serviceInstRequest.getRequestDetails() != null &&
934 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
935 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
936 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
938 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
939 return mapper.writeValueAsString(sir);
942 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
943 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
945 // Found the duplicate record. Return the appropriate error.
946 String instance = null;
947 if(instanceName != null){
948 instance = instanceName;
950 instance = instanceIdMap.get(requestScope + "InstanceId");
952 //List<String> variables = new ArrayList<String>();
953 //variables.add(dup.getRequestStatus());
954 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
957 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
958 .errorInfo(errorLoggerInfo).build();
960 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
965 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
966 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
967 InfraActiveRequests dup = null;
969 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
970 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
972 } catch (Exception e) {
973 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
976 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
977 .errorInfo(errorLoggerInfo).build();
979 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
981 throw validateException;
986 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
987 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
989 ObjectMapper mapper = new ObjectMapper();
990 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
992 } catch (IOException e) {
994 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
996 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
997 .errorInfo(errorLoggerInfo).build();
998 String requestScope = requestScopeFromUri(requestUri);
1000 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1002 throw validateException;
1006 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1007 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1008 int reqVersion = Integer.parseInt(version.substring(1));
1010 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1011 } catch (Exception e) {
1012 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1013 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1014 .errorInfo(errorLoggerInfo).build();
1016 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1018 throw validateException;
1022 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1023 InfraActiveRequests currentActiveReq) throws ApiException {
1024 RecipeLookupResult recipeLookupResult = null;
1025 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1026 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1027 // Query MSO Catalog DB
1029 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1030 recipeLookupResult = getDefaultVnfUri(sir, action);
1031 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1033 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1034 } catch (IOException e) {
1035 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1038 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1039 .errorInfo(errorLoggerInfo).build();
1041 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1043 throw validateException;
1045 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1046 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1048 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1049 } catch (ValidationException e) {
1050 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1053 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1054 .errorInfo(errorLoggerInfo).build();
1056 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1058 throw validateException;
1060 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1062 recipeLookupResult = getNetworkUri( sir, action);
1063 } catch (ValidationException e) {
1065 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1068 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1069 .errorInfo(errorLoggerInfo).build();
1070 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1072 throw validateException;
1076 if (recipeLookupResult == null) {
1077 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1080 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1081 .errorInfo(errorLoggerInfo).build();
1083 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1084 throw recipeNotFoundExceptionException;
1086 return recipeLookupResult;
1089 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1091 // Construct the default service name
1092 // TODO need to make this a configurable property
1093 String defaultServiceModelName = getDefaultModel(servInstReq);
1094 RequestDetails requestDetails = servInstReq.getRequestDetails();
1095 ModelInfo modelInfo = requestDetails.getModelInfo();
1096 org.onap.so.db.catalog.beans.Service serviceRecord;
1097 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1098 ServiceRecipe recipe = null;
1101 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1102 if(serviceRecord !=null){
1103 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1106 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1107 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1108 if (recipe == null){
1109 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1110 if(!serviceRecordList.isEmpty()){
1111 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1112 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1121 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1122 RequestParameters reqParam = requestDetails.getRequestParameters();
1123 if(reqParam!=null && alaCarteFlag && recipe==null){
1125 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1126 mapToLegacyRequest(requestDetails);
1127 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1128 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1129 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1131 if(modelInfo.getModelVersionId() == null) {
1132 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1137 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1140 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1141 RequestParameters reqParam;
1142 if (requestDetails.getRequestParameters() == null) {
1143 reqParam = new RequestParameters();
1145 reqParam = requestDetails.getRequestParameters();
1147 if(requestDetails.getCloudConfiguration() == null) {
1148 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1149 if(cloudConfig != null) {
1150 requestDetails.setCloudConfiguration(cloudConfig);
1154 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1155 if(!userParams.isEmpty()) {
1156 if (reqParam == null) {
1157 requestDetails.setRequestParameters(new RequestParameters());
1159 requestDetails.getRequestParameters().setUserParams(userParams);
1163 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1165 for(Map<String, Object> params : reqParams.getUserParams()){
1166 if(params.containsKey("service")){
1167 Service service = serviceMapper(params);
1169 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1171 if (targetConfiguration.isPresent()) {
1172 return targetConfiguration.get();
1174 for(Networks network : service.getResources().getNetworks()) {
1175 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1176 if(targetConfiguration.isPresent()) {
1177 return targetConfiguration.get();
1181 for(Vnfs vnf : service.getResources().getVnfs()) {
1182 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1184 if(targetConfiguration.isPresent()) {
1185 return targetConfiguration.get();
1188 for(VfModules vfModule : vnf.getVfModules()) {
1189 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1191 if(targetConfiguration.isPresent()) {
1192 return targetConfiguration.get();
1203 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1204 CloudConfiguration targetConfiguration = new CloudConfiguration();
1205 if(sourceCloudConfiguration != null) {
1206 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1207 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1208 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1209 return Optional.of(targetConfiguration);
1211 return Optional.empty();
1214 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1215 msoLogger.debug("Configuring UserParams for Macro Request");
1216 Map<String, Object> userParams = new HashMap<>();
1218 for(Map<String, Object> params : reqParams.getUserParams()){
1219 if(params.containsKey("service")){
1220 Service service = serviceMapper(params);
1222 addUserParams(userParams, service.getInstanceParams());
1224 for(Networks network : service.getResources().getNetworks()) {
1225 addUserParams(userParams, network.getInstanceParams());
1228 for(Vnfs vnf: service.getResources().getVnfs()) {
1229 addUserParams(userParams, vnf.getInstanceParams());
1231 for(VfModules vfModule: vnf.getVfModules()) {
1232 addUserParams(userParams, vfModule.getInstanceParams());
1238 return mapFlatMapToNameValue(userParams);
1241 private Service serviceMapper(Map<String, Object> params)
1242 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1243 ObjectMapper obj = new ObjectMapper();
1244 String input = obj.writeValueAsString(params.get("service"));
1245 return obj.readValue(input, Service.class);
1248 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1249 for(Map<String, String> map : sourceUserParams) {
1250 for (Map.Entry<String, String> entry : map.entrySet()) {
1251 targetUserParams.put(entry.getKey(), entry.getValue());
1256 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1257 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1259 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1260 Map<String, Object> targetMap = new HashMap<>();
1261 targetMap.put(NAME, map.getKey());
1262 targetMap.put(VALUE, map.getValue());
1263 targetUserParams.add(targetMap);
1265 return targetUserParams;
1268 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1270 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1271 String vnfComponentType = modelInfo.getModelType().name();
1273 RelatedInstanceList[] instanceList = null;
1274 if (servInstReq.getRequestDetails() != null) {
1275 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1278 Recipe recipe = null;
1279 String defaultSource = getDefaultModel(servInstReq);
1280 String modelCustomizationId = modelInfo.getModelCustomizationId();
1281 String modelCustomizationName = modelInfo.getModelCustomizationName();
1282 String relatedInstanceModelVersionId = null;
1283 String relatedInstanceModelInvariantId = null;
1284 String relatedInstanceVersion = null;
1285 String relatedInstanceModelCustomizationName = null;
1287 if (instanceList != null) {
1289 for(RelatedInstanceList relatedInstanceList : instanceList){
1291 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1292 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1293 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1294 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1295 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1298 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1299 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1300 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1301 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1302 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1306 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1307 // a. For a vnf request (only create, no update currently):
1308 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1309 // 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
1310 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1311 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1312 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1313 // (MODEL_UUID) in SERVICE table.
1314 // 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
1315 // during 1707 data migration if VID did not provide it originally on request.
1316 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1317 // 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.
1319 VnfResource vnfResource = null;
1320 VnfResourceCustomization vrc=null;
1321 // Validation for vnfResource
1323 if(modelCustomizationId!=null) {
1324 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1326 vnfResource = vrc.getVnfResources();
1329 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1330 if(service == null) {
1331 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1334 if(service == null) {
1335 throw new ValidationException("service in relatedInstance");
1337 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1338 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1339 vrc=vnfResourceCustom;
1344 vnfResource = vrc.getVnfResources();
1345 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1346 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1350 if(vnfResource==null){
1351 throw new ValidationException("vnfResource");
1353 if(modelInfo.getModelVersionId() == null) {
1354 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1358 VnfRecipe vnfRecipe = null;
1361 String nfRole = vrc.getNfRole();
1362 if(nfRole != null) {
1363 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1367 if(vnfRecipe == null) {
1368 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1371 if (vnfRecipe == null) {
1375 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1377 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1378 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1379 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1380 // 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.
1381 // 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
1382 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1383 // 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)
1384 // and MODEL_VERSION (modelVersion).
1386 VfModuleCustomization vfmc = null;
1388 VnfResourceCustomization vnfrc;
1389 VfModule vfModule = null;
1391 if(modelInfo.getModelCustomizationId() != null) {
1392 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1394 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1396 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1398 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1400 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1402 String vfModuleModelUUID = modelInfo.getModelVersionId();
1403 for(VfModuleCustomization vf : list) {
1404 VfModuleCustomization vfmCustom;
1405 if(vfModuleModelUUID != null){
1406 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1407 if(vfmCustom != null){
1408 vfModule = vfmCustom.getVfModule();
1411 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1412 if(vfmCustom != null){
1413 vfModule = vfmCustom.getVfModule();
1415 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1419 if(vfModule != null) {
1420 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1421 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1427 if(vfmc == null && vfModule == null) {
1428 throw new ValidationException("vfModuleCustomization");
1429 } else if (vfModule == null && vfmc != null) {
1430 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1433 if(modelInfo.getModelVersionId() == null) {
1434 modelInfo.setModelVersionId(vfModule.getModelUUID());
1438 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1440 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1441 if(!vfModuleRecords.isEmpty()){
1442 for(VfModule record : vfModuleRecords){
1443 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1450 if(recipe == null) {
1451 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1452 if (recipe == null) {
1453 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1456 if(recipe == null) {
1463 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1464 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1465 if (recipe == null) {
1469 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1471 if (recipe == null) {
1477 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1480 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1482 String defaultSource = getDefaultModel(sir);
1484 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1486 if (vnfRecipe == null) {
1490 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1494 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1496 String defaultNetworkType = getDefaultModel(sir);
1498 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1499 String modelName = modelInfo.getModelName();
1500 Recipe recipe = null;
1502 if(modelInfo.getModelCustomizationId()!=null){
1503 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1504 if(networkResource!=null){
1505 if(modelInfo.getModelVersionId() == null) {
1506 modelInfo.setModelVersionId(networkResource.getModelUUID());
1508 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1510 throw new ValidationException("no catalog entry found");
1513 //ok for version < 3 and action delete
1514 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1518 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1521 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1524 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1525 String requestTestApi = null;
1526 TestApi testApi = null;
1528 if (requestParams != null) {
1529 requestTestApi = requestParams.getTestApi();
1532 if (requestTestApi == null) {
1533 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1534 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1536 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1541 testApi = TestApi.valueOf(requestTestApi);
1542 return Optional.of(testApi.getModelName());
1543 } catch (Exception e) {
1544 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1545 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1549 private String getDefaultModel(ServiceInstancesRequest sir) {
1550 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1551 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1552 if (oModelName.isPresent()) {
1553 defaultModel = oModelName.get();
1555 return defaultModel;
1558 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1559 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1560 Boolean aLaCarte = null;
1561 String apiVersion = version.substring(1);
1563 long startTime = System.currentTimeMillis ();
1564 ServiceInstancesRequest sir = null;
1566 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1567 String requestScope = deriveRequestScope(action,sir, requestUri);
1568 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1569 if(sir.getRequestDetails().getRequestParameters() != null){
1570 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1572 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1573 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1574 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1576 InfraActiveRequests dup = null;
1578 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1580 if (instanceIdMap != null && dup != null) {
1581 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1584 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1585 RequestReferences referencesResponse = new RequestReferences();
1586 referencesResponse.setRequestId(requestId);
1587 serviceResponse.setRequestReferences(referencesResponse);
1590 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1591 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1593 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1594 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1596 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1599 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1600 .errorInfo(errorLoggerInfo).build();
1602 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1604 throw validateException;
1608 serviceInstanceId = "";
1609 String configurationId = "";
1610 String correlationId = "";
1612 if(sir.getServiceInstanceId () != null){
1613 serviceInstanceId = sir.getServiceInstanceId ();
1616 if(sir.getConfigurationId() != null){
1617 configurationId = sir.getConfigurationId();
1619 if (sir.getCorrelationId() != null) {
1620 correlationId = sir.getCorrelationId();
1622 infraActiveRequestsClient.save(currentActiveReq);
1624 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1626 }else if(aLaCarte == null){
1630 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1631 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1634 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1635 String requestId = null;
1636 if (requestContext.getProperty("requestId") != null) {
1637 requestId = requestContext.getProperty("requestId").toString();
1639 if (UUIDChecker.isValidUUID(requestId)) {
1642 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1643 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1644 .errorInfo(errorLoggerInfo).build();
1646 throw validateException;
1649 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1650 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1651 aq.setStatusMessage (errorMessage);
1652 aq.setProgress(new Long(100));
1653 aq.setRequestStatus(status.toString());
1654 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1655 aq.setEndTime (endTimeStamp);
1656 infraActiveRequestsClient.save(aq);