2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.openecomp.mso.apihandlerinfra;
 
  23 import java.io.StringReader;
 
  24 import java.io.StringWriter;
 
  25 import java.io.IOException;
 
  26 import java.sql.Timestamp;
 
  27 import java.util.ArrayList;
 
  28 import java.util.HashMap;
 
  29 import java.util.List;
 
  31 import java.util.Map.Entry;
 
  32 import java.util.StringTokenizer;
 
  34 import javax.ws.rs.core.MultivaluedMap;
 
  35 import javax.ws.rs.core.Response;
 
  36 import javax.xml.bind.JAXBContext;
 
  37 import javax.xml.bind.JAXBException;
 
  38 import javax.xml.bind.Marshaller;
 
  39 import javax.xml.transform.OutputKeys;
 
  40 import javax.xml.transform.Transformer;
 
  41 import javax.xml.transform.TransformerFactory;
 
  42 import javax.xml.transform.dom.DOMSource;
 
  43 import javax.xml.transform.stream.StreamResult;
 
  45 import org.codehaus.jackson.JsonGenerationException;
 
  46 import org.codehaus.jackson.map.JsonMappingException;
 
  47 import org.codehaus.jackson.map.ObjectMapper;
 
  48 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
  49 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
  50 import org.hibernate.Session;
 
  51 import org.w3c.dom.Document;
 
  52 import org.w3c.dom.Element;
 
  53 import org.w3c.dom.Node;
 
  54 import org.w3c.dom.NodeList;
 
  56 import org.openecomp.mso.apihandler.common.ValidationException;
 
  57 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.CloudConfiguration;
 
  58 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
 
  59 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.PolicyException;
 
  60 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
 
  61 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
 
  62 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestError;
 
  63 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
 
  64 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
 
  65 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceException;
 
  66 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
 
  67 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;
 
  68 import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType;
 
  69 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfInputs;
 
  70 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfRequest;
 
  71 import org.openecomp.mso.db.AbstractSessionFactoryManager;
 
  72 import org.openecomp.mso.logger.MessageEnum;
 
  73 import org.openecomp.mso.logger.MsoLogger;
 
  74 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
 
  75 import org.openecomp.mso.requestsdb.InfraActiveRequests;
 
  76 import org.openecomp.mso.requestsdb.RequestsDatabase;
 
  77 import org.openecomp.mso.utils.UUIDChecker;
 
  79 public class MsoRequest {
 
  81     private String requestId;
 
  82     private String requestXML;
 
  83     private String requestJSON;
 
  84     private String requestUri;
 
  85     private VnfRequest vnfReq;
 
  86     private RequestInfo requestInfo;
 
  87     private ModelInfo modelInfo;
 
  88     private CloudConfiguration cloudConfiguration ;
 
  89     private VnfInputs vnfInputs;
 
  90     private String vnfParams;
 
  91     private Action action;
 
  92     private String errorMessage;
 
  93     private String errorCode;
 
  94     private String httpResponse;
 
  95     private String responseBody;
 
  96     private RequestStatusType status;
 
  97     private ServiceInstancesRequest sir;
 
  98     private long startTime;
 
  99     private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
 
 100     private String serviceInstanceType;
 
 101     private String vnfType;
 
 102     private String vfModuleType;
 
 103     private String vfModuleModelName;
 
 104     private String networkType;
 
 105     private String asdcServiceModelVersion;
 
 106     private String requestScope;
 
 107     private int reqVersion;
 
 108     private boolean aLaCarteFlag = false;
 
 110     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
 
 111     private static final String NOT_PROVIDED = "not provided";
 
 113     protected AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager ();
 
 115     MsoRequest (String requestId) {
 
 116         this.requestId = requestId;
 
 117         this.startTime = System.currentTimeMillis();
 
 118         MsoLogger.setLogContext (requestId, null);
 
 124         this.startTime = System.currentTimeMillis();
 
 125         MsoLogger.setLogContext (requestId, null);
 
 130     public Response buildServiceErrorResponse (int httpResponseCode,
 
 131             MsoException exceptionType,
 
 134             List<String> variables) {
 
 136         this.errorCode = messageId;
 
 139                 this.errorMessage = text;
 
 142                 this.errorMessage = "";
 
 144         this.httpResponse = Integer.toString(httpResponseCode);
 
 145         if(errorMessage.length() > 1999){
 
 146             errorMessage = errorMessage.substring(0, 1999);
 
 149         RequestError re = new RequestError();
 
 151         if(exceptionType.name().equals("PolicyException")){
 
 153                 PolicyException pe = new PolicyException();
 
 154                 pe.setMessageId(messageId);
 
 156                 if(variables != null){
 
 157                         for(String variable: variables){
 
 158                                 pe.getVariables().add(variable);
 
 161                 re.setPolicyException(pe);
 
 165                 ServiceException se = new ServiceException();
 
 166                 se.setMessageId(messageId);
 
 168                 if(variables != null){
 
 169                         if(variables != null){
 
 170                                 for(String variable: variables){
 
 171                                         se.getVariables().add(variable);
 
 175                 re.setServiceException(se);
 
 178         String requestErrorStr = null;
 
 181                 ObjectMapper mapper = new ObjectMapper();
 
 182                 mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
 
 183                 requestErrorStr = mapper.writeValueAsString(re);
 
 185                 msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e);
 
 189         return Response.status (httpResponseCode).entity(requestErrorStr).build ();
 
 193     private int reqVersionToInt(String version){
 
 195                 return Integer.parseInt(version.substring(1));
 
 201     // Parse request JSON
 
 202     void parse (ServiceInstancesRequest sir, HashMap<String,String> instanceIdMap, Action action, String version) throws ValidationException {
 
 204         msoLogger.debug ("Validating the Service Instance request");
 
 207         this.action = action;
 
 208         this.reqVersion = reqVersionToInt(version);
 
 209         msoLogger.debug ("Incoming version is: " + version + " coverting to int: " + this.reqVersion);
 
 213                 ObjectMapper mapper = new ObjectMapper();
 
 214                 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
 
 215                 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
 
 217         } catch(Exception e){
 
 218                 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string");
 
 221         if(instanceIdMap != null){
 
 222                 if(instanceIdMap.get("serviceInstanceId") != null){
 
 223                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("serviceInstanceId"))) {
 
 224                                 throw new ValidationException ("serviceInstanceId");
 
 226                         this.sir.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
 
 229                 if(instanceIdMap.get("vnfInstanceId") != null){
 
 230                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vnfInstanceId"))) {
 
 231                                 throw new ValidationException ("vnfInstanceId");
 
 233                         this.sir.setVnfInstanceId(instanceIdMap.get("vnfInstanceId"));
 
 236                 if(instanceIdMap.get("vfModuleInstanceId") != null){
 
 237                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vfModuleInstanceId"))) {
 
 238                                 throw new ValidationException ("vfModuleInstanceId");
 
 240                         this.sir.setVfModuleInstanceId(instanceIdMap.get("vfModuleInstanceId"));
 
 243                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
 
 244                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("volumeGroupInstanceId"))) {
 
 245                                 throw new ValidationException ("volumeGroupInstanceId");
 
 247                         this.sir.setVolumeGroupInstanceId(instanceIdMap.get("volumeGroupInstanceId"));
 
 250                 if(instanceIdMap.get("networkInstanceId") != null){
 
 251                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("networkInstanceId"))) {
 
 252                                 throw new ValidationException ("networkInstanceId");
 
 254                         this.sir.setNetworkInstanceId(instanceIdMap.get("networkInstanceId"));
 
 258         RequestParameters requestParameters = sir.getRequestDetails().getRequestParameters();
 
 259         if(this.reqVersion >= 3){
 
 260                 if(requestParameters!=null){
 
 261                         this.aLaCarteFlag = sir.getRequestDetails().getRequestParameters().getALaCarte();
 
 263                         this.aLaCarteFlag = false;
 
 266                 this.aLaCarteFlag = true;
 
 269                 if(requestParameters != null && (reqVersion < 3) && requestParameters.getAutoBuildVfModules()){
 
 270                 throw new ValidationException("AutoBuildVfModule", version);
 
 273         this.modelInfo = sir.getRequestDetails().getModelInfo();
 
 275         if (this.modelInfo == null) {
 
 276             throw new ValidationException ("model-info");
 
 279         this.requestInfo = sir.getRequestDetails().getRequestInfo();
 
 281         if (this.requestInfo == null) {
 
 282             throw new ValidationException ("requestInfo");
 
 285         if (modelInfo.getModelType () == null) {
 
 286                 throw new ValidationException ("modelType");
 
 289         this.requestScope = modelInfo.getModelType().name();
 
 291         // modelCustomizationId is required when usePreLoad is false for v4 and higher for VF Module Create
 
 292         if(requestParameters != null && reqVersion > 3 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.createInstance && !requestParameters.isUsePreload()) {
 
 293                 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
 
 294                         throw new ValidationException("modelCustomizationId");
 
 298         // modelCustomizationId is required when usePreLoad is false for v5 and higher for VF Module Replace
 
 299         if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
 
 300                 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
 
 301                         throw new ValidationException("modelCustomizationId");
 
 305         // modelCustomizationId or modelCustomizationName are required when usePreLoad is false for v5 and higher for VNF Replace
 
 306         if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
 
 307                 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId()) && modelInfo.getModelCustomizationName() == null) {
 
 308                         throw new ValidationException("modelCustomizationId or modelCustomizationName");
 
 312         //is required for serviceInstance delete macro when aLaCarte=false (v3)
 
 313         //create and updates except for network (except v4)
 
 314         if (empty (modelInfo.getModelInvariantId ()) && ((this.reqVersion >2 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
 
 315                 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
 
 316                 throw new ValidationException ("modelInvariantId");
 
 319         if (!empty (modelInfo.getModelInvariantId ()) && !UUIDChecker.isValidUUID (modelInfo.getModelInvariantId ())) {
 
 320                 throw new ValidationException ("modelInvariantId format");
 
 323         if (this.reqVersion <= 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
 
 324                         (requestScope.equalsIgnoreCase (ModelType.network.name ()) || requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))) {
 
 325                 throw new ValidationException ("modelName");
 
 327         if(this.reqVersion > 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
 
 328                         (requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))){
 
 329                 throw new ValidationException ("modelName");
 
 332         if (empty (modelInfo.getModelVersion ()) && ((this.reqVersion == 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) || 
 
 333                         !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
 
 334                 throw new ValidationException ("modelVersion");
 
 337         // modelVersionId doesn't exist in v2, not required field in v3, is required for serviceInstance delete macro when aLaCarte=false in v4
 
 338         if (this.reqVersion > 3 && empty (modelInfo.getModelVersionId()) && ((!this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
 
 339                         (action == Action.createInstance || action == Action.updateInstance))) {
 
 340                 throw new ValidationException ("modelVersionId");
 
 343         if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action != Action.deleteInstance && empty (modelInfo.getModelCustomizationName ())) {
 
 344                 if(this.reqVersion<=2){
 
 345                         throw new ValidationException ("modelCustomizationName");
 
 346                 } else if (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) {
 
 347                         throw new ValidationException ("modelCustomizationId or modelCustomizationName");
 
 351         if(this.reqVersion > 2 && (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) && requestScope.equalsIgnoreCase (ModelType.network.name ())
 
 352                         && (action == Action.updateInstance || action == Action.createInstance)){
 
 353                 throw new ValidationException ("modelCustomizationId");
 
 356         if(!empty(modelInfo.getModelNameVersionId())){
 
 357                 modelInfo.setModelVersionId(modelInfo.getModelNameVersionId());
 
 360         this.cloudConfiguration = sir.getRequestDetails ().getCloudConfiguration ();
 
 361         if ( (((!this.aLaCarteFlag && requestScope.equalsIgnoreCase (ModelType.service.name ()) && this.reqVersion < 5) ||
 
 362                         (!requestScope.equalsIgnoreCase (ModelType.service.name ())) && action != Action.updateInstance))
 
 363                         && cloudConfiguration == null) {
 
 364                 throw new ValidationException ("cloudConfiguration");
 
 367         if (cloudConfiguration != null) {
 
 368                 if (empty (cloudConfiguration.getLcpCloudRegionId ())) {
 
 369                         throw new ValidationException ("lcpCloudRegionId");
 
 371                 if (empty (cloudConfiguration.getTenantId ())) {
 
 372                         throw new ValidationException ("tenantId");
 
 377         if (requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
 
 378                 if (requestParameters == null) {
 
 379                         throw new ValidationException ("requestParameters");
 
 381                 if (empty (requestParameters.getSubscriptionServiceType ())) {
 
 382                         throw new ValidationException ("subscriptionServiceType");
 
 386         if (this.reqVersion > 4 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
 
 387                 SubscriberInfo subscriberInfo = sir.getRequestDetails ().getSubscriberInfo();
 
 388                 if (subscriberInfo == null) {
 
 389                         throw new ValidationException ("subscriberInfo");
 
 391                 if (empty (subscriberInfo.getGlobalSubscriberId ())) {
 
 392                         throw new ValidationException ("globalSubscriberId");
 
 396         if(requestScope.equalsIgnoreCase(ModelType.service.name())){
 
 397                 this.serviceInstanceType = modelInfo.getModelName();
 
 400         if(requestScope.equalsIgnoreCase(ModelType.network.name())){
 
 401                 this.networkType = modelInfo.getModelName();
 
 404         // Verify instanceName existence and format except for macro serviceInstance
 
 405         if (this.reqVersion < 3 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && empty (requestInfo.getInstanceName ()) && action == Action.createInstance) {
 
 406                 throw new ValidationException ("instanceName");
 
 409         if (!empty (requestInfo.getInstanceName ())) {
 
 410                 if (!requestInfo.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
 
 411                         throw new ValidationException ("instanceName format");
 
 415         if (empty (requestInfo.getProductFamilyId ()))  {
 
 416                 // Mandatory for vnf Create(aLaCarte=true), Network Create(aLaCarte=true) and network update
 
 417                 //Mandatory for macro request create service instance
 
 418                 if((requestScope.equalsIgnoreCase (ModelType.vnf.name ()) && action == Action.createInstance) || 
 
 419                         (requestScope.equalsIgnoreCase (ModelType.network.name ()) && (action == Action.createInstance || action == Action.updateInstance)) ||
 
 420                         (this.reqVersion > 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.createInstance)) {
 
 421                 throw new ValidationException ("productFamilyId");
 
 425         //required for all operations in V4
 
 426         if(empty(requestInfo.getRequestorId()) && this.reqVersion > 3) {
 
 427                 throw new ValidationException ("requestorId");
 
 430         if (empty (requestInfo.getSource ())) {
 
 431                 throw new ValidationException ("source");
 
 435         RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
 
 437         String serviceModelName = null;
 
 438         String vnfModelName = null;
 
 439         String asdcServiceModelVersion = null;
 
 440         String volumeGroupId = null;
 
 441         boolean isRelatedServiceInstancePresent = false;
 
 442         boolean isRelatedVnfInstancePresent = false;
 
 444         if (instanceList != null) {
 
 445                 for(RelatedInstanceList relatedInstanceList : instanceList){
 
 446                         RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
 
 448                         ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo ();
 
 449                                 if (relatedInstanceModelInfo == null) {
 
 450                                 throw new ValidationException ("modelInfo in relatedInstance");
 
 453                         if (relatedInstanceModelInfo.getModelType () == null) {
 
 454                                 throw new ValidationException ("modelType in relatedInstance");
 
 458                         if (!empty (relatedInstance.getInstanceName ())) {
 
 459                         if (!relatedInstance.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
 
 460                                 throw new ValidationException ("instanceName format in relatedInstance");
 
 464                         if (empty (relatedInstance.getInstanceId ())) {
 
 465                                 throw new ValidationException ("instanceId in relatedInstance");
 
 468                         if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
 
 469                                 throw new ValidationException ("instanceId format in relatedInstance");
 
 473                         if (action != Action.deleteInstance) {
 
 474                                 if(!relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
 
 476                                         if(empty (relatedInstanceModelInfo.getModelInvariantId ())) {
 
 477                                         throw new ValidationException ("modelInvariantId in relatedInstance");
 
 478                                         } else if(this.reqVersion > 3 && empty(relatedInstanceModelInfo.getModelVersionId ())) {
 
 479                                                 throw new ValidationException("modelVersionId in relatedInstance");
 
 480                                         } else if(empty(relatedInstanceModelInfo.getModelName ())) {
 
 481                                                 throw new ValidationException ("modelName in relatedInstance");
 
 482                                         } else if (empty (relatedInstanceModelInfo.getModelVersion ())) {
 
 483                                                 throw new ValidationException ("modelVersion in relatedInstance");
 
 487                                 if (!empty (relatedInstanceModelInfo.getModelInvariantId ()) &&
 
 488                                                 !UUIDChecker.isValidUUID (relatedInstanceModelInfo.getModelInvariantId ())) {
 
 489                                         throw new ValidationException ("modelInvariantId format in relatedInstance");
 
 493                         if (empty (relatedInstanceModelInfo.getModelCustomizationName ()) && relatedInstanceModelInfo.getModelType ().equals (ModelType.vnf) ) {
 
 494                                 if(this.reqVersion >=3 && empty (relatedInstanceModelInfo.getModelCustomizationId()) && action != Action.deleteInstance) {
 
 495                                         throw new ValidationException ("modelCustomizationName or modelCustomizationId in relatedInstance of vnf");
 
 496                                 } else if(this.reqVersion < 3) {
 
 497                                         throw new ValidationException ("modelCustomizationName in relatedInstance");
 
 501                         if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
 
 502                                 isRelatedServiceInstancePresent = true;
 
 503                                 if (!relatedInstance.getInstanceId ().equals (this.sir.getServiceInstanceId ())) {
 
 504                                         throw new ValidationException ("serviceInstanceId matching the serviceInstanceId in request URI");
 
 506                                 serviceModelName = relatedInstanceModelInfo.getModelName ();
 
 507                                 asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion ();
 
 508                         } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
 
 509                                 isRelatedVnfInstancePresent = true;
 
 510                                 if (!relatedInstance.getInstanceId ().equals (this.sir.getVnfInstanceId ())) {
 
 511                                         throw new ValidationException ("vnfInstanceId matching the vnfInstanceId in request URI");
 
 513                                 vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
 
 514                         } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {                              
 
 515                                 volumeGroupId = relatedInstance.getInstanceId ();
 
 520                 if(requestScope.equalsIgnoreCase (ModelType.volumeGroup.name ())) {
 
 521                         if (!isRelatedServiceInstancePresent) {
 
 522                                 throw new ValidationException ("related service instance for volumeGroup request");
 
 524                         if (!isRelatedVnfInstancePresent) {
 
 525                                 throw new ValidationException ("related vnf instance for volumeGroup request");
 
 527                         this.serviceInstanceType = serviceModelName;
 
 528                         this.vnfType = serviceModelName + "/" + vnfModelName;
 
 529                         this.asdcServiceModelVersion = asdcServiceModelVersion;
 
 531                 else if(requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) {
 
 532                         if (!isRelatedServiceInstancePresent) {
 
 533                                 throw new ValidationException ("related service instance for vfModule request");
 
 535                         if (!isRelatedVnfInstancePresent) {
 
 536                                 throw new ValidationException ("related vnf instance for vfModule request");
 
 538                         String vfModuleModelName = modelInfo.getModelName ();
 
 539                         this.vfModuleModelName = vfModuleModelName;
 
 540                         this.serviceInstanceType = serviceModelName;
 
 541                         this.vnfType = serviceModelName + "/" + vnfModelName;
 
 542                         this.asdcServiceModelVersion = asdcServiceModelVersion;
 
 543                         this.vfModuleType = vnfType + "::" + vfModuleModelName;
 
 544                         this.sir.setVolumeGroupInstanceId (volumeGroupId);
 
 546                 else if (requestScope.equalsIgnoreCase (ModelType.vnf.name ())) {
 
 547                         if (!isRelatedServiceInstancePresent) {
 
 548                                 throw new ValidationException ("related service instance for vnf request");
 
 550                         this.vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
 
 553         else if ((( requestScope.equalsIgnoreCase(ModelType.vnf.name ()) || requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ()) ) && (action == Action.createInstance)) ||
 
 554                         (this.reqVersion > 2 && (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) && action == Action.updateInstance)){
 
 555                  msoLogger.debug ("related instance exception");
 
 556                 throw new ValidationException ("related instances");
 
 561     void parseOrchestration (ServiceInstancesRequest sir) throws ValidationException {
 
 563         msoLogger.debug ("Validating the Orchestration request");
 
 568                 ObjectMapper mapper = new ObjectMapper();
 
 569                 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
 
 570                 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
 
 572         } catch(Exception e){
 
 573                 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string", e);
 
 576         this.requestInfo = sir.getRequestDetails().getRequestInfo();
 
 578         if (this.requestInfo == null) {
 
 579             throw new ValidationException ("requestInfo");
 
 582         if (empty (requestInfo.getSource ())) {
 
 583                 throw new ValidationException ("source");
 
 585         if (empty (requestInfo.getRequestorId ())) {
 
 586                 throw new ValidationException ("requestorId");
 
 590     public Map<String, List<String>> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
 
 592         String queryParam = null;
 
 593         Map<String, List<String>> orchestrationFilterParams = new HashMap<String, List<String>>();
 
 596         for (Entry<String,List<String>> entry : queryParams.entrySet()) {
 
 597             queryParam = entry.getKey();
 
 600                   if(queryParam.equalsIgnoreCase("filter")){
 
 601                           for(String value : entry.getValue()) {
 
 602                                   StringTokenizer st = new StringTokenizer(value, ":");
 
 606                                   List<String> orchestrationList = new ArrayList<String>();
 
 607                                   while (st.hasMoreElements()) {
 
 609                                                   mapKey = st.nextElement() + "";
 
 611                                                   orchestrationList.add(st.nextElement() + "");
 
 615                                   orchestrationFilterParams.put(mapKey, orchestrationList);
 
 620                 //msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, e);
 
 621                 throw new ValidationException ("QueryParam ServiceInfo", e);
 
 628         return orchestrationFilterParams;
 
 631     public void createRequestRecord (Status status, Action action) {
 
 633         Session session = null;
 
 636             session = requestsDbSessionFactoryManager.getSessionFactory ().openSession ();
 
 637             session.beginTransaction ();
 
 640                 sir = new ServiceInstancesRequest ();
 
 643             InfraActiveRequests aq = new InfraActiveRequests ();
 
 644             aq.setRequestId (requestId);
 
 646             aq.setRequestAction(action.name());
 
 647             aq.setAction(action.name());
 
 649             Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
 
 651             aq.setStartTime (startTimeStamp);
 
 653             if (requestInfo != null) {
 
 655                 if(requestInfo.getSource() != null){
 
 656                         aq.setSource(requestInfo.getSource());
 
 658                 if(requestInfo.getCallbackUrl() != null){
 
 659                         aq.setCallBackUrl(requestInfo.getCallbackUrl());
 
 661                 if(requestInfo.getCorrelator() != null){
 
 662                         aq.setCorrelator(requestInfo.getCorrelator());
 
 665                 if(requestInfo.getRequestorId() != null) {
 
 666                         aq.setRequestorId(requestInfo.getRequestorId());
 
 670             if (modelInfo != null) {
 
 671                 aq.setRequestScope(requestScope);
 
 674             if (cloudConfiguration != null) {
 
 675                 if(cloudConfiguration.getLcpCloudRegionId() != null) {
 
 676                         aq.setAicCloudRegion(cloudConfiguration.getLcpCloudRegionId());
 
 679                 if(cloudConfiguration.getTenantId() != null) {
 
 680                         aq.setTenantId(cloudConfiguration.getTenantId());
 
 685             if(sir.getServiceInstanceId() != null){
 
 686                 aq.setServiceInstanceId(sir.getServiceInstanceId());
 
 689             if(sir.getVnfInstanceId() != null){
 
 690                 aq.setVnfId(sir.getVnfInstanceId());
 
 694             if(ModelType.service.name().equalsIgnoreCase(requestScope)){
 
 695                 if(requestInfo.getInstanceName() != null){
 
 696                         aq.setServiceInstanceName(requestInfo.getInstanceName());
 
 700             if(ModelType.network.name().equalsIgnoreCase(requestScope)){
 
 701                 aq.setNetworkName(requestInfo.getInstanceName());
 
 702                 aq.setNetworkType(networkType);
 
 703                 aq.setNetworkId(sir.getNetworkInstanceId());
 
 706             if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)){
 
 707                 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
 
 708                 aq.setVolumeGroupName(requestInfo.getInstanceName());
 
 709                 aq.setVnfType(vnfType);
 
 713             if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)){
 
 714                 aq.setVfModuleName(requestInfo.getInstanceName());
 
 715                 aq.setVfModuleModelName(modelInfo.getModelName());
 
 716                 aq.setVfModuleId(sir.getVfModuleInstanceId());
 
 717                 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
 
 718                 aq.setVnfType(vnfType);
 
 722             if(ModelType.vnf.name().equalsIgnoreCase(requestScope)){
 
 723                 aq.setVnfName(requestInfo.getInstanceName());
 
 724                                 if (null != sir.getRequestDetails()) {
 
 725                                         RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
 
 727                                         if (instanceList != null) {
 
 729                                                 for(RelatedInstanceList relatedInstanceList : instanceList){
 
 731                                                         RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
 
 732                                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
 
 733                                                                 aq.setVnfType(vnfType);
 
 740             aq.setRequestBody (this.requestJSON);
 
 742             aq.setRequestStatus (status.toString ());
 
 743             aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
 
 745             if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
 
 746                 aq.setStatusMessage (this.errorMessage);
 
 747                 aq.setResponseBody (this.responseBody);
 
 748                 aq.setProgress(new Long(100));
 
 750                 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
 
 751                 aq.setEndTime (endTimeStamp);
 
 754             msoLogger.debug ("About to insert a record");
 
 757             session.getTransaction ().commit ();
 
 759         } catch (Exception e) {
 
 760                 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
 
 761             if (session != null) {
 
 764             if (!status.equals (Status.FAILED)) {
 
 770     public void updateFinalStatus (Status status) {
 
 773             result = (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId,
 
 778                                                               Constants.MODIFIED_BY_APIHANDLER);
 
 779         } catch (Exception e) {
 
 780                 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
 
 781             msoLogger.debug ("Exception: ", e);
 
 785     public Response buildResponse (int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
 
 786         return buildResponseWithError (httpResponseCode, errorCode, inProgress, null);
 
 789     public Response buildResponseWithError (int httpResponseCode,
 
 791                                             InfraActiveRequests inProgress,
 
 792                                             String errorString) {
 
 796         // Log the failed request into the MSO Requests database
 
 798         return Response.status (httpResponseCode).entity (null).build ();
 
 802     public Response buildResponseFailedValidation (int httpResponseCode, String exceptionMessage) {
 
 806         return Response.status (httpResponseCode).entity (null).build ();
 
 809     public String getRequestUri () {
 
 813     public void setRequestUri (String requestUri) {
 
 814         this.requestUri = requestUri;
 
 817     public VnfInputs getVnfInputs () {
 
 821     public RequestInfo getRequestInfo () {
 
 825     public String getResponseBody () {
 
 829     public void setResponseBody (String responseBody) {
 
 830         this.responseBody = responseBody;
 
 833     public String getHttpResponse () {
 
 837     public void setHttpResponse (String httpResponse) {
 
 838         this.httpResponse = httpResponse;
 
 841     public String getRequestId () {
 
 845     public String getRequestXML () {
 
 849     public void setRequestXML (String requestXML) {
 
 850         this.requestXML = requestXML;
 
 853     public RequestStatusType getStatus () {
 
 857     public String getServiceType () {
 
 858         if (this.vnfInputs.getServiceType () != null)
 
 859                 return this.vnfInputs.getServiceType ();
 
 860         if (this.vnfInputs.getServiceId () != null)
 
 861                 return this.vnfInputs.getServiceId ();
 
 865     public void setStatus (RequestStatusType status) {
 
 866         this.status = status;
 
 870                 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
 
 873                 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
 
 878     public ModelInfo getModelInfo() {
 
 882     public ServiceInstancesRequest getServiceInstancesRequest() {
 
 886     public String getServiceInstanceType () {
 
 887         return serviceInstanceType;
 
 890     public String getNetworkType () {
 
 894     public String getVnfType () {
 
 898     public String getVfModuleModelName () {
 
 899         return vfModuleModelName;
 
 902     public String getVfModuleType () {
 
 906     public String getAsdcServiceModelVersion () {
 
 907         return asdcServiceModelVersion;
 
 910     public static String domToStr (Document doc) {
 
 916             StringWriter sw = new StringWriter ();
 
 917             StreamResult sr = new StreamResult (sw);
 
 918             TransformerFactory tf = TransformerFactory.newInstance ();
 
 919             Transformer t = tf.newTransformer ();
 
 920             t.setOutputProperty (OutputKeys.STANDALONE, "yes");
 
 921             NodeList nl = doc.getDocumentElement ().getChildNodes ();
 
 922             DOMSource source = null;
 
 923             for (int x = 0; x < nl.getLength (); x++) {
 
 924                 Node e = nl.item (x);
 
 925                 if (e instanceof Element) {
 
 926                     source = new DOMSource (e);
 
 930             if (source != null) {
 
 931                 t.transform (source, sr);
 
 933                 String s = sw.toString ();
 
 939         } catch (Exception e) {
 
 940             msoLogger.error (MessageEnum.APIH_DOM2STR_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in domToStr", e);
 
 945     public void addBPMNSpecificInputs(String personaModelId, String personaModelVersion, Boolean isBaseVfModule,
 
 946                         String vnfPersonaModelId, String vnfPersonaModelVersion) {
 
 947         vnfInputs.setPersonaModelId(personaModelId);
 
 948         vnfInputs.setPersonaModelVersion(personaModelVersion);
 
 949         vnfInputs.setIsBaseVfModule(isBaseVfModule);
 
 950         vnfInputs.setVnfPersonaModelId(vnfPersonaModelId);
 
 951         vnfInputs.setVnfPersonaModelVersion(vnfPersonaModelVersion);
 
 953         this.vnfReq.setVnfInputs(vnfInputs);
 
 955           StringWriter stringWriter = new StringWriter ();
 
 957               JAXBContext jaxbContext = JAXBContext.newInstance (VnfRequest.class);
 
 958               Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
 
 960               // output pretty printed
 
 961               jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
 
 963               jaxbMarshaller.marshal (this.vnfReq, stringWriter);
 
 965           } catch (JAXBException e) {
 
 966               msoLogger.debug ("Exception: ", e);
 
 969           this.requestXML = stringWriter.toString ();
 
 970           msoLogger.debug("REQUEST XML to BPEL: " + this.requestXML);
 
 975     private static boolean empty(String s) {
 
 976           return (s == null || s.trim().isEmpty());
 
 979     public String getRequestJSON() throws JsonGenerationException, JsonMappingException, IOException {
 
 980         ObjectMapper mapper = new ObjectMapper();
 
 981         mapper.setSerializationInclusion(Inclusion.NON_NULL);
 
 982         //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
 
 983         msoLogger.debug ("building sir from object " + sir);
 
 984         requestJSON = mapper.writeValueAsString(sir);
 
 986         // Perform mapping from VID-style modelInfo fields to ASDC-style modelInfo fields
 
 988         msoLogger.debug("REQUEST JSON before mapping: " + requestJSON);
 
 989         // modelUuid = modelVersionId
 
 990         requestJSON = requestJSON.replaceAll("\"modelVersionId\":","\"modelUuid\":");
 
 991         // modelCustomizationUuid = modelCustomizationId
 
 992         requestJSON = requestJSON.replaceAll("\"modelCustomizationId\":","\"modelCustomizationUuid\":");
 
 993         // modelInstanceName = modelCustomizationName
 
 994         requestJSON = requestJSON.replaceAll("\"modelCustomizationName\":","\"modelInstanceName\":");
 
 995         // modelInvariantUuid = modelInvariantId 
 
 996         requestJSON = requestJSON.replaceAll("\"modelInvariantId\":","\"modelInvariantUuid\":");        
 
 997         msoLogger.debug("REQUEST JSON after mapping: " + requestJSON);
 
1002         public boolean getALaCarteFlag() {
 
1003                 return aLaCarteFlag;
 
1006         public void setaLaCarteFlag(boolean aLaCarteFlag) {
 
1007                 this.aLaCarteFlag = aLaCarteFlag;
 
1010         public int getReqVersion() {
 
1014         public void setReqVersion(int reqVersion) {
 
1015                 this.reqVersion = reqVersion;