2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.apihandlerinfra;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.POST;
31 import javax.ws.rs.PUT;
32 import javax.ws.rs.Path;
33 import javax.ws.rs.PathParam;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.core.MediaType;
36 import javax.ws.rs.core.Response;
38 import org.apache.commons.lang.StringUtils;
39 import org.apache.http.HttpResponse;
40 import org.apache.http.HttpStatus;
41 import com.fasterxml.jackson.databind.ObjectMapper;
42 import org.openecomp.mso.apihandler.common.CommonConstants;
43 import org.openecomp.mso.apihandler.common.ErrorNumbers;
44 import org.openecomp.mso.apihandler.common.RequestClient;
45 import org.openecomp.mso.apihandler.common.RequestClientFactory;
46 import org.openecomp.mso.apihandler.common.RequestClientParamater;
47 import org.openecomp.mso.apihandler.common.ResponseHandler;
48 import org.openecomp.mso.apihandler.common.ValidationException;
49 import org.openecomp.mso.serviceinstancebeans.ModelInfo;
50 import org.openecomp.mso.serviceinstancebeans.ModelType;
51 import org.openecomp.mso.serviceinstancebeans.RelatedInstance;
52 import org.openecomp.mso.serviceinstancebeans.RelatedInstanceList;
53 import org.openecomp.mso.serviceinstancebeans.RequestParameters;
54 import org.openecomp.mso.serviceinstancebeans.RequestReferences;
55 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesRequest;
56 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesResponse;
57 import org.openecomp.mso.db.catalog.CatalogDatabase;
58 import org.openecomp.mso.db.catalog.beans.NetworkResource;
59 import org.openecomp.mso.db.catalog.beans.Recipe;
60 import org.openecomp.mso.db.catalog.beans.Service;
61 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
62 import org.openecomp.mso.db.catalog.beans.VfModule;
63 import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
64 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
65 import org.openecomp.mso.db.catalog.beans.VnfResource;
66 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
67 import org.openecomp.mso.logger.MessageEnum;
68 import org.openecomp.mso.logger.MsoAlarmLogger;
69 import org.openecomp.mso.logger.MsoLogger;
70 import org.openecomp.mso.properties.MsoJavaProperties;
71 import org.openecomp.mso.requestsdb.InfraActiveRequests;
72 import org.openecomp.mso.requestsdb.RequestsDatabase;
73 import org.openecomp.mso.utils.UUIDChecker;
75 import com.wordnik.swagger.annotations.Api;
76 import com.wordnik.swagger.annotations.ApiOperation;
78 @Path("/serviceInstances")
79 @Api(value="/serviceInstances",description="API Requests for Service Instances")
80 public class ServiceInstances {
82 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
83 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
86 @Path("/{version:[vV][4-6]}")
87 @Consumes(MediaType.APPLICATION_JSON)
88 @Produces(MediaType.APPLICATION_JSON)
89 @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
90 public Response createServiceInstance(String request, @PathParam("version") String version) {
91 return serviceInstances(request, Action.createInstance, null, version);
95 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/activate")
96 @Consumes(MediaType.APPLICATION_JSON)
97 @Produces(MediaType.APPLICATION_JSON)
98 @ApiOperation(value="Activate provided Service Instance",response=Response.class)
99 public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
100 HashMap<String, String> instanceIdMap = new HashMap<>();
101 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
102 return serviceInstances(request, Action.activateInstance, instanceIdMap, version);
106 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/deactivate")
107 @Consumes(MediaType.APPLICATION_JSON)
108 @Produces(MediaType.APPLICATION_JSON)
109 @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
110 public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
111 HashMap<String, String> instanceIdMap = new HashMap<>();
112 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
113 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
117 @Path("/{version:[vV][4-6]}/{serviceInstanceId}")
118 @Consumes(MediaType.APPLICATION_JSON)
119 @Produces(MediaType.APPLICATION_JSON)
120 @ApiOperation(value="Delete provided Service Instance",response=Response.class)
121 public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
122 HashMap<String, String> instanceIdMap = new HashMap<>();
123 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
124 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
128 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations")
129 @Consumes(MediaType.APPLICATION_JSON)
130 @Produces(MediaType.APPLICATION_JSON)
131 @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
132 public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
133 HashMap<String, String> instanceIdMap = new HashMap<>();
134 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
135 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version);
139 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}")
140 @Consumes(MediaType.APPLICATION_JSON)
141 @Produces(MediaType.APPLICATION_JSON)
142 @ApiOperation(value="Delete provided Port",response=Response.class)
143 public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
144 @PathParam("configurationInstanceId") String configurationInstanceId) {
145 HashMap<String, String> instanceIdMap = new HashMap<>();
146 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
147 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
148 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version);
152 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
153 @Consumes(MediaType.APPLICATION_JSON)
154 @Produces(MediaType.APPLICATION_JSON)
155 @ApiOperation(value="Enable Port Mirroring",response=Response.class)
156 public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
157 @PathParam("configurationInstanceId") String configurationInstanceId) {
158 HashMap<String, String> instanceIdMap = new HashMap<>();
159 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
160 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
161 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version);
165 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
166 @Consumes(MediaType.APPLICATION_JSON)
167 @Produces(MediaType.APPLICATION_JSON)
168 @ApiOperation(value="Disable Port Mirroring",response=Response.class)
169 public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
170 @PathParam("configurationInstanceId") String configurationInstanceId) {
171 HashMap<String, String> instanceIdMap = new HashMap<>();
172 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
173 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
174 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version);
178 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
179 @Consumes(MediaType.APPLICATION_JSON)
180 @Produces(MediaType.APPLICATION_JSON)
181 @ApiOperation(value="Activate Port Mirroring",response=Response.class)
182 public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
183 @PathParam("configurationInstanceId") String configurationInstanceId) {
184 HashMap<String, String> instanceIdMap = new HashMap<>();
185 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
186 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
187 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version);
191 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
192 @Consumes(MediaType.APPLICATION_JSON)
193 @Produces(MediaType.APPLICATION_JSON)
194 @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
195 public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
196 @PathParam("configurationInstanceId") String configurationInstanceId) {
197 HashMap<String, String> instanceIdMap = new HashMap<>();
198 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
199 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
200 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version);
204 @Path("/{version:[vV][6]}/{serviceInstanceId}/addRelationships")
205 @Consumes(MediaType.APPLICATION_JSON)
206 @Produces(MediaType.APPLICATION_JSON)
207 @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
208 public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
209 msoLogger.debug ("version is: " + version);
210 HashMap<String, String> instanceIdMap = new HashMap<>();
211 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
212 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version);
216 @Path("/{version:[vV][6]}/{serviceInstanceId}/removeRelationships")
217 @Consumes(MediaType.APPLICATION_JSON)
218 @Produces(MediaType.APPLICATION_JSON)
219 @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
220 public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
221 msoLogger.debug ("version is: " + version);
222 HashMap<String, String> instanceIdMap = new HashMap<>();
223 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
224 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version);
228 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs")
229 @Consumes(MediaType.APPLICATION_JSON)
230 @Produces(MediaType.APPLICATION_JSON)
231 @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
232 public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
233 msoLogger.debug ("version is: " + version);
234 HashMap<String, String> instanceIdMap = new HashMap<>();
235 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236 return serviceInstances(request, Action.createInstance, instanceIdMap, version);
240 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
241 @Consumes(MediaType.APPLICATION_JSON)
242 @Produces(MediaType.APPLICATION_JSON)
243 @ApiOperation(value="Replace provided VNF instance",response=Response.class)
244 public Response replaceVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
245 @PathParam("vnfInstanceId") String vnfInstanceId) {
246 msoLogger.debug ("version is: " + version);
247 HashMap<String, String> instanceIdMap = new HashMap<>();
248 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
249 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
250 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
254 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
255 @Consumes(MediaType.APPLICATION_JSON)
256 @Produces(MediaType.APPLICATION_JSON)
257 @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
258 public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
259 @PathParam("vnfInstanceId") String vnfInstanceId) {
260 HashMap<String, String> instanceIdMap = new HashMap<>();
261 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
262 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
263 return serviceInstances(request, Action.updateInstance, instanceIdMap, version);
267 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
268 @Consumes(MediaType.APPLICATION_JSON)
269 @Produces(MediaType.APPLICATION_JSON)
270 @ApiOperation(value="Apply updated configuration",response=Response.class)
271 public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
272 @PathParam("vnfInstanceId") String vnfInstanceId) {
273 HashMap<String, String> instanceIdMap = new HashMap<>();
274 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
275 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
276 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version);
281 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
282 @Consumes(MediaType.APPLICATION_JSON)
283 @Produces(MediaType.APPLICATION_JSON)
284 @ApiOperation(value="Delete provided VNF instance",response=Response.class)
285 public Response deleteVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
286 @PathParam("vnfInstanceId") String vnfInstanceId) {
287 HashMap<String, String> instanceIdMap = new HashMap<>();
288 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
290 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
294 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
295 @Consumes(MediaType.APPLICATION_JSON)
296 @Produces(MediaType.APPLICATION_JSON)
297 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
298 public Response createVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
299 @PathParam("vnfInstanceId") String vnfInstanceId) {
300 msoLogger.debug ("version is: " + version);
301 HashMap<String, String> instanceIdMap = new HashMap<>();
302 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
303 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
304 return serviceInstances(request, Action.createInstance, instanceIdMap, version);
308 @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
309 @Consumes(MediaType.APPLICATION_JSON)
310 @Produces(MediaType.APPLICATION_JSON)
311 @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
312 public Response replaceVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
313 @PathParam("vnfInstanceId") String vnfInstanceId,
314 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
315 msoLogger.debug ("version is: " + version);
316 HashMap<String, String> instanceIdMap = new HashMap<>();
317 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
318 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
319 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
320 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
324 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
325 @Consumes(MediaType.APPLICATION_JSON)
326 @Produces(MediaType.APPLICATION_JSON)
327 @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
328 public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
329 @PathParam("vnfInstanceId") String vnfInstanceId,
330 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
331 HashMap<String, String> instanceIdMap = new HashMap<>();
332 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
333 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
334 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
335 return serviceInstances(request, Action.updateInstance, instanceIdMap, version);
339 @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
340 @Consumes(MediaType.APPLICATION_JSON)
341 @Produces(MediaType.APPLICATION_JSON)
342 @ApiOperation(value="Perform VNF software update",response=Response.class)
343 public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
344 @PathParam("vnfInstanceId") String vnfInstanceId) {
345 HashMap<String, String> instanceIdMap = new HashMap<>();
346 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
347 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
348 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version);
352 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
353 @Consumes(MediaType.APPLICATION_JSON)
354 @Produces(MediaType.APPLICATION_JSON)
355 @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
356 public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
357 @PathParam("vnfInstanceId") String vnfInstanceId,
358 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
359 HashMap<String, String> instanceIdMap = new HashMap<>();
360 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
361 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
362 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
363 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
368 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
369 @Consumes(MediaType.APPLICATION_JSON)
370 @Produces(MediaType.APPLICATION_JSON)
371 @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
372 public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
373 @PathParam("vnfInstanceId") String vnfInstanceId) {
374 HashMap<String, String> instanceIdMap = new HashMap<>();
375 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
376 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
377 return serviceInstances(request, Action.createInstance, instanceIdMap, version);
381 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
382 @Consumes(MediaType.APPLICATION_JSON)
383 @Produces(MediaType.APPLICATION_JSON)
384 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
385 public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
386 @PathParam("vnfInstanceId") String vnfInstanceId,
387 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
388 HashMap<String, String> instanceIdMap = new HashMap<>();
389 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
390 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
391 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
392 return serviceInstances(request, Action.updateInstance, instanceIdMap, version);
396 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
397 @Consumes(MediaType.APPLICATION_JSON)
398 @Produces(MediaType.APPLICATION_JSON)
399 @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
400 public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
401 @PathParam("vnfInstanceId") String vnfInstanceId,
402 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
403 HashMap<String, String> instanceIdMap = new HashMap<>();
404 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
405 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
406 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
407 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
411 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks")
412 @Consumes(MediaType.APPLICATION_JSON)
413 @Produces(MediaType.APPLICATION_JSON)
414 @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
415 public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
416 HashMap<String, String> instanceIdMap = new HashMap<>();
417 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
418 return serviceInstances(request, Action.createInstance, instanceIdMap, version);
422 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
423 @Consumes(MediaType.APPLICATION_JSON)
424 @Produces(MediaType.APPLICATION_JSON)
425 @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
426 public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
427 @PathParam("networkInstanceId") String networkInstanceId) {
428 HashMap<String, String> instanceIdMap = new HashMap<>();
429 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
430 instanceIdMap.put("networkInstanceId", networkInstanceId);
431 return serviceInstances(request, Action.updateInstance, instanceIdMap, version);
435 @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
436 @Consumes(MediaType.APPLICATION_JSON)
437 @Produces(MediaType.APPLICATION_JSON)
438 @ApiOperation(value="Delete provided Network instance",response=Response.class)
439 public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
440 @PathParam("networkInstanceId") String networkInstanceId) {
441 HashMap<String, String> instanceIdMap = new HashMap<>();
442 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
443 instanceIdMap.put("networkInstanceId", networkInstanceId);
444 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
447 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
449 String requestId = UUIDChecker.generateUUID(msoLogger);
450 long startTime = System.currentTimeMillis ();
451 msoLogger.debug ("requestId is: " + requestId);
452 ServiceInstancesRequest sir = null;
454 MsoRequest msoRequest = new MsoRequest (requestId);
457 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
458 } catch(Exception e) {
459 msoLogger.debug("Exception occurred while mapping of request to JSON object ", e);
460 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
461 "Mapping of request to JSON object failed. " + e.getMessage(),
462 ErrorNumbers.SVC_BAD_PARAMETER, null);
463 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
468 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
469 } catch(Exception e) {
470 msoLogger.debug("Exception occurred while logging ", e);
471 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
472 "Error parsing request. " + e.getMessage(),
473 ErrorNumbers.SVC_BAD_PARAMETER, null);
474 if (msoRequest.getRequestId () != null) {
475 msoLogger.debug ("Logging failed message to the database");
476 msoRequest.createRequestRecord (Status.FAILED, action);
478 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
482 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
484 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
485 requestScope = (ModelType.vnf.name());
487 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
489 InfraActiveRequests dup = null;
492 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
493 } catch(Exception e) {
494 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
496 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
498 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
503 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
506 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
508 RequestReferences referencesResponse = new RequestReferences();
510 referencesResponse.setRequestId(requestId);
512 serviceResponse.setRequestReferences(referencesResponse);
514 CatalogDatabase db = null;
516 db = CatalogDatabase.getInstance();
517 } catch (Exception e) {
518 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
519 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
520 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
521 MsoException.ServiceException,
522 "No communication to catalog DB " + e.getMessage (),
523 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
525 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
526 MsoAlarmLogger.CRITICAL,
527 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
528 msoRequest.createRequestRecord (Status.FAILED,action);
529 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
530 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
534 RecipeLookupResult recipeLookupResult = null;
536 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
537 } catch (ValidationException e) {
538 msoLogger.debug ("Validation failed: ", e);
539 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
540 "Error validating request. " + e.getMessage(),
541 ErrorNumbers.SVC_BAD_PARAMETER, null);
542 if (msoRequest.getRequestId () != null) {
543 msoLogger.debug ("Logging failed message to the database");
544 msoRequest.createRequestRecord (Status.FAILED, action);
546 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
547 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
548 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
550 } catch (Exception e) {
551 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
552 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
553 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
554 MsoException.ServiceException,
555 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
556 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
558 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
559 MsoAlarmLogger.CRITICAL,
560 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
561 msoRequest.createRequestRecord (Status.FAILED,action);
562 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
563 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
568 if (recipeLookupResult == null) {
569 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
570 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
571 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
572 MsoException.ServiceException,
573 "Recipe does not exist in catalog DB",
574 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
576 msoRequest.createRequestRecord (Status.FAILED, action);
577 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
578 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
584 Boolean isBaseVfModule = false;
586 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
587 action == Action.inPlaceSoftwareUpdate)) {
591 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
592 modelType = ModelType.vnf;
595 modelType = msoRequest.getModelInfo().getModelType();
598 if (modelType.equals(ModelType.vfModule)) {
599 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
601 // Get VF Module-specific base module indicator
604 String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
606 if(modelVersionId != null) {
607 vfm = db.getVfModuleByModelUuid(modelVersionId);
609 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
613 if (vfm.getIsBase() == 1) {
614 isBaseVfModule = true;
617 else if (action == Action.createInstance || action == Action.updateInstance){
618 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
619 // This request cannot proceed
620 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
621 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
622 String serviceVersionText = "";
623 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
624 serviceVersionText = " with version " + asdcServiceModelVersion;
626 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
627 MsoException.ServiceException,
628 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
629 ErrorNumbers.SVC_BAD_PARAMETER,
631 msoRequest.createRequestRecord (Status.FAILED, action);
632 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
633 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
640 msoLogger.debug ("requestId is: " + msoRequest.getRequestId());
641 msoLogger.debug ("About to insert a record");
644 createRequestRecord(action, startTime, msoRequest);
645 } catch(Exception e) {
646 msoLogger.debug("Exception occurred while creating record in DB", e);
647 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
648 MsoException.ServiceException,
649 "Exception while creating record in DB " + e.getMessage(),
650 ErrorNumbers.SVC_BAD_PARAMETER,
652 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
656 return postBPELRequest(action, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(),
657 recipeLookupResult.getRecipeTimeout(), isBaseVfModule);
660 private RequestClientParamater buildRequestClientParameter(MsoRequest msoRequest, boolean isBaseVfModule,
661 int timeOut, String requestAction) throws IOException {
662 return new RequestClientParamater.Builder().
663 setRequestId(msoRequest.getRequestId()).
664 setBaseVfModule(isBaseVfModule).setRecipeTimeout(timeOut).
665 setRequestAction(requestAction).
666 setServiceInstanceId(msoRequest.getServiceInstancesRequest().getServiceInstanceId()).
667 setCorrelationId(msoRequest.getServiceInstancesRequest().getCorrelationId()).
668 setVnfId(msoRequest.getServiceInstancesRequest().getVnfInstanceId()).
669 setVfModuleId(msoRequest.getServiceInstancesRequest().getVfModuleInstanceId()).
670 setVolumeGroupId(msoRequest.getServiceInstancesRequest().getVolumeGroupInstanceId()).
671 setNetworkId(msoRequest.getServiceInstancesRequest().getNetworkInstanceId()).
672 setConfigurationId(msoRequest.getServiceInstancesRequest().getConfigurationId()).
673 setServiceType(msoRequest.getServiceInstanceType()).
674 setVnfType(msoRequest.getVnfType()).
675 setVfModuleType(msoRequest.getVfModuleType()).
676 setNetworkType(msoRequest.getNetworkType()).
677 setRequestDetails(msoRequest.getRequestJSON()).build();
680 private Response postBPELRequest(Action action, long startTime, MsoRequest msoRequest,
681 String orchestrationUri, int timeOut, Boolean isBaseVfModule) {
682 RequestClient requestClient = null;
683 HttpResponse response = null;
684 long subStartTime = System.currentTimeMillis();
686 requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
687 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
689 System.out.println("URL : " + requestClient.getUrl ());
691 response = requestClient.post(buildRequestClientParameter(msoRequest, isBaseVfModule, timeOut, action.name()));
692 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
693 } catch (Exception e) {
694 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
695 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
696 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
697 MsoException.ServiceException,
698 "Failed calling bpmn " + e.getMessage (),
699 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
701 alarmLogger.sendAlarm ("MsoConfigurationError",
702 MsoAlarmLogger.CRITICAL,
703 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
704 msoRequest.updateFinalStatus (Status.FAILED);
705 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
706 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
707 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
711 if (response == null) {
712 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
713 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
714 MsoException.ServiceException,
715 "bpelResponse is null",
716 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
718 msoRequest.updateFinalStatus (Status.FAILED);
719 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
720 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
721 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
725 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
726 int bpelStatus = respHandler.getStatus ();
728 // BPEL accepted the request, the request is in progress
729 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
730 String camundaJSONResponseBody = respHandler.getContent();
731 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
732 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
733 (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
734 Status.IN_PROGRESS.toString (),
735 Constants.PROGRESS_REQUEST_IN_PROGRESS,
736 Constants.MODIFIED_BY_APIHANDLER);
737 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
738 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
739 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
741 List<String> variables = new ArrayList<>();
742 variables.add(bpelStatus + "");
743 String camundaJSONResponseBody = respHandler.getContent();
744 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
745 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
746 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
747 MsoException.ServiceException,
748 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
749 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
751 msoRequest.updateFinalStatus (Status.FAILED);
752 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
753 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
754 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
757 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
758 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
759 MsoException.ServiceException,
760 "Request Failed due to BPEL error with HTTP Status= %1" ,
761 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
763 msoRequest.updateFinalStatus (Status.FAILED);
764 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
765 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
766 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
772 private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
774 msoRequest.createRequestRecord (Status.PENDING, action);
775 } catch (Exception e) {
776 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
777 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
778 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
779 throw new Exception(e);
783 private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
784 String instanceName, String requestScope, InfraActiveRequests dup) {
786 // Found the duplicate record. Return the appropriate error.
787 String instance = null;
788 if(instanceName != null){
789 instance = instanceName;
791 instance = instanceIdMap.get(requestScope + "InstanceId");
793 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.";
794 //List<String> variables = new ArrayList<String>();
795 //variables.add(dup.getRequestStatus());
797 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
799 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
803 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
804 msoRequest.createRequestRecord (Status.FAILED, action);
805 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
806 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
810 private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
811 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
812 InfraActiveRequests dup = null;
814 if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
815 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
817 } catch (Exception e) {
818 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
819 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
820 throw new Exception(e);
825 private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
826 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
828 msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
829 } catch (Exception e) {
830 msoLogger.debug ("Validation failed: ", e);
831 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
832 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
833 throw new Exception(e);
837 private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
838 MsoRequest msoRequest) throws Exception {
840 ObjectMapper mapper = new ObjectMapper();
841 return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
842 } catch(Exception e){
843 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
844 if (msoRequest.getRequestId () != null) {
845 msoLogger.debug ("Mapping of request to JSON object failed");
846 msoRequest.createRequestRecord (Status.FAILED, action);
848 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
849 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
850 throw new Exception(e);
854 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
855 RecipeLookupResult recipeLookupResult = null;
856 //if the aLaCarte flag is set to TRUE, the API-H should choose the “VID_DEFAULTâ€
\9d recipe for the requested action
858 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
859 // Query MSO Catalog DB
861 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
862 recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
864 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
865 recipeLookupResult = getServiceURI(db, msoRequest, action);
867 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
868 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
870 recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
872 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
874 recipeLookupResult = getNetworkUri(db, msoRequest, action);
877 if (recipeLookupResult != null) {
878 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
881 msoLogger.debug("No matching recipe record found");
883 return recipeLookupResult;
887 private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
889 // Construct the default service name
890 // TODO need to make this a configurable property
891 String defaultServiceModelName = "*";
892 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
894 Service serviceRecord;
895 ModelInfo modelInfo = msoRequest.getModelInfo();
896 if(msoRequest.getALaCarteFlag()){
897 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
898 if (serviceRecord == null) {
899 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
902 serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
903 if(serviceRecord == null) {
904 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
908 ServiceRecipe recipe = null;
909 if(serviceRecord !=null){
910 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
912 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
913 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
914 if(reqParam!=null && reqParam.isaLaCarte()!=null && reqParam.isaLaCarte() && recipe==null){
916 } else if (recipe==null) {
917 //aLaCarte wasn't sent, so we'll try the default
918 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
919 if (serviceRecord == null) {
920 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
922 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
925 if(modelInfo.getModelVersionId() == null) {
926 modelInfo.setModelVersionId(serviceRecord.getModelUUID());
931 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
935 private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
937 ModelInfo modelInfo = msoRequest.getModelInfo();
938 String vnfComponentType = modelInfo.getModelType().name();
940 RelatedInstanceList[] instanceList = null;
941 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
942 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
945 Recipe recipe = null;
946 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
947 String modelCustomizationId = modelInfo.getModelCustomizationId();
948 String modelCustomizationName = modelInfo.getModelCustomizationName();
949 String relatedInstanceModelVersionId = null;
950 String relatedInstanceModelInvariantId = null;
951 String relatedInstanceVersion = null;
952 String relatedInstanceModelCustomizationName = null;
954 if (instanceList != null) {
956 for(RelatedInstanceList relatedInstanceList : instanceList){
958 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
959 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
960 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
961 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
962 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
965 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
966 relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
967 relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
968 relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
969 relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
973 if(modelInfo.getModelType().equals(ModelType.vnf)) {
974 // a. For a vnf request (only create, no update currently):
975 // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
976 // 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
977 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
978 // to “joinâ€
\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid record exists.
979 // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
980 // (MODEL_UUID) in SERVICE table.
981 // 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
982 // during 1707 data migration if VID did not provide it originally on request.
983 // iv. Note: continue to construct the “vnf-typeâ€
\9d value and pass to BPMN (must still be populated in A&AI).
984 // 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.
986 VnfResource vnfResource = null;
987 VnfResourceCustomization vrc;
988 // Validation for vnfResource
990 if(modelCustomizationId!=null) {
991 vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
993 Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
994 if(service == null) {
995 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
998 if(service == null) {
999 throw new ValidationException("service in relatedInstance");
1002 vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1004 vnfResource = vrc.getVnfResource();
1005 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1006 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1010 if(vnfResource==null){
1011 throw new ValidationException("catalog entry");
1013 if(modelInfo.getModelVersionId() == null) {
1014 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1018 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1020 if (vnfRecipe == null) {
1024 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1026 // 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
1027 // been provided (else create request should be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName
1028 // to “joinâ€
\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record exists.
1029 // **If relatedInstance.modelInfo[vnf].modelVersionId was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead
1030 // 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
1031 // 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,
1032 // use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data
1033 // (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not
1034 // provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found
1035 // 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)
1036 // and MODEL_VERSION (modelVersion).
1038 VfModuleCustomization vfmc = null;
1039 VnfResourceCustomization vnfrc;
1040 VfModule vfModule = null;
1042 if( modelInfo.getModelCustomizationId() != null) {
1043 vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1045 vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1047 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1050 List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1052 String vfModuleModelUUID = modelInfo.getModelVersionId();
1053 for(VfModuleCustomization vf : list) {
1054 if(vfModuleModelUUID != null) {
1055 vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1057 vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1060 if(vfModule != null) {
1061 modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1062 modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1068 if(vfmc == null && vfModule == null) {
1069 throw new ValidationException("no catalog entry found");
1070 } else if (vfModule == null && vfmc != null) {
1071 vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1074 if(modelInfo.getModelVersionId() == null) {
1075 modelInfo.setModelVersionId(vfModule.getModelUUID());
1077 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1079 if(recipe == null) {
1080 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1081 if (recipe == null) {
1082 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1085 if(recipe == null) {
1091 msoLogger.debug("recipe is null, getting default");
1093 if(modelInfo.getModelType().equals(ModelType.vnf)) {
1094 recipe = db.getVnfRecipe(defaultSource, action.name());
1095 if (recipe == null) {
1099 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1101 if (recipe == null) {
1107 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1110 private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1112 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1114 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1116 if (vnfRecipe == null) {
1120 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1123 private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1125 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1127 ModelInfo modelInfo = msoRequest.getModelInfo();
1128 String modelName = modelInfo.getModelName();
1129 Recipe recipe = null;
1131 if(modelInfo.getModelCustomizationId()!=null){
1132 NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1133 if(networkResource!=null){
1134 if(modelInfo.getModelVersionId() == null) {
1135 modelInfo.setModelVersionId(networkResource.getModelUUID());
1137 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1139 throw new ValidationException("no catalog entry found");
1142 //ok for version < 3 and action delete
1143 recipe = db.getNetworkRecipe(modelName, action.name());
1147 recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1150 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1153 private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1154 String requestId = UUIDChecker.generateUUID(msoLogger);
1155 long startTime = System.currentTimeMillis ();
1156 msoLogger.debug ("requestId is: " + requestId);
1157 ServiceInstancesRequest sir = null;
1158 MsoRequest msoRequest = new MsoRequest (requestId);
1161 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
1162 } catch(Exception e) {
1163 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1164 "Mapping of request to JSON object failed. " + e.getMessage(),
1165 ErrorNumbers.SVC_BAD_PARAMETER, null);
1166 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1171 parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1172 } catch(Exception e) {
1173 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1174 "Error parsing request. " + e.getMessage(),
1175 ErrorNumbers.SVC_BAD_PARAMETER, null);
1176 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1180 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1181 String requestScope;
1182 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1183 requestScope = (ModelType.vnf.name());
1185 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1187 InfraActiveRequests dup = null;
1190 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1191 } catch(Exception e) {
1192 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1194 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1196 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1201 return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1204 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1205 RequestReferences referencesResponse = new RequestReferences();
1206 referencesResponse.setRequestId(requestId);
1207 serviceResponse.setRequestReferences(referencesResponse);
1209 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1210 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1211 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1213 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1214 String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1216 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "",
1217 MsoLogger.ErrorCode.DataError, error);
1218 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1219 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1220 MsoException.ServiceException,
1222 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1224 msoRequest.createRequestRecord (Status.FAILED, action);
1225 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1226 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1231 requestId = msoRequest.getRequestId ();
1232 msoLogger.debug ("requestId is: " + requestId);
1233 msoLogger.debug ("About to insert a record");
1236 createRequestRecord(action, startTime, msoRequest);
1237 } catch(Exception e) {
1238 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1239 MsoException.ServiceException,
1240 "Exception while creating record in DB " + e.getMessage(),
1241 ErrorNumbers.SVC_BAD_PARAMETER,
1243 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1247 return postBPELRequest(action, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false);