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.RequestDbFailureException;
49 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
50 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
51 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
52 import org.onap.so.db.catalog.beans.NetworkResource;
53 import org.onap.so.db.catalog.beans.Recipe;
54 import org.onap.so.db.catalog.beans.ServiceRecipe;
55 import org.onap.so.db.catalog.beans.VfModule;
56 import org.onap.so.db.catalog.beans.VfModuleCustomization;
57 import org.onap.so.db.catalog.beans.VnfRecipe;
58 import org.onap.so.db.catalog.beans.VnfResource;
59 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
60 import org.onap.so.db.catalog.client.CatalogDbClient;
61 import org.onap.so.db.request.beans.InfraActiveRequests;
62 import org.onap.so.db.request.client.RequestsDbClient;
63 import org.onap.so.exceptions.ValidationException;
64 import org.onap.so.logger.MessageEnum;
65 import org.onap.so.logger.MsoLogger;
66 import org.onap.so.serviceinstancebeans.CloudConfiguration;
67 import org.onap.so.serviceinstancebeans.ModelInfo;
68 import org.onap.so.serviceinstancebeans.ModelType;
69 import org.onap.so.serviceinstancebeans.Networks;
70 import org.onap.so.serviceinstancebeans.RelatedInstance;
71 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
72 import org.onap.so.serviceinstancebeans.RequestDetails;
73 import org.onap.so.serviceinstancebeans.RequestParameters;
74 import org.onap.so.serviceinstancebeans.RequestReferences;
75 import org.onap.so.serviceinstancebeans.Service;
76 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
77 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
78 import org.onap.so.serviceinstancebeans.VfModules;
79 import org.onap.so.serviceinstancebeans.Vnfs;
80 import org.onap.so.utils.UUIDChecker;
81 import org.springframework.beans.factory.annotation.Autowired;
82 import org.springframework.core.env.Environment;
83 import org.springframework.stereotype.Component;
85 import javax.transaction.Transactional;
86 import javax.ws.rs.Consumes;
87 import javax.ws.rs.DELETE;
88 import javax.ws.rs.POST;
89 import javax.ws.rs.PUT;
90 import javax.ws.rs.Path;
91 import javax.ws.rs.PathParam;
92 import javax.ws.rs.Produces;
93 import javax.ws.rs.container.ContainerRequestContext;
94 import javax.ws.rs.core.Context;
95 import javax.ws.rs.core.MediaType;
96 import javax.ws.rs.core.Response;
97 import java.io.IOException;
98 import java.sql.Timestamp;
99 import java.util.ArrayList;
100 import java.util.HashMap;
101 import java.util.List;
102 import java.util.Map;
103 import java.util.Optional;
106 @Path("/onap/so/infra/serviceInstantiation")
107 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
108 public class ServiceInstances {
110 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
111 private static String NAME = "name";
112 private static String VALUE = "value";
113 private static final String SAVE_TO_DB = "save instance to db";
116 private Environment env;
119 private RequestClientFactory reqClientFactory;
122 private CatalogDbClient catalogDbClient;
125 private RequestsDbClient infraActiveRequestsClient;
128 private ResponseBuilder builder;
131 private MsoRequest msoRequest;
134 @Path("/{version:[vV][5-7]}/serviceInstances")
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
139 public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
140 String requestId = getRequestId(requestContext);
141 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
145 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
146 @Consumes(MediaType.APPLICATION_JSON)
147 @Produces(MediaType.APPLICATION_JSON)
148 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
150 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
151 String requestId = getRequestId(requestContext);
152 HashMap<String, String> instanceIdMap = new HashMap<>();
153 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
154 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
158 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
159 @Consumes(MediaType.APPLICATION_JSON)
160 @Produces(MediaType.APPLICATION_JSON)
161 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
163 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
164 String requestId = getRequestId(requestContext);
165 HashMap<String, String> instanceIdMap = new HashMap<>();
166 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
167 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
171 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
172 @Consumes(MediaType.APPLICATION_JSON)
173 @Produces(MediaType.APPLICATION_JSON)
174 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
176 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
177 String requestId = getRequestId(requestContext);
178 HashMap<String, String> instanceIdMap = new HashMap<>();
179 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
180 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
184 @Path("/{version:[vV][7]}/serviceInstances/assign")
185 @Consumes(MediaType.APPLICATION_JSON)
186 @Produces(MediaType.APPLICATION_JSON)
187 @ApiOperation(value="Assign Service Instance", response=Response.class)
189 public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
190 String requestId = getRequestId(requestContext);
191 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
195 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
196 @Consumes(MediaType.APPLICATION_JSON)
197 @Produces(MediaType.APPLICATION_JSON)
198 @ApiOperation(value="Unassign Service Instance", response=Response.class)
200 public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
201 String requestId = getRequestId(requestContext);
202 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
203 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
204 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
208 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
209 @Consumes(MediaType.APPLICATION_JSON)
210 @Produces(MediaType.APPLICATION_JSON)
211 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
213 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
214 String requestId = getRequestId(requestContext);
215 HashMap<String, String> instanceIdMap = new HashMap<>();
216 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
217 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
221 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Delete provided Port",response=Response.class)
226 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
227 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
228 String requestId = getRequestId(requestContext);
229 HashMap<String, String> instanceIdMap = new HashMap<>();
230 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
231 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
232 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
236 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
237 @Consumes(MediaType.APPLICATION_JSON)
238 @Produces(MediaType.APPLICATION_JSON)
239 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
241 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
242 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
243 String requestId = getRequestId(requestContext);
244 HashMap<String, String> instanceIdMap = new HashMap<>();
245 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
246 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
247 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
251 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
252 @Consumes(MediaType.APPLICATION_JSON)
253 @Produces(MediaType.APPLICATION_JSON)
254 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
256 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
257 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
258 String requestId = getRequestId(requestContext);
259 HashMap<String, String> instanceIdMap = new HashMap<>();
260 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
261 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
262 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
266 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
267 @Consumes(MediaType.APPLICATION_JSON)
268 @Produces(MediaType.APPLICATION_JSON)
269 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
271 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
272 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
273 String requestId = getRequestId(requestContext);
274 HashMap<String, String> instanceIdMap = new HashMap<>();
275 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
276 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
277 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
281 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
282 @Consumes(MediaType.APPLICATION_JSON)
283 @Produces(MediaType.APPLICATION_JSON)
284 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
286 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
287 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
288 String requestId = getRequestId(requestContext);
289 HashMap<String, String> instanceIdMap = new HashMap<>();
290 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
291 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
292 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
296 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
297 @Consumes(MediaType.APPLICATION_JSON)
298 @Produces(MediaType.APPLICATION_JSON)
299 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
301 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
302 String requestId = getRequestId(requestContext);
303 HashMap<String, String> instanceIdMap = new HashMap<>();
304 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
305 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
309 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
310 @Consumes(MediaType.APPLICATION_JSON)
311 @Produces(MediaType.APPLICATION_JSON)
312 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
314 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
315 String requestId = getRequestId(requestContext);
316 HashMap<String, String> instanceIdMap = new HashMap<>();
317 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
318 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
322 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
323 @Consumes(MediaType.APPLICATION_JSON)
324 @Produces(MediaType.APPLICATION_JSON)
325 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
327 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
328 String requestId = getRequestId(requestContext);
329 HashMap<String, String> instanceIdMap = new HashMap<>();
330 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
331 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
335 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
336 @Consumes(MediaType.APPLICATION_JSON)
337 @Produces(MediaType.APPLICATION_JSON)
338 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
340 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
341 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
342 String requestId = getRequestId(requestContext);
343 HashMap<String, String> instanceIdMap = new HashMap<>();
344 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
345 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
346 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
350 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
351 @Consumes(MediaType.APPLICATION_JSON)
352 @Produces(MediaType.APPLICATION_JSON)
353 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
355 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
356 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
357 String requestId = getRequestId(requestContext);
358 HashMap<String, String> instanceIdMap = new HashMap<>();
359 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
360 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
361 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
365 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
366 @Consumes(MediaType.APPLICATION_JSON)
367 @Produces(MediaType.APPLICATION_JSON)
368 @ApiOperation(value="Apply updated configuration",response=Response.class)
369 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
370 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
371 String requestId = getRequestId(requestContext);
372 HashMap<String, String> instanceIdMap = new HashMap<>();
373 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
374 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
375 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
379 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
380 @Consumes(MediaType.APPLICATION_JSON)
381 @Produces(MediaType.APPLICATION_JSON)
382 @ApiOperation(value="Recreate VNF Instance",response=Response.class)
383 public Response recreateVnfInstance(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.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
394 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
395 @Consumes(MediaType.APPLICATION_JSON)
396 @Produces(MediaType.APPLICATION_JSON)
397 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
399 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
400 @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
401 String requestId = getRequestId(requestContext);
402 HashMap<String, String> instanceIdMap = new HashMap<>();
403 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
404 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
405 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
409 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
410 @Consumes(MediaType.APPLICATION_JSON)
411 @Produces(MediaType.APPLICATION_JSON)
412 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
414 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
415 @PathParam("vnfInstanceId") String vnfInstanceId, @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 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
424 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
425 @Consumes(MediaType.APPLICATION_JSON)
426 @Produces(MediaType.APPLICATION_JSON)
427 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
429 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
430 @PathParam("vnfInstanceId") String vnfInstanceId,
431 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
432 String requestId = getRequestId(requestContext);
433 HashMap<String, String> instanceIdMap = new HashMap<>();
434 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
435 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
436 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
437 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
441 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
442 @Consumes(MediaType.APPLICATION_JSON)
443 @Produces(MediaType.APPLICATION_JSON)
444 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
446 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
447 @PathParam("vnfInstanceId") String vnfInstanceId,
448 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @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 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
454 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
458 @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
459 @Consumes(MediaType.APPLICATION_JSON)
460 @Produces(MediaType.APPLICATION_JSON)
461 @ApiOperation(value="Perform VNF software update",response=Response.class)
463 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
464 @PathParam("vnfInstanceId") String vnfInstanceId, @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 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
473 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
474 @Consumes(MediaType.APPLICATION_JSON)
475 @Produces(MediaType.APPLICATION_JSON)
476 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
478 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
479 @PathParam("vnfInstanceId") String vnfInstanceId,
480 @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 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
490 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
491 @Consumes(MediaType.APPLICATION_JSON)
492 @Produces(MediaType.APPLICATION_JSON)
493 @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
495 public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
496 @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
497 String requestId = getRequestId(requestContext);
498 HashMap<String, String> instanceIdMap = new HashMap<>();
499 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
500 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
501 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
502 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
507 @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
508 @Consumes(MediaType.APPLICATION_JSON)
509 @Produces(MediaType.APPLICATION_JSON)
510 @ApiOperation(value="VF Auto Scale Out",response=Response.class)
512 public Response scaleOutVfModule(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.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
523 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
524 @Consumes(MediaType.APPLICATION_JSON)
525 @Produces(MediaType.APPLICATION_JSON)
526 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
528 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
529 @PathParam("vnfInstanceId") String vnfInstanceId, @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 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
538 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
539 @Consumes(MediaType.APPLICATION_JSON)
540 @Produces(MediaType.APPLICATION_JSON)
541 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
543 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
544 @PathParam("vnfInstanceId") String vnfInstanceId,
545 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
546 String requestId = getRequestId(requestContext);
547 HashMap<String, String> instanceIdMap = new HashMap<>();
548 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
549 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
550 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
551 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
555 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
556 @Consumes(MediaType.APPLICATION_JSON)
557 @Produces(MediaType.APPLICATION_JSON)
558 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
560 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
561 @PathParam("vnfInstanceId") String vnfInstanceId,
562 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
563 String requestId = getRequestId(requestContext);
564 HashMap<String, String> instanceIdMap = new HashMap<>();
565 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
566 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
567 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
568 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
572 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
573 @Consumes(MediaType.APPLICATION_JSON)
574 @Produces(MediaType.APPLICATION_JSON)
575 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
577 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
578 String requestId = getRequestId(requestContext);
579 HashMap<String, String> instanceIdMap = new HashMap<>();
580 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
581 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
585 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
586 @Consumes(MediaType.APPLICATION_JSON)
587 @Produces(MediaType.APPLICATION_JSON)
588 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
590 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
591 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
592 String requestId = getRequestId(requestContext);
593 HashMap<String, String> instanceIdMap = new HashMap<>();
594 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
595 instanceIdMap.put("networkInstanceId", networkInstanceId);
596 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
600 @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
601 @Consumes(MediaType.APPLICATION_JSON)
602 @Produces(MediaType.APPLICATION_JSON)
603 @ApiOperation(value="Delete provided Network instance",response=Response.class)
605 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
606 @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
607 String requestId = getRequestId(requestContext);
608 HashMap<String, String> instanceIdMap = new HashMap<>();
609 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
610 instanceIdMap.put("networkInstanceId", networkInstanceId);
611 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
614 public String getRequestUri(ContainerRequestContext context){
615 String requestUri = context.getUriInfo().getPath();
616 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
620 public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
621 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
622 Boolean aLaCarte = null;
623 long startTime = System.currentTimeMillis ();
624 ServiceInstancesRequest sir = null;
625 String apiVersion = version.substring(1);
627 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
628 String requestScope = deriveRequestScope(action, sir, requestUri);
629 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject (sir, action, requestId, Status.PENDING, requestJSON, requestScope);
630 if(sir.getRequestDetails().getRequestParameters() != null){
631 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
633 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
634 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
636 int requestVersion = Integer.parseInt(version.substring(1));
637 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
638 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
639 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
640 String networkType = msoRequest.getNetworkType(sir,requestScope);
641 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
642 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
643 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
645 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
646 currentActiveReq.setVnfType(vnfType);
647 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
648 currentActiveReq.setNetworkType(networkType);
651 InfraActiveRequests dup = null;
654 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
657 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
659 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
661 RequestReferences referencesResponse = new RequestReferences();
663 referencesResponse.setRequestId(requestId);
665 serviceResponse.setRequestReferences(referencesResponse);
666 Boolean isBaseVfModule = false;
668 RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
671 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
672 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
673 modelType = ModelType.vnf;
675 modelType =modelInfo.getModelType();
678 if (modelType.equals(ModelType.vfModule)) {
681 // Get VF Module-specific base module indicator
684 String modelVersionId = modelInfo.getModelVersionId();
686 if(modelVersionId != null) {
687 vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
688 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
689 vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
693 if (vfm.getIsBase()) {
694 isBaseVfModule = true;
696 } else if (action == Action.createInstance || action == Action.updateInstance) {
697 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
698 // This request cannot proceed
700 String serviceVersionText = "";
701 if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
702 serviceVersionText = " with version " + sdcServiceModelVersion;
705 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
706 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
707 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
708 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
710 throw vfModuleException;
715 serviceInstanceId = "";
717 String vfModuleId = "";
718 String volumeGroupId = "";
719 String networkId = "";
720 String correlationId = "";
722 if(sir.getServiceInstanceId () != null){
723 serviceInstanceId = sir.getServiceInstanceId ();
726 if(sir.getVnfInstanceId () != null){
727 vnfId = sir.getVnfInstanceId ();
730 if(sir.getVfModuleInstanceId () != null){
731 vfModuleId = sir.getVfModuleInstanceId ();
734 if(sir.getVolumeGroupInstanceId () != null){
735 volumeGroupId = sir.getVolumeGroupInstanceId ();
738 if(sir.getNetworkInstanceId () != null){
739 networkId = sir.getNetworkInstanceId ();
742 if (sir.getCorrelationId() != null) {
743 correlationId = sir.getCorrelationId();
746 infraActiveRequestsClient.save(currentActiveReq);
748 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
749 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
750 .errorInfo(errorLoggerInfo).build();
753 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
755 }else if(aLaCarte == null){
759 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
760 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
761 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
764 private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
765 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
766 return (ModelType.vnf.name());
769 if(sir.getRequestDetails().getModelInfo().getModelType() == null){
770 requestScope = requestScopeFromUri(requestUri);
772 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
777 private String requestScopeFromUri(String requestUri){
779 if(requestUri.contains(ModelType.network.name())){
780 requestScope = ModelType.network.name();
781 }else if(requestUri.contains(ModelType.vfModule.name())){
782 requestScope = ModelType.vfModule.name();
783 }else if(requestUri.contains(ModelType.volumeGroup.name())){
784 requestScope = ModelType.volumeGroup.name();
785 }else if(requestUri.contains(ModelType.configuration.name())){
786 requestScope = ModelType.configuration.name();
787 }else if(requestUri.contains(ModelType.vnf.name())){
788 requestScope = ModelType.vnf.name();
790 requestScope = ModelType.service.name();
794 private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
795 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
796 String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
797 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType,
798 String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
799 RequestClient requestClient = null;
800 HttpResponse response = null;
802 requestClient = reqClientFactory.getRequestClient (orchestrationUri);
803 response = requestClient.post(new RequestClientParameter.Builder()
804 .setRequestId(requestId)
805 .setBaseVfModule(isBaseVfModule)
806 .setRecipeTimeout(timeOut)
807 .setRequestAction(action.toString())
808 .setServiceInstanceId(serviceInstanceId)
809 .setCorrelationId(correlationId)
811 .setVfModuleId(vfModuleId)
812 .setVolumeGroupId(volumeGroupId)
813 .setNetworkId(networkId)
814 .setConfigurationId(configurationId)
815 .setServiceType(serviceInstanceType)
817 .setVfModuleType(vfModuleType)
818 .setNetworkType(networkType)
819 .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
820 .setApiVersion(apiVersion)
821 .setALaCarte(aLaCarte)
822 .setRecipeParamXsd(paramXsd)
823 .setRequestUri(requestUri).build());
826 } catch (Exception e) {
828 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
829 String url = requestClient != null ? requestClient.getUrl() : "";
830 ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
831 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
833 throw clientException;
836 if (response == null) {
838 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
839 ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
841 updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
843 throw clientException;
846 ResponseHandler respHandler = null;
847 int bpelStatus = 500;
849 respHandler = new ResponseHandler (response, requestClient.getType ());
850 bpelStatus = respHandler.getStatus ();
851 } catch (ApiException e) {
853 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
854 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
855 .errorInfo(errorLoggerInfo).build();
856 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
857 throw validateException;
860 // BPEL accepted the request, the request is in progress
861 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
862 ServiceInstancesResponse jsonResponse;
863 CamundaResponse camundaResp = respHandler.getResponse();
865 if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
867 ObjectMapper mapper = new ObjectMapper();
868 jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
869 } catch (IOException e) {
871 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
872 ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
873 .errorInfo(errorLoggerInfo).build();
874 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
875 throw validateException;
878 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
879 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
882 infraActiveRequestsClient.save(currentActiveReq);
884 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
885 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
886 .errorInfo(errorLoggerInfo).build();
888 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
892 List<String> variables = new ArrayList<>();
893 variables.add(bpelStatus + "");
894 String camundaJSONResponseBody = respHandler.getResponseBody ();
895 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
897 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
898 BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
899 .errorInfo(errorLoggerInfo).build();
901 updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
906 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
909 BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
910 .errorInfo(errorLoggerInfo).build();
911 updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
917 private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
918 if(StringUtils.isNotBlank(instanceId)) {
919 if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
920 currentActiveReq.setServiceInstanceId(instanceId);
921 } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
922 currentActiveReq.setVnfId(instanceId);
923 } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
924 currentActiveReq.setVfModuleId(instanceId);
925 } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
926 currentActiveReq.setVolumeGroupId(instanceId);
927 } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
928 currentActiveReq.setNetworkId(instanceId);
929 } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
930 currentActiveReq.setConfigurationId(instanceId);
932 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
933 if(instanceIdMap.get("serviceInstanceId") != null){
934 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
936 if(instanceIdMap.get("vnfInstanceId") != null){
937 currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
939 if(instanceIdMap.get("vfModuleInstanceId") != null){
940 currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
942 if(instanceIdMap.get("volumeGroupInstanceId") != null){
943 currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
945 if(instanceIdMap.get("networkInstanceId") != null){
946 currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
948 if(instanceIdMap.get("configurationInstanceId") != null){
949 currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
954 protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
955 ObjectMapper mapper = new ObjectMapper();
956 mapper.setSerializationInclusion(Include.NON_NULL);
957 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);
958 if( !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null &&
959 serviceInstRequest.getRequestDetails() != null &&
960 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
961 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
962 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
964 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
965 return mapper.writeValueAsString(sir);
968 private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
969 String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
971 // Found the duplicate record. Return the appropriate error.
972 String instance = null;
973 if(instanceName != null){
974 instance = instanceName;
976 instance = instanceIdMap.get(requestScope + "InstanceId");
978 //List<String> variables = new ArrayList<String>();
979 //variables.add(dup.getRequestStatus());
980 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
983 DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
984 .errorInfo(errorLoggerInfo).build();
986 updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
991 private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
992 MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
993 InfraActiveRequests dup = null;
995 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
996 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
998 } catch (Exception e) {
999 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1000 RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1001 .errorInfo(errorLoggerInfo).build();
1002 updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1003 throw requestDbFailureException;
1008 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1009 ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1011 ObjectMapper mapper = new ObjectMapper();
1012 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1014 } catch (IOException e) {
1016 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1018 ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1019 .errorInfo(errorLoggerInfo).build();
1020 String requestScope = requestScopeFromUri(requestUri);
1022 msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1024 throw validateException;
1028 private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version,
1029 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1030 int reqVersion = Integer.parseInt(version.substring(1));
1032 msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1033 } catch (Exception e) {
1034 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1035 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1036 .errorInfo(errorLoggerInfo).build();
1038 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1040 throw validateException;
1044 private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag,
1045 InfraActiveRequests currentActiveReq) throws ApiException {
1046 RecipeLookupResult recipeLookupResult = null;
1047 //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1048 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1049 // Query MSO Catalog DB
1051 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1052 recipeLookupResult = getDefaultVnfUri(sir, action);
1053 } else if (modelInfo.getModelType().equals(ModelType.service)) {
1055 recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1056 } catch (IOException e) {
1057 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1060 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1061 .errorInfo(errorLoggerInfo).build();
1063 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1065 throw validateException;
1067 } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1068 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1070 recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1071 } catch (ValidationException e) {
1072 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1075 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1076 .errorInfo(errorLoggerInfo).build();
1078 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1080 throw validateException;
1082 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1084 recipeLookupResult = getNetworkUri( sir, action);
1085 } catch (ValidationException e) {
1087 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1090 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1091 .errorInfo(errorLoggerInfo).build();
1092 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1094 throw validateException;
1098 if (recipeLookupResult == null) {
1099 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1102 RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1103 .errorInfo(errorLoggerInfo).build();
1105 updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1106 throw recipeNotFoundExceptionException;
1108 return recipeLookupResult;
1111 private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1113 // Construct the default service name
1114 // TODO need to make this a configurable property
1115 String defaultServiceModelName = getDefaultModel(servInstReq);
1116 RequestDetails requestDetails = servInstReq.getRequestDetails();
1117 ModelInfo modelInfo = requestDetails.getModelInfo();
1118 org.onap.so.db.catalog.beans.Service serviceRecord;
1119 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1120 ServiceRecipe recipe = null;
1123 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1124 if(serviceRecord !=null){
1125 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1128 serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1129 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1130 if (recipe == null){
1131 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1132 if(!serviceRecordList.isEmpty()){
1133 for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1134 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1143 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1144 RequestParameters reqParam = requestDetails.getRequestParameters();
1145 if(reqParam!=null && alaCarteFlag && recipe==null){
1147 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1148 mapToLegacyRequest(requestDetails);
1149 }else if (recipe == null) { //aLaCarte wasn't sent, so we'll try the default
1150 serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1151 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1153 if(modelInfo.getModelVersionId() == null) {
1154 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1159 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1162 protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1163 RequestParameters reqParam;
1164 if (requestDetails.getRequestParameters() == null) {
1165 reqParam = new RequestParameters();
1167 reqParam = requestDetails.getRequestParameters();
1169 if(requestDetails.getCloudConfiguration() == null) {
1170 CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1171 if(cloudConfig != null) {
1172 requestDetails.setCloudConfiguration(cloudConfig);
1176 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1177 if(!userParams.isEmpty()) {
1178 if (reqParam == null) {
1179 requestDetails.setRequestParameters(new RequestParameters());
1181 requestDetails.getRequestParameters().setUserParams(userParams);
1185 protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1187 for(Map<String, Object> params : reqParams.getUserParams()){
1188 if(params.containsKey("service")){
1189 Service service = serviceMapper(params);
1191 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1193 if (targetConfiguration.isPresent()) {
1194 return targetConfiguration.get();
1196 for(Networks network : service.getResources().getNetworks()) {
1197 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1198 if(targetConfiguration.isPresent()) {
1199 return targetConfiguration.get();
1203 for(Vnfs vnf : service.getResources().getVnfs()) {
1204 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1206 if(targetConfiguration.isPresent()) {
1207 return targetConfiguration.get();
1210 for(VfModules vfModule : vnf.getVfModules()) {
1211 targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1213 if(targetConfiguration.isPresent()) {
1214 return targetConfiguration.get();
1225 private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1226 CloudConfiguration targetConfiguration = new CloudConfiguration();
1227 if(sourceCloudConfiguration != null) {
1228 targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1229 targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1230 targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1231 targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1232 return Optional.of(targetConfiguration);
1234 return Optional.empty();
1237 protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1238 msoLogger.debug("Configuring UserParams for Macro Request");
1239 Map<String, Object> userParams = new HashMap<>();
1241 for(Map<String, Object> params : reqParams.getUserParams()){
1242 if(params.containsKey("service")){
1243 Service service = serviceMapper(params);
1245 addUserParams(userParams, service.getInstanceParams());
1247 for(Networks network : service.getResources().getNetworks()) {
1248 addUserParams(userParams, network.getInstanceParams());
1251 for(Vnfs vnf: service.getResources().getVnfs()) {
1252 addUserParams(userParams, vnf.getInstanceParams());
1254 for(VfModules vfModule: vnf.getVfModules()) {
1255 addUserParams(userParams, vfModule.getInstanceParams());
1261 return mapFlatMapToNameValue(userParams);
1264 private Service serviceMapper(Map<String, Object> params)
1265 throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1266 ObjectMapper obj = new ObjectMapper();
1267 String input = obj.writeValueAsString(params.get("service"));
1268 return obj.readValue(input, Service.class);
1271 private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1272 for(Map<String, String> map : sourceUserParams) {
1273 for (Map.Entry<String, String> entry : map.entrySet()) {
1274 targetUserParams.put(entry.getKey(), entry.getValue());
1279 protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1280 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1282 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1283 Map<String, Object> targetMap = new HashMap<>();
1284 targetMap.put(NAME, map.getKey());
1285 targetMap.put(VALUE, map.getValue());
1286 targetUserParams.add(targetMap);
1288 return targetUserParams;
1291 private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1293 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1294 String vnfComponentType = modelInfo.getModelType().name();
1296 RelatedInstanceList[] instanceList = null;
1297 if (servInstReq.getRequestDetails() != null) {
1298 instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1301 Recipe recipe = null;
1302 String defaultSource = getDefaultModel(servInstReq);
1303 String modelCustomizationId = modelInfo.getModelCustomizationId();
1304 String modelCustomizationName = modelInfo.getModelCustomizationName();
1305 String relatedInstanceModelVersionId = null;
1306 String relatedInstanceModelInvariantId = null;
1307 String relatedInstanceVersion = null;
1308 String relatedInstanceModelCustomizationName = null;
1310 if (instanceList != null) {
1312 for(RelatedInstanceList relatedInstanceList : instanceList){
1314 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1315 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1316 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1317 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1318 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1321 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1322 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1323 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1324 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1325 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1329 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1330 // a. For a vnf request (only create, no update currently):
1331 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1332 // 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
1333 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1334 // to “join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1335 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1336 // (MODEL_UUID) in SERVICE table.
1337 // 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
1338 // during 1707 data migration if VID did not provide it originally on request.
1339 // iv. Note: continue to construct the “vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1340 // 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.
1342 VnfResource vnfResource = null;
1343 VnfResourceCustomization vrc=null;
1344 // Validation for vnfResource
1346 if(modelCustomizationId!=null) {
1347 vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1349 vnfResource = vrc.getVnfResources();
1352 org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1353 if(service == null) {
1354 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1357 if(service == null) {
1358 throw new ValidationException("service in relatedInstance");
1360 for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1361 if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1362 vrc=vnfResourceCustom;
1367 vnfResource = vrc.getVnfResources();
1368 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1369 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1373 if(vnfResource==null){
1374 throw new ValidationException("vnfResource");
1376 if(modelInfo.getModelVersionId() == null) {
1377 modelInfo.setModelVersionId(vnfResource.getModelUUID());
1381 VnfRecipe vnfRecipe = null;
1384 String nfRole = vrc.getNfRole();
1385 if(nfRole != null) {
1386 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1390 if(vnfRecipe == null) {
1391 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1394 if (vnfRecipe == null) {
1398 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1400 /* (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have
1401 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName
1402 // to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1403 // 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.
1404 // 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
1405 // confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found
1406 // 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)
1407 // and MODEL_VERSION (modelVersion).
1409 VfModuleCustomization vfmc = null;
1411 VnfResourceCustomization vnfrc;
1412 VfModule vfModule = null;
1414 if(modelInfo.getModelCustomizationId() != null) {
1415 vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1417 vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1419 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1421 vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1423 List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1425 String vfModuleModelUUID = modelInfo.getModelVersionId();
1426 for(VfModuleCustomization vf : list) {
1427 VfModuleCustomization vfmCustom;
1428 if(vfModuleModelUUID != null){
1429 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1430 if(vfmCustom != null){
1431 vfModule = vfmCustom.getVfModule();
1434 vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1435 if(vfmCustom != null){
1436 vfModule = vfmCustom.getVfModule();
1438 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1442 if(vfModule != null) {
1443 modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1444 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1450 if(vfmc == null && vfModule == null) {
1451 throw new ValidationException("vfModuleCustomization");
1452 } else if (vfModule == null && vfmc != null) {
1453 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1456 if(modelInfo.getModelVersionId() == null) {
1457 modelInfo.setModelVersionId(vfModule.getModelUUID());
1461 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1463 List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1464 if(!vfModuleRecords.isEmpty()){
1465 for(VfModule record : vfModuleRecords){
1466 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1473 if(recipe == null) {
1474 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1475 if (recipe == null) {
1476 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1479 if(recipe == null) {
1486 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1487 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1488 if (recipe == null) {
1492 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1494 if (recipe == null) {
1500 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1503 private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1505 String defaultSource = getDefaultModel(sir);
1507 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1509 if (vnfRecipe == null) {
1513 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1517 private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1519 String defaultNetworkType = getDefaultModel(sir);
1521 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1522 String modelName = modelInfo.getModelName();
1523 Recipe recipe = null;
1525 if(modelInfo.getModelCustomizationId()!=null){
1526 NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1527 if(networkResource!=null){
1528 if(modelInfo.getModelVersionId() == null) {
1529 modelInfo.setModelVersionId(networkResource.getModelUUID());
1531 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1533 throw new ValidationException("no catalog entry found");
1536 //ok for version < 3 and action delete
1537 if(modelName != null){
1538 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1543 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1546 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1549 private Optional<String> retrieveModelName(RequestParameters requestParams) {
1550 String requestTestApi = null;
1551 TestApi testApi = null;
1553 if (requestParams != null) {
1554 requestTestApi = requestParams.getTestApi();
1557 if (requestTestApi == null) {
1558 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1559 requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1561 requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1566 testApi = TestApi.valueOf(requestTestApi);
1567 return Optional.of(testApi.getModelName());
1568 } catch (Exception e) {
1569 msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1570 throw new IllegalArgumentException("Invalid TestApi is provided", e);
1574 private String getDefaultModel(ServiceInstancesRequest sir) {
1575 String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1576 Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1577 if (oModelName.isPresent()) {
1578 defaultModel = oModelName.get();
1580 return defaultModel;
1583 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1584 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1585 Boolean aLaCarte = null;
1586 String apiVersion = version.substring(1);
1588 long startTime = System.currentTimeMillis ();
1589 ServiceInstancesRequest sir = null;
1591 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1592 String requestScope = deriveRequestScope(action,sir, requestUri);
1593 InfraActiveRequests currentActiveReq = msoRequest.createRequestObject ( sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1594 if(sir.getRequestDetails().getRequestParameters() != null){
1595 aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1597 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1598 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1599 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1601 InfraActiveRequests dup = null;
1603 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1605 if (instanceIdMap != null && dup != null) {
1606 buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1609 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1610 RequestReferences referencesResponse = new RequestReferences();
1611 referencesResponse.setRequestId(requestId);
1612 serviceResponse.setRequestReferences(referencesResponse);
1615 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1616 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1618 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1619 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1621 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1624 ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1625 .errorInfo(errorLoggerInfo).build();
1627 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1629 throw validateException;
1633 serviceInstanceId = "";
1634 String configurationId = "";
1635 String correlationId = "";
1637 if(sir.getServiceInstanceId () != null){
1638 serviceInstanceId = sir.getServiceInstanceId ();
1641 if(sir.getConfigurationId() != null){
1642 configurationId = sir.getConfigurationId();
1644 if (sir.getCorrelationId() != null) {
1645 correlationId = sir.getCorrelationId();
1648 infraActiveRequestsClient.save(currentActiveReq);
1649 }catch(Exception e){
1650 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1651 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1652 .errorInfo(errorLoggerInfo).build();
1655 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1657 }else if(aLaCarte == null){
1661 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false,
1662 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1665 public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1666 String requestId = null;
1667 if (requestContext.getProperty("requestId") != null) {
1668 requestId = requestContext.getProperty("requestId").toString();
1670 if (UUIDChecker.isValidUUID(requestId)) {
1673 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1674 ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1675 .errorInfo(errorLoggerInfo).build();
1677 throw validateException;
1680 public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1681 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1682 aq.setStatusMessage (errorMessage);
1683 aq.setProgress(new Long(100));
1684 aq.setRequestStatus(status.toString());
1685 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1686 aq.setEndTime (endTimeStamp);
1688 infraActiveRequestsClient.save(aq);
1689 }catch(Exception e){
1690 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1691 throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1692 .errorInfo(errorLoggerInfo).build();