* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
+
package org.openecomp.mso.apihandlerinfra;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import org.openecomp.mso.apihandler.common.RequestClient;
import org.openecomp.mso.apihandler.common.RequestClientFactory;
import org.openecomp.mso.apihandler.common.ResponseHandler;
-import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.E2EServiceInstanceRequest;
+import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceRequest;
+import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EUserParam;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestDetails;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
+import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;
import org.openecomp.mso.db.catalog.CatalogDatabase;
import org.openecomp.mso.db.catalog.beans.Service;
import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
import org.openecomp.mso.logger.MessageEnum;
import org.openecomp.mso.logger.MsoAlarmLogger;
import org.openecomp.mso.logger.MsoLogger;
-import org.openecomp.mso.properties.MsoJavaProperties;
import org.openecomp.mso.requestsdb.InfraActiveRequests;
import org.openecomp.mso.requestsdb.RequestsDatabase;
import org.openecomp.mso.utils.UUIDChecker;
-@Path("/")
-public class E2EServiceInstances {
-
- private HashMap<String, String> instanceIdMap = new HashMap<String, String>();
-
- private static MsoLogger msoLogger = MsoLogger
- .getMsoLogger(MsoLogger.Catalog.APIH);
+import com.wordnik.swagger.annotations.Api;
+import com.wordnik.swagger.annotations.ApiOperation;
- private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger();
+@Path("/e2eServiceInstances")
+@Api(value="/e2eServiceInstances",description="API Requests for E2E Service Instances")
+public class E2EServiceInstances {
+ private HashMap<String, String> instanceIdMap = new HashMap<String,String>();
+ private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
+ private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
- private static MsoJavaProperties props = MsoPropertiesUtils
- .loadMsoProperties();
-
public E2EServiceInstances() {
}
+
+ /**
+ *POST Requests for E2E Service create Instance on a version provided
+ */
@POST
- @Path("e2eServiceInstances/{version:[vV][2-3]}")
+ @Path("/{version:[vV][3-5]}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response createE2EServiceInstance(String request,
- @PathParam("version") String version) {
+ @ApiOperation(value="Create a E2E Service Instance on a version provided",response=Response.class)
+ public Response createE2EServiceInstance(String request, @PathParam("version") String version) {
- Response response = E2EserviceInstances(request, Action.createInstance,
- null, version);
+ Response response = E2EserviceInstances(request, Action.createInstance, null, version);
return response;
}
+ /**
+ *DELETE Requests for E2E Service delete Instance on a specified version and serviceId
+ */
+
@DELETE
- @Path("e2eServiceInstances/{version:[vV][2-3]}/{serviceId}")
+ @Path("/{version:[vV][3-5]}/{serviceId}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response deleteE2EServiceInstance(String request,
- @PathParam("version") String version) {
+ @ApiOperation(value="Delete E2E Service Instance on a specified version and serviceId",response=Response.class)
+ public Response deleteE2EServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceId") String serviceId) {
- Response response = E2EserviceInstances(request, Action.deleteInstance,
- null, version);
+ instanceIdMap.put("serviceId", serviceId);
+ Response response = E2EserviceInstances(request, Action.deleteInstance, null, version);
return response;
}
-
+
private Response E2EserviceInstances(String requestJSON, Action action,
HashMap<String, String> instanceIdMap, String version) {
long startTime = System.currentTimeMillis();
msoLogger.debug("requestId is: " + requestId);
E2EServiceInstanceRequest sir = null;
+
MsoRequest msoRequest = new MsoRequest(requestId);
ObjectMapper mapper = new ObjectMapper();
try {
- sir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);
+ sir = mapper
+ .readValue(requestJSON, E2EServiceInstanceRequest.class);
+
} catch (Exception e) {
msoLogger.debug("Mapping of request to JSON object failed : ", e);
MsoException.ServiceException,
"Mapping of request to JSON object failed. "
+ e.getMessage(), ErrorNumbers.SVC_BAD_PARAMETER,
- null);
+ null);
msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR,
MSO_PROP_APIHANDLER_INFRA, "", "",
MsoLogger.ErrorCode.SchemaError, requestJSON, e);
InfraActiveRequests dup = null;
String instanceName = sir.getService().getName();
- String requestScope = sir.getService().getName();
+ String requestScope = sir.getService().getParameters().getNodeType();
try {
- if (!(instanceName == null && requestScope.equals("E2EService") && action == Action.createInstance)) {
- dup = (RequestsDatabase.getInstance())
- .checkInstanceNameDuplicate(instanceIdMap,
- instanceName, requestScope);
+ if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
+ dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
}
} catch (Exception e) {
- msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC,
- MSO_PROP_APIHANDLER_INFRA, "", "",
- MsoLogger.ErrorCode.DataError,
- "Error during duplicate check ", e);
+ msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
- Response response = msoRequest.buildServiceErrorResponse(
- HttpStatus.SC_INTERNAL_SERVER_ERROR,
- MsoException.ServiceException, e.getMessage(),
- ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
+ Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
+ e.getMessage(),
+ ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
+ null) ;
- msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
- MsoLogger.ResponseCode.DBAccessError,
- "Error during duplicate check");
- msoLogger.debug("End of the transaction, the final response is: "
- + (String) response.getEntity());
+
+ msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
+ msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
return response;
}
if (dup != null) {
// Found the duplicate record. Return the appropriate error.
String instance = null;
- if (instanceName != null) {
+ if(instanceName != null){
instance = instanceName;
- } else {
+ }else{
instance = instanceIdMap.get(requestScope + "InstanceId");
}
- 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.";
+ 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.";
- Response response = msoRequest.buildServiceErrorResponse(
- HttpStatus.SC_CONFLICT, MsoException.ServiceException,
- dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
+ Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
+ dupMessage,
+ ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
+ null) ;
- msoLogger
- .warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "",
- MsoLogger.ErrorCode.SchemaError,
- "Duplicate request - Subscriber already has a request for this service");
- msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
- MsoLogger.ResponseCode.Conflict, dupMessage);
- msoLogger.debug("End of the transaction, the final response is: "
- + (String) response.getEntity());
- return response;
- }
- CatalogDatabase db = null;
- try {
- db = CatalogDatabase.getInstance();
- ;
- } catch (Exception e) {
- msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,
- MSO_PROP_APIHANDLER_INFRA, "", "",
- MsoLogger.ErrorCode.AvailabilityError,
- "Exception while communciate with Catalog DB", e);
- msoRequest
- .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
- Response response = msoRequest.buildServiceErrorResponse(
- HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
- "No communication to catalog DB " + e.getMessage(),
- ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
- alarmLogger.sendAlarm("MsoDatabaseAccessError",
- MsoAlarmLogger.CRITICAL, Messages.errors
- .get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
- msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
- MsoLogger.ResponseCode.DBAccessError,
- "Exception while communciate with DB");
- msoLogger.debug("End of the transaction, the final response is: "
- + (String) response.getEntity());
+ msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
+ msoRequest.createRequestRecord (Status.FAILED, action);
+ msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
+ msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
return response;
}
+ CatalogDatabase db = null;
RecipeLookupResult recipeLookupResult = null;
-
try {
+ db = CatalogDatabase.getInstance();
recipeLookupResult = getServiceInstanceOrchestrationURI(db, sir, action);
-
} catch (Exception e) {
- msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,
- MSO_PROP_APIHANDLER_INFRA, "", "",
- MsoLogger.ErrorCode.DataError,
- "Exception while querying Catalog DB", e);
- msoRequest
- .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
- Response response = msoRequest.buildServiceErrorResponse(
- HttpStatus.SC_NOT_FOUND,
+ msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
+ msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+ Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
MsoException.ServiceException,
- "Recipe could not be retrieved from catalog DB "
- + e.getMessage(),
- ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
- alarmLogger.sendAlarm("MsoDatabaseAccessError",
+ "No communication to catalog DB " + e.getMessage (),
+ ErrorNumbers.SVC_NO_SERVER_RESOURCES,
+ null);
+ alarmLogger.sendAlarm ("MsoDatabaseAccessError",
MsoAlarmLogger.CRITICAL,
- Messages.errors.get(ErrorNumbers.ERROR_FROM_CATALOG_DB));
- msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
- MsoLogger.ResponseCode.DBAccessError,
- "Exception while querying Catalog DB");
- msoLogger.debug("End of the transaction, the final response is: "
- + (String) response.getEntity());
- db.close();
+ Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
+ msoRequest.createRequestRecord (Status.FAILED,action);
+ msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
+ msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
return response;
+ } finally {
+ if(db != null) {
+ db.close();
+ }
}
if (recipeLookupResult == null) {
- msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,
- MSO_PROP_APIHANDLER_INFRA, "", "",
- MsoLogger.ErrorCode.DataError, "No recipe found in DB");
- msoRequest
- .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
- Response response = msoRequest.buildServiceErrorResponse(
- HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+ msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
+ msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+ Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
+ MsoException.ServiceException,
"Recipe does not exist in catalog DB",
- ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
- msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
- MsoLogger.ResponseCode.DataNotFound,
- "No recipe found in DB");
- msoLogger.debug("End of the transaction, the final response is: "
- + (String) response.getEntity());
- db.close();
+ ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
+ null);
+ msoRequest.createRequestRecord (Status.FAILED, action);
+ msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
+ msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
+
return response;
}
+
+ String modelInfo = sir.getService().getParameters().getNodeTemplateName();
+ String[] arrayOfInfo = modelInfo.split(":");
+ String serviceInstanceType = arrayOfInfo[0];
+
+
+
+ String serviceId = "";
+
RequestClient requestClient = null;
HttpResponse response = null;
+
long subStartTime = System.currentTimeMillis();
+ String sirRequestJson = mappingObtainedRequestJSONToServiceInstanceRequest(sir);
+
try {
- requestClient = RequestClientFactory.getRequestClient(
- recipeLookupResult.getOrchestrationURI(), props);
- // Capture audit event
- msoLogger
- .debug("MSO API Handler Posting call to BPEL engine for url: "
- + requestClient.getUrl());
+ requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), MsoPropertiesUtils.loadMsoProperties ());
- // System.out.println("URL : " + requestClient.getUrl());
+ // Capture audit event
+ msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
- response = requestClient
- .post(requestId, false,
- recipeLookupResult.getRecipeTimeout(),
- action.name(), null, null, null, null, null, null,
- null, null, null, requestJSON);
+ response = requestClient.post(requestId, false,
+ recipeLookupResult.getRecipeTimeout(),
+ action.name(), serviceId, null, null, null, null, serviceInstanceType,
+ null, null, null, sirRequestJson);
msoLogger.recordMetricEvent(subStartTime,
MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
// BPEL accepted the request, the request is in progress
if (bpelStatus == HttpStatus.SC_ACCEPTED) {
String camundaJSONResponseBody = respHandler.getResponseBody();
- msoLogger.debug("Received from Camunda: " + camundaJSONResponseBody);
+ msoLogger
+ .debug("Received from Camunda: " + camundaJSONResponseBody);
(RequestsDatabase.getInstance()).updateInfraStatus(requestId,
Status.IN_PROGRESS.toString(),
Constants.PROGRESS_REQUEST_IN_PROGRESS,
bpelStatus, MsoException.ServiceException,
"Request Failed due to BPEL error with HTTP Status= %1 "
+ '\n' + camundaJSONResponseBody,
- ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
+ ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
requestClient.getUrl(), "", "",
MsoLogger.ErrorCode.BusinessProcesssError,
MsoLogger.ResponseCode.InternalError,
"Response from BPMN engine is failed");
msoLogger
- .debug("End of the transaction, the final response is: "
- + (String) resp.getEntity());
+ .debug("End of the transaction, the final response is: "
+ + (String) resp.getEntity());
return resp;
} else {
Response resp = msoRequest
MsoLogger.ResponseCode.InternalError,
"Response from BPEL engine is empty");
msoLogger
- .debug("End of the transaction, the final response is: "
- + (String) resp.getEntity());
+ .debug("End of the transaction, the final response is: "
+ + (String) resp.getEntity());
return resp;
}
}
private RecipeLookupResult getServiceInstanceOrchestrationURI(
CatalogDatabase db, E2EServiceInstanceRequest sir, Action action) {
+
RecipeLookupResult recipeLookupResult = null;
- if (sir.getService().getName().equals("E2EService")) {
- recipeLookupResult = getServiceURI(db, sir, action);
- }
+ recipeLookupResult = getServiceURI(db, sir, action);
+
if (recipeLookupResult != null) {
- msoLogger.debug("Orchestration URI is: "
- + recipeLookupResult.getOrchestrationURI()
- + ", recipe Timeout is: "
- + Integer.toString(recipeLookupResult.getRecipeTimeout()));
- } else {
+ msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
+ }
+ else {
msoLogger.debug("No matching recipe record found");
}
return recipeLookupResult;
private RecipeLookupResult getServiceURI(CatalogDatabase db,
E2EServiceInstanceRequest sir, Action action) {
+ String defaultServiceModelName = "UUI_DEFAULT";
+
Service serviceRecord = null;
ServiceRecipe recipe = null;
- if (sir.getService().getName().equalsIgnoreCase("E2EService")) {
- serviceRecord = db
- .getServiceByModelName(sir.getService().getName());
- recipe = db.getServiceRecipeByModelUUID(
- serviceRecord.getModelUUID(), action.name());
- }
+ serviceRecord = db.getServiceByModelName(defaultServiceModelName);
+ recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
+
if (recipe == null) {
return null;
}
recipe.getRecipeTimeout());
}
+
+ private String mappingObtainedRequestJSONToServiceInstanceRequest(E2EServiceInstanceRequest e2eSir){
+
+ ServiceInstancesRequest sir = new ServiceInstancesRequest();
+
+ String returnString = null;
+ RequestDetails requestDetails = new RequestDetails();
+ ModelInfo modelInfo = new ModelInfo();
+
+ //ModelInvariantId
+ modelInfo.setModelInvariantId(e2eSir.getService().getServiceDefId());
+
+ //modelNameVersionId
+ modelInfo.setModelNameVersionId(e2eSir.getService().getTemplateId());
+
+ String modelInfoValue = e2eSir.getService().getParameters().getNodeTemplateName();
+ String[] arrayOfInfo = modelInfoValue.split(":");
+ String modelName = arrayOfInfo[0];
+ String modelVersion = arrayOfInfo[1];
+
+ //modelName
+ modelInfo.setModelName(modelName);
+
+ //modelVersion
+ modelInfo.setModelVersion(modelVersion);
+
+ //modelType
+ //if(ModelType.service.equals(e2eSir.getService().getParameters().getNodeType())){
+ modelInfo.setModelType(ModelType.service);
+ //}
+
+ //setting modelInfo to requestDetails
+ requestDetails.setModelInfo(modelInfo);
+
+ SubscriberInfo subscriberInfo = new SubscriberInfo();
+
+ //globalsubscriberId
+ subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getParameters().getGlobalSubscriberId());
+
+ //subscriberName
+ subscriberInfo.setSubscriberName(e2eSir.getService().getParameters().getSubscriberName());
+
+ //setting subscriberInfo to requestDetails
+ requestDetails.setSubscriberInfo(subscriberInfo);
+
+ RequestInfo requestInfo = new RequestInfo();
+
+ //instanceName
+ requestInfo.setInstanceName(e2eSir.getService().getName());
+
+ //source
+ requestInfo.setSource("UUI");
+
+ //suppressRollback
+ requestInfo.setSuppressRollback(true);
+
+ //setting requestInfo to requestDetails
+ requestDetails.setRequestInfo(requestInfo);
+
+ RequestParameters requestParameters = new RequestParameters();
+
+ //subscriptionServiceType
+ requestParameters.setSubscriptionServiceType("MOG");
+
+ //Userparams
+ List<E2EUserParam> userParams = new ArrayList<>();
+ userParams = e2eSir.getService().getParameters().getRequestParameters().getUserParams();
+ List<Map<String, String>> userParamList = new ArrayList<Map<String,String>>();
+ Map<String,String> userParamMap= new HashMap<String, String>();
+ for(E2EUserParam userp: userParams){
+ userParamMap.put(userp.getName(), userp.getValue());
+ userParamList.add(userParamMap);
+ }
+
+ requestParameters.setUserParams(userParamList);
+
+ //setting requestParameters to requestDetails
+ requestDetails.setRequestParameters(requestParameters);
+
+ sir.setRequestDetails(requestDetails);
+
+ //converting to string
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ returnString = mapper.writeValueAsString(sir);
+ } catch (IOException e) {
+ msoLogger.debug("Exception while converting ServiceInstancesRequest object to string", e);
+ }
+
+ return returnString;
+ }
}
\ No newline at end of file