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 static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
81 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
84 @Path("/{version:[vV][4-6]}")
85 @Consumes(MediaType.APPLICATION_JSON)
86 @Produces(MediaType.APPLICATION_JSON)
87 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
88 public Response createServiceInstance(String request, @PathParam("version") String version) {
90 Response response = serviceInstances(request, Action.createInstance, null, version);
96 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/activate")
97 @Consumes(MediaType.APPLICATION_JSON)
98 @Produces(MediaType.APPLICATION_JSON)
99 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
100 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
101 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
102 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
103 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
109 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/deactivate")
110 @Consumes(MediaType.APPLICATION_JSON)
111 @Produces(MediaType.APPLICATION_JSON)
112 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
113 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
114 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
115 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
116 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
122 @Path("/{version:[vV][4-6]}/{serviceInstanceId}")
123 @Consumes(MediaType.APPLICATION_JSON)
124 @Produces(MediaType.APPLICATION_JSON)
125 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
126 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
127 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
128 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
129 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
134 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations")
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
138 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
139 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
140 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
141 Response response = configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version);
147 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}")
148 @Consumes(MediaType.APPLICATION_JSON)
149 @Produces(MediaType.APPLICATION_JSON)
150 @ApiOperation(value="Delete provided Port",response=Response.class)
151 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
152 @PathParam("configurationInstanceId") String configurationInstanceId) {
153 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
154 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
155 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
156 Response response = configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version);
161 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
162 @Consumes(MediaType.APPLICATION_JSON)
163 @Produces(MediaType.APPLICATION_JSON)
164 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
165 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
166 @PathParam("configurationInstanceId") String configurationInstanceId) {
167 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
168 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
169 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
170 Response response = configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version);
176 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
177 @Consumes(MediaType.APPLICATION_JSON)
178 @Produces(MediaType.APPLICATION_JSON)
179 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
180 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
181 @PathParam("configurationInstanceId") String configurationInstanceId) {
182 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
183 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
184 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
185 Response response = configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version);
191 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
192 @Consumes(MediaType.APPLICATION_JSON)
193 @Produces(MediaType.APPLICATION_JSON)
194 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
195 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
196 @PathParam("configurationInstanceId") String configurationInstanceId) {
197 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
198 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
199 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
200 Response response = configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version);
206 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
207 @Consumes(MediaType.APPLICATION_JSON)
208 @Produces(MediaType.APPLICATION_JSON)
209 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
210 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
211 @PathParam("configurationInstanceId") String configurationInstanceId) {
212 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
213 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
214 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
215 Response response = configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version);
221 @Path("/{version:[vV][6]}/{serviceInstanceId}/addRelationships")
222 @Consumes(MediaType.APPLICATION_JSON)
223 @Produces(MediaType.APPLICATION_JSON)
224 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
225 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
226 msoLogger.debug ("version is: " + version);
227 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
228 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
229 Response response = configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version);
235 @Path("/{version:[vV][6]}/{serviceInstanceId}/removeRelationships")
236 @Consumes(MediaType.APPLICATION_JSON)
237 @Produces(MediaType.APPLICATION_JSON)
238 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
239 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
240 msoLogger.debug ("version is: " + version);
241 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
242 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
243 Response response = configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version);
249 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs")
250 @Consumes(MediaType.APPLICATION_JSON)
251 @Produces(MediaType.APPLICATION_JSON)
252 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
253 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
254 msoLogger.debug ("version is: " + version);
255 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
256 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
257 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
263 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
264 @Consumes(MediaType.APPLICATION_JSON)
265 @Produces(MediaType.APPLICATION_JSON)
266 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
267 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
268 @PathParam("vnfInstanceId") String vnfInstanceId) {
269 msoLogger.debug ("version is: " + version);
270 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
271 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
272 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
273 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
279 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
280 @Consumes(MediaType.APPLICATION_JSON)
281 @Produces(MediaType.APPLICATION_JSON)
282 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
283 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
284 @PathParam("vnfInstanceId") String vnfInstanceId) {
285 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
286 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
287 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
288 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
294 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
295 @Consumes(MediaType.APPLICATION_JSON)
296 @Produces(MediaType.APPLICATION_JSON)
297 @ApiOperation(value="Apply updated configuration",response=Response.class)
298 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
299 @PathParam("vnfInstanceId") String vnfInstanceId) {
300 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
301 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
302 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
303 Response response = serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version);
310 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
311 @Consumes(MediaType.APPLICATION_JSON)
312 @Produces(MediaType.APPLICATION_JSON)
313 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
314 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
315 @PathParam("vnfInstanceId") String vnfInstanceId) {
316 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
317 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
318 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
319 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
325 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
326 @Consumes(MediaType.APPLICATION_JSON)
327 @Produces(MediaType.APPLICATION_JSON)
328 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
329 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
330 @PathParam("vnfInstanceId") String vnfInstanceId) {
331 msoLogger.debug ("version is: " + version);
332 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
333 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
334 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
335 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
341 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
342 @Consumes(MediaType.APPLICATION_JSON)
343 @Produces(MediaType.APPLICATION_JSON)
344 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
345 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
346 @PathParam("vnfInstanceId") String vnfInstanceId,
347 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
348 msoLogger.debug ("version is: " + version);
349 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
350 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
351 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
352 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
353 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
359 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
360 @Consumes(MediaType.APPLICATION_JSON)
361 @Produces(MediaType.APPLICATION_JSON)
362 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
363 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
364 @PathParam("vnfInstanceId") String vnfInstanceId,
365 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
366 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
367 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
368 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
369 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
370 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
376 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
377 @Consumes(MediaType.APPLICATION_JSON)
378 @Produces(MediaType.APPLICATION_JSON)
379 @ApiOperation(value="Perform VNF software update",response=Response.class)
380 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
381 @PathParam("vnfInstanceId") String vnfInstanceId) {
382 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
383 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
384 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
385 Response response = serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version);
391 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
392 @Consumes(MediaType.APPLICATION_JSON)
393 @Produces(MediaType.APPLICATION_JSON)
394 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
395 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
396 @PathParam("vnfInstanceId") String vnfInstanceId,
397 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
398 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
399 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
400 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
401 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
402 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
409 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
410 @Consumes(MediaType.APPLICATION_JSON)
411 @Produces(MediaType.APPLICATION_JSON)
412 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
413 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
414 @PathParam("vnfInstanceId") String vnfInstanceId) {
415 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
416 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
417 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
418 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
424 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
425 @Consumes(MediaType.APPLICATION_JSON)
426 @Produces(MediaType.APPLICATION_JSON)
427 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
428 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
429 @PathParam("vnfInstanceId") String vnfInstanceId,
430 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
431 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
432 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
433 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
434 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
435 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
441 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
442 @Consumes(MediaType.APPLICATION_JSON)
443 @Produces(MediaType.APPLICATION_JSON)
444 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
445 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
446 @PathParam("vnfInstanceId") String vnfInstanceId,
447 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
448 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
449 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
450 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
451 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
452 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
458 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks")
459 @Consumes(MediaType.APPLICATION_JSON)
460 @Produces(MediaType.APPLICATION_JSON)
461 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
462 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
463 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
464 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
465 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
471 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
472 @Consumes(MediaType.APPLICATION_JSON)
473 @Produces(MediaType.APPLICATION_JSON)
474 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
475 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
476 @PathParam("networkInstanceId") String networkInstanceId) {
477 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
478 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
479 instanceIdMap.put("networkInstanceId", networkInstanceId);
480 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
486 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
487 @Consumes(MediaType.APPLICATION_JSON)
488 @Produces(MediaType.APPLICATION_JSON)
489 @ApiOperation(value="Delete provided Network instance",response=Response.class)
490 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
491 @PathParam("networkInstanceId") String networkInstanceId) {
492 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
493 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
494 instanceIdMap.put("networkInstanceId", networkInstanceId);
495 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
500 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
502 String requestId = UUIDChecker.generateUUID(msoLogger);
503 long startTime = System.currentTimeMillis ();
504 msoLogger.debug ("requestId is: " + requestId);
505 ServiceInstancesRequest sir = null;
507 MsoRequest msoRequest = new MsoRequest (requestId);
510 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
511 } catch(Exception e) {
512 msoLogger.debug("Exception occurred while mapping of request to JSON object ", 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 msoLogger.debug("Exception occurred while logging ", e);
524 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
525 "Error parsing request. " + e.getMessage(),
526 ErrorNumbers.SVC_BAD_PARAMETER, null);
527 if (msoRequest.getRequestId () != null) {
528 msoLogger.debug ("Logging failed message to the database");
529 msoRequest.createRequestRecord (Status.FAILED, action);
531 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
535 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
537 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
538 requestScope = (ModelType.vnf.name());
540 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
542 InfraActiveRequests dup = null;
545 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
546 } catch(Exception e) {
547 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
549 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
551 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
556 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
559 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
561 RequestReferences referencesResponse = new RequestReferences();
563 referencesResponse.setRequestId(requestId);
565 serviceResponse.setRequestReferences(referencesResponse);
567 CatalogDatabase db = null;
569 db = CatalogDatabase.getInstance();
570 } catch (Exception e) {
571 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
572 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
573 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
574 MsoException.ServiceException,
575 "No communication to catalog DB " + e.getMessage (),
576 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
578 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
579 MsoAlarmLogger.CRITICAL,
580 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
581 msoRequest.createRequestRecord (Status.FAILED,action);
582 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
583 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
587 RecipeLookupResult recipeLookupResult = null;
589 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
590 } catch (ValidationException e) {
591 msoLogger.debug ("Validation failed: ", e);
592 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
593 "Error validating request. " + e.getMessage(),
594 ErrorNumbers.SVC_BAD_PARAMETER, null);
595 if (msoRequest.getRequestId () != null) {
596 msoLogger.debug ("Logging failed message to the database");
597 msoRequest.createRequestRecord (Status.FAILED, action);
599 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
600 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
601 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
603 } catch (Exception e) {
604 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
605 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
606 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
607 MsoException.ServiceException,
608 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
609 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
611 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
612 MsoAlarmLogger.CRITICAL,
613 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
614 msoRequest.createRequestRecord (Status.FAILED,action);
615 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
616 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
621 if (recipeLookupResult == null) {
622 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
623 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
624 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
625 MsoException.ServiceException,
626 "Recipe does not exist in catalog DB",
627 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
629 msoRequest.createRequestRecord (Status.FAILED, action);
630 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
631 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
637 Boolean isBaseVfModule = false;
639 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
640 action == Action.inPlaceSoftwareUpdate)) {
644 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
645 modelType = ModelType.vnf;
648 modelType = msoRequest.getModelInfo().getModelType();
651 if (modelType.equals(ModelType.vfModule)) {
652 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
654 // Get VF Module-specific base module indicator
657 String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
659 if(modelVersionId != null) {
660 vfm = db.getVfModuleByModelUuid(modelVersionId);
662 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
666 if (vfm.getIsBase() == 1) {
667 isBaseVfModule = true;
670 else if (action == Action.createInstance || action == Action.updateInstance){
671 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
672 // This request cannot proceed
673 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
674 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
675 String serviceVersionText = "";
676 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
677 serviceVersionText = " with version " + asdcServiceModelVersion;
679 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
680 MsoException.ServiceException,
681 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
682 ErrorNumbers.SVC_BAD_PARAMETER,
684 msoRequest.createRequestRecord (Status.FAILED, action);
685 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
686 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
694 String serviceInstanceId = "";
696 String vfModuleId = "";
697 String volumeGroupId = "";
698 String networkId = "";
699 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
701 if(siReq.getServiceInstanceId () != null){
702 serviceInstanceId = siReq.getServiceInstanceId ();
705 if(siReq.getVnfInstanceId () != null){
706 vnfId = siReq.getVnfInstanceId ();
709 if(siReq.getVfModuleInstanceId () != null){
710 vfModuleId = siReq.getVfModuleInstanceId ();
713 if(siReq.getVolumeGroupInstanceId () != null){
714 volumeGroupId = siReq.getVolumeGroupInstanceId ();
717 if(siReq.getNetworkInstanceId () != null){
718 networkId = siReq.getNetworkInstanceId ();
722 requestId = msoRequest.getRequestId ();
723 msoLogger.debug ("requestId is: " + requestId);
724 msoLogger.debug ("About to insert a record");
727 createRequestRecord(action, startTime, msoRequest);
728 } catch(Exception e) {
729 msoLogger.debug("Exception occurred while creating record in DB", e);
730 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
731 MsoException.ServiceException,
732 "Exception while creating record in DB " + e.getMessage(),
733 ErrorNumbers.SVC_BAD_PARAMETER,
735 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
739 return postBPELRequest(action, requestId, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(),
740 isBaseVfModule, serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, null,
741 msoRequest.getServiceInstanceType(), msoRequest.getVnfType(), msoRequest.getVfModuleType(), msoRequest.getNetworkType());
744 private Response postBPELRequest(Action action, String requestId, long startTime, MsoRequest msoRequest,
745 String orchestrationUri, int timeOut, Boolean isBaseVfModule,
746 String serviceInstanceId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
747 String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType) {
748 RequestClient requestClient = null;
749 HttpResponse response = null;
750 long subStartTime = System.currentTimeMillis();
752 requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
753 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
755 System.out.println("URL : " + requestClient.getUrl ());
757 response = requestClient.post(requestId, isBaseVfModule, timeOut, action.name (),
758 serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, configurationId,
759 msoRequest.getServiceInstanceType (),
760 msoRequest.getVnfType (), msoRequest.getVfModuleType (),
761 msoRequest.getNetworkType (), msoRequest.getRequestJSON(), null);
763 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
764 } catch (Exception e) {
765 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
766 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
767 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
768 MsoException.ServiceException,
769 "Failed calling bpmn " + e.getMessage (),
770 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
772 alarmLogger.sendAlarm ("MsoConfigurationError",
773 MsoAlarmLogger.CRITICAL,
774 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
775 msoRequest.updateFinalStatus (Status.FAILED);
776 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
777 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
778 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
782 if (response == null) {
783 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
784 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
785 MsoException.ServiceException,
786 "bpelResponse is null",
787 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
789 msoRequest.updateFinalStatus (Status.FAILED);
790 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
791 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
792 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
796 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
797 int bpelStatus = respHandler.getStatus ();
799 // BPEL accepted the request, the request is in progress
800 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
801 String camundaJSONResponseBody = respHandler.getContent();
802 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
803 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
804 (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
805 Status.IN_PROGRESS.toString (),
806 Constants.PROGRESS_REQUEST_IN_PROGRESS,
807 Constants.MODIFIED_BY_APIHANDLER);
808 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
809 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
810 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
812 List<String> variables = new ArrayList<>();
813 variables.add(bpelStatus + "");
814 String camundaJSONResponseBody = respHandler.getContent();
815 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
816 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
817 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
818 MsoException.ServiceException,
819 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
820 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
822 msoRequest.updateFinalStatus (Status.FAILED);
823 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
824 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
825 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
828 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
829 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
830 MsoException.ServiceException,
831 "Request Failed due to BPEL error with HTTP Status= %1" ,
832 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
834 msoRequest.updateFinalStatus (Status.FAILED);
835 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
836 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
837 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
843 private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
845 msoRequest.createRequestRecord (Status.PENDING, action);
846 } catch (Exception e) {
847 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
848 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
849 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
850 throw new Exception(e);
854 private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
855 String instanceName, String requestScope, InfraActiveRequests dup) {
857 // Found the duplicate record. Return the appropriate error.
858 String instance = null;
859 if(instanceName != null){
860 instance = instanceName;
862 instance = instanceIdMap.get(requestScope + "InstanceId");
864 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.";
865 //List<String> variables = new ArrayList<String>();
866 //variables.add(dup.getRequestStatus());
868 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
870 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
874 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
875 msoRequest.createRequestRecord (Status.FAILED, action);
876 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
877 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
881 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
882 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
883 InfraActiveRequests dup = null;
885 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
886 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
888 } catch (Exception e) {
889 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
890 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
891 throw new Exception(e);
896 private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
897 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
899 msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
900 } catch (Exception e) {
901 msoLogger.debug ("Validation failed: ", e);
902 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
903 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
904 throw new Exception(e);
908 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
909 MsoRequest msoRequest) throws Exception {
911 ObjectMapper mapper = new ObjectMapper();
912 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
913 } catch(Exception e){
914 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
915 if (msoRequest.getRequestId () != null) {
916 msoLogger.debug ("Mapping of request to JSON object failed");
917 msoRequest.createRequestRecord (Status.FAILED, action);
919 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
920 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
921 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()!=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, 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);