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 java.io.StringReader;
25 import java.io.StringWriter;
26 import java.io.IOException;
27 import java.sql.Timestamp;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
32 import java.util.Map.Entry;
33 import java.util.StringTokenizer;
35 import javax.ws.rs.core.MultivaluedMap;
36 import javax.ws.rs.core.Response;
37 import javax.xml.bind.JAXBContext;
38 import javax.xml.bind.JAXBException;
39 import javax.xml.bind.Marshaller;
40 import javax.xml.transform.OutputKeys;
41 import javax.xml.transform.Transformer;
42 import javax.xml.transform.TransformerFactory;
43 import javax.xml.transform.dom.DOMSource;
44 import javax.xml.transform.stream.StreamResult;
46 import org.codehaus.jackson.JsonGenerationException;
47 import org.codehaus.jackson.map.JsonMappingException;
48 import org.codehaus.jackson.map.ObjectMapper;
49 import org.codehaus.jackson.map.annotate.JsonSerialize;
50 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
51 import org.hibernate.Session;
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 org.openecomp.mso.apihandler.common.ValidationException;
58 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.CloudConfiguration;
59 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
60 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.PolicyException;
61 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
62 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
63 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestError;
64 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
65 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
66 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceException;
67 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
68 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;
69 import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType;
70 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfInputs;
71 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfRequest;
72 import org.openecomp.mso.db.AbstractSessionFactoryManager;
73 import org.openecomp.mso.logger.MessageEnum;
74 import org.openecomp.mso.logger.MsoLogger;
75 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
76 import org.openecomp.mso.requestsdb.InfraActiveRequests;
77 import org.openecomp.mso.requestsdb.RequestsDatabase;
78 import org.openecomp.mso.utils.UUIDChecker;
80 public class MsoRequest {
82 private String requestId;
83 private String requestXML;
84 private String requestJSON;
85 private String requestUri;
86 private VnfRequest vnfReq;
87 private RequestInfo requestInfo;
88 private ModelInfo modelInfo;
89 private CloudConfiguration cloudConfiguration ;
90 private VnfInputs vnfInputs;
91 private String vnfParams;
92 private Action action;
93 private String errorMessage;
94 private String errorCode;
95 private String httpResponse;
96 private String responseBody;
97 private RequestStatusType status;
98 private ServiceInstancesRequest sir;
99 private long startTime;
100 private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
101 private String serviceInstanceType;
102 private String vnfType;
103 private String vfModuleType;
104 private String vfModuleModelName;
105 private String networkType;
106 private String asdcServiceModelVersion;
107 private String requestScope;
108 private int reqVersion;
109 private boolean aLaCarteFlag = false;
111 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
112 private static final String NOT_PROVIDED = "not provided";
114 protected AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager ();
116 MsoRequest (String requestId) {
117 this.requestId = requestId;
118 this.startTime = System.currentTimeMillis();
119 MsoLogger.setLogContext (requestId, null);
125 this.startTime = System.currentTimeMillis();
126 MsoLogger.setLogContext (requestId, null);
131 public Response buildServiceErrorResponse (int httpResponseCode,
132 MsoException exceptionType,
135 List<String> variables) {
137 this.errorCode = messageId;
140 this.errorMessage = text;
143 this.errorMessage = "";
145 this.httpResponse = Integer.toString(httpResponseCode);
146 if(errorMessage.length() > 1999){
147 errorMessage = errorMessage.substring(0, 1999);
150 RequestError re = new RequestError();
152 if("PolicyException".equals(exceptionType.name())){
154 PolicyException pe = new PolicyException();
155 pe.setMessageId(messageId);
157 if(variables != null){
158 for(String variable: variables){
159 pe.getVariables().add(variable);
162 re.setPolicyException(pe);
166 ServiceException se = new ServiceException();
167 se.setMessageId(messageId);
169 if(variables != null){
170 if(variables != null){
171 for(String variable: variables){
172 se.getVariables().add(variable);
176 re.setServiceException(se);
179 String requestErrorStr = null;
182 ObjectMapper mapper = new ObjectMapper();
183 mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
184 requestErrorStr = mapper.writeValueAsString(re);
186 msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e);
190 return Response.status (httpResponseCode).entity(requestErrorStr).build ();
194 private int reqVersionToInt(String version){
196 return Integer.parseInt(version.substring(1));
202 // Parse request JSON
203 void parse (ServiceInstancesRequest sir, HashMap<String,String> instanceIdMap, Action action, String version) throws ValidationException {
205 msoLogger.debug ("Validating the Service Instance request");
208 this.action = action;
209 this.reqVersion = reqVersionToInt(version);
210 msoLogger.debug ("Incoming version is: " + version + " coverting to int: " + this.reqVersion);
214 ObjectMapper mapper = new ObjectMapper();
215 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
216 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
218 } catch(Exception e){
219 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string",e);
222 if(instanceIdMap != null){
223 if(instanceIdMap.get("serviceInstanceId") != null){
224 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("serviceInstanceId"))) {
225 throw new ValidationException ("serviceInstanceId");
227 this.sir.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
230 if(instanceIdMap.get("vnfInstanceId") != null){
231 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vnfInstanceId"))) {
232 throw new ValidationException ("vnfInstanceId");
234 this.sir.setVnfInstanceId(instanceIdMap.get("vnfInstanceId"));
237 if(instanceIdMap.get("vfModuleInstanceId") != null){
238 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vfModuleInstanceId"))) {
239 throw new ValidationException ("vfModuleInstanceId");
241 this.sir.setVfModuleInstanceId(instanceIdMap.get("vfModuleInstanceId"));
244 if(instanceIdMap.get("volumeGroupInstanceId") != null){
245 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("volumeGroupInstanceId"))) {
246 throw new ValidationException ("volumeGroupInstanceId");
248 this.sir.setVolumeGroupInstanceId(instanceIdMap.get("volumeGroupInstanceId"));
251 if(instanceIdMap.get("networkInstanceId") != null){
252 if (!UUIDChecker.isValidUUID (instanceIdMap.get ("networkInstanceId"))) {
253 throw new ValidationException ("networkInstanceId");
255 this.sir.setNetworkInstanceId(instanceIdMap.get("networkInstanceId"));
259 RequestParameters requestParameters = sir.getRequestDetails().getRequestParameters();
260 if(this.reqVersion >= 3){
261 if(requestParameters!=null){
262 this.aLaCarteFlag = sir.getRequestDetails().getRequestParameters().getALaCarte();
264 this.aLaCarteFlag = false;
267 this.aLaCarteFlag = true;
270 if(requestParameters != null && (reqVersion < 3) && requestParameters.getAutoBuildVfModules()){
271 throw new ValidationException("AutoBuildVfModule", version);
274 this.modelInfo = sir.getRequestDetails().getModelInfo();
276 if (this.modelInfo == null) {
277 throw new ValidationException ("model-info");
280 this.requestInfo = sir.getRequestDetails().getRequestInfo();
282 if (this.requestInfo == null) {
283 throw new ValidationException ("requestInfo");
286 if (modelInfo.getModelType () == null) {
287 throw new ValidationException ("modelType");
290 this.requestScope = modelInfo.getModelType().name();
292 // modelCustomizationId is required when usePreLoad is false for v4 and higher for VF Module Create
293 if(requestParameters != null && reqVersion > 3 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.createInstance && !requestParameters.isUsePreload()) {
294 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
295 throw new ValidationException("modelCustomizationId");
299 // modelCustomizationId is required when usePreLoad is false for v5 and higher for VF Module Replace
300 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
301 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
302 throw new ValidationException("modelCustomizationId");
306 // modelCustomizationId or modelCustomizationName are required when usePreLoad is false for v5 and higher for VNF Replace
307 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
308 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId()) && modelInfo.getModelCustomizationName() == null) {
309 throw new ValidationException("modelCustomizationId or modelCustomizationName");
313 //is required for serviceInstance delete macro when aLaCarte=false (v3)
314 //create and updates except for network (except v4)
315 if (empty (modelInfo.getModelInvariantId ()) && ((this.reqVersion >2 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
316 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
317 throw new ValidationException ("modelInvariantId");
320 if (!empty (modelInfo.getModelInvariantId ()) && !UUIDChecker.isValidUUID (modelInfo.getModelInvariantId ())) {
321 throw new ValidationException ("modelInvariantId format");
324 if (this.reqVersion <= 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
325 (requestScope.equalsIgnoreCase (ModelType.network.name ()) || requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))) {
326 throw new ValidationException ("modelName");
328 if(this.reqVersion > 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
329 (requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))){
330 throw new ValidationException ("modelName");
333 if (empty (modelInfo.getModelVersion ()) && ((this.reqVersion == 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
334 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
335 throw new ValidationException ("modelVersion");
338 // modelVersionId doesn't exist in v2, not required field in v3, is required for serviceInstance delete macro when aLaCarte=false in v4
339 if (this.reqVersion > 3 && empty (modelInfo.getModelVersionId()) && ((!this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
340 (action == Action.createInstance || action == Action.updateInstance))) {
341 throw new ValidationException ("modelVersionId");
344 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action != Action.deleteInstance && empty (modelInfo.getModelCustomizationName ())) {
345 if(this.reqVersion<=2){
346 throw new ValidationException ("modelCustomizationName");
347 } else if (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) {
348 throw new ValidationException ("modelCustomizationId or modelCustomizationName");
352 if(this.reqVersion > 2 && (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) && requestScope.equalsIgnoreCase (ModelType.network.name ())
353 && (action == Action.updateInstance || action == Action.createInstance)){
354 throw new ValidationException ("modelCustomizationId");
357 if(!empty(modelInfo.getModelNameVersionId())){
358 modelInfo.setModelVersionId(modelInfo.getModelNameVersionId());
361 this.cloudConfiguration = sir.getRequestDetails ().getCloudConfiguration ();
362 if ( (((!this.aLaCarteFlag && requestScope.equalsIgnoreCase (ModelType.service.name ()) && this.reqVersion < 5) ||
363 (!requestScope.equalsIgnoreCase (ModelType.service.name ())) && action != Action.updateInstance))
364 && cloudConfiguration == null) {
365 throw new ValidationException ("cloudConfiguration");
368 if (cloudConfiguration != null) {
369 if (empty (cloudConfiguration.getLcpCloudRegionId ())) {
370 throw new ValidationException ("lcpCloudRegionId");
372 if (empty (cloudConfiguration.getTenantId ())) {
373 throw new ValidationException ("tenantId");
378 if (requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
379 if (requestParameters == null) {
380 throw new ValidationException ("requestParameters");
382 if (empty (requestParameters.getSubscriptionServiceType ())) {
383 throw new ValidationException ("subscriptionServiceType");
387 if (this.reqVersion > 4 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
388 SubscriberInfo subscriberInfo = sir.getRequestDetails ().getSubscriberInfo();
389 if (subscriberInfo == null) {
390 throw new ValidationException ("subscriberInfo");
392 if (empty (subscriberInfo.getGlobalSubscriberId ())) {
393 throw new ValidationException ("globalSubscriberId");
397 if(requestScope.equalsIgnoreCase(ModelType.service.name())){
398 this.serviceInstanceType = modelInfo.getModelName();
401 if(requestScope.equalsIgnoreCase(ModelType.network.name())){
402 this.networkType = modelInfo.getModelName();
405 // Verify instanceName existence and format except for macro serviceInstance
406 if (this.reqVersion < 3 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && empty (requestInfo.getInstanceName ()) && action == Action.createInstance) {
407 throw new ValidationException ("instanceName");
410 if (!empty (requestInfo.getInstanceName ())) {
411 if (!requestInfo.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
412 throw new ValidationException ("instanceName format");
416 if (empty (requestInfo.getProductFamilyId ())) {
417 // Mandatory for vnf Create(aLaCarte=true), Network Create(aLaCarte=true) and network update
418 //Mandatory for macro request create service instance
419 if((requestScope.equalsIgnoreCase (ModelType.vnf.name ()) && action == Action.createInstance) ||
420 (requestScope.equalsIgnoreCase (ModelType.network.name ()) && (action == Action.createInstance || action == Action.updateInstance)) ||
421 (this.reqVersion > 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.createInstance)) {
422 throw new ValidationException ("productFamilyId");
426 //required for all operations in V4
427 if(empty(requestInfo.getRequestorId()) && this.reqVersion > 3) {
428 throw new ValidationException ("requestorId");
431 if (empty (requestInfo.getSource ())) {
432 throw new ValidationException ("source");
436 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
438 String serviceModelName = null;
439 String vnfModelName = null;
440 String asdcServiceModelVersion = null;
441 String volumeGroupId = null;
442 boolean isRelatedServiceInstancePresent = false;
443 boolean isRelatedVnfInstancePresent = false;
445 if (instanceList != null) {
446 for(RelatedInstanceList relatedInstanceList : instanceList){
447 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
449 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo ();
450 if (relatedInstanceModelInfo == null) {
451 throw new ValidationException ("modelInfo in relatedInstance");
454 if (relatedInstanceModelInfo.getModelType () == null) {
455 throw new ValidationException ("modelType in relatedInstance");
459 if (!empty (relatedInstance.getInstanceName ())) {
460 if (!relatedInstance.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
461 throw new ValidationException ("instanceName format in relatedInstance");
465 if (empty (relatedInstance.getInstanceId ())) {
466 throw new ValidationException ("instanceId in relatedInstance");
469 if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
470 throw new ValidationException ("instanceId format in relatedInstance");
474 if (action != Action.deleteInstance) {
475 if(!relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
477 if(empty (relatedInstanceModelInfo.getModelInvariantId ())) {
478 throw new ValidationException ("modelInvariantId in relatedInstance");
479 } else if(this.reqVersion > 3 && empty(relatedInstanceModelInfo.getModelVersionId ())) {
480 throw new ValidationException("modelVersionId in relatedInstance");
481 } else if(empty(relatedInstanceModelInfo.getModelName ())) {
482 throw new ValidationException ("modelName in relatedInstance");
483 } else if (empty (relatedInstanceModelInfo.getModelVersion ())) {
484 throw new ValidationException ("modelVersion in relatedInstance");
488 if (!empty (relatedInstanceModelInfo.getModelInvariantId ()) &&
489 !UUIDChecker.isValidUUID (relatedInstanceModelInfo.getModelInvariantId ())) {
490 throw new ValidationException ("modelInvariantId format in relatedInstance");
494 if (empty (relatedInstanceModelInfo.getModelCustomizationName ()) && relatedInstanceModelInfo.getModelType ().equals (ModelType.vnf) ) {
495 if(this.reqVersion >=3 && empty (relatedInstanceModelInfo.getModelCustomizationId()) && action != Action.deleteInstance) {
496 throw new ValidationException ("modelCustomizationName or modelCustomizationId in relatedInstance of vnf");
497 } else if(this.reqVersion < 3) {
498 throw new ValidationException ("modelCustomizationName in relatedInstance");
502 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
503 isRelatedServiceInstancePresent = true;
504 if (!relatedInstance.getInstanceId ().equals (this.sir.getServiceInstanceId ())) {
505 throw new ValidationException ("serviceInstanceId matching the serviceInstanceId in request URI");
507 serviceModelName = relatedInstanceModelInfo.getModelName ();
508 asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion ();
509 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
510 isRelatedVnfInstancePresent = true;
511 if (!relatedInstance.getInstanceId ().equals (this.sir.getVnfInstanceId ())) {
512 throw new ValidationException ("vnfInstanceId matching the vnfInstanceId in request URI");
514 vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
515 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
516 volumeGroupId = relatedInstance.getInstanceId ();
521 if(requestScope.equalsIgnoreCase (ModelType.volumeGroup.name ())) {
522 if (!isRelatedServiceInstancePresent) {
523 throw new ValidationException ("related service instance for volumeGroup request");
525 if (!isRelatedVnfInstancePresent) {
526 throw new ValidationException ("related vnf instance for volumeGroup request");
528 this.serviceInstanceType = serviceModelName;
529 this.vnfType = serviceModelName + "/" + vnfModelName;
530 this.asdcServiceModelVersion = asdcServiceModelVersion;
532 else if(requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) {
533 if (!isRelatedServiceInstancePresent) {
534 throw new ValidationException ("related service instance for vfModule request");
536 if (!isRelatedVnfInstancePresent) {
537 throw new ValidationException ("related vnf instance for vfModule request");
539 String vfModuleModelName = modelInfo.getModelName ();
540 this.vfModuleModelName = vfModuleModelName;
541 this.serviceInstanceType = serviceModelName;
542 this.vnfType = serviceModelName + "/" + vnfModelName;
543 this.asdcServiceModelVersion = asdcServiceModelVersion;
544 this.vfModuleType = vnfType + "::" + vfModuleModelName;
545 this.sir.setVolumeGroupInstanceId (volumeGroupId);
547 else if (requestScope.equalsIgnoreCase (ModelType.vnf.name ())) {
548 if (!isRelatedServiceInstancePresent) {
549 throw new ValidationException ("related service instance for vnf request");
551 this.vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
554 else if ((( requestScope.equalsIgnoreCase(ModelType.vnf.name ()) || requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ()) ) && (action == Action.createInstance)) ||
555 (this.reqVersion > 2 && (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) && action == Action.updateInstance)){
556 msoLogger.debug ("related instance exception");
557 throw new ValidationException ("related instances");
562 void parseOrchestration (ServiceInstancesRequest sir) throws ValidationException {
564 msoLogger.debug ("Validating the Orchestration request");
569 ObjectMapper mapper = new ObjectMapper();
570 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
571 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
573 } catch(Exception e){
574 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string", e);
577 this.requestInfo = sir.getRequestDetails().getRequestInfo();
579 if (this.requestInfo == null) {
580 throw new ValidationException ("requestInfo");
583 if (empty (requestInfo.getSource ())) {
584 throw new ValidationException ("source");
586 if (empty (requestInfo.getRequestorId ())) {
587 throw new ValidationException ("requestorId");
591 public Map<String, List<String>> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
593 String queryParam = null;
594 Map<String, List<String>> orchestrationFilterParams = new HashMap<String, List<String>>();
597 for (Entry<String,List<String>> entry : queryParams.entrySet()) {
598 queryParam = entry.getKey();
601 if(queryParam.equalsIgnoreCase("filter")){
602 for(String value : entry.getValue()) {
603 StringTokenizer st = new StringTokenizer(value, ":");
607 List<String> orchestrationList = new ArrayList<String>();
608 while (st.hasMoreElements()) {
610 mapKey = st.nextElement() + "";
612 orchestrationList.add(st.nextElement() + "");
616 orchestrationFilterParams.put(mapKey, orchestrationList);
621 //msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, e);
622 throw new ValidationException ("QueryParam ServiceInfo", e);
629 return orchestrationFilterParams;
632 public void createRequestRecord (Status status, Action action) {
634 Session session = null;
637 session = requestsDbSessionFactoryManager.getSessionFactory ().openSession ();
638 session.beginTransaction ();
641 sir = new ServiceInstancesRequest ();
644 InfraActiveRequests aq = new InfraActiveRequests ();
645 aq.setRequestId (requestId);
647 aq.setRequestAction(action.name());
648 aq.setAction(action.name());
650 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
652 aq.setStartTime (startTimeStamp);
654 if (requestInfo != null) {
656 if(requestInfo.getSource() != null){
657 aq.setSource(requestInfo.getSource());
659 if(requestInfo.getCallbackUrl() != null){
660 aq.setCallBackUrl(requestInfo.getCallbackUrl());
662 if(requestInfo.getCorrelator() != null){
663 aq.setCorrelator(requestInfo.getCorrelator());
666 if(requestInfo.getRequestorId() != null) {
667 aq.setRequestorId(requestInfo.getRequestorId());
671 if (modelInfo != null) {
672 aq.setRequestScope(requestScope);
675 if (cloudConfiguration != null) {
676 if(cloudConfiguration.getLcpCloudRegionId() != null) {
677 aq.setAicCloudRegion(cloudConfiguration.getLcpCloudRegionId());
680 if(cloudConfiguration.getTenantId() != null) {
681 aq.setTenantId(cloudConfiguration.getTenantId());
686 if(sir.getServiceInstanceId() != null){
687 aq.setServiceInstanceId(sir.getServiceInstanceId());
690 if(sir.getVnfInstanceId() != null){
691 aq.setVnfId(sir.getVnfInstanceId());
695 if(ModelType.service.name().equalsIgnoreCase(requestScope)){
696 if(requestInfo.getInstanceName() != null){
697 aq.setServiceInstanceName(requestInfo.getInstanceName());
701 if(ModelType.network.name().equalsIgnoreCase(requestScope)){
702 aq.setNetworkName(requestInfo.getInstanceName());
703 aq.setNetworkType(networkType);
704 aq.setNetworkId(sir.getNetworkInstanceId());
707 if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)){
708 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
709 aq.setVolumeGroupName(requestInfo.getInstanceName());
710 aq.setVnfType(vnfType);
714 if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)){
715 aq.setVfModuleName(requestInfo.getInstanceName());
716 aq.setVfModuleModelName(modelInfo.getModelName());
717 aq.setVfModuleId(sir.getVfModuleInstanceId());
718 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
719 aq.setVnfType(vnfType);
723 if(ModelType.vnf.name().equalsIgnoreCase(requestScope)){
724 aq.setVnfName(requestInfo.getInstanceName());
725 if (null != sir.getRequestDetails()) {
726 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
728 if (instanceList != null) {
730 for(RelatedInstanceList relatedInstanceList : instanceList){
732 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
733 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
734 aq.setVnfType(vnfType);
741 aq.setRequestBody (this.requestJSON);
743 aq.setRequestStatus (status.toString ());
744 aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
746 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
747 aq.setStatusMessage (this.errorMessage);
748 aq.setResponseBody (this.responseBody);
749 aq.setProgress(new Long(100));
751 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
752 aq.setEndTime (endTimeStamp);
755 msoLogger.debug ("About to insert a record");
758 session.getTransaction ().commit ();
760 } catch (Exception e) {
761 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
762 if (session != null) {
765 if (!status.equals (Status.FAILED)) {
771 public void updateFinalStatus (Status status) {
774 result = (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId,
779 Constants.MODIFIED_BY_APIHANDLER);
780 } catch (Exception e) {
781 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
782 msoLogger.debug ("Exception: ", e);
786 public Response buildResponse (int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
787 return buildResponseWithError (httpResponseCode, errorCode, inProgress, null);
790 public Response buildResponseWithError (int httpResponseCode,
792 InfraActiveRequests inProgress,
793 String errorString) {
797 // Log the failed request into the MSO Requests database
799 return Response.status (httpResponseCode).entity (null).build ();
803 public Response buildResponseFailedValidation (int httpResponseCode, String exceptionMessage) {
807 return Response.status (httpResponseCode).entity (null).build ();
810 public String getRequestUri () {
814 public void setRequestUri (String requestUri) {
815 this.requestUri = requestUri;
818 public VnfInputs getVnfInputs () {
822 public RequestInfo getRequestInfo () {
826 public String getResponseBody () {
830 public void setResponseBody (String responseBody) {
831 this.responseBody = responseBody;
834 public String getHttpResponse () {
838 public void setHttpResponse (String httpResponse) {
839 this.httpResponse = httpResponse;
842 public String getRequestId () {
846 public String getRequestXML () {
850 public void setRequestXML (String requestXML) {
851 this.requestXML = requestXML;
854 public RequestStatusType getStatus () {
858 public String getServiceType () {
859 if (this.vnfInputs.getServiceType () != null)
860 return this.vnfInputs.getServiceType ();
861 if (this.vnfInputs.getServiceId () != null)
862 return this.vnfInputs.getServiceId ();
866 public void setStatus (RequestStatusType status) {
867 this.status = status;
871 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
874 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
879 public ModelInfo getModelInfo() {
883 public ServiceInstancesRequest getServiceInstancesRequest() {
887 public String getServiceInstanceType () {
888 return serviceInstanceType;
891 public String getNetworkType () {
895 public String getVnfType () {
899 public String getVfModuleModelName () {
900 return vfModuleModelName;
903 public String getVfModuleType () {
907 public String getAsdcServiceModelVersion () {
908 return asdcServiceModelVersion;
911 public static String domToStr (Document doc) {
917 StringWriter sw = new StringWriter ();
918 StreamResult sr = new StreamResult (sw);
919 TransformerFactory tf = TransformerFactory.newInstance ();
920 Transformer t = tf.newTransformer ();
921 t.setOutputProperty (OutputKeys.STANDALONE, "yes");
922 NodeList nl = doc.getDocumentElement ().getChildNodes ();
923 DOMSource source = null;
924 for (int x = 0; x < nl.getLength (); x++) {
925 Node e = nl.item (x);
926 if (e instanceof Element) {
927 source = new DOMSource (e);
931 if (source != null) {
932 t.transform (source, sr);
934 String s = sw.toString ();
940 } catch (Exception e) {
941 msoLogger.error (MessageEnum.APIH_DOM2STR_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in domToStr", e);
946 public void addBPMNSpecificInputs(String personaModelId, String personaModelVersion, Boolean isBaseVfModule,
947 String vnfPersonaModelId, String vnfPersonaModelVersion) {
948 vnfInputs.setPersonaModelId(personaModelId);
949 vnfInputs.setPersonaModelVersion(personaModelVersion);
950 vnfInputs.setIsBaseVfModule(isBaseVfModule);
951 vnfInputs.setVnfPersonaModelId(vnfPersonaModelId);
952 vnfInputs.setVnfPersonaModelVersion(vnfPersonaModelVersion);
954 this.vnfReq.setVnfInputs(vnfInputs);
956 StringWriter stringWriter = new StringWriter ();
958 JAXBContext jaxbContext = JAXBContext.newInstance (VnfRequest.class);
959 Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
961 // output pretty printed
962 jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
964 jaxbMarshaller.marshal (this.vnfReq, stringWriter);
966 } catch (JAXBException e) {
967 msoLogger.debug ("Exception: ", e);
970 this.requestXML = stringWriter.toString ();
971 msoLogger.debug("REQUEST XML to BPEL: " + this.requestXML);
976 private static boolean empty(String s) {
977 return (s == null || s.trim().isEmpty());
980 public String getRequestJSON() throws JsonGenerationException, JsonMappingException, IOException {
981 ObjectMapper mapper = new ObjectMapper();
982 mapper.setSerializationInclusion(Inclusion.NON_NULL);
983 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
984 msoLogger.debug ("building sir from object " + sir);
985 requestJSON = mapper.writeValueAsString(sir);
987 // Perform mapping from VID-style modelInfo fields to ASDC-style modelInfo fields
989 msoLogger.debug("REQUEST JSON before mapping: " + requestJSON);
990 // modelUuid = modelVersionId
991 requestJSON = requestJSON.replaceAll("\"modelVersionId\":","\"modelUuid\":");
992 // modelCustomizationUuid = modelCustomizationId
993 requestJSON = requestJSON.replaceAll("\"modelCustomizationId\":","\"modelCustomizationUuid\":");
994 // modelInstanceName = modelCustomizationName
995 requestJSON = requestJSON.replaceAll("\"modelCustomizationName\":","\"modelInstanceName\":");
996 // modelInvariantUuid = modelInvariantId
997 requestJSON = requestJSON.replaceAll("\"modelInvariantId\":","\"modelInvariantUuid\":");
998 msoLogger.debug("REQUEST JSON after mapping: " + requestJSON);
1003 public boolean getALaCarteFlag() {
1004 return aLaCarteFlag;
1007 public void setaLaCarteFlag(boolean aLaCarteFlag) {
1008 this.aLaCarteFlag = aLaCarteFlag;
1011 public int getReqVersion() {
1015 public void setReqVersion(int reqVersion) {
1016 this.reqVersion = reqVersion;