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);
672 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
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 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
835 throw validateException;
838 // BPEL accepted the request, the request is in progress
839 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
840 ServiceInstancesResponse jsonResponse;
841 CamundaResponse camundaResp = respHandler.getResponse();
843 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
845 ObjectMapper mapper = new ObjectMapper();
846 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
847 } catch (IOException e) {
849 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
850 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
851 .errorInfo(errorLoggerInfo).build();
852 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
853 throw validateException;
856 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
857 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
859 infraActiveRequestsClient.save(currentActiveReq);
860 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
864 List<String> variables = new ArrayList<>();
865 variables.add(bpelStatus + "");
866 String camundaJSONResponseBody = respHandler.getResponseBody ();
867 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
869 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
870 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
871 .errorInfo(errorLoggerInfo).build();
873 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
878 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
881 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
882 .errorInfo(errorLoggerInfo).build();
883 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
889 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
890 if(StringUtils.isNotBlank(instanceId)) {
891 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
892 currentActiveReq.setServiceInstanceId(instanceId);
893 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
894 currentActiveReq.setVnfId(instanceId);
895 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
896 currentActiveReq.setVfModuleId(instanceId);
897 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
898 currentActiveReq.setVolumeGroupId(instanceId);
899 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
900 currentActiveReq.setNetworkId(instanceId);
901 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
902 currentActiveReq.setConfigurationId(instanceId);
904 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
905 if(instanceIdMap.get("serviceInstanceId") != null){
906 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
908 if(instanceIdMap.get("vnfInstanceId") != null){
909 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
911 if(instanceIdMap.get("vfModuleInstanceId") != null){
912 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
914 if(instanceIdMap.get("volumeGroupInstanceId") != null){
915 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
917 if(instanceIdMap.get("networkInstanceId") != null){
918 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
920 if(instanceIdMap.get("configurationInstanceId") != null){
921 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
926 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
927 ObjectMapper mapper = new ObjectMapper();
928 mapper.setSerializationInclusion(Include.NON_NULL);
929 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
930 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
931 serviceInstRequest.getRequestDetails() != null &&
932 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
933 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
934 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
936 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
937 return mapper.writeValueAsString(sir);
940 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
941 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
943 // Found the duplicate record. Return the appropriate error.
944 String instance = null;
945 if(instanceName != null){
946 instance = instanceName;
948 instance = instanceIdMap.get(requestScope + "InstanceId");
950 //List<String> variables = new ArrayList<String>();
951 //variables.add(dup.getRequestStatus());
952 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
955 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
956 .errorInfo(errorLoggerInfo).build();
958 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
963 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
964 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
965 InfraActiveRequests dup = null;
967 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
968 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
970 } catch (Exception e) {
971 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
974 ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
975 .errorInfo(errorLoggerInfo).build();
977 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
979 throw validateException;
984 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
985 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
987 ObjectMapper mapper = new ObjectMapper();
988 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
990 } catch (IOException e) {
992 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
994 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
995 .errorInfo(errorLoggerInfo).build();
996 String requestScope = requestScopeFromUri(requestUri);
998 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1000 throw validateException;
1004 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1005 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1006 int reqVersion = Integer.parseInt(version.substring(1));
1008 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1009 } catch (Exception e) {
1010 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1011 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1012 .errorInfo(errorLoggerInfo).build();
1014 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1016 throw validateException;
1020 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1021 InfraActiveRequests currentActiveReq) throws ApiException {
1022 RecipeLookupResult recipeLookupResult = null;
1023 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1024 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1025 // Query MSO Catalog DB
1027 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1028 recipeLookupResult = getDefaultVnfUri(sir, action);
1029 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1031 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1032 } catch (IOException e) {
1033 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1036 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1037 .errorInfo(errorLoggerInfo).build();
1039 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1041 throw validateException;
1043 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1044 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1046 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1047 } catch (ValidationException e) {
1048 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1051 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1052 .errorInfo(errorLoggerInfo).build();
1054 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1056 throw validateException;
1058 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1060 recipeLookupResult = getNetworkUri( sir, action);
1061 } catch (ValidationException e) {
1063 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1066 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1067 .errorInfo(errorLoggerInfo).build();
1068 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1070 throw validateException;
1074 if (recipeLookupResult == null) {
1075 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1078 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1079 .errorInfo(errorLoggerInfo).build();
1081 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1082 throw recipeNotFoundExceptionException;
1084 return recipeLookupResult;
1087 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1089 // Construct the default service name
1090 // TODO need to make this a configurable property
1091 String defaultServiceModelName = getDefaultModel(servInstReq);
1092 RequestDetails requestDetails = servInstReq.getRequestDetails();
1093 ModelInfo modelInfo = requestDetails.getModelInfo();
1094 org.onap.so.db.catalog.beans.Service serviceRecord;
1095 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1096 ServiceRecipe recipe = null;
1099 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1100 if(serviceRecord !=null){
1101 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1104 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1105 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1106 if (recipe == null){
1107 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1108 if(!serviceRecordList.isEmpty()){
1109 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1110 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1119 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1120 RequestParameters reqParam = requestDetails.getRequestParameters();
1121 if(reqParam!=null && alaCarteFlag && recipe==null){
1123 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1124 mapToLegacyRequest(requestDetails);
1125 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1126 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1127 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1129 if(modelInfo.getModelVersionId() == null) {
1130 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1135 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1138 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1139 RequestParameters reqParam;
1140 if (requestDetails.getRequestParameters() == null) {
1141 reqParam = new RequestParameters();
1143 reqParam = requestDetails.getRequestParameters();
1145 if(requestDetails.getCloudConfiguration() == null) {
1146 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1147 if(cloudConfig != null) {
1148 requestDetails.setCloudConfiguration(cloudConfig);
1152 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1153 if(!userParams.isEmpty()) {
1154 if (reqParam == null) {
1155 requestDetails.setRequestParameters(new RequestParameters());
1157 requestDetails.getRequestParameters().setUserParams(userParams);
1161 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1163 for(Map<String, Object> params : reqParams.getUserParams()){
1164 if(params.containsKey("service")){
1165 Service service = serviceMapper(params);
1167 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1169 if (targetConfiguration.isPresent()) {
1170 return targetConfiguration.get();
1172 for(Networks network : service.getResources().getNetworks()) {
1173 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1174 if(targetConfiguration.isPresent()) {
1175 return targetConfiguration.get();
1179 for(Vnfs vnf : service.getResources().getVnfs()) {
1180 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1182 if(targetConfiguration.isPresent()) {
1183 return targetConfiguration.get();
1186 for(VfModules vfModule : vnf.getVfModules()) {
1187 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1189 if(targetConfiguration.isPresent()) {
1190 return targetConfiguration.get();
1201 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1202 CloudConfiguration targetConfiguration = new CloudConfiguration();
1203 if(sourceCloudConfiguration != null) {
1204 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1205 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1206 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1207 return Optional.of(targetConfiguration);
1209 return Optional.empty();
1212 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1213 msoLogger.debug("Configuring UserParams for Macro Request");
1214 Map<String, Object> userParams = new HashMap<>();
1216 for(Map<String, Object> params : reqParams.getUserParams()){
1217 if(params.containsKey("service")){
1218 Service service = serviceMapper(params);
1220 addUserParams(userParams, service.getInstanceParams());
1222 for(Networks network : service.getResources().getNetworks()) {
1223 addUserParams(userParams, network.getInstanceParams());
1226 for(Vnfs vnf: service.getResources().getVnfs()) {
1227 addUserParams(userParams, vnf.getInstanceParams());
1229 for(VfModules vfModule: vnf.getVfModules()) {
1230 addUserParams(userParams, vfModule.getInstanceParams());
1236 return mapFlatMapToNameValue(userParams);
1239 private Service serviceMapper(Map<String, Object> params)
1240 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1241 ObjectMapper obj = new ObjectMapper();
1242 String input = obj.writeValueAsString(params.get("service"));
1243 return obj.readValue(input, Service.class);
1246 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1247 for(Map<String, String> map : sourceUserParams) {
1248 for (Map.Entry<String, String> entry : map.entrySet()) {
1249 targetUserParams.put(entry.getKey(), entry.getValue());
1254 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1255 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1257 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1258 Map<String, Object> targetMap = new HashMap<>();
1259 targetMap.put(NAME, map.getKey());
1260 targetMap.put(VALUE, map.getValue());
1261 targetUserParams.add(targetMap);
1263 return targetUserParams;
1266 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1268 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1269 String vnfComponentType = modelInfo.getModelType().name();
1271 RelatedInstanceList[] instanceList = null;
1272 if (servInstReq.getRequestDetails() != null) {
1273 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1276 Recipe recipe = null;
1277 String defaultSource = getDefaultModel(servInstReq);
1278 String modelCustomizationId = modelInfo.getModelCustomizationId();
1279 String modelCustomizationName = modelInfo.getModelCustomizationName();
1280 String relatedInstanceModelVersionId = null;
1281 String relatedInstanceModelInvariantId = null;
1282 String relatedInstanceVersion = null;
1283 String relatedInstanceModelCustomizationName = null;
1285 if (instanceList != null) {
1287 for(RelatedInstanceList relatedInstanceList : instanceList){
1289 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1290 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1291 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1292 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1293 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1296 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1297 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1298 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1299 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1300 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1304 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1305 // a. For a vnf request (only create, no update currently):
1306 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1307 // 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
1308 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1309 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1310 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1311 // (MODEL_UUID) in SERVICE table.
1312 // 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
1313 // during 1707 data migration if VID did not provide it originally on request.
1314 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1315 // 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.
1317 VnfResource vnfResource = null;
1318 VnfResourceCustomization vrc=null;
1319 // Validation for vnfResource
1321 if(modelCustomizationId!=null) {
1322 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1324 vnfResource = vrc.getVnfResources();
1327 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1328 if(service == null) {
1329 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1332 if(service == null) {
1333 throw new ValidationException("service in relatedInstance");
1335 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1336 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1337 vrc=vnfResourceCustom;
1342 vnfResource = vrc.getVnfResources();
1343 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1344 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1348 if(vnfResource==null){
1349 throw new ValidationException("vnfResource");
1351 if(modelInfo.getModelVersionId() == null) {
1352 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1356 VnfRecipe vnfRecipe = null;
1359 String nfRole = vrc.getNfRole();
1360 if(nfRole != null) {
1361 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1365 if(vnfRecipe == null) {
1366 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1369 if (vnfRecipe == null) {
1373 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1375 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1376 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1377 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1378 // 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.
1379 // 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
1380 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1381 // 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)
1382 // and MODEL_VERSION (modelVersion).
1384 VfModuleCustomization vfmc = null;
1386 VnfResourceCustomization vnfrc;
1387 VfModule vfModule = null;
1389 if(modelInfo.getModelCustomizationId() != null) {
1390 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1392 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1394 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1396 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1398 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1400 String vfModuleModelUUID = modelInfo.getModelVersionId();
1401 for(VfModuleCustomization vf : list) {
1402 VfModuleCustomization vfmCustom;
1403 if(vfModuleModelUUID != null){
1404 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1405 if(vfmCustom != null){
1406 vfModule = vfmCustom.getVfModule();
1409 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1410 if(vfmCustom != null){
1411 vfModule = vfmCustom.getVfModule();
1413 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1417 if(vfModule != null) {
1418 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1419 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1425 if(vfmc == null && vfModule == null) {
1426 throw new ValidationException("vfModuleCustomization");
1427 } else if (vfModule == null && vfmc != null) {
1428 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1431 if(modelInfo.getModelVersionId() == null) {
1432 modelInfo.setModelVersionId(vfModule.getModelUUID());
1436 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1438 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1439 if(!vfModuleRecords.isEmpty()){
1440 for(VfModule record : vfModuleRecords){
1441 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1448 if(recipe == null) {
1449 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1450 if (recipe == null) {
1451 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1454 if(recipe == null) {
1461 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1462 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1463 if (recipe == null) {
1467 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1469 if (recipe == null) {
1475 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1478 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1480 String defaultSource = getDefaultModel(sir);
1482 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1484 if (vnfRecipe == null) {
1488 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1492 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1494 String defaultNetworkType = getDefaultModel(sir);
1496 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1497 String modelName = modelInfo.getModelName();
1498 Recipe recipe = null;
1500 if(modelInfo.getModelCustomizationId()!=null){
1501 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1502 if(networkResource!=null){
1503 if(modelInfo.getModelVersionId() == null) {
1504 modelInfo.setModelVersionId(networkResource.getModelUUID());
1506 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1508 throw new ValidationException("no catalog entry found");
1511 //ok for version < 3 and action delete
1512 if(modelName != null){
1513 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);