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.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
27 import javax.ws.rs.Consumes;
28 import javax.ws.rs.DELETE;
29 import javax.ws.rs.POST;
30 import javax.ws.rs.PUT;
31 import javax.ws.rs.Path;
32 import javax.ws.rs.PathParam;
33 import javax.ws.rs.Produces;
34 import javax.ws.rs.core.MediaType;
35 import javax.ws.rs.core.Response;
37 import org.apache.commons.lang.StringUtils;
38 import org.apache.http.HttpResponse;
39 import org.apache.http.HttpStatus;
40 import com.fasterxml.jackson.databind.ObjectMapper;
41 import org.openecomp.mso.apihandler.common.CommonConstants;
42 import org.openecomp.mso.apihandler.common.ErrorNumbers;
43 import org.openecomp.mso.apihandler.common.RequestClient;
44 import org.openecomp.mso.apihandler.common.RequestClientFactory;
45 import org.openecomp.mso.apihandler.common.ResponseHandler;
46 import org.openecomp.mso.apihandler.common.ValidationException;
47 import org.openecomp.mso.serviceinstancebeans.ModelInfo;
48 import org.openecomp.mso.serviceinstancebeans.ModelType;
49 import org.openecomp.mso.serviceinstancebeans.RelatedInstance;
50 import org.openecomp.mso.serviceinstancebeans.RelatedInstanceList;
51 import org.openecomp.mso.serviceinstancebeans.RequestParameters;
52 import org.openecomp.mso.serviceinstancebeans.RequestReferences;
53 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesRequest;
54 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesResponse;
55 import org.openecomp.mso.db.catalog.CatalogDatabase;
56 import org.openecomp.mso.db.catalog.beans.NetworkResource;
57 import org.openecomp.mso.db.catalog.beans.Recipe;
58 import org.openecomp.mso.db.catalog.beans.Service;
59 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
60 import org.openecomp.mso.db.catalog.beans.VfModule;
61 import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
62 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
63 import org.openecomp.mso.db.catalog.beans.VnfResource;
64 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
65 import org.openecomp.mso.logger.MessageEnum;
66 import org.openecomp.mso.logger.MsoAlarmLogger;
67 import org.openecomp.mso.logger.MsoLogger;
68 import org.openecomp.mso.properties.MsoJavaProperties;
69 import org.openecomp.mso.requestsdb.InfraActiveRequests;
70 import org.openecomp.mso.requestsdb.RequestsDatabase;
71 import org.openecomp.mso.utils.UUIDChecker;
73 import com.wordnik.swagger.annotations.Api;
74 import com.wordnik.swagger.annotations.ApiOperation;
76 @Path("/serviceInstances")
77 @Api(value="/serviceInstances",description="API Requests for Service Instances")
78 public class ServiceInstances {
80 private HashMap<String, String> instanceIdMap = new HashMap<>();
81 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
82 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
85 @Path("/{version:[vV][4-6]}")
86 @Consumes(MediaType.APPLICATION_JSON)
87 @Produces(MediaType.APPLICATION_JSON)
88 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
89 public Response createServiceInstance(String request, @PathParam("version") String version) {
91 Response response = serviceInstances(request, Action.createInstance, null, version);
97 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/activate")
98 @Consumes(MediaType.APPLICATION_JSON)
99 @Produces(MediaType.APPLICATION_JSON)
100 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
101 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
102 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
103 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
104 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
110 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/deactivate")
111 @Consumes(MediaType.APPLICATION_JSON)
112 @Produces(MediaType.APPLICATION_JSON)
113 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
114 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
115 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
116 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
117 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
123 @Path("/{version:[vV][4-6]}/{serviceInstanceId}")
124 @Consumes(MediaType.APPLICATION_JSON)
125 @Produces(MediaType.APPLICATION_JSON)
126 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
127 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
128 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
129 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
130 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
135 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations")
136 @Consumes(MediaType.APPLICATION_JSON)
137 @Produces(MediaType.APPLICATION_JSON)
138 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
139 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
140 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
141 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
142 Response response = configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version);
148 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}")
149 @Consumes(MediaType.APPLICATION_JSON)
150 @Produces(MediaType.APPLICATION_JSON)
151 @ApiOperation(value="Delete provided Port",response=Response.class)
152 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
153 @PathParam("configurationInstanceId") String configurationInstanceId) {
154 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
155 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
156 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
157 Response response = configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version);
162 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
163 @Consumes(MediaType.APPLICATION_JSON)
164 @Produces(MediaType.APPLICATION_JSON)
165 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
166 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
167 @PathParam("configurationInstanceId") String configurationInstanceId) {
168 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
169 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
170 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
171 Response response = configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version);
177 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
178 @Consumes(MediaType.APPLICATION_JSON)
179 @Produces(MediaType.APPLICATION_JSON)
180 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
181 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
182 @PathParam("configurationInstanceId") String configurationInstanceId) {
183 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
184 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
185 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
186 Response response = configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version);
192 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
193 @Consumes(MediaType.APPLICATION_JSON)
194 @Produces(MediaType.APPLICATION_JSON)
195 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
196 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
197 @PathParam("configurationInstanceId") String configurationInstanceId) {
198 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
199 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
200 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
201 Response response = configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version);
207 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
208 @Consumes(MediaType.APPLICATION_JSON)
209 @Produces(MediaType.APPLICATION_JSON)
210 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
211 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
212 @PathParam("configurationInstanceId") String configurationInstanceId) {
213 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
214 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
215 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
216 Response response = configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version);
222 @Path("/{version:[vV][6]}/{serviceInstanceId}/addRelationships")
223 @Consumes(MediaType.APPLICATION_JSON)
224 @Produces(MediaType.APPLICATION_JSON)
225 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
226 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
227 msoLogger.debug ("version is: " + version);
228 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
229 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
230 Response response = configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version);
236 @Path("/{version:[vV][6]}/{serviceInstanceId}/removeRelationships")
237 @Consumes(MediaType.APPLICATION_JSON)
238 @Produces(MediaType.APPLICATION_JSON)
239 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
240 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
241 msoLogger.debug ("version is: " + version);
242 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
243 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
244 Response response = configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version);
250 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs")
251 @Consumes(MediaType.APPLICATION_JSON)
252 @Produces(MediaType.APPLICATION_JSON)
253 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
254 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
255 msoLogger.debug ("version is: " + version);
256 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
257 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
258 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
264 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
265 @Consumes(MediaType.APPLICATION_JSON)
266 @Produces(MediaType.APPLICATION_JSON)
267 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
268 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
269 @PathParam("vnfInstanceId") String vnfInstanceId) {
270 msoLogger.debug ("version is: " + version);
271 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
272 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
273 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
274 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
280 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
281 @Consumes(MediaType.APPLICATION_JSON)
282 @Produces(MediaType.APPLICATION_JSON)
283 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
284 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
285 @PathParam("vnfInstanceId") String vnfInstanceId) {
286 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
287 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
288 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
289 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
295 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
296 @Consumes(MediaType.APPLICATION_JSON)
297 @Produces(MediaType.APPLICATION_JSON)
298 @ApiOperation(value="Apply updated configuration",response=Response.class)
299 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
300 @PathParam("vnfInstanceId") String vnfInstanceId) {
301 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
302 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
303 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
304 Response response = serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version);
311 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
312 @Consumes(MediaType.APPLICATION_JSON)
313 @Produces(MediaType.APPLICATION_JSON)
314 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
315 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
316 @PathParam("vnfInstanceId") String vnfInstanceId) {
317 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
318 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
320 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
326 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
327 @Consumes(MediaType.APPLICATION_JSON)
328 @Produces(MediaType.APPLICATION_JSON)
329 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
330 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
331 @PathParam("vnfInstanceId") String vnfInstanceId) {
332 msoLogger.debug ("version is: " + version);
333 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
334 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
335 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
336 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
342 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
343 @Consumes(MediaType.APPLICATION_JSON)
344 @Produces(MediaType.APPLICATION_JSON)
345 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
346 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
347 @PathParam("vnfInstanceId") String vnfInstanceId,
348 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
349 msoLogger.debug ("version is: " + version);
350 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
351 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
352 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
353 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
354 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
360 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
361 @Consumes(MediaType.APPLICATION_JSON)
362 @Produces(MediaType.APPLICATION_JSON)
363 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
364 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
365 @PathParam("vnfInstanceId") String vnfInstanceId,
366 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
367 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
368 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
369 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
370 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
371 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
377 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
378 @Consumes(MediaType.APPLICATION_JSON)
379 @Produces(MediaType.APPLICATION_JSON)
380 @ApiOperation(value="Perform VNF software update",response=Response.class)
381 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
382 @PathParam("vnfInstanceId") String vnfInstanceId) {
383 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
384 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
385 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
386 Response response = serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version);
392 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
393 @Consumes(MediaType.APPLICATION_JSON)
394 @Produces(MediaType.APPLICATION_JSON)
395 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
396 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
397 @PathParam("vnfInstanceId") String vnfInstanceId,
398 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
399 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
400 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
401 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
402 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
403 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
410 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
411 @Consumes(MediaType.APPLICATION_JSON)
412 @Produces(MediaType.APPLICATION_JSON)
413 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
414 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
415 @PathParam("vnfInstanceId") String vnfInstanceId) {
416 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
417 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
418 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
419 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
425 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
426 @Consumes(MediaType.APPLICATION_JSON)
427 @Produces(MediaType.APPLICATION_JSON)
428 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
429 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
430 @PathParam("vnfInstanceId") String vnfInstanceId,
431 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
432 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
433 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
434 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
435 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
436 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
442 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
443 @Consumes(MediaType.APPLICATION_JSON)
444 @Produces(MediaType.APPLICATION_JSON)
445 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
446 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
447 @PathParam("vnfInstanceId") String vnfInstanceId,
448 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
449 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
450 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
451 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
452 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
453 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
459 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks")
460 @Consumes(MediaType.APPLICATION_JSON)
461 @Produces(MediaType.APPLICATION_JSON)
462 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
463 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
464 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
465 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
466 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
472 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
473 @Consumes(MediaType.APPLICATION_JSON)
474 @Produces(MediaType.APPLICATION_JSON)
475 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
476 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
477 @PathParam("networkInstanceId") String networkInstanceId) {
478 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
479 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
480 instanceIdMap.put("networkInstanceId", networkInstanceId);
481 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
487 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
488 @Consumes(MediaType.APPLICATION_JSON)
489 @Produces(MediaType.APPLICATION_JSON)
490 @ApiOperation(value="Delete provided Network instance",response=Response.class)
491 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
492 @PathParam("networkInstanceId") String networkInstanceId) {
493 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
494 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
495 instanceIdMap.put("networkInstanceId", networkInstanceId);
496 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
501 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
503 String requestId = UUIDChecker.generateUUID(msoLogger);
504 long startTime = System.currentTimeMillis ();
505 msoLogger.debug ("requestId is: " + requestId);
506 ServiceInstancesRequest sir = null;
508 MsoRequest msoRequest = new MsoRequest (requestId);
511 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest);
512 } catch(Exception e) {
513 msoLogger.debug("Exception occurred while mapping of request to JSON object ", e);
514 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
515 "Mapping of request to JSON object failed. " + e.getMessage(),
516 ErrorNumbers.SVC_BAD_PARAMETER, null);
517 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
522 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
523 } catch(Exception e) {
524 msoLogger.debug("Exception occurred while logging ", e);
525 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
526 "Error parsing request. " + e.getMessage(),
527 ErrorNumbers.SVC_BAD_PARAMETER, null);
528 if (msoRequest.getRequestId () != null) {
529 msoLogger.debug ("Logging failed message to the database");
530 msoRequest.createRequestRecord (Status.FAILED, action);
532 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
536 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
538 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
539 requestScope = (ModelType.vnf.name());
541 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
543 InfraActiveRequests dup = null;
546 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
547 } catch(Exception e) {
548 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
550 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
552 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
557 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
560 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
562 RequestReferences referencesResponse = new RequestReferences();
564 referencesResponse.setRequestId(requestId);
566 serviceResponse.setRequestReferences(referencesResponse);
568 CatalogDatabase db = null;
570 db = CatalogDatabase.getInstance();
571 } catch (Exception e) {
572 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
573 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
574 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
575 MsoException.ServiceException,
576 "No communication to catalog DB " + e.getMessage (),
577 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
579 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
580 MsoAlarmLogger.CRITICAL,
581 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
582 msoRequest.createRequestRecord (Status.FAILED,action);
583 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
584 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
588 RecipeLookupResult recipeLookupResult = null;
590 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
591 } catch (ValidationException e) {
592 msoLogger.debug ("Validation failed: ", e);
593 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
594 "Error validating request. " + e.getMessage(),
595 ErrorNumbers.SVC_BAD_PARAMETER, null);
596 if (msoRequest.getRequestId () != null) {
597 msoLogger.debug ("Logging failed message to the database");
598 msoRequest.createRequestRecord (Status.FAILED, action);
600 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
601 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
602 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
604 } catch (Exception e) {
605 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
606 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
607 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
608 MsoException.ServiceException,
609 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
610 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
612 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
613 MsoAlarmLogger.CRITICAL,
614 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
615 msoRequest.createRequestRecord (Status.FAILED,action);
616 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
617 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
622 if (recipeLookupResult == null) {
623 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
624 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
625 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
626 MsoException.ServiceException,
627 "Recipe does not exist in catalog DB",
628 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
630 msoRequest.createRequestRecord (Status.FAILED, action);
631 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
632 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
638 Boolean isBaseVfModule = false;
640 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
641 action == Action.inPlaceSoftwareUpdate)) {
645 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
646 modelType = ModelType.vnf;
649 modelType = msoRequest.getModelInfo().getModelType();
652 if (modelType.equals(ModelType.vfModule)) {
653 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
655 // Get VF Module-specific base module indicator
658 String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
660 if(modelVersionId != null) {
661 vfm = db.getVfModuleByModelUuid(modelVersionId);
663 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
667 if (vfm.getIsBase() == 1) {
668 isBaseVfModule = true;
671 else if (action == Action.createInstance || action == Action.updateInstance){
672 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
673 // This request cannot proceed
674 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
675 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
676 String serviceVersionText = "";
677 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
678 serviceVersionText = " with version " + asdcServiceModelVersion;
680 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
681 MsoException.ServiceException,
682 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
683 ErrorNumbers.SVC_BAD_PARAMETER,
685 msoRequest.createRequestRecord (Status.FAILED, action);
686 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
687 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
695 String serviceInstanceId = "";
697 String vfModuleId = "";
698 String volumeGroupId = "";
699 String networkId = "";
700 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
702 if(siReq.getServiceInstanceId () != null){
703 serviceInstanceId = siReq.getServiceInstanceId ();
706 if(siReq.getVnfInstanceId () != null){
707 vnfId = siReq.getVnfInstanceId ();
710 if(siReq.getVfModuleInstanceId () != null){
711 vfModuleId = siReq.getVfModuleInstanceId ();
714 if(siReq.getVolumeGroupInstanceId () != null){
715 volumeGroupId = siReq.getVolumeGroupInstanceId ();
718 if(siReq.getNetworkInstanceId () != null){
719 networkId = siReq.getNetworkInstanceId ();
723 requestId = msoRequest.getRequestId ();
724 msoLogger.debug ("requestId is: " + requestId);
725 msoLogger.debug ("About to insert a record");
728 createRequestRecord(action, startTime, msoRequest);
729 } catch(Exception e) {
730 msoLogger.debug("Exception occurred while creating record in DB", e);
731 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
732 MsoException.ServiceException,
733 "Exception while creating record in DB " + e.getMessage(),
734 ErrorNumbers.SVC_BAD_PARAMETER,
736 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
740 return postBPELRequest(action, requestId, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
741 isBaseVfModule, serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, null,
742 msoRequest.getServiceInstanceType(), msoRequest.getVnfType(), msoRequest.getVfModuleType(), msoRequest.getNetworkType());
745 private Response postBPELRequest(Action action, String requestId, long startTime, MsoRequest msoRequest,
746 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
747 String serviceInstanceId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
748 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType) {
749 RequestClient requestClient = null;
750 HttpResponse response = null;
751 long subStartTime = System.currentTimeMillis();
753 requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
754 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
756 System.out.println("URL : " + requestClient.getUrl ());
758 response = requestClient.post(requestId, isBaseVfModule, timeOut, action.name (),
759 serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, configurationId,
760 msoRequest.getServiceInstanceType (),
761 msoRequest.getVnfType (), msoRequest.getVfModuleType (),
762 msoRequest.getNetworkType (), msoRequest.getRequestJSON(), null);
764 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
765 } catch (Exception e) {
766 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
767 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
768 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
769 MsoException.ServiceException,
770 "Failed calling bpmn " + e.getMessage (),
771 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
773 alarmLogger.sendAlarm ("MsoConfigurationError",
774 MsoAlarmLogger.CRITICAL,
775 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
776 msoRequest.updateFinalStatus (Status.FAILED);
777 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
778 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
779 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
783 if (response == null) {
784 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
785 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
786 MsoException.ServiceException,
787 "bpelResponse is null",
788 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
790 msoRequest.updateFinalStatus (Status.FAILED);
791 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
792 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
793 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
797 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
798 int bpelStatus = respHandler.getStatus ();
800 // BPEL accepted the request, the request is in progress
801 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
802 String camundaJSONResponseBody = respHandler.getResponseBody ();
803 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
804 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
805 (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
806 Status.IN_PROGRESS.toString (),
807 Constants.PROGRESS_REQUEST_IN_PROGRESS,
808 Constants.MODIFIED_BY_APIHANDLER);
809 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
810 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
811 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
813 List<String> variables = new ArrayList<>();
814 variables.add(bpelStatus + "");
815 String camundaJSONResponseBody = respHandler.getResponseBody ();
816 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
817 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
818 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
819 MsoException.ServiceException,
820 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
821 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
823 msoRequest.updateFinalStatus (Status.FAILED);
824 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
825 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
826 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
829 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
830 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
831 MsoException.ServiceException,
832 "Request Failed due to BPEL error with HTTP Status= %1" ,
833 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
835 msoRequest.updateFinalStatus (Status.FAILED);
836 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
837 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
838 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
844 private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
846 msoRequest.createRequestRecord (Status.PENDING, action);
847 } catch (Exception e) {
848 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
849 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
850 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
851 throw new Exception(e);
855 private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
856 String instanceName, String requestScope, InfraActiveRequests dup) {
858 // Found the duplicate record. Return the appropriate error.
859 String instance = null;
860 if(instanceName != null){
861 instance = instanceName;
863 instance = instanceIdMap.get(requestScope + "InstanceId");
865 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.";
866 //List<String> variables = new ArrayList<String>();
867 //variables.add(dup.getRequestStatus());
869 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
871 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
875 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
876 msoRequest.createRequestRecord (Status.FAILED, action);
877 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
878 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
882 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
883 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
884 InfraActiveRequests dup = null;
886 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
887 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
889 } catch (Exception e) {
890 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
891 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
892 throw new Exception(e);
897 private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
898 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
900 msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
901 } catch (Exception e) {
902 msoLogger.debug ("Validation failed: ", e);
903 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
904 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
905 throw new Exception(e);
909 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
910 ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
912 ObjectMapper mapper = new ObjectMapper();
913 sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
915 } catch(Exception e){
916 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
917 if (msoRequest.getRequestId () != null) {
918 msoLogger.debug ("Mapping of request to JSON object failed");
919 msoRequest.createRequestRecord (Status.FAILED, action);
921 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
922 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
923 throw new Exception(e);
928 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
929 RecipeLookupResult recipeLookupResult = null;
930 //if the aLaCarte flag is set to TRUE, the API-H should choose the “VID_DEFAULTâ€
\9d recipe for the requested action
932 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
933 // Query MSO Catalog DB
935 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
936 recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
938 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
939 recipeLookupResult = getServiceURI(db, msoRequest, action);
941 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
942 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
944 recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
946 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
948 recipeLookupResult = getNetworkUri(db, msoRequest, action);
951 if (recipeLookupResult != null) {
952 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
955 msoLogger.debug("No matching recipe record found");
957 return recipeLookupResult;
961 private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
963 // Construct the default service name
964 // TODO need to make this a configurable property
965 String defaultServiceModelName = "*";
966 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
968 Service serviceRecord;
969 ModelInfo modelInfo = msoRequest.getModelInfo();
970 if(msoRequest.getALaCarteFlag()){
971 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
972 if (serviceRecord == null) {
973 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
976 serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
977 if(serviceRecord == null) {
978 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
982 ServiceRecipe recipe = null;
983 if(serviceRecord !=null){
984 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
986 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
987 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
988 if(reqParam!=null && reqParam.isaLaCarte() && recipe==null){
992 //aLaCarte wasn't sent, so we'll try the default
993 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
994 if (serviceRecord == null) {
995 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
998 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
999 if(modelInfo.getModelVersionId() == null) {
1000 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1005 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1009 private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1011 ModelInfo modelInfo = msoRequest.getModelInfo();
1012 String vnfComponentType = modelInfo.getModelType().name();
1014 RelatedInstanceList[] instanceList = null;
1015 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
1016 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
1019 Recipe recipe = null;
1020 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1021 String modelCustomizationId = modelInfo.getModelCustomizationId();
1022 String modelCustomizationName = modelInfo.getModelCustomizationName();
1023 String relatedInstanceModelVersionId = null;
1024 String relatedInstanceModelInvariantId = null;
1025 String relatedInstanceVersion = null;
1026 String relatedInstanceModelCustomizationName = null;
1028 if (instanceList != null) {
1030 for(RelatedInstanceList relatedInstanceList : instanceList){
1032 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1033 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1034 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1035 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1036 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1039 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1040 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1041 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1042 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1043 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1047 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1048 // a. For a vnf request (only create, no update currently):
1049 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1050 // 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
1051 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1052 // to “joinâ€
\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1053 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1054 // (MODEL_UUID) in SERVICE table.
1055 // 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
1056 // during 1707 data migration if VID did not provide it originally on request.
1057 // iv. Note: continue to construct the “vnf-typeâ€
\9d value and pass to BPMN (must still be populated in A&AI).
1058 // 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.
1060 VnfResource vnfResource = null;
1061 VnfResourceCustomization vrc;
1062 // Validation for vnfResource
1064 if(modelCustomizationId!=null) {
1065 vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
1067 Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
1068 if(service == null) {
1069 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
1072 if(service == null) {
1073 throw new ValidationException("service in relatedInstance");
1076 vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1078 vnfResource = vrc.getVnfResource();
1079 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1080 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1084 if(vnfResource==null){
1085 throw new ValidationException("catalog entry");
1087 if(modelInfo.getModelVersionId() == null) {
1088 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1092 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1094 if (vnfRecipe == null) {
1098 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1100 // 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
1101 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName
1102 // to “joinâ€
\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1103 // **If relatedInstance.modelInfo[vnf].modelVersionId was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead
1104 // 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
1105 // 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,
1106 // use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data
1107 // (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not
1108 // provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found
1109 // 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)
1110 // and MODEL_VERSION (modelVersion).
1112 VfModuleCustomization vfmc = null;
1113 VnfResourceCustomization vnfrc;
1114 VfModule vfModule = null;
1116 if( modelInfo.getModelCustomizationId() != null) {
1117 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1119 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1121 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1124 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1126 String vfModuleModelUUID = modelInfo.getModelVersionId();
1127 for(VfModuleCustomization vf : list) {
1128 if(vfModuleModelUUID != null) {
1129 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1131 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1134 if(vfModule != null) {
1135 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1136 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1142 if(vfmc == null && vfModule == null) {
1143 throw new ValidationException("no catalog entry found");
1144 } else if (vfModule == null && vfmc != null) {
1145 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1148 if(modelInfo.getModelVersionId() == null) {
1149 modelInfo.setModelVersionId(vfModule.getModelUUID());
1151 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1153 if(recipe == null) {
1154 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1155 if (recipe == null) {
1156 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1159 if(recipe == null) {
1165 msoLogger.debug("recipe is null, getting default");
1167 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1168 recipe = db.getVnfRecipe(defaultSource, action.name());
1169 if (recipe == null) {
1173 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1175 if (recipe == null) {
1181 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1184 private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1186 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1188 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1190 if (vnfRecipe == null) {
1194 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1198 private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1200 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1202 ModelInfo modelInfo = msoRequest.getModelInfo();
1203 String modelName = modelInfo.getModelName();
1204 Recipe recipe = null;
1206 if(modelInfo.getModelCustomizationId()!=null){
1207 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1208 if(networkResource!=null){
1209 if(modelInfo.getModelVersionId() == null) {
1210 modelInfo.setModelVersionId(networkResource.getModelUUID());
1212 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1214 throw new ValidationException("no catalog entry found");
1217 //ok for version < 3 and action delete
1218 recipe = db.getNetworkRecipe(modelName, action.name());
1222 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1225 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1228 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1229 String requestId = UUIDChecker.generateUUID(msoLogger);
1230 long startTime = System.currentTimeMillis ();
1231 msoLogger.debug ("requestId is: " + requestId);
1232 ServiceInstancesRequest sir = null;
1233 MsoRequest msoRequest = new MsoRequest (requestId);
1236 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest);
1237 } catch(Exception e) {
1238 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1239 "Mapping of request to JSON object failed. " + e.getMessage(),
1240 ErrorNumbers.SVC_BAD_PARAMETER, null);
1241 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1246 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1247 } catch(Exception e) {
1248 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1249 "Error parsing request. " + e.getMessage(),
1250 ErrorNumbers.SVC_BAD_PARAMETER, null);
1251 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1255 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1256 String requestScope;
1257 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1258 requestScope = (ModelType.vnf.name());
1260 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1262 InfraActiveRequests dup = null;
1265 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1266 } catch(Exception e) {
1267 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1269 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1271 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1276 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1279 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1280 RequestReferences referencesResponse = new RequestReferences();
1281 referencesResponse.setRequestId(requestId);
1282 serviceResponse.setRequestReferences(referencesResponse);
1284 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1285 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1286 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1288 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1289 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1291 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "",
1292 MsoLogger.ErrorCode.DataError, error);
1293 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1294 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1295 MsoException.ServiceException,
1297 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1299 msoRequest.createRequestRecord (Status.FAILED, action);
1300 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1301 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1306 String serviceInstanceId = "";
1307 String configurationId = "";
1308 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
1310 if(siReq.getServiceInstanceId () != null){
1311 serviceInstanceId = siReq.getServiceInstanceId ();
1314 if(siReq.getConfigurationId() != null){
1315 configurationId = siReq.getConfigurationId();
1318 requestId = msoRequest.getRequestId ();
1319 msoLogger.debug ("requestId is: " + requestId);
1320 msoLogger.debug ("About to insert a record");
1323 createRequestRecord(action, startTime, msoRequest);
1324 } catch(Exception e) {
1325 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1326 MsoException.ServiceException,
1327 "Exception while creating record in DB " + e.getMessage(),
1328 ErrorNumbers.SVC_BAD_PARAMETER,
1330 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1334 return postBPELRequest(action, requestId, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false,
1335 serviceInstanceId, null, null, null, null, configurationId, null, null, null, null);