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=========================================================
22 package org.openecomp.mso.apihandlerinfra;
24 import org.codehaus.jackson.JsonGenerationException;
25 import org.codehaus.jackson.map.JsonMappingException;
26 import org.codehaus.jackson.map.ObjectMapper;
27 import org.codehaus.jackson.map.annotate.JsonSerialize;
28 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
29 import org.hibernate.Session;
30 import org.openecomp.mso.apihandler.common.ValidationException;
31 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.CloudConfiguration;
32 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
33 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.PolicyException;
34 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
35 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
36 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestError;
37 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
38 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
39 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceException;
40 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
41 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;
42 import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType;
43 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfInputs;
44 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfRequest;
45 import org.openecomp.mso.db.AbstractSessionFactoryManager;
46 import org.openecomp.mso.logger.MessageEnum;
47 import org.openecomp.mso.logger.MsoLogger;
48 import org.openecomp.mso.requestsdb.InfraActiveRequests;
49 import org.openecomp.mso.requestsdb.RequestsDatabase;
50 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
51 import org.openecomp.mso.utils.UUIDChecker;
52 import org.w3c.dom.Document;
53 import org.w3c.dom.Element;
54 import org.w3c.dom.Node;
55 import org.w3c.dom.NodeList;
57 import javax.ws.rs.core.MultivaluedMap;
58 import javax.ws.rs.core.Response;
59 import javax.xml.bind.JAXBContext;
60 import javax.xml.bind.JAXBException;
61 import javax.xml.bind.Marshaller;
62 import javax.xml.transform.OutputKeys;
63 import javax.xml.transform.Transformer;
64 import javax.xml.transform.TransformerFactory;
65 import javax.xml.transform.dom.DOMSource;
66 import javax.xml.transform.stream.StreamResult;
67 import java.io.IOException;
68 import java.io.StringWriter;
69 import java.sql.Timestamp;
70 import java.util.ArrayList;
71 import java.util.HashMap;
72 import java.util.List;
74 import java.util.Map.Entry;
75 import java.util.StringTokenizer;
77 public class MsoRequest {
79 private String requestId;
80 private String requestXML;
81 private String requestJSON;
82 private String requestUri;
83 private VnfRequest vnfReq;
84 private RequestInfo requestInfo;
85 private ModelInfo modelInfo;
86 private CloudConfiguration cloudConfiguration ;
87 private VnfInputs vnfInputs;
88 private String vnfParams;
89 private Action action;
90 private String errorMessage;
91 private String errorCode;
92 private String httpResponse;
93 private String responseBody;
94 private RequestStatusType status;
95 private ServiceInstancesRequest sir;
96 private long startTime;
97 private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
98 private String serviceInstanceType;
99 private String vnfType;
100 private String vfModuleType;
101 private String vfModuleModelName;
102 private String networkType;
103 private String asdcServiceModelVersion;
104 private String requestScope;
105 private int reqVersion;
106 private boolean aLaCarteFlag = false;
108 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
109 private static final String NOT_PROVIDED = "not provided";
111 protected AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager ();
113 MsoRequest (String requestId) {
114 this.requestId = requestId;
115 this.startTime = System.currentTimeMillis();
116 MsoLogger.setLogContext (requestId, null);
122 this.startTime = System.currentTimeMillis();
123 MsoLogger.setLogContext (requestId, null);
128 public Response buildServiceErrorResponse (int httpResponseCode,
129 MsoException exceptionType,
132 List<String> variables) {
134 this.errorCode = messageId;
137 this.errorMessage = text;
140 this.errorMessage = "";
142 this.httpResponse = Integer.toString(httpResponseCode);
143 if(errorMessage.length() > 1999){
144 errorMessage = errorMessage.substring(0, 1999);
147 RequestError re = new RequestError();
149 if("PolicyException".equals(exceptionType.name())){
151 PolicyException pe = new PolicyException();
152 pe.setMessageId(messageId);
154 if(variables != null){
155 for(String variable: variables){
156 pe.getVariables().add(variable);
159 re.setPolicyException(pe);
163 ServiceException se = new ServiceException();
164 se.setMessageId(messageId);
166 if(variables != null){
167 for(String variable: variables){
168 se.getVariables().add(variable);
171 re.setServiceException(se);
174 String requestErrorStr = null;
177 ObjectMapper mapper = new ObjectMapper();
178 mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
179 requestErrorStr = mapper.writeValueAsString(re);
181 msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e);
185 return Response.status (httpResponseCode).entity(requestErrorStr).build ();
189 private int reqVersionToInt(String version){
191 return Integer.parseInt(version.substring(1));
197 // Parse request JSON
198 void parse (ServiceInstancesRequest sir, HashMap<String,String> instanceIdMap, Action action, String version) throws ValidationException {
200 msoLogger.debug ("Validating the Service Instance request");
203 this.action = action;
204 this.reqVersion = reqVersionToInt(version);
205 msoLogger.debug ("Incoming version is: " + version + " coverting to int: " + this.reqVersion);
209 ObjectMapper mapper = new ObjectMapper();
210 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
211 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
213 } catch(Exception e){
214 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string",e);
217 if(instanceIdMap != null){
218 if(instanceIdMap.get("serviceInstanceId") != null){
219 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("serviceInstanceId"))) {
220 throw new ValidationException ("serviceInstanceId");
222 this.sir.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
225 if(instanceIdMap.get("vnfInstanceId") != null){
226 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vnfInstanceId"))) {
227 throw new ValidationException ("vnfInstanceId");
229 this.sir.setVnfInstanceId(instanceIdMap.get("vnfInstanceId"));
232 if(instanceIdMap.get("vfModuleInstanceId") != null){
233 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vfModuleInstanceId"))) {
234 throw new ValidationException ("vfModuleInstanceId");
236 this.sir.setVfModuleInstanceId(instanceIdMap.get("vfModuleInstanceId"));
239 if(instanceIdMap.get("volumeGroupInstanceId") != null){
240 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("volumeGroupInstanceId"))) {
241 throw new ValidationException ("volumeGroupInstanceId");
243 this.sir.setVolumeGroupInstanceId(instanceIdMap.get("volumeGroupInstanceId"));
246 if(instanceIdMap.get("networkInstanceId") != null){
247 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("networkInstanceId"))) {
248 throw new ValidationException ("networkInstanceId");
250 this.sir.setNetworkInstanceId(instanceIdMap.get("networkInstanceId"));
254 RequestParameters requestParameters = sir.getRequestDetails().getRequestParameters();
255 if(this.reqVersion >= 3){
256 if(requestParameters!=null){
257 this.aLaCarteFlag = sir.getRequestDetails().getRequestParameters().getALaCarte();
259 this.aLaCarteFlag = false;
262 this.aLaCarteFlag = true;
265 if(requestParameters != null && (reqVersion < 3) && requestParameters.getAutoBuildVfModules()){
266 throw new ValidationException("AutoBuildVfModule", version);
269 this.modelInfo = sir.getRequestDetails().getModelInfo();
271 if (this.modelInfo == null) {
272 throw new ValidationException ("model-info");
275 this.requestInfo = sir.getRequestDetails().getRequestInfo();
277 if (this.requestInfo == null) {
278 throw new ValidationException ("requestInfo");
281 if (modelInfo.getModelType () == null) {
282 throw new ValidationException ("modelType");
285 this.requestScope = modelInfo.getModelType().name();
287 // modelCustomizationId is required when usePreLoad is false for v4 and higher for VF Module Create
288 if(requestParameters != null && reqVersion > 3 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.createInstance && !requestParameters.isUsePreload()) {
289 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
290 throw new ValidationException("modelCustomizationId");
294 // modelCustomizationId is required when usePreLoad is false for v5 and higher for VF Module Replace
295 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
296 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
297 throw new ValidationException("modelCustomizationId");
301 // modelCustomizationId or modelCustomizationName are required when usePreLoad is false for v5 and higher for VNF Replace
302 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
303 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId()) && modelInfo.getModelCustomizationName() == null) {
304 throw new ValidationException("modelCustomizationId or modelCustomizationName");
308 //is required for serviceInstance delete macro when aLaCarte=false (v3)
309 //create and updates except for network (except v4)
310 if (empty (modelInfo.getModelInvariantId ()) && ((this.reqVersion >2 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
311 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
312 throw new ValidationException ("modelInvariantId");
315 if (!empty (modelInfo.getModelInvariantId ()) && !UUIDChecker.isValidUUID (modelInfo.getModelInvariantId ())) {
316 throw new ValidationException ("modelInvariantId format");
319 if (this.reqVersion <= 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
320 (requestScope.equalsIgnoreCase (ModelType.network.name ()) || requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))) {
321 throw new ValidationException ("modelName");
323 if(this.reqVersion > 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
324 (requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))){
325 throw new ValidationException ("modelName");
328 if (empty (modelInfo.getModelVersion ()) && ((this.reqVersion == 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
329 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
330 throw new ValidationException ("modelVersion");
333 // modelVersionId doesn't exist in v2, not required field in v3, is required for serviceInstance delete macro when aLaCarte=false in v4
334 if (this.reqVersion > 3 && empty (modelInfo.getModelVersionId()) && ((!this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
335 (action == Action.createInstance || action == Action.updateInstance))) {
336 throw new ValidationException ("modelVersionId");
339 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action != Action.deleteInstance && empty (modelInfo.getModelCustomizationName ())) {
340 if(this.reqVersion<=2){
341 throw new ValidationException ("modelCustomizationName");
342 } else if (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) {
343 throw new ValidationException ("modelCustomizationId or modelCustomizationName");
347 if(this.reqVersion > 2 && (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) && requestScope.equalsIgnoreCase (ModelType.network.name ())
348 && (action == Action.updateInstance || action == Action.createInstance)){
349 throw new ValidationException ("modelCustomizationId");
352 if(!empty(modelInfo.getModelNameVersionId())){
353 modelInfo.setModelVersionId(modelInfo.getModelNameVersionId());
356 this.cloudConfiguration = sir.getRequestDetails ().getCloudConfiguration ();
357 if ( (((!this.aLaCarteFlag && requestScope.equalsIgnoreCase (ModelType.service.name ()) && this.reqVersion < 5) ||
358 (!requestScope.equalsIgnoreCase (ModelType.service.name ())) && action != Action.updateInstance))
359 && cloudConfiguration == null) {
360 throw new ValidationException ("cloudConfiguration");
363 if (cloudConfiguration != null) {
364 if (empty (cloudConfiguration.getLcpCloudRegionId ())) {
365 throw new ValidationException ("lcpCloudRegionId");
367 if (empty (cloudConfiguration.getTenantId ())) {
368 throw new ValidationException ("tenantId");
373 if (requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
374 if (requestParameters == null) {
375 throw new ValidationException ("requestParameters");
377 if (empty (requestParameters.getSubscriptionServiceType ())) {
378 throw new ValidationException ("subscriptionServiceType");
382 if (this.reqVersion > 4 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
383 SubscriberInfo subscriberInfo = sir.getRequestDetails ().getSubscriberInfo();
384 if (subscriberInfo == null) {
385 throw new ValidationException ("subscriberInfo");
387 if (empty (subscriberInfo.getGlobalSubscriberId ())) {
388 throw new ValidationException ("globalSubscriberId");
392 if(requestScope.equalsIgnoreCase(ModelType.service.name())){
393 this.serviceInstanceType = modelInfo.getModelName();
396 if(requestScope.equalsIgnoreCase(ModelType.network.name())){
397 this.networkType = modelInfo.getModelName();
400 // Verify instanceName existence and format except for macro serviceInstance
401 if (this.reqVersion < 3 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && empty (requestInfo.getInstanceName ()) && action == Action.createInstance) {
402 throw new ValidationException ("instanceName");
405 if (!empty (requestInfo.getInstanceName ())) {
406 if (!requestInfo.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
407 throw new ValidationException ("instanceName format");
411 if (empty (requestInfo.getProductFamilyId ())) {
412 // Mandatory for vnf Create(aLaCarte=true), Network Create(aLaCarte=true) and network update
413 //Mandatory for macro request create service instance
414 if((requestScope.equalsIgnoreCase (ModelType.vnf.name ()) && action == Action.createInstance) ||
415 (requestScope.equalsIgnoreCase (ModelType.network.name ()) && (action == Action.createInstance || action == Action.updateInstance)) ||
416 (this.reqVersion > 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.createInstance)) {
417 throw new ValidationException ("productFamilyId");
421 //required for all operations in V4
422 if(empty(requestInfo.getRequestorId()) && this.reqVersion > 3) {
423 throw new ValidationException ("requestorId");
426 if (empty (requestInfo.getSource ())) {
427 throw new ValidationException ("source");
431 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
433 String serviceModelName = null;
434 String vnfModelName = null;
435 String asdcServiceModelVersion = null;
436 String volumeGroupId = null;
437 boolean isRelatedServiceInstancePresent = false;
438 boolean isRelatedVnfInstancePresent = false;
440 if (instanceList != null) {
441 for(RelatedInstanceList relatedInstanceList : instanceList){
442 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
444 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo ();
445 if (relatedInstanceModelInfo == null) {
446 throw new ValidationException ("modelInfo in relatedInstance");
449 if (relatedInstanceModelInfo.getModelType () == null) {
450 throw new ValidationException ("modelType in relatedInstance");
454 if (!empty (relatedInstance.getInstanceName ())) {
455 if (!relatedInstance.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
456 throw new ValidationException ("instanceName format in relatedInstance");
460 if (empty (relatedInstance.getInstanceId ())) {
461 throw new ValidationException ("instanceId in relatedInstance");
464 if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
465 throw new ValidationException ("instanceId format in relatedInstance");
469 if (action != Action.deleteInstance) {
470 if(!relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
472 if(empty (relatedInstanceModelInfo.getModelInvariantId ())) {
473 throw new ValidationException ("modelInvariantId in relatedInstance");
474 } else if(this.reqVersion > 3 && empty(relatedInstanceModelInfo.getModelVersionId ())) {
475 throw new ValidationException("modelVersionId in relatedInstance");
476 } else if(empty(relatedInstanceModelInfo.getModelName ())) {
477 throw new ValidationException ("modelName in relatedInstance");
478 } else if (empty (relatedInstanceModelInfo.getModelVersion ())) {
479 throw new ValidationException ("modelVersion in relatedInstance");
483 if (!empty (relatedInstanceModelInfo.getModelInvariantId ()) &&
484 !UUIDChecker.isValidUUID (relatedInstanceModelInfo.getModelInvariantId ())) {
485 throw new ValidationException ("modelInvariantId format in relatedInstance");
489 if (empty (relatedInstanceModelInfo.getModelCustomizationName ()) && relatedInstanceModelInfo.getModelType ().equals (ModelType.vnf) ) {
490 if(this.reqVersion >=3 && empty (relatedInstanceModelInfo.getModelCustomizationId()) && action != Action.deleteInstance) {
491 throw new ValidationException ("modelCustomizationName or modelCustomizationId in relatedInstance of vnf");
492 } else if(this.reqVersion < 3) {
493 throw new ValidationException ("modelCustomizationName in relatedInstance");
497 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
498 isRelatedServiceInstancePresent = true;
499 if (!relatedInstance.getInstanceId ().equals (this.sir.getServiceInstanceId ())) {
500 throw new ValidationException ("serviceInstanceId matching the serviceInstanceId in request URI");
502 serviceModelName = relatedInstanceModelInfo.getModelName ();
503 asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion ();
504 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
505 isRelatedVnfInstancePresent = true;
506 if (!relatedInstance.getInstanceId ().equals (this.sir.getVnfInstanceId ())) {
507 throw new ValidationException ("vnfInstanceId matching the vnfInstanceId in request URI");
509 vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
510 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
511 volumeGroupId = relatedInstance.getInstanceId ();
516 if(requestScope.equalsIgnoreCase (ModelType.volumeGroup.name ())) {
517 if (!isRelatedServiceInstancePresent) {
518 throw new ValidationException ("related service instance for volumeGroup request");
520 if (!isRelatedVnfInstancePresent) {
521 throw new ValidationException ("related vnf instance for volumeGroup request");
523 this.serviceInstanceType = serviceModelName;
524 this.vnfType = serviceModelName + "/" + vnfModelName;
525 this.asdcServiceModelVersion = asdcServiceModelVersion;
527 else if(requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) {
528 if (!isRelatedServiceInstancePresent) {
529 throw new ValidationException ("related service instance for vfModule request");
531 if (!isRelatedVnfInstancePresent) {
532 throw new ValidationException ("related vnf instance for vfModule request");
534 String vfModuleModelName = modelInfo.getModelName ();
535 this.vfModuleModelName = vfModuleModelName;
536 this.serviceInstanceType = serviceModelName;
537 this.vnfType = serviceModelName + "/" + vnfModelName;
538 this.asdcServiceModelVersion = asdcServiceModelVersion;
539 this.vfModuleType = vnfType + "::" + vfModuleModelName;
540 this.sir.setVolumeGroupInstanceId (volumeGroupId);
542 else if (requestScope.equalsIgnoreCase (ModelType.vnf.name ())) {
543 if (!isRelatedServiceInstancePresent) {
544 throw new ValidationException ("related service instance for vnf request");
546 this.vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
549 else if ((( requestScope.equalsIgnoreCase(ModelType.vnf.name ()) || requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ()) ) && (action == Action.createInstance)) ||
550 (this.reqVersion > 2 && (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) && action == Action.updateInstance)){
551 msoLogger.debug ("related instance exception");
552 throw new ValidationException ("related instances");
557 void parseOrchestration (ServiceInstancesRequest sir) throws ValidationException {
559 msoLogger.debug ("Validating the Orchestration request");
564 ObjectMapper mapper = new ObjectMapper();
565 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
566 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
568 } catch(Exception e){
569 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string", e);
572 this.requestInfo = sir.getRequestDetails().getRequestInfo();
574 if (this.requestInfo == null) {
575 throw new ValidationException ("requestInfo");
578 if (empty (requestInfo.getSource ())) {
579 throw new ValidationException ("source");
581 if (empty (requestInfo.getRequestorId ())) {
582 throw new ValidationException ("requestorId");
586 public Map<String, List<String>> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
588 String queryParam = null;
589 Map<String, List<String>> orchestrationFilterParams = new HashMap<>();
592 for (Entry<String,List<String>> entry : queryParams.entrySet()) {
593 queryParam = entry.getKey();
596 if("filter".equalsIgnoreCase(queryParam)){
597 for(String value : entry.getValue()) {
598 StringTokenizer st = new StringTokenizer(value, ":");
602 List<String> orchestrationList = new ArrayList<>();
603 while (st.hasMoreElements()) {
605 mapKey = st.nextElement() + "";
607 orchestrationList.add(st.nextElement() + "");
611 orchestrationFilterParams.put(mapKey, orchestrationList);
616 //msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, e);
617 throw new ValidationException ("QueryParam ServiceInfo", e);
624 return orchestrationFilterParams;
627 public void createRequestRecord (Status status, Action action) {
629 Session session = null;
632 session = requestsDbSessionFactoryManager.getSessionFactory ().openSession ();
633 session.beginTransaction ();
636 sir = new ServiceInstancesRequest ();
639 InfraActiveRequests aq = new InfraActiveRequests ();
640 aq.setRequestId (requestId);
642 aq.setRequestAction(action.name());
643 aq.setAction(action.name());
645 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
647 aq.setStartTime (startTimeStamp);
649 if (requestInfo != null) {
651 if(requestInfo.getSource() != null){
652 aq.setSource(requestInfo.getSource());
654 if(requestInfo.getCallbackUrl() != null){
655 aq.setCallBackUrl(requestInfo.getCallbackUrl());
657 if(requestInfo.getCorrelator() != null){
658 aq.setCorrelator(requestInfo.getCorrelator());
661 if(requestInfo.getRequestorId() != null) {
662 aq.setRequestorId(requestInfo.getRequestorId());
666 if (modelInfo != null) {
667 aq.setRequestScope(requestScope);
670 if (cloudConfiguration != null) {
671 if(cloudConfiguration.getLcpCloudRegionId() != null) {
672 aq.setAicCloudRegion(cloudConfiguration.getLcpCloudRegionId());
675 if(cloudConfiguration.getTenantId() != null) {
676 aq.setTenantId(cloudConfiguration.getTenantId());
681 if(sir.getServiceInstanceId() != null){
682 aq.setServiceInstanceId(sir.getServiceInstanceId());
685 if(sir.getVnfInstanceId() != null){
686 aq.setVnfId(sir.getVnfInstanceId());
690 if(ModelType.service.name().equalsIgnoreCase(requestScope)){
691 if(requestInfo.getInstanceName() != null){
692 aq.setServiceInstanceName(requestInfo.getInstanceName());
696 if(ModelType.network.name().equalsIgnoreCase(requestScope)){
697 aq.setNetworkName(requestInfo.getInstanceName());
698 aq.setNetworkType(networkType);
699 aq.setNetworkId(sir.getNetworkInstanceId());
702 if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)){
703 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
704 aq.setVolumeGroupName(requestInfo.getInstanceName());
705 aq.setVnfType(vnfType);
709 if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)){
710 aq.setVfModuleName(requestInfo.getInstanceName());
711 aq.setVfModuleModelName(modelInfo.getModelName());
712 aq.setVfModuleId(sir.getVfModuleInstanceId());
713 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
714 aq.setVnfType(vnfType);
718 if(ModelType.vnf.name().equalsIgnoreCase(requestScope)){
719 aq.setVnfName(requestInfo.getInstanceName());
720 if (null != sir.getRequestDetails()) {
721 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
723 if (instanceList != null) {
725 for(RelatedInstanceList relatedInstanceList : instanceList){
727 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
728 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
729 aq.setVnfType(vnfType);
736 aq.setRequestBody (this.requestJSON);
738 aq.setRequestStatus (status.toString ());
739 aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
741 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
742 aq.setStatusMessage (this.errorMessage);
743 aq.setResponseBody (this.responseBody);
744 aq.setProgress(new Long(100));
746 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
747 aq.setEndTime (endTimeStamp);
750 msoLogger.debug ("About to insert a record");
753 session.getTransaction ().commit ();
755 } catch (Exception e) {
756 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
757 if (session != null) {
760 if (!status.equals (Status.FAILED)) {
766 public void updateFinalStatus (Status status) {
769 result = (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId,
774 Constants.MODIFIED_BY_APIHANDLER);
775 } catch (Exception e) {
776 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
777 msoLogger.debug ("Exception: ", e);
781 public Response buildResponse (int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
782 return buildResponseWithError (httpResponseCode, errorCode, inProgress, null);
785 public Response buildResponseWithError (int httpResponseCode,
787 InfraActiveRequests inProgress,
788 String errorString) {
792 // Log the failed request into the MSO Requests database
794 return Response.status (httpResponseCode).entity (null).build ();
798 public Response buildResponseFailedValidation (int httpResponseCode, String exceptionMessage) {
802 return Response.status (httpResponseCode).entity (null).build ();
805 public String getRequestUri () {
809 public void setRequestUri (String requestUri) {
810 this.requestUri = requestUri;
813 public VnfInputs getVnfInputs () {
817 public RequestInfo getRequestInfo () {
821 public String getResponseBody () {
825 public void setResponseBody (String responseBody) {
826 this.responseBody = responseBody;
829 public String getHttpResponse () {
833 public void setHttpResponse (String httpResponse) {
834 this.httpResponse = httpResponse;
837 public String getRequestId () {
841 public String getRequestXML () {
845 public void setRequestXML (String requestXML) {
846 this.requestXML = requestXML;
849 public RequestStatusType getStatus () {
853 public String getServiceType () {
854 if (this.vnfInputs.getServiceType () != null)
855 return this.vnfInputs.getServiceType ();
856 if (this.vnfInputs.getServiceId () != null)
857 return this.vnfInputs.getServiceId ();
861 public void setStatus (RequestStatusType status) {
862 this.status = status;
866 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
869 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
874 public ModelInfo getModelInfo() {
878 public ServiceInstancesRequest getServiceInstancesRequest() {
882 public String getServiceInstanceType () {
883 return serviceInstanceType;
886 public String getNetworkType () {
890 public String getVnfType () {
894 public String getVfModuleModelName () {
895 return vfModuleModelName;
898 public String getVfModuleType () {
902 public String getAsdcServiceModelVersion () {
903 return asdcServiceModelVersion;
906 public static String domToStr (Document doc) {
912 StringWriter sw = new StringWriter ();
913 StreamResult sr = new StreamResult (sw);
914 TransformerFactory tf = TransformerFactory.newInstance ();
915 Transformer t = tf.newTransformer ();
916 t.setOutputProperty (OutputKeys.STANDALONE, "yes");
917 NodeList nl = doc.getDocumentElement ().getChildNodes ();
918 DOMSource source = null;
919 for (int x = 0; x < nl.getLength (); x++) {
920 Node e = nl.item (x);
921 if (e instanceof Element) {
922 source = new DOMSource (e);
926 if (source != null) {
927 t.transform (source, sr);
929 String s = sw.toString ();
935 } catch (Exception e) {
936 msoLogger.error (MessageEnum.APIH_DOM2STR_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in domToStr", e);
941 public void addBPMNSpecificInputs(String personaModelId, String personaModelVersion, Boolean isBaseVfModule,
942 String vnfPersonaModelId, String vnfPersonaModelVersion) {
943 vnfInputs.setPersonaModelId(personaModelId);
944 vnfInputs.setPersonaModelVersion(personaModelVersion);
945 vnfInputs.setIsBaseVfModule(isBaseVfModule);
946 vnfInputs.setVnfPersonaModelId(vnfPersonaModelId);
947 vnfInputs.setVnfPersonaModelVersion(vnfPersonaModelVersion);
949 this.vnfReq.setVnfInputs(vnfInputs);
951 StringWriter stringWriter = new StringWriter ();
953 JAXBContext jaxbContext = JAXBContext.newInstance (VnfRequest.class);
954 Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
956 // output pretty printed
957 jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
959 jaxbMarshaller.marshal (this.vnfReq, stringWriter);
961 } catch (JAXBException e) {
962 msoLogger.debug ("Exception: ", e);
965 this.requestXML = stringWriter.toString ();
966 msoLogger.debug("REQUEST XML to BPEL: " + this.requestXML);
971 private static boolean empty(String s) {
972 return (s == null || s.trim().isEmpty());
975 public String getRequestJSON() throws JsonGenerationException, JsonMappingException, IOException {
976 ObjectMapper mapper = new ObjectMapper();
977 mapper.setSerializationInclusion(Inclusion.NON_NULL);
978 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
979 msoLogger.debug ("building sir from object " + sir);
980 requestJSON = mapper.writeValueAsString(sir);
982 // Perform mapping from VID-style modelInfo fields to ASDC-style modelInfo fields
984 msoLogger.debug("REQUEST JSON before mapping: " + requestJSON);
985 // modelUuid = modelVersionId
986 requestJSON = requestJSON.replaceAll("\"modelVersionId\":","\"modelUuid\":");
987 // modelCustomizationUuid = modelCustomizationId
988 requestJSON = requestJSON.replaceAll("\"modelCustomizationId\":","\"modelCustomizationUuid\":");
989 // modelInstanceName = modelCustomizationName
990 requestJSON = requestJSON.replaceAll("\"modelCustomizationName\":","\"modelInstanceName\":");
991 // modelInvariantUuid = modelInvariantId
992 requestJSON = requestJSON.replaceAll("\"modelInvariantId\":","\"modelInvariantUuid\":");
993 msoLogger.debug("REQUEST JSON after mapping: " + requestJSON);
998 public boolean getALaCarteFlag() {
1002 public void setaLaCarteFlag(boolean aLaCarteFlag) {
1003 this.aLaCarteFlag = aLaCarteFlag;
1006 public int getReqVersion() {
1010 public void setReqVersion(int reqVersion) {
1011 this.reqVersion = reqVersion;