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=========================================================
21 package org.openecomp.mso.apihandlerinfra;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.POST;
31 import javax.ws.rs.PUT;
32 import javax.ws.rs.Path;
33 import javax.ws.rs.PathParam;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.core.MediaType;
36 import javax.ws.rs.core.Response;
38 import org.apache.commons.lang.StringUtils;
39 import org.apache.http.HttpResponse;
40 import org.apache.http.HttpStatus;
41 import com.fasterxml.jackson.databind.ObjectMapper;
42 import org.openecomp.mso.apihandler.common.CommonConstants;
43 import org.openecomp.mso.apihandler.common.ErrorNumbers;
44 import org.openecomp.mso.apihandler.common.RequestClient;
45 import org.openecomp.mso.apihandler.common.RequestClientFactory;
46 import org.openecomp.mso.apihandler.common.RequestClientParamater;
47 import org.openecomp.mso.apihandler.common.ResponseHandler;
48 import org.openecomp.mso.apihandler.common.ValidationException;
49 import org.openecomp.mso.serviceinstancebeans.ModelInfo;
50 import org.openecomp.mso.serviceinstancebeans.ModelType;
51 import org.openecomp.mso.serviceinstancebeans.RelatedInstance;
52 import org.openecomp.mso.serviceinstancebeans.RelatedInstanceList;
53 import org.openecomp.mso.serviceinstancebeans.RequestParameters;
54 import org.openecomp.mso.serviceinstancebeans.RequestReferences;
55 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesRequest;
56 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesResponse;
57 import org.openecomp.mso.db.catalog.CatalogDatabase;
58 import org.openecomp.mso.db.catalog.beans.NetworkResource;
59 import org.openecomp.mso.db.catalog.beans.Recipe;
60 import org.openecomp.mso.db.catalog.beans.Service;
61 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
62 import org.openecomp.mso.db.catalog.beans.VfModule;
63 import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
64 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
65 import org.openecomp.mso.db.catalog.beans.VnfResource;
66 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
67 import org.openecomp.mso.logger.MessageEnum;
68 import org.openecomp.mso.logger.MsoAlarmLogger;
69 import org.openecomp.mso.logger.MsoLogger;
70 import org.openecomp.mso.properties.MsoJavaProperties;
71 import org.openecomp.mso.requestsdb.InfraActiveRequests;
72 import org.openecomp.mso.requestsdb.RequestsDatabase;
73 import org.openecomp.mso.utils.UUIDChecker;
75 import com.wordnik.swagger.annotations.Api;
76 import com.wordnik.swagger.annotations.ApiOperation;
78 @Path("/serviceInstances")
79 @Api(value="/serviceInstances",description="API Requests for Service Instances")
80 public class ServiceInstances {
82 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
83 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
86 @Path("/{version:[vV][4-6]}")
87 @Consumes(MediaType.APPLICATION_JSON)
88 @Produces(MediaType.APPLICATION_JSON)
89 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
90 public Response createServiceInstance(String request, @PathParam("version") String version) {
92 Response response = serviceInstances(request, Action.createInstance, null, version);
98 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/activate")
99 @Consumes(MediaType.APPLICATION_JSON)
100 @Produces(MediaType.APPLICATION_JSON)
101 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
102 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
103 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
104 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
105 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
111 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/deactivate")
112 @Consumes(MediaType.APPLICATION_JSON)
113 @Produces(MediaType.APPLICATION_JSON)
114 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
115 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
116 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
117 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
118 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
124 @Path("/{version:[vV][4-6]}/{serviceInstanceId}")
125 @Consumes(MediaType.APPLICATION_JSON)
126 @Produces(MediaType.APPLICATION_JSON)
127 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
128 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
129 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
130 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
131 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
136 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations")
137 @Consumes(MediaType.APPLICATION_JSON)
138 @Produces(MediaType.APPLICATION_JSON)
139 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
140 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
141 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
142 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
143 Response response = configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version);
149 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}")
150 @Consumes(MediaType.APPLICATION_JSON)
151 @Produces(MediaType.APPLICATION_JSON)
152 @ApiOperation(value="Delete provided Port",response=Response.class)
153 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
154 @PathParam("configurationInstanceId") String configurationInstanceId) {
155 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
156 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
157 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
158 Response response = configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version);
163 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
164 @Consumes(MediaType.APPLICATION_JSON)
165 @Produces(MediaType.APPLICATION_JSON)
166 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
167 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
168 @PathParam("configurationInstanceId") String configurationInstanceId) {
169 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
170 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
171 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
172 Response response = configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version);
178 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
179 @Consumes(MediaType.APPLICATION_JSON)
180 @Produces(MediaType.APPLICATION_JSON)
181 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
182 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
183 @PathParam("configurationInstanceId") String configurationInstanceId) {
184 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
185 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
186 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
187 Response response = configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version);
193 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
194 @Consumes(MediaType.APPLICATION_JSON)
195 @Produces(MediaType.APPLICATION_JSON)
196 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
197 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
198 @PathParam("configurationInstanceId") String configurationInstanceId) {
199 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
200 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
201 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
202 Response response = configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version);
208 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
209 @Consumes(MediaType.APPLICATION_JSON)
210 @Produces(MediaType.APPLICATION_JSON)
211 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
212 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
213 @PathParam("configurationInstanceId") String configurationInstanceId) {
214 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
215 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
216 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
217 Response response = configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version);
223 @Path("/{version:[vV][6]}/{serviceInstanceId}/addRelationships")
224 @Consumes(MediaType.APPLICATION_JSON)
225 @Produces(MediaType.APPLICATION_JSON)
226 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
227 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
228 msoLogger.debug ("version is: " + version);
229 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
230 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
231 Response response = configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version);
237 @Path("/{version:[vV][6]}/{serviceInstanceId}/removeRelationships")
238 @Consumes(MediaType.APPLICATION_JSON)
239 @Produces(MediaType.APPLICATION_JSON)
240 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
241 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
242 msoLogger.debug ("version is: " + version);
243 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
244 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
245 Response response = configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version);
251 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs")
252 @Consumes(MediaType.APPLICATION_JSON)
253 @Produces(MediaType.APPLICATION_JSON)
254 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
255 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
256 msoLogger.debug ("version is: " + version);
257 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
258 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
265 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
266 @Consumes(MediaType.APPLICATION_JSON)
267 @Produces(MediaType.APPLICATION_JSON)
268 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
269 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
270 @PathParam("vnfInstanceId") String vnfInstanceId) {
271 msoLogger.debug ("version is: " + version);
272 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
273 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
274 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
275 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
281 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
282 @Consumes(MediaType.APPLICATION_JSON)
283 @Produces(MediaType.APPLICATION_JSON)
284 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
285 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
286 @PathParam("vnfInstanceId") String vnfInstanceId) {
287 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
288 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
290 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
296 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
297 @Consumes(MediaType.APPLICATION_JSON)
298 @Produces(MediaType.APPLICATION_JSON)
299 @ApiOperation(value="Apply updated configuration",response=Response.class)
300 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
301 @PathParam("vnfInstanceId") String vnfInstanceId) {
302 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
303 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
304 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
305 Response response = serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version);
312 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
313 @Consumes(MediaType.APPLICATION_JSON)
314 @Produces(MediaType.APPLICATION_JSON)
315 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
316 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
317 @PathParam("vnfInstanceId") String vnfInstanceId) {
318 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
319 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
320 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
321 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
327 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
328 @Consumes(MediaType.APPLICATION_JSON)
329 @Produces(MediaType.APPLICATION_JSON)
330 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
331 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
332 @PathParam("vnfInstanceId") String vnfInstanceId) {
333 msoLogger.debug ("version is: " + version);
334 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
335 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
336 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
337 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
343 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
344 @Consumes(MediaType.APPLICATION_JSON)
345 @Produces(MediaType.APPLICATION_JSON)
346 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
347 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
348 @PathParam("vnfInstanceId") String vnfInstanceId,
349 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
350 msoLogger.debug ("version is: " + version);
351 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
352 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
353 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
354 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
355 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
361 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
362 @Consumes(MediaType.APPLICATION_JSON)
363 @Produces(MediaType.APPLICATION_JSON)
364 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
365 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
366 @PathParam("vnfInstanceId") String vnfInstanceId,
367 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
368 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
369 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
370 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
371 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
372 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
378 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
379 @Consumes(MediaType.APPLICATION_JSON)
380 @Produces(MediaType.APPLICATION_JSON)
381 @ApiOperation(value="Perform VNF software update",response=Response.class)
382 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
383 @PathParam("vnfInstanceId") String vnfInstanceId) {
384 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
385 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
387 Response response = serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version);
393 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
394 @Consumes(MediaType.APPLICATION_JSON)
395 @Produces(MediaType.APPLICATION_JSON)
396 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
397 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
398 @PathParam("vnfInstanceId") String vnfInstanceId,
399 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
400 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
401 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
402 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
403 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
404 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
411 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
412 @Consumes(MediaType.APPLICATION_JSON)
413 @Produces(MediaType.APPLICATION_JSON)
414 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
415 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
416 @PathParam("vnfInstanceId") String vnfInstanceId) {
417 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
418 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
419 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
420 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
426 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
427 @Consumes(MediaType.APPLICATION_JSON)
428 @Produces(MediaType.APPLICATION_JSON)
429 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
430 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
431 @PathParam("vnfInstanceId") String vnfInstanceId,
432 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
433 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
434 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
435 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
436 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
437 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
443 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
444 @Consumes(MediaType.APPLICATION_JSON)
445 @Produces(MediaType.APPLICATION_JSON)
446 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
447 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
448 @PathParam("vnfInstanceId") String vnfInstanceId,
449 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
450 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
451 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
452 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
453 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
454 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
460 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks")
461 @Consumes(MediaType.APPLICATION_JSON)
462 @Produces(MediaType.APPLICATION_JSON)
463 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
464 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
465 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
466 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
467 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
473 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
474 @Consumes(MediaType.APPLICATION_JSON)
475 @Produces(MediaType.APPLICATION_JSON)
476 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
477 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
478 @PathParam("networkInstanceId") String networkInstanceId) {
479 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
480 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
481 instanceIdMap.put("networkInstanceId", networkInstanceId);
482 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
488 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
489 @Consumes(MediaType.APPLICATION_JSON)
490 @Produces(MediaType.APPLICATION_JSON)
491 @ApiOperation(value="Delete provided Network instance",response=Response.class)
492 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
493 @PathParam("networkInstanceId") String networkInstanceId) {
494 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
495 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
496 instanceIdMap.put("networkInstanceId", networkInstanceId);
497 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
502 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
504 String requestId = UUIDChecker.generateUUID(msoLogger);
505 long startTime = System.currentTimeMillis ();
506 msoLogger.debug ("requestId is: " + requestId);
507 ServiceInstancesRequest sir = null;
509 MsoRequest msoRequest = new MsoRequest (requestId);
512 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
513 } catch(Exception e) {
514 msoLogger.debug("Exception occurred while mapping of request to JSON object ", e);
515 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
516 "Mapping of request to JSON object failed. " + e.getMessage(),
517 ErrorNumbers.SVC_BAD_PARAMETER, null);
518 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
523 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
524 } catch(Exception e) {
525 msoLogger.debug("Exception occurred while logging ", e);
526 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
527 "Error parsing request. " + e.getMessage(),
528 ErrorNumbers.SVC_BAD_PARAMETER, null);
529 if (msoRequest.getRequestId () != null) {
530 msoLogger.debug ("Logging failed message to the database");
531 msoRequest.createRequestRecord (Status.FAILED, action);
533 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
537 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
539 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
540 requestScope = (ModelType.vnf.name());
542 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
544 InfraActiveRequests dup = null;
547 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
548 } catch(Exception e) {
549 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
551 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
553 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
558 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
561 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
563 RequestReferences referencesResponse = new RequestReferences();
565 referencesResponse.setRequestId(requestId);
567 serviceResponse.setRequestReferences(referencesResponse);
569 CatalogDatabase db = null;
571 db = CatalogDatabase.getInstance();
572 } catch (Exception e) {
573 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
574 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
575 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
576 MsoException.ServiceException,
577 "No communication to catalog DB " + e.getMessage (),
578 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
580 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
581 MsoAlarmLogger.CRITICAL,
582 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
583 msoRequest.createRequestRecord (Status.FAILED,action);
584 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
585 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
589 RecipeLookupResult recipeLookupResult = null;
591 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
592 } catch (ValidationException e) {
593 msoLogger.debug ("Validation failed: ", e);
594 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
595 "Error validating request. " + e.getMessage(),
596 ErrorNumbers.SVC_BAD_PARAMETER, null);
597 if (msoRequest.getRequestId () != null) {
598 msoLogger.debug ("Logging failed message to the database");
599 msoRequest.createRequestRecord (Status.FAILED, action);
601 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
602 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
603 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
605 } catch (Exception e) {
606 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
607 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
608 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
609 MsoException.ServiceException,
610 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
611 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
613 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
614 MsoAlarmLogger.CRITICAL,
615 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
616 msoRequest.createRequestRecord (Status.FAILED,action);
617 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
618 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
623 if (recipeLookupResult == null) {
624 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
625 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
626 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
627 MsoException.ServiceException,
628 "Recipe does not exist in catalog DB",
629 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
631 msoRequest.createRequestRecord (Status.FAILED, action);
632 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
633 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
639 Boolean isBaseVfModule = false;
641 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
642 action == Action.inPlaceSoftwareUpdate)) {
646 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
647 modelType = ModelType.vnf;
650 modelType = msoRequest.getModelInfo().getModelType();
653 if (modelType.equals(ModelType.vfModule)) {
654 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
656 // Get VF Module-specific base module indicator
659 String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
661 if(modelVersionId != null) {
662 vfm = db.getVfModuleByModelUuid(modelVersionId);
664 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
668 if (vfm.getIsBase() == 1) {
669 isBaseVfModule = true;
672 else if (action == Action.createInstance || action == Action.updateInstance){
673 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
674 // This request cannot proceed
675 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
676 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
677 String serviceVersionText = "";
678 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
679 serviceVersionText = " with version " + asdcServiceModelVersion;
681 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
682 MsoException.ServiceException,
683 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
684 ErrorNumbers.SVC_BAD_PARAMETER,
686 msoRequest.createRequestRecord (Status.FAILED, action);
687 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
688 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
695 msoLogger.debug ("requestId is: " + msoRequest.getRequestId());
696 msoLogger.debug ("About to insert a record");
699 createRequestRecord(action, startTime, msoRequest);
700 } catch(Exception e) {
701 msoLogger.debug("Exception occurred while creating record in DB", e);
702 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
703 MsoException.ServiceException,
704 "Exception while creating record in DB " + e.getMessage(),
705 ErrorNumbers.SVC_BAD_PARAMETER,
707 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
711 return postBPELRequest(action, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(),
712 recipeLookupResult.getRecipeTimeout(), isBaseVfModule);
715 private RequestClientParamater buildRequestClientParameter(MsoRequest msoRequest, boolean isBaseVfModule,
716 int timeOut, String requestAction) throws IOException {
717 return new RequestClientParamater.Builder().
718 setRequestId(msoRequest.getRequestId()).
719 setBaseVfModule(isBaseVfModule).setRecipeTimeout(timeOut).
720 setRequestAction(requestAction).
721 setServiceInstanceId(msoRequest.getServiceInstancesRequest().getServiceInstanceId()).
722 setCorrelationId(msoRequest.getServiceInstancesRequest().getCorrelationId()).
723 setVnfId(msoRequest.getServiceInstancesRequest().getVnfInstanceId()).
724 setVfModuleId(msoRequest.getServiceInstancesRequest().getVfModuleInstanceId()).
725 setVolumeGroupId(msoRequest.getServiceInstancesRequest().getVolumeGroupInstanceId()).
726 setNetworkId(msoRequest.getServiceInstancesRequest().getNetworkInstanceId()).
727 setConfigurationId(msoRequest.getServiceInstancesRequest().getConfigurationId()).
728 setServiceType(msoRequest.getServiceInstanceType()).
729 setVnfType(msoRequest.getVnfType()).
730 setVfModuleType(msoRequest.getVfModuleType()).
731 setNetworkType(msoRequest.getNetworkType()).
732 setRequestDetails(msoRequest.getRequestJSON()).build();
735 private Response postBPELRequest(Action action, long startTime, MsoRequest msoRequest,
736 String orchestrationUri, int timeOut, Boolean isBaseVfModule) {
737 RequestClient requestClient = null;
738 HttpResponse response = null;
739 long subStartTime = System.currentTimeMillis();
741 requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
742 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
744 System.out.println("URL : " + requestClient.getUrl ());
746 response = requestClient.post(buildRequestClientParameter(msoRequest, isBaseVfModule, timeOut, action.name()));
747 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
748 } catch (Exception e) {
749 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
750 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
751 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
752 MsoException.ServiceException,
753 "Failed calling bpmn " + e.getMessage (),
754 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
756 alarmLogger.sendAlarm ("MsoConfigurationError",
757 MsoAlarmLogger.CRITICAL,
758 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
759 msoRequest.updateFinalStatus (Status.FAILED);
760 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
761 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
762 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
766 if (response == null) {
767 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
768 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
769 MsoException.ServiceException,
770 "bpelResponse is null",
771 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
773 msoRequest.updateFinalStatus (Status.FAILED);
774 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
775 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
776 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
780 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
781 int bpelStatus = respHandler.getStatus ();
783 // BPEL accepted the request, the request is in progress
784 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
785 String camundaJSONResponseBody = respHandler.getContent();
786 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
787 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
788 (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
789 Status.IN_PROGRESS.toString (),
790 Constants.PROGRESS_REQUEST_IN_PROGRESS,
791 Constants.MODIFIED_BY_APIHANDLER);
792 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
793 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
794 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
796 List<String> variables = new ArrayList<>();
797 variables.add(bpelStatus + "");
798 String camundaJSONResponseBody = respHandler.getContent();
799 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
800 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
801 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
802 MsoException.ServiceException,
803 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
804 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
806 msoRequest.updateFinalStatus (Status.FAILED);
807 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
808 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
809 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
812 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
813 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
814 MsoException.ServiceException,
815 "Request Failed due to BPEL error with HTTP Status= %1" ,
816 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
818 msoRequest.updateFinalStatus (Status.FAILED);
819 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
820 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
821 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
827 private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
829 msoRequest.createRequestRecord (Status.PENDING, action);
830 } catch (Exception e) {
831 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
832 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
833 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
834 throw new Exception(e);
838 private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
839 String instanceName, String requestScope, InfraActiveRequests dup) {
841 // Found the duplicate record. Return the appropriate error.
842 String instance = null;
843 if(instanceName != null){
844 instance = instanceName;
846 instance = instanceIdMap.get(requestScope + "InstanceId");
848 String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") " + "already has a request being worked with a status of " + dup.getRequestStatus() + " (RequestId - " + dup.getRequestId() + "). The existing request must finish or be cleaned up before proceeding.";
849 //List<String> variables = new ArrayList<String>();
850 //variables.add(dup.getRequestStatus());
852 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
854 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
858 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
859 msoRequest.createRequestRecord (Status.FAILED, action);
860 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
861 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
865 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
866 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
867 InfraActiveRequests dup = null;
869 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
870 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
872 } catch (Exception e) {
873 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
874 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
875 throw new Exception(e);
880 private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
881 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
883 msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
884 } catch (Exception e) {
885 msoLogger.debug ("Validation failed: ", e);
886 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
887 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
888 throw new Exception(e);
892 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
893 MsoRequest msoRequest) throws Exception {
895 ObjectMapper mapper = new ObjectMapper();
896 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
897 } catch(Exception e){
898 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
899 if (msoRequest.getRequestId () != null) {
900 msoLogger.debug ("Mapping of request to JSON object failed");
901 msoRequest.createRequestRecord (Status.FAILED, action);
903 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
904 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
905 throw new Exception(e);
909 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
910 RecipeLookupResult recipeLookupResult = null;
911 //if the aLaCarte flag is set to TRUE, the API-H should choose the “VID_DEFAULTâ€
\9d recipe for the requested action
913 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
914 // Query MSO Catalog DB
916 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
917 recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
919 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
920 recipeLookupResult = getServiceURI(db, msoRequest, action);
922 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
923 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
925 recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
927 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
929 recipeLookupResult = getNetworkUri(db, msoRequest, action);
932 if (recipeLookupResult != null) {
933 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
936 msoLogger.debug("No matching recipe record found");
938 return recipeLookupResult;
942 private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
944 // Construct the default service name
945 // TODO need to make this a configurable property
946 String defaultServiceModelName = "*";
947 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
949 Service serviceRecord;
950 ModelInfo modelInfo = msoRequest.getModelInfo();
951 if(msoRequest.getALaCarteFlag()){
952 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
953 if (serviceRecord == null) {
954 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
957 serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
958 if(serviceRecord == null) {
959 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
963 ServiceRecipe recipe = null;
964 if(serviceRecord !=null){
965 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
967 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
968 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
969 if(reqParam!=null && reqParam.isaLaCarte()!=null && reqParam.isaLaCarte() && recipe==null){
971 } else if (recipe==null) {
972 //aLaCarte wasn't sent, so we'll try the default
973 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
974 if (serviceRecord == null) {
975 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
977 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
980 if(modelInfo.getModelVersionId() == null) {
981 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
986 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
990 private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
992 ModelInfo modelInfo = msoRequest.getModelInfo();
993 String vnfComponentType = modelInfo.getModelType().name();
995 RelatedInstanceList[] instanceList = null;
996 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
997 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
1000 Recipe recipe = null;
1001 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1002 String modelCustomizationId = modelInfo.getModelCustomizationId();
1003 String modelCustomizationName = modelInfo.getModelCustomizationName();
1004 String relatedInstanceModelVersionId = null;
1005 String relatedInstanceModelInvariantId = null;
1006 String relatedInstanceVersion = null;
1007 String relatedInstanceModelCustomizationName = null;
1009 if (instanceList != null) {
1011 for(RelatedInstanceList relatedInstanceList : instanceList){
1013 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1014 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1015 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1016 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1017 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1020 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1021 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1022 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1023 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1024 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1028 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1029 // a. For a vnf request (only create, no update currently):
1030 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1031 // 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
1032 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1033 // to “joinâ€
\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1034 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1035 // (MODEL_UUID) in SERVICE table.
1036 // 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
1037 // during 1707 data migration if VID did not provide it originally on request.
1038 // iv. Note: continue to construct the “vnf-typeâ€
\9d value and pass to BPMN (must still be populated in A&AI).
1039 // 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.
1041 VnfResource vnfResource = null;
1042 VnfResourceCustomization vrc;
1043 // Validation for vnfResource
1045 if(modelCustomizationId!=null) {
1046 vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
1048 Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
1049 if(service == null) {
1050 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
1053 if(service == null) {
1054 throw new ValidationException("service in relatedInstance");
1057 vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1059 vnfResource = vrc.getVnfResource();
1060 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1061 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1065 if(vnfResource==null){
1066 throw new ValidationException("catalog entry");
1068 if(modelInfo.getModelVersionId() == null) {
1069 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1073 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1075 if (vnfRecipe == null) {
1079 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1081 // 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
1082 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName
1083 // to “joinâ€
\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1084 // **If relatedInstance.modelInfo[vnf].modelVersionId was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead
1085 // to lookup modelVersionId (MODEL_UUID) in vnf_resource table. Once the vnf’s model_customization_uuid has been obtained, use it to find all vfModule customizations
1086 // for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. For each vf_module_cust_model_customization_uuid value returned,
1087 // use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data
1088 // (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not
1089 // provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found
1090 // 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)
1091 // and MODEL_VERSION (modelVersion).
1093 VfModuleCustomization vfmc = null;
1094 VnfResourceCustomization vnfrc;
1095 VfModule vfModule = null;
1097 if( modelInfo.getModelCustomizationId() != null) {
1098 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1100 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1102 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1105 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1107 String vfModuleModelUUID = modelInfo.getModelVersionId();
1108 for(VfModuleCustomization vf : list) {
1109 if(vfModuleModelUUID != null) {
1110 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1112 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1115 if(vfModule != null) {
1116 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1117 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1123 if(vfmc == null && vfModule == null) {
1124 throw new ValidationException("no catalog entry found");
1125 } else if (vfModule == null && vfmc != null) {
1126 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1129 if(modelInfo.getModelVersionId() == null) {
1130 modelInfo.setModelVersionId(vfModule.getModelUUID());
1132 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1134 if(recipe == null) {
1135 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1136 if (recipe == null) {
1137 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1140 if(recipe == null) {
1146 msoLogger.debug("recipe is null, getting default");
1148 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1149 recipe = db.getVnfRecipe(defaultSource, action.name());
1150 if (recipe == null) {
1154 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1156 if (recipe == null) {
1162 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1165 private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1167 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1169 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1171 if (vnfRecipe == null) {
1175 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1178 private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1180 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1182 ModelInfo modelInfo = msoRequest.getModelInfo();
1183 String modelName = modelInfo.getModelName();
1184 Recipe recipe = null;
1186 if(modelInfo.getModelCustomizationId()!=null){
1187 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1188 if(networkResource!=null){
1189 if(modelInfo.getModelVersionId() == null) {
1190 modelInfo.setModelVersionId(networkResource.getModelUUID());
1192 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1194 throw new ValidationException("no catalog entry found");
1197 //ok for version < 3 and action delete
1198 recipe = db.getNetworkRecipe(modelName, action.name());
1202 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1205 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1208 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1209 String requestId = UUIDChecker.generateUUID(msoLogger);
1210 long startTime = System.currentTimeMillis ();
1211 msoLogger.debug ("requestId is: " + requestId);
1212 ServiceInstancesRequest sir = null;
1213 MsoRequest msoRequest = new MsoRequest (requestId);
1216 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
1217 } catch(Exception e) {
1218 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1219 "Mapping of request to JSON object failed. " + e.getMessage(),
1220 ErrorNumbers.SVC_BAD_PARAMETER, null);
1221 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1226 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1227 } catch(Exception e) {
1228 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1229 "Error parsing request. " + e.getMessage(),
1230 ErrorNumbers.SVC_BAD_PARAMETER, null);
1231 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1235 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1236 String requestScope;
1237 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1238 requestScope = (ModelType.vnf.name());
1240 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1242 InfraActiveRequests dup = null;
1245 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1246 } catch(Exception e) {
1247 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1249 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1251 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1256 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1259 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1260 RequestReferences referencesResponse = new RequestReferences();
1261 referencesResponse.setRequestId(requestId);
1262 serviceResponse.setRequestReferences(referencesResponse);
1264 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1265 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1266 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1268 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1269 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1271 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "",
1272 MsoLogger.ErrorCode.DataError, error);
1273 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1274 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1275 MsoException.ServiceException,
1277 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1279 msoRequest.createRequestRecord (Status.FAILED, action);
1280 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1281 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1286 requestId = msoRequest.getRequestId ();
1287 msoLogger.debug ("requestId is: " + requestId);
1288 msoLogger.debug ("About to insert a record");
1291 createRequestRecord(action, startTime, msoRequest);
1292 } catch(Exception e) {
1293 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1294 MsoException.ServiceException,
1295 "Exception while creating record in DB " + e.getMessage(),
1296 ErrorNumbers.SVC_BAD_PARAMETER,
1298 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1302 return postBPELRequest(action, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false);