2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.apihandlerinfra.tenantisolation;
23 import java.sql.Timestamp;
24 import java.util.HashMap;
25 import java.util.List;
27 import java.util.Map.Entry;
29 import javax.ws.rs.core.MultivaluedMap;
30 import javax.ws.rs.core.Response;
32 import org.apache.commons.lang3.StringUtils;
33 import org.hibernate.Session;
34 import org.openecomp.mso.apihandler.common.ValidationException;
35 import org.openecomp.mso.apihandlerinfra.Constants;
36 import org.openecomp.mso.apihandlerinfra.MsoException;
37 import org.openecomp.mso.apihandlerinfra.Status;
38 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Action;
39 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.Manifest;
40 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
41 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstance;
42 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
43 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestDetails;
44 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestInfo;
45 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.RequestParameters;
46 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.ResourceType;
47 import org.openecomp.mso.apihandlerinfra.tenantisolationbeans.ServiceModelList;
48 import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType;
49 import org.openecomp.mso.db.AbstractSessionFactoryManager;
50 import org.openecomp.mso.logger.MessageEnum;
51 import org.openecomp.mso.logger.MsoLogger;
52 import org.openecomp.mso.requestsdb.InfraActiveRequests;
53 import org.openecomp.mso.requestsdb.RequestsDatabase;
54 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
55 import org.openecomp.mso.serviceinstancebeans.PolicyException;
56 import org.openecomp.mso.serviceinstancebeans.RequestError;
57 import org.openecomp.mso.serviceinstancebeans.ServiceException;
58 import org.openecomp.mso.utils.UUIDChecker;
60 import com.fasterxml.jackson.annotation.JsonInclude.Include;
61 import com.fasterxml.jackson.databind.ObjectMapper;
63 public class TenantIsolationRequest {
65 private String requestId;
66 private String requestJSON;
67 private RequestInfo requestInfo;
69 private String errorMessage;
70 private String errorCode;
71 private String httpResponse;
72 private String responseBody;
73 private RequestStatusType status;
74 private CloudOrchestrationRequest cor;
75 private String operationalEnvironmentId;
76 private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
77 private String requestScope;
81 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
82 protected AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager ();
84 TenantIsolationRequest (String requestId) {
85 this.requestId = requestId;
86 MsoLogger.setLogContext (requestId, null);
89 TenantIsolationRequest () {
90 MsoLogger.setLogContext (requestId, null);
93 void parse(CloudOrchestrationRequest request, HashMap<String,String> instanceIdMap, Action action) throws ValidationException {
94 msoLogger.debug ("Validating the Cloud Orchestration request");
96 this.requestInfo = request.getRequestDetails().getRequestInfo();
99 ObjectMapper mapper = new ObjectMapper();
100 requestJSON = mapper.writeValueAsString(request.getRequestDetails());
102 } catch(Exception e){
103 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string");
107 if(instanceIdMap != null) {
108 envId = instanceIdMap.get("operationalEnvironmentId");
109 if(envId != null && !UUIDChecker.isValidUUID (envId)){
110 throw new ValidationException ("operationalEnvironmentId");
112 cor.setOperationalEnvironmentId(envId);
115 this.operationalEnvironmentId = envId;
117 RequestDetails requestDetails = request.getRequestDetails();
118 RequestParameters requestParameters = requestDetails.getRequestParameters();
120 requestInfoValidation(action, requestInfo);
122 requestParamsValidation(action, requestParameters);
124 relatedInstanceValidation(action, requestDetails, requestParameters);
128 private void relatedInstanceValidation(Action action, RequestDetails requestDetails, RequestParameters requestParameters) throws ValidationException {
129 RelatedInstanceList[] instanceList = requestDetails.getRelatedInstanceList();
131 if((Action.activate.equals(action) || Action.deactivate.equals(action)) && OperationalEnvironment.ECOMP.equals(requestParameters.getOperationalEnvironmentType())) {
132 throw new ValidationException("operationalEnvironmentType in requestParameters");
135 if(!Action.deactivate.equals(action) && OperationalEnvironment.VNF.equals(requestParameters.getOperationalEnvironmentType())) {
136 if(instanceList != null && instanceList.length > 0) {
137 for(RelatedInstanceList relatedInstanceList : instanceList){
138 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
140 if(relatedInstance.getResourceType() == null) {
141 throw new ValidationException("ResourceType in relatedInstance");
144 if(!empty(relatedInstance.getInstanceName()) && !relatedInstance.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
145 throw new ValidationException ("instanceName format");
148 if (empty (relatedInstance.getInstanceId ())) {
149 throw new ValidationException ("instanceId in relatedInstance");
152 if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
153 throw new ValidationException ("instanceId format in relatedInstance");
157 throw new ValidationException ("relatedInstanceList");
162 private void requestParamsValidation(Action action, RequestParameters requestParameters) throws ValidationException {
164 if(requestParameters != null) {
165 if(!Action.deactivate.equals(action) && requestParameters.getOperationalEnvironmentType() == null) {
166 throw new ValidationException ("OperationalEnvironmentType");
169 if (Action.create.equals(action) && empty(requestParameters.getTenantContext())) {
170 throw new ValidationException ("Tenant Context");
172 if (!Action.deactivate.equals(action) && empty(requestParameters.getWorkloadContext())) {
173 throw new ValidationException ("Workload Context");
176 Manifest manifest = requestParameters.getManifest();
178 if(Action.activate.equals(action)) {
179 if(manifest == null) {
180 throw new ValidationException ("Manifest on Activate");
182 List<ServiceModelList> serviceModelList = manifest.getServiceModelList();
184 if(serviceModelList.size() == 0) {
185 throw new ValidationException (" empty ServiceModelList");
188 for(ServiceModelList list : serviceModelList) {
189 if(empty(list.getServiceModelVersionId())) {
190 throw new ValidationException ("ServiceModelVersionId");
193 if (!UUIDChecker.isValidUUID (list.getServiceModelVersionId())) {
194 throw new ValidationException ("ServiceModelVersionId format");
197 if(list.getRecoveryAction() == null) {
198 throw new ValidationException ("RecoveryAction");
203 } else if(!Action.deactivate.equals(action)) {
204 throw new ValidationException("request Parameters");
208 private void requestInfoValidation(Action action, RequestInfo requestInfo) throws ValidationException {
210 if(Action.create.equals(action) && empty(requestInfo.getInstanceName())) {
211 throw new ValidationException ("instanceName");
214 if(!empty(requestInfo.getInstanceName()) && !requestInfo.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
215 throw new ValidationException ("instanceName format");
218 if (empty(requestInfo.getSource())) {
219 throw new ValidationException ("source");
222 if(empty(requestInfo.getRequestorId())) {
223 throw new ValidationException ("requestorId");
226 ResourceType resourceType = requestInfo.getResourceType();
227 if(resourceType == null) {
228 throw new ValidationException ("resourceType");
231 this.requestScope = resourceType.name();
234 void parseOrchestration (CloudOrchestrationRequest cor) throws ValidationException {
236 msoLogger.debug ("Validating the Orchestration request");
241 ObjectMapper mapper = new ObjectMapper();
242 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
243 requestJSON = mapper.writeValueAsString(cor.getRequestDetails());
245 } catch(Exception e){
246 throw new ValidationException ("Parse CloudOrchestrationRequest to JSON string", e);
249 this.requestInfo = cor.getRequestDetails().getRequestInfo();
251 if (this.requestInfo == null) {
252 throw new ValidationException ("requestInfo");
255 if (empty (requestInfo.getSource ())) {
256 throw new ValidationException ("source");
258 if (empty (requestInfo.getRequestorId ())) {
259 throw new ValidationException ("requestorId");
263 public void createRequestRecord (Status status, Action action) {
264 Session session = null;
267 session = requestsDbSessionFactoryManager.getSessionFactory ().openSession ();
268 session.beginTransaction ();
271 cor = new CloudOrchestrationRequest();
274 InfraActiveRequests aq = new InfraActiveRequests ();
275 aq.setRequestId (requestId);
277 aq.setRequestAction(action.name());
278 aq.setAction(action.name());
280 Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
282 aq.setStartTime (startTimeStamp);
284 if (requestInfo != null) {
286 if(requestInfo.getSource() != null){
287 aq.setSource(requestInfo.getSource());
289 if(requestInfo.getRequestorId() != null) {
290 aq.setRequestorId(requestInfo.getRequestorId());
292 if(requestInfo.getResourceType() != null) {
293 aq.setRequestScope(requestInfo.getResourceType().name());
297 if(ResourceType.operationalEnvironment.name().equalsIgnoreCase(requestScope)) {
298 aq.setOperationalEnvId(operationalEnvironmentId);
299 aq.setOperationalEnvName(requestInfo.getInstanceName());
302 aq.setRequestBody (this.requestJSON);
304 aq.setRequestStatus (status.toString ());
305 aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
307 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
308 aq.setStatusMessage (this.errorMessage);
309 aq.setResponseBody (this.responseBody);
310 aq.setProgress(new Long(100));
312 Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
313 aq.setEndTime (endTimeStamp);
314 } else if(status == Status.IN_PROGRESS) {
315 aq.setProgress(Constants.PROGRESS_REQUEST_IN_PROGRESS);
318 msoLogger.debug ("About to insert a record");
321 session.getTransaction ().commit ();
323 } catch (Exception e) {
324 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
325 if (session != null) {
328 if (!status.equals (Status.FAILED)) {
335 public Map<String, String> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
336 String queryParam = null;
337 Map<String, String> orchestrationFilterParams = new HashMap<String, String>();
339 for (Entry<String,List<String>> entry : queryParams.entrySet()) {
340 queryParam = entry.getKey();
342 for(String value : entry.getValue()) {
343 if(StringUtils.isBlank(value)) {
344 throw new Exception(queryParam + " value");
346 orchestrationFilterParams.put(queryParam, value);
349 throw new ValidationException (e.getMessage());
353 return orchestrationFilterParams;
357 * Build Error Response for Exception handling.
360 * @param httpResponseCode the HTTP response code
361 * @param exceptionType.
362 * @param text the error description
364 * @return the web service response
367 public Response buildServiceErrorResponse (int httpResponseCode,
368 MsoException exceptionType,
371 List<String> variables) {
373 this.errorCode = messageId;
376 this.errorMessage = text;
379 this.errorMessage = "";
381 this.httpResponse = Integer.toString(httpResponseCode);
382 if(errorMessage.length() > 1999){
383 errorMessage = errorMessage.substring(0, 1999);
386 RequestError re = new RequestError();
388 if(exceptionType.name().equals("PolicyException")){
390 PolicyException pe = new PolicyException();
391 pe.setMessageId(messageId);
393 if(variables != null){
394 for(String variable: variables){
395 pe.getVariables().add(variable);
398 re.setPolicyException(pe);
402 ServiceException se = new ServiceException();
403 se.setMessageId(messageId);
405 if(variables != null){
406 if(variables != null){
407 for(String variable: variables){
408 se.getVariables().add(variable);
412 re.setServiceException(se);
415 String requestErrorStr = null;
418 ObjectMapper mapper = new ObjectMapper();
419 mapper.setSerializationInclusion(Include.NON_DEFAULT);
420 requestErrorStr = mapper.writeValueAsString(re);
422 msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e);
426 return Response.status (httpResponseCode).entity(requestErrorStr).build ();
430 private static boolean empty(String s) {
431 return (s == null || s.trim().isEmpty());
434 public String getRequestId () {
438 public void setRequestId(String requestId) {
439 this.requestId = requestId;
442 public void updateFinalStatus(Status failed) {
444 (RequestsDatabase.getInstance()).updateInfraFinalStatus (requestId,
449 Constants.MODIFIED_BY_APIHANDLER);
450 } catch (Exception e) {
451 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
452 msoLogger.debug ("Exception: ", e);
456 public void setStatus (RequestStatusType status) {
457 this.status = status;
461 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
464 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
469 public String getOperationalEnvironmentId() {
470 return operationalEnvironmentId;
473 public void setOperationalEnvironmentId(String operationalEnvironmentId) {
474 this.operationalEnvironmentId = operationalEnvironmentId;