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 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
514 "Mapping of request to JSON object failed. " + e.getMessage(),
515 ErrorNumbers.SVC_BAD_PARAMETER, null);
516 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
521 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
522 } catch(Exception e) {
523 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
524 "Error parsing request. " + e.getMessage(),
525 ErrorNumbers.SVC_BAD_PARAMETER, null);
526 if (msoRequest.getRequestId () != null) {
527 msoLogger.debug ("Logging failed message to the database");
528 msoRequest.createRequestRecord (Status.FAILED, action);
530 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
534 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
536 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
537 requestScope = (ModelType.vnf.name());
539 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
541 InfraActiveRequests dup = null;
544 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
545 } catch(Exception e) {
546 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
548 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
550 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
555 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
558 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
560 RequestReferences referencesResponse = new RequestReferences();
562 referencesResponse.setRequestId(requestId);
564 serviceResponse.setRequestReferences(referencesResponse);
566 CatalogDatabase db = null;
568 db = CatalogDatabase.getInstance();
569 } catch (Exception e) {
570 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
571 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
572 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
573 MsoException.ServiceException,
574 "No communication to catalog DB " + e.getMessage (),
575 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
577 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
578 MsoAlarmLogger.CRITICAL,
579 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
580 msoRequest.createRequestRecord (Status.FAILED,action);
581 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
582 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
586 RecipeLookupResult recipeLookupResult = null;
588 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
589 } catch (ValidationException e) {
590 msoLogger.debug ("Validation failed: ", e);
591 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
592 "Error validating request. " + e.getMessage(),
593 ErrorNumbers.SVC_BAD_PARAMETER, null);
594 if (msoRequest.getRequestId () != null) {
595 msoLogger.debug ("Logging failed message to the database");
596 msoRequest.createRequestRecord (Status.FAILED, action);
598 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
599 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
600 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
602 } catch (Exception e) {
603 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
604 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
605 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
606 MsoException.ServiceException,
607 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
608 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
610 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
611 MsoAlarmLogger.CRITICAL,
612 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
613 msoRequest.createRequestRecord (Status.FAILED,action);
614 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
615 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
620 if (recipeLookupResult == null) {
621 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
622 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
623 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
624 MsoException.ServiceException,
625 "Recipe does not exist in catalog DB",
626 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
628 msoRequest.createRequestRecord (Status.FAILED, action);
629 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
630 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
636 Boolean isBaseVfModule = false;
638 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
639 action == Action.inPlaceSoftwareUpdate)) {
643 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
644 modelType = ModelType.vnf;
647 modelType = msoRequest.getModelInfo().getModelType();
650 if (modelType.equals(ModelType.vfModule)) {
651 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
653 // Get VF Module-specific base module indicator
656 String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
658 if(modelVersionId != null) {
659 vfm = db.getVfModuleByModelUuid(modelVersionId);
661 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
665 if (vfm.getIsBase() == 1) {
666 isBaseVfModule = true;
669 else if (action == Action.createInstance || action == Action.updateInstance){
670 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
671 // This request cannot proceed
672 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
673 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
674 String serviceVersionText = "";
675 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
676 serviceVersionText = " with version " + asdcServiceModelVersion;
678 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
679 MsoException.ServiceException,
680 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
681 ErrorNumbers.SVC_BAD_PARAMETER,
683 msoRequest.createRequestRecord (Status.FAILED, action);
684 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
685 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
693 String serviceInstanceId = "";
695 String vfModuleId = "";
696 String volumeGroupId = "";
697 String networkId = "";
698 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
700 if(siReq.getServiceInstanceId () != null){
701 serviceInstanceId = siReq.getServiceInstanceId ();
704 if(siReq.getVnfInstanceId () != null){
705 vnfId = siReq.getVnfInstanceId ();
708 if(siReq.getVfModuleInstanceId () != null){
709 vfModuleId = siReq.getVfModuleInstanceId ();
712 if(siReq.getVolumeGroupInstanceId () != null){
713 volumeGroupId = siReq.getVolumeGroupInstanceId ();
716 if(siReq.getNetworkInstanceId () != null){
717 networkId = siReq.getNetworkInstanceId ();
721 requestId = msoRequest.getRequestId ();
722 msoLogger.debug ("requestId is: " + requestId);
723 msoLogger.debug ("About to insert a record");
726 createRequestRecord(action, startTime, msoRequest);
727 } catch(Exception e) {
728 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
729 MsoException.ServiceException,
730 "Exception while creating record in DB " + e.getMessage(),
731 ErrorNumbers.SVC_BAD_PARAMETER,
733 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
737 return postBPELRequest(action, requestId, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
738 isBaseVfModule, serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, null,
739 msoRequest.getServiceInstanceType(), msoRequest.getVnfType(), msoRequest.getVfModuleType(), msoRequest.getNetworkType());
742 private Response postBPELRequest(Action action, String requestId, long startTime, MsoRequest msoRequest,
743 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
744 String serviceInstanceId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
745 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType) {
746 RequestClient requestClient = null;
747 HttpResponse response = null;
748 long subStartTime = System.currentTimeMillis();
750 requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
751 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
753 System.out.println("URL : " + requestClient.getUrl ());
755 response = requestClient.post(requestId, isBaseVfModule, timeOut, action.name (),
756 serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, configurationId,
757 msoRequest.getServiceInstanceType (),
758 msoRequest.getVnfType (), msoRequest.getVfModuleType (),
759 msoRequest.getNetworkType (), msoRequest.getRequestJSON(), null);
761 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
762 } catch (Exception e) {
763 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
764 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
765 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
766 MsoException.ServiceException,
767 "Failed calling bpmn " + e.getMessage (),
768 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
770 alarmLogger.sendAlarm ("MsoConfigurationError",
771 MsoAlarmLogger.CRITICAL,
772 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
773 msoRequest.updateFinalStatus (Status.FAILED);
774 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
775 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
776 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
780 if (response == null) {
781 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
782 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
783 MsoException.ServiceException,
784 "bpelResponse is null",
785 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
787 msoRequest.updateFinalStatus (Status.FAILED);
788 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
789 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
790 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
794 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
795 int bpelStatus = respHandler.getStatus ();
797 // BPEL accepted the request, the request is in progress
798 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
799 String camundaJSONResponseBody = respHandler.getResponseBody ();
800 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
801 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
802 (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
803 Status.IN_PROGRESS.toString (),
804 Constants.PROGRESS_REQUEST_IN_PROGRESS,
805 Constants.MODIFIED_BY_APIHANDLER);
806 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
807 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
808 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
810 List<String> variables = new ArrayList<>();
811 variables.add(bpelStatus + "");
812 String camundaJSONResponseBody = respHandler.getResponseBody ();
813 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
814 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
815 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
816 MsoException.ServiceException,
817 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
818 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
820 msoRequest.updateFinalStatus (Status.FAILED);
821 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
822 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
823 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
826 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
827 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
828 MsoException.ServiceException,
829 "Request Failed due to BPEL error with HTTP Status= %1" ,
830 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
832 msoRequest.updateFinalStatus (Status.FAILED);
833 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
834 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
835 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
841 private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
843 msoRequest.createRequestRecord (Status.PENDING, action);
844 } catch (Exception e) {
845 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
846 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
847 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
848 throw new Exception(e);
852 private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
853 String instanceName, String requestScope, InfraActiveRequests dup) {
855 // Found the duplicate record. Return the appropriate error.
856 String instance = null;
857 if(instanceName != null){
858 instance = instanceName;
860 instance = instanceIdMap.get(requestScope + "InstanceId");
862 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.";
863 //List<String> variables = new ArrayList<String>();
864 //variables.add(dup.getRequestStatus());
866 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
868 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
872 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
873 msoRequest.createRequestRecord (Status.FAILED, action);
874 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
875 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
879 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
880 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
881 InfraActiveRequests dup = null;
883 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
884 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
886 } catch (Exception e) {
887 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
888 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
889 throw new Exception(e);
894 private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
895 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
897 msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
898 } catch (Exception e) {
899 msoLogger.debug ("Validation failed: ", e);
900 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
901 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
902 throw new Exception(e);
906 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
907 ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
909 ObjectMapper mapper = new ObjectMapper();
910 sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
912 } catch(Exception e){
913 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
914 if (msoRequest.getRequestId () != null) {
915 msoLogger.debug ("Mapping of request to JSON object failed");
916 msoRequest.createRequestRecord (Status.FAILED, action);
918 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
919 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
920 throw new Exception(e);
925 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
926 RecipeLookupResult recipeLookupResult = null;
927 //if the aLaCarte flag is set to TRUE, the API-H should choose the “VID_DEFAULTâ€
\9d recipe for the requested action
929 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
930 // Query MSO Catalog DB
932 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
933 recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
935 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
936 recipeLookupResult = getServiceURI(db, msoRequest, action);
938 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
939 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
941 recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
943 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
945 recipeLookupResult = getNetworkUri(db, msoRequest, action);
948 if (recipeLookupResult != null) {
949 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
952 msoLogger.debug("No matching recipe record found");
954 return recipeLookupResult;
958 private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
960 // Construct the default service name
961 // TODO need to make this a configurable property
962 String defaultServiceModelName = "*";
963 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
965 Service serviceRecord;
966 ModelInfo modelInfo = msoRequest.getModelInfo();
967 if(msoRequest.getALaCarteFlag()){
968 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
969 if (serviceRecord == null) {
970 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
973 serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
974 if(serviceRecord == null) {
975 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
979 ServiceRecipe recipe = null;
980 if(serviceRecord !=null){
981 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
983 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
984 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
985 if(reqParam!=null && reqParam.isaLaCarte() && recipe==null){
989 //aLaCarte wasn't sent, so we'll try the default
990 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
991 if (serviceRecord == null) {
992 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
995 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
996 if(modelInfo.getModelVersionId() == null) {
997 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1002 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1006 private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1008 ModelInfo modelInfo = msoRequest.getModelInfo();
1009 String vnfComponentType = modelInfo.getModelType().name();
1011 RelatedInstanceList[] instanceList = null;
1012 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
1013 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
1016 Recipe recipe = null;
1017 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1018 String modelCustomizationId = modelInfo.getModelCustomizationId();
1019 String modelCustomizationName = modelInfo.getModelCustomizationName();
1020 String relatedInstanceModelVersionId = null;
1021 String relatedInstanceModelInvariantId = null;
1022 String relatedInstanceVersion = null;
1023 String relatedInstanceModelCustomizationName = null;
1025 if (instanceList != null) {
1027 for(RelatedInstanceList relatedInstanceList : instanceList){
1029 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1030 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1031 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1032 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1033 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1036 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1037 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1038 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1039 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1040 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1044 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1045 // a. For a vnf request (only create, no update currently):
1046 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1047 // 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
1048 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
1049 // to “joinâ€
\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
1050 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
1051 // (MODEL_UUID) in SERVICE table.
1052 // 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
1053 // during 1707 data migration if VID did not provide it originally on request.
1054 // iv. Note: continue to construct the “vnf-typeâ€
\9d value and pass to BPMN (must still be populated in A&AI).
1055 // 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.
1057 VnfResource vnfResource = null;
1058 VnfResourceCustomization vrc;
1059 // Validation for vnfResource
1061 if(modelCustomizationId!=null) {
1062 vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
1064 Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
1065 if(service == null) {
1066 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
1069 if(service == null) {
1070 throw new ValidationException("service in relatedInstance");
1073 vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1075 vnfResource = vrc.getVnfResource();
1076 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1077 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1081 if(vnfResource==null){
1082 throw new ValidationException("catalog entry");
1084 if(modelInfo.getModelVersionId() == null) {
1085 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1089 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1091 if (vnfRecipe == null) {
1095 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1097 // 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
1098 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName
1099 // to “joinâ€
\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1100 // **If relatedInstance.modelInfo[vnf].modelVersionId was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead
1101 // 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
1102 // 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,
1103 // use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data
1104 // (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not
1105 // provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found
1106 // 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)
1107 // and MODEL_VERSION (modelVersion).
1109 VfModuleCustomization vfmc = null;
1110 VnfResourceCustomization vnfrc;
1111 VfModule vfModule = null;
1113 if( modelInfo.getModelCustomizationId() != null) {
1114 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1116 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1118 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1121 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1123 String vfModuleModelUUID = modelInfo.getModelVersionId();
1124 for(VfModuleCustomization vf : list) {
1125 if(vfModuleModelUUID != null) {
1126 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1128 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1131 if(vfModule != null) {
1132 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1133 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1139 if(vfmc == null && vfModule == null) {
1140 throw new ValidationException("no catalog entry found");
1141 } else if (vfModule == null && vfmc != null) {
1142 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1145 if(modelInfo.getModelVersionId() == null) {
1146 modelInfo.setModelVersionId(vfModule.getModelUUID());
1148 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1150 if(recipe == null) {
1151 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1152 if (recipe == null) {
1153 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1156 if(recipe == null) {
1162 msoLogger.debug("recipe is null, getting default");
1164 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1165 recipe = db.getVnfRecipe(defaultSource, action.name());
1166 if (recipe == null) {
1170 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1172 if (recipe == null) {
1178 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1181 private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1183 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1185 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1187 if (vnfRecipe == null) {
1191 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1195 private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1197 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1199 ModelInfo modelInfo = msoRequest.getModelInfo();
1200 String modelName = modelInfo.getModelName();
1201 Recipe recipe = null;
1203 if(modelInfo.getModelCustomizationId()!=null){
1204 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1205 if(networkResource!=null){
1206 if(modelInfo.getModelVersionId() == null) {
1207 modelInfo.setModelVersionId(networkResource.getModelUUID());
1209 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1211 throw new ValidationException("no catalog entry found");
1214 //ok for version < 3 and action delete
1215 recipe = db.getNetworkRecipe(modelName, action.name());
1219 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1222 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1225 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1226 String requestId = UUIDChecker.generateUUID(msoLogger);
1227 long startTime = System.currentTimeMillis ();
1228 msoLogger.debug ("requestId is: " + requestId);
1229 ServiceInstancesRequest sir = null;
1230 MsoRequest msoRequest = new MsoRequest (requestId);
1233 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest);
1234 } catch(Exception e) {
1235 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1236 "Mapping of request to JSON object failed. " + e.getMessage(),
1237 ErrorNumbers.SVC_BAD_PARAMETER, null);
1238 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1243 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1244 } catch(Exception e) {
1245 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1246 "Error parsing request. " + e.getMessage(),
1247 ErrorNumbers.SVC_BAD_PARAMETER, null);
1248 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1252 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1253 String requestScope;
1254 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1255 requestScope = (ModelType.vnf.name());
1257 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1259 InfraActiveRequests dup = null;
1262 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1263 } catch(Exception e) {
1264 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1266 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1268 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1273 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1276 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1277 RequestReferences referencesResponse = new RequestReferences();
1278 referencesResponse.setRequestId(requestId);
1279 serviceResponse.setRequestReferences(referencesResponse);
1281 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1282 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1283 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1285 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1286 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1288 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "",
1289 MsoLogger.ErrorCode.DataError, error);
1290 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1291 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1292 MsoException.ServiceException,
1294 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1296 msoRequest.createRequestRecord (Status.FAILED, action);
1297 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1298 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1303 String serviceInstanceId = "";
1304 String configurationId = "";
1305 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
1307 if(siReq.getServiceInstanceId () != null){
1308 serviceInstanceId = siReq.getServiceInstanceId ();
1311 if(siReq.getConfigurationId() != null){
1312 configurationId = siReq.getConfigurationId();
1315 requestId = msoRequest.getRequestId ();
1316 msoLogger.debug ("requestId is: " + requestId);
1317 msoLogger.debug ("About to insert a record");
1320 createRequestRecord(action, startTime, msoRequest);
1321 } catch(Exception e) {
1322 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1323 MsoException.ServiceException,
1324 "Exception while creating record in DB " + e.getMessage(),
1325 ErrorNumbers.SVC_BAD_PARAMETER,
1327 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1331 return postBPELRequest(action, requestId, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false,
1332 serviceInstanceId, null, null, null, null, configurationId, null, null, null, null);