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) {
257 requestParameters != null && sir.getRequestDetails().getRequestParameters().isaLaCarte();
259 this.aLaCarteFlag = true;
262 if(requestParameters != null && (reqVersion < 3) && requestParameters.getAutoBuildVfModules()){
263 throw new ValidationException("AutoBuildVfModule", version);
266 this.modelInfo = sir.getRequestDetails().getModelInfo();
268 if (this.modelInfo == null) {
269 throw new ValidationException ("model-info");
272 this.requestInfo = sir.getRequestDetails().getRequestInfo();
274 if (this.requestInfo == null) {
275 throw new ValidationException ("requestInfo");
278 if (modelInfo.getModelType () == null) {
279 throw new ValidationException ("modelType");
282 this.requestScope = modelInfo.getModelType().name();
284 // modelCustomizationId is required when usePreLoad is false for v4 and higher for VF Module Create
285 if(requestParameters != null && reqVersion > 3 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.createInstance && !requestParameters.isUsePreload()) {
286 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
287 throw new ValidationException("modelCustomizationId");
291 // modelCustomizationId is required when usePreLoad is false for v5 and higher for VF Module Replace
292 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vfModule.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
293 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId())) {
294 throw new ValidationException("modelCustomizationId");
298 // modelCustomizationId or modelCustomizationName are required when usePreLoad is false for v5 and higher for VNF Replace
299 if(requestParameters != null && reqVersion > 4 && requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action == Action.replaceInstance && !requestParameters.isUsePreload()) {
300 if(!UUIDChecker.isValidUUID(modelInfo.getModelCustomizationId()) && modelInfo.getModelCustomizationName() == null) {
301 throw new ValidationException("modelCustomizationId or modelCustomizationName");
305 //is required for serviceInstance delete macro when aLaCarte=false (v3)
306 //create and updates except for network (except v4)
307 if (empty (modelInfo.getModelInvariantId ()) && ((this.reqVersion >2 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
308 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
309 throw new ValidationException ("modelInvariantId");
312 if (!empty (modelInfo.getModelInvariantId ()) && !UUIDChecker.isValidUUID (modelInfo.getModelInvariantId ())) {
313 throw new ValidationException ("modelInvariantId format");
316 if (this.reqVersion <= 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
317 (requestScope.equalsIgnoreCase (ModelType.network.name ()) || requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))) {
318 throw new ValidationException ("modelName");
320 if(this.reqVersion > 2 && empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance &&
321 (requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))){
322 throw new ValidationException ("modelName");
325 if (empty (modelInfo.getModelVersion ()) && ((this.reqVersion == 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
326 !(this.reqVersion < 4 && requestScope.equalsIgnoreCase (ModelType.network.name ())) && (action == Action.createInstance || action == Action.updateInstance))) {
327 throw new ValidationException ("modelVersion");
330 // modelVersionId doesn't exist in v2, not required field in v3, is required for serviceInstance delete macro when aLaCarte=false in v4
331 if (this.reqVersion > 3 && empty (modelInfo.getModelVersionId()) && ((!this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.deleteInstance) ||
332 (action == Action.createInstance || action == Action.updateInstance))) {
333 throw new ValidationException ("modelVersionId");
336 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action != Action.deleteInstance && empty (modelInfo.getModelCustomizationName ())) {
337 if(this.reqVersion<=2){
338 throw new ValidationException ("modelCustomizationName");
339 } else if (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) {
340 throw new ValidationException ("modelCustomizationId or modelCustomizationName");
344 if(this.reqVersion > 2 && (!UUIDChecker.isValidUUID (modelInfo.getModelCustomizationId())) && requestScope.equalsIgnoreCase (ModelType.network.name ())
345 && (action == Action.updateInstance || action == Action.createInstance)){
346 throw new ValidationException ("modelCustomizationId");
349 if(!empty(modelInfo.getModelNameVersionId())){
350 modelInfo.setModelVersionId(modelInfo.getModelNameVersionId());
353 this.cloudConfiguration = sir.getRequestDetails ().getCloudConfiguration ();
354 if ( (((!this.aLaCarteFlag && requestScope.equalsIgnoreCase (ModelType.service.name ()) && this.reqVersion < 5) ||
355 (!requestScope.equalsIgnoreCase (ModelType.service.name ())) && action != Action.updateInstance))
356 && cloudConfiguration == null) {
357 throw new ValidationException ("cloudConfiguration");
360 if (cloudConfiguration != null) {
361 if (empty (cloudConfiguration.getLcpCloudRegionId ())) {
362 throw new ValidationException ("lcpCloudRegionId");
364 if (empty (cloudConfiguration.getTenantId ())) {
365 throw new ValidationException ("tenantId");
370 if (requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
371 if (requestParameters == null) {
372 throw new ValidationException ("requestParameters");
374 if (empty (requestParameters.getSubscriptionServiceType ())) {
375 throw new ValidationException ("subscriptionServiceType");
379 if (this.reqVersion > 4 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
380 SubscriberInfo subscriberInfo = sir.getRequestDetails ().getSubscriberInfo();
381 if (subscriberInfo == null) {
382 throw new ValidationException ("subscriberInfo");
384 if (empty (subscriberInfo.getGlobalSubscriberId ())) {
385 throw new ValidationException ("globalSubscriberId");
389 if(requestScope.equalsIgnoreCase(ModelType.service.name())){
390 this.serviceInstanceType = modelInfo.getModelName();
393 if(requestScope.equalsIgnoreCase(ModelType.network.name())){
394 this.networkType = modelInfo.getModelName();
397 // Verify instanceName existence and format except for macro serviceInstance
398 if (this.reqVersion < 3 && requestScope.equalsIgnoreCase (ModelType.service.name ()) && empty (requestInfo.getInstanceName ()) && action == Action.createInstance) {
399 throw new ValidationException ("instanceName");
402 if (!empty (requestInfo.getInstanceName ())) {
403 if (!requestInfo.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
404 throw new ValidationException ("instanceName format");
408 if (empty (requestInfo.getProductFamilyId ())) {
409 // Mandatory for vnf Create(aLaCarte=true), Network Create(aLaCarte=true) and network update
410 //Mandatory for macro request create service instance
411 if((requestScope.equalsIgnoreCase (ModelType.vnf.name ()) && action == Action.createInstance) ||
412 (requestScope.equalsIgnoreCase (ModelType.network.name ()) && (action == Action.createInstance || action == Action.updateInstance)) ||
413 (this.reqVersion > 3 && !this.aLaCarteFlag && requestScope.equalsIgnoreCase(ModelType.service.name()) && action == Action.createInstance)) {
414 throw new ValidationException ("productFamilyId");
418 //required for all operations in V4
419 if(empty(requestInfo.getRequestorId()) && this.reqVersion > 3) {
420 throw new ValidationException ("requestorId");
423 if (empty (requestInfo.getSource ())) {
424 throw new ValidationException ("source");
428 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
430 String serviceModelName = null;
431 String vnfModelName = null;
432 String asdcServiceModelVersion = null;
433 String volumeGroupId = null;
434 boolean isRelatedServiceInstancePresent = false;
435 boolean isRelatedVnfInstancePresent = false;
437 if (instanceList != null) {
438 for(RelatedInstanceList relatedInstanceList : instanceList){
439 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
441 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo ();
442 if (relatedInstanceModelInfo == null) {
443 throw new ValidationException ("modelInfo in relatedInstance");
446 if (relatedInstanceModelInfo.getModelType () == null) {
447 throw new ValidationException ("modelType in relatedInstance");
451 if (!empty (relatedInstance.getInstanceName ())) {
452 if (!relatedInstance.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
453 throw new ValidationException ("instanceName format in relatedInstance");
457 if (empty (relatedInstance.getInstanceId ())) {
458 throw new ValidationException ("instanceId in relatedInstance");
461 if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
462 throw new ValidationException ("instanceId format in relatedInstance");
466 if (action != Action.deleteInstance) {
467 if(!relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
469 if(empty (relatedInstanceModelInfo.getModelInvariantId ())) {
470 throw new ValidationException ("modelInvariantId in relatedInstance");
471 } else if(this.reqVersion > 3 && empty(relatedInstanceModelInfo.getModelVersionId ())) {
472 throw new ValidationException("modelVersionId in relatedInstance");
473 } else if(empty(relatedInstanceModelInfo.getModelName ())) {
474 throw new ValidationException ("modelName in relatedInstance");
475 } else if (empty (relatedInstanceModelInfo.getModelVersion ())) {
476 throw new ValidationException ("modelVersion in relatedInstance");
480 if (!empty (relatedInstanceModelInfo.getModelInvariantId ()) &&
481 !UUIDChecker.isValidUUID (relatedInstanceModelInfo.getModelInvariantId ())) {
482 throw new ValidationException ("modelInvariantId format in relatedInstance");
486 if (empty (relatedInstanceModelInfo.getModelCustomizationName ()) && relatedInstanceModelInfo.getModelType ().equals (ModelType.vnf) ) {
487 if(this.reqVersion >=3 && empty (relatedInstanceModelInfo.getModelCustomizationId()) && action != Action.deleteInstance) {
488 throw new ValidationException ("modelCustomizationName or modelCustomizationId in relatedInstance of vnf");
489 } else if(this.reqVersion < 3) {
490 throw new ValidationException ("modelCustomizationName in relatedInstance");
494 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
495 isRelatedServiceInstancePresent = true;
496 if (!relatedInstance.getInstanceId ().equals (this.sir.getServiceInstanceId ())) {
497 throw new ValidationException ("serviceInstanceId matching the serviceInstanceId in request URI");
499 serviceModelName = relatedInstanceModelInfo.getModelName ();
500 asdcServiceModelVersion = relatedInstanceModelInfo.getModelVersion ();
501 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
502 isRelatedVnfInstancePresent = true;
503 if (!relatedInstance.getInstanceId ().equals (this.sir.getVnfInstanceId ())) {
504 throw new ValidationException ("vnfInstanceId matching the vnfInstanceId in request URI");
506 vnfModelName = relatedInstanceModelInfo.getModelCustomizationName();
507 } else if(relatedInstanceModelInfo.getModelType().equals(ModelType.volumeGroup)) {
508 volumeGroupId = relatedInstance.getInstanceId ();
513 if(requestScope.equalsIgnoreCase (ModelType.volumeGroup.name ())) {
514 if (!isRelatedServiceInstancePresent) {
515 throw new ValidationException ("related service instance for volumeGroup request");
517 if (!isRelatedVnfInstancePresent) {
518 throw new ValidationException ("related vnf instance for volumeGroup request");
520 this.serviceInstanceType = serviceModelName;
521 this.vnfType = serviceModelName + "/" + vnfModelName;
522 this.asdcServiceModelVersion = asdcServiceModelVersion;
524 else if(requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) {
525 if (!isRelatedServiceInstancePresent) {
526 throw new ValidationException ("related service instance for vfModule request");
528 if (!isRelatedVnfInstancePresent) {
529 throw new ValidationException ("related vnf instance for vfModule request");
531 String vfModuleModelName = modelInfo.getModelName ();
532 this.vfModuleModelName = vfModuleModelName;
533 this.serviceInstanceType = serviceModelName;
534 this.vnfType = serviceModelName + "/" + vnfModelName;
535 this.asdcServiceModelVersion = asdcServiceModelVersion;
536 this.vfModuleType = vnfType + "::" + vfModuleModelName;
537 this.sir.setVolumeGroupInstanceId (volumeGroupId);
539 else if (requestScope.equalsIgnoreCase (ModelType.vnf.name ())) {
540 if (!isRelatedServiceInstancePresent) {
541 throw new ValidationException ("related service instance for vnf request");
543 this.vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
546 else if ((( requestScope.equalsIgnoreCase(ModelType.vnf.name ()) || requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ()) ) && (action == Action.createInstance)) ||
547 (this.reqVersion > 2 && (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name ()) || requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) && action == Action.updateInstance)){
548 msoLogger.debug ("related instance exception");
549 throw new ValidationException ("related instances");
554 void parseOrchestration (ServiceInstancesRequest sir) throws ValidationException {
556 msoLogger.debug ("Validating the Orchestration request");
561 ObjectMapper mapper = new ObjectMapper();
562 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
563 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
565 } catch(Exception e){
566 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string", e);
569 this.requestInfo = sir.getRequestDetails().getRequestInfo();
571 if (this.requestInfo == null) {
572 throw new ValidationException ("requestInfo");
575 if (empty (requestInfo.getSource ())) {
576 throw new ValidationException ("source");
578 if (empty (requestInfo.getRequestorId ())) {
579 throw new ValidationException ("requestorId");
583 public Map<String, List<String>> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
585 String queryParam = null;
586 Map<String, List<String>> orchestrationFilterParams = new HashMap<>();
589 for (Entry<String,List<String>> entry : queryParams.entrySet()) {
590 queryParam = entry.getKey();
593 if("filter".equalsIgnoreCase(queryParam)){
594 for(String value : entry.getValue()) {
595 StringTokenizer st = new StringTokenizer(value, ":");
599 List<String> orchestrationList = new ArrayList<>();
600 while (st.hasMoreElements()) {
602 mapKey = st.nextElement() + "";
604 orchestrationList.add(st.nextElement() + "");
608 orchestrationFilterParams.put(mapKey, orchestrationList);
613 //msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, e);
614 throw new ValidationException ("QueryParam ServiceInfo", e);
621 return orchestrationFilterParams;
624 public void createRequestRecord (Status status, Action action) {
626 Session session = null;
629 session = requestsDbSessionFactoryManager.getSessionFactory ().openSession ();
630 session.beginTransaction ();
633 sir = new ServiceInstancesRequest ();
636 InfraActiveRequests aq = new InfraActiveRequests ();
637 aq.setRequestId (requestId);
639 aq.setRequestAction(action.name());
640 aq.setAction(action.name());
642 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
644 aq.setStartTime (startTimeStamp);
646 if (requestInfo != null) {
648 if(requestInfo.getSource() != null){
649 aq.setSource(requestInfo.getSource());
651 if(requestInfo.getCallbackUrl() != null){
652 aq.setCallBackUrl(requestInfo.getCallbackUrl());
654 if(requestInfo.getCorrelator() != null){
655 aq.setCorrelator(requestInfo.getCorrelator());
658 if(requestInfo.getRequestorId() != null) {
659 aq.setRequestorId(requestInfo.getRequestorId());
663 if (modelInfo != null) {
664 aq.setRequestScope(requestScope);
667 if (cloudConfiguration != null) {
668 if(cloudConfiguration.getLcpCloudRegionId() != null) {
669 aq.setAicCloudRegion(cloudConfiguration.getLcpCloudRegionId());
672 if(cloudConfiguration.getTenantId() != null) {
673 aq.setTenantId(cloudConfiguration.getTenantId());
678 if(sir.getServiceInstanceId() != null){
679 aq.setServiceInstanceId(sir.getServiceInstanceId());
682 if(sir.getVnfInstanceId() != null){
683 aq.setVnfId(sir.getVnfInstanceId());
687 if(ModelType.service.name().equalsIgnoreCase(requestScope)){
688 if(requestInfo.getInstanceName() != null){
689 aq.setServiceInstanceName(requestInfo.getInstanceName());
693 if(ModelType.network.name().equalsIgnoreCase(requestScope)){
694 aq.setNetworkName(requestInfo.getInstanceName());
695 aq.setNetworkType(networkType);
696 aq.setNetworkId(sir.getNetworkInstanceId());
699 if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)){
700 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
701 aq.setVolumeGroupName(requestInfo.getInstanceName());
702 aq.setVnfType(vnfType);
706 if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)){
707 aq.setVfModuleName(requestInfo.getInstanceName());
708 aq.setVfModuleModelName(modelInfo.getModelName());
709 aq.setVfModuleId(sir.getVfModuleInstanceId());
710 aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
711 aq.setVnfType(vnfType);
715 if(ModelType.vnf.name().equalsIgnoreCase(requestScope)){
716 aq.setVnfName(requestInfo.getInstanceName());
717 if (null != sir.getRequestDetails()) {
718 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
720 if (instanceList != null) {
722 for(RelatedInstanceList relatedInstanceList : instanceList){
724 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
725 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
726 aq.setVnfType(vnfType);
733 aq.setRequestBody (this.requestJSON);
735 aq.setRequestStatus (status.toString ());
736 aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
738 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
739 aq.setStatusMessage (this.errorMessage);
740 aq.setResponseBody (this.responseBody);
741 aq.setProgress(100L);
743 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
744 aq.setEndTime (endTimeStamp);
747 msoLogger.debug ("About to insert a record");
750 session.getTransaction ().commit ();
752 } catch (Exception e) {
753 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
754 if (session != null) {
757 if (!status.equals (Status.FAILED)) {
763 public void updateFinalStatus (Status status) {
766 result = (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId,
771 Constants.MODIFIED_BY_APIHANDLER);
772 } catch (Exception e) {
773 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
774 msoLogger.debug ("Exception: ", e);
778 public Response buildResponse (int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
779 return buildResponseWithError (httpResponseCode, errorCode, inProgress, null);
782 public Response buildResponseWithError (int httpResponseCode,
784 InfraActiveRequests inProgress,
785 String errorString) {
789 // Log the failed request into the MSO Requests database
791 return Response.status (httpResponseCode).entity (null).build ();
795 public Response buildResponseFailedValidation (int httpResponseCode, String exceptionMessage) {
799 return Response.status (httpResponseCode).entity (null).build ();
802 public String getRequestUri () {
806 public void setRequestUri (String requestUri) {
807 this.requestUri = requestUri;
810 public VnfInputs getVnfInputs () {
814 public RequestInfo getRequestInfo () {
818 public String getResponseBody () {
822 public void setResponseBody (String responseBody) {
823 this.responseBody = responseBody;
826 public String getHttpResponse () {
830 public void setHttpResponse (String httpResponse) {
831 this.httpResponse = httpResponse;
834 public String getRequestId () {
838 public String getRequestXML () {
842 public void setRequestXML (String requestXML) {
843 this.requestXML = requestXML;
846 public RequestStatusType getStatus () {
850 public String getServiceType () {
851 if (this.vnfInputs.getServiceType () != null)
852 return this.vnfInputs.getServiceType ();
853 if (this.vnfInputs.getServiceId () != null)
854 return this.vnfInputs.getServiceId ();
858 public void setStatus (RequestStatusType status) {
859 this.status = status;
863 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
866 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
871 public ModelInfo getModelInfo() {
875 public ServiceInstancesRequest getServiceInstancesRequest() {
879 public String getServiceInstanceType () {
880 return serviceInstanceType;
883 public String getNetworkType () {
887 public String getVnfType () {
891 public String getVfModuleModelName () {
892 return vfModuleModelName;
895 public String getVfModuleType () {
899 public String getAsdcServiceModelVersion () {
900 return asdcServiceModelVersion;
903 public static String domToStr (Document doc) {
909 StringWriter sw = new StringWriter ();
910 StreamResult sr = new StreamResult (sw);
911 TransformerFactory tf = TransformerFactory.newInstance ();
912 Transformer t = tf.newTransformer ();
913 t.setOutputProperty (OutputKeys.STANDALONE, "yes");
914 NodeList nl = doc.getDocumentElement ().getChildNodes ();
915 DOMSource source = null;
916 for (int x = 0; x < nl.getLength (); x++) {
917 Node e = nl.item (x);
918 if (e instanceof Element) {
919 source = new DOMSource (e);
923 if (source != null) {
924 t.transform (source, sr);
926 String s = sw.toString ();
932 } catch (Exception e) {
933 msoLogger.error (MessageEnum.APIH_DOM2STR_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in domToStr", e);
938 public void addBPMNSpecificInputs(String personaModelId, String personaModelVersion, Boolean isBaseVfModule,
939 String vnfPersonaModelId, String vnfPersonaModelVersion) {
940 vnfInputs.setPersonaModelId(personaModelId);
941 vnfInputs.setPersonaModelVersion(personaModelVersion);
942 vnfInputs.setIsBaseVfModule(isBaseVfModule);
943 vnfInputs.setVnfPersonaModelId(vnfPersonaModelId);
944 vnfInputs.setVnfPersonaModelVersion(vnfPersonaModelVersion);
946 this.vnfReq.setVnfInputs(vnfInputs);
948 StringWriter stringWriter = new StringWriter ();
950 JAXBContext jaxbContext = JAXBContext.newInstance (VnfRequest.class);
951 Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
953 // output pretty printed
954 jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
956 jaxbMarshaller.marshal (this.vnfReq, stringWriter);
958 } catch (JAXBException e) {
959 msoLogger.debug ("Exception: ", e);
962 this.requestXML = stringWriter.toString ();
963 msoLogger.debug("REQUEST XML to BPEL: " + this.requestXML);
968 private static boolean empty(String s) {
969 return (s == null || s.trim().isEmpty());
972 public String getRequestJSON() throws JsonGenerationException, JsonMappingException, IOException {
973 ObjectMapper mapper = new ObjectMapper();
974 mapper.setSerializationInclusion(Inclusion.NON_NULL);
975 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
976 msoLogger.debug ("building sir from object " + sir);
977 requestJSON = mapper.writeValueAsString(sir);
979 // Perform mapping from VID-style modelInfo fields to ASDC-style modelInfo fields
981 msoLogger.debug("REQUEST JSON before mapping: " + requestJSON);
982 // modelUuid = modelVersionId
983 requestJSON = requestJSON.replaceAll("\"modelVersionId\":","\"modelUuid\":");
984 // modelCustomizationUuid = modelCustomizationId
985 requestJSON = requestJSON.replaceAll("\"modelCustomizationId\":","\"modelCustomizationUuid\":");
986 // modelInstanceName = modelCustomizationName
987 requestJSON = requestJSON.replaceAll("\"modelCustomizationName\":","\"modelInstanceName\":");
988 // modelInvariantUuid = modelInvariantId
989 requestJSON = requestJSON.replaceAll("\"modelInvariantId\":","\"modelInvariantUuid\":");
990 msoLogger.debug("REQUEST JSON after mapping: " + requestJSON);
995 public boolean getALaCarteFlag() {
999 public void setaLaCarteFlag(boolean aLaCarteFlag) {
1000 this.aLaCarteFlag = aLaCarteFlag;
1003 public int getReqVersion() {
1007 public void setReqVersion(int reqVersion) {
1008 this.reqVersion = reqVersion;