2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Modifications Copyright (c) 2019 Samsung
 
   8  * ================================================================================
 
   9  * Licensed under the Apache License, Version 2.0 (the "License");
 
  10  * you may not use this file except in compliance with the License.
 
  11  * You may obtain a copy of the License at
 
  13  *      http://www.apache.org/licenses/LICENSE-2.0
 
  15  * Unless required by applicable law or agreed to in writing, software
 
  16  * distributed under the License is distributed on an "AS IS" BASIS,
 
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  18  * See the License for the specific language governing permissions and
 
  19  * limitations under the License.
 
  20  * ============LICENSE_END=========================================================
 
  23 package org.onap.so.apihandlerinfra.tenantisolation;
 
  25 import java.sql.Timestamp;
 
  26 import java.util.HashMap;
 
  27 import java.util.List;
 
  29 import java.util.Map.Entry;
 
  30 import javax.ws.rs.core.MultivaluedMap;
 
  31 import org.apache.commons.lang3.StringUtils;
 
  32 import org.onap.so.apihandlerinfra.Constants;
 
  33 import org.onap.so.apihandlerinfra.tenantisolationbeans.Action;
 
  34 import org.onap.so.apihandlerinfra.tenantisolationbeans.Manifest;
 
  35 import org.onap.so.apihandlerinfra.tenantisolationbeans.OperationalEnvironment;
 
  36 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstance;
 
  37 import org.onap.so.apihandlerinfra.tenantisolationbeans.RelatedInstanceList;
 
  38 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestDetails;
 
  39 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestInfo;
 
  40 import org.onap.so.apihandlerinfra.tenantisolationbeans.RequestParameters;
 
  41 import org.onap.so.apihandlerinfra.tenantisolationbeans.ResourceType;
 
  42 import org.onap.so.apihandlerinfra.tenantisolationbeans.ServiceModelList;
 
  43 import org.onap.so.apihandlerinfra.vnfbeans.RequestStatusType;
 
  44 import org.onap.so.constants.Status;
 
  45 import org.onap.so.db.request.beans.InfraActiveRequests;
 
  46 import org.onap.so.db.request.client.RequestsDbClient;
 
  47 import org.onap.so.exceptions.ValidationException;
 
  48 import org.onap.so.utils.UUIDChecker;
 
  49 import org.slf4j.Logger;
 
  50 import org.slf4j.LoggerFactory;
 
  51 import org.springframework.beans.factory.annotation.Autowired;
 
  52 import org.springframework.context.annotation.Scope;
 
  53 import org.springframework.stereotype.Component;
 
  54 import com.fasterxml.jackson.core.JsonProcessingException;
 
  55 import com.fasterxml.jackson.databind.ObjectMapper;
 
  59 public class TenantIsolationRequest {
 
  61     private String requestId;
 
  62     private String requestJSON;
 
  63     private RequestInfo requestInfo;
 
  65     private String errorMessage;
 
  66     private String responseBody;
 
  67     private RequestStatusType status;
 
  68     private String operationalEnvironmentId;
 
  69     private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
 
  70     private String requestScope;
 
  71     private CloudOrchestrationRequest cor;
 
  74     private RequestsDbClient requestsDbClient;
 
  76     private static Logger logger = LoggerFactory.getLogger(TenantIsolationRequest.class);
 
  79     TenantIsolationRequest(String requestId) {
 
  80         this.requestId = requestId;
 
  83     TenantIsolationRequest() {}
 
  85     void parse(CloudOrchestrationRequest request, HashMap<String, String> instanceIdMap, Action action)
 
  86             throws ValidationException {
 
  88         this.requestInfo = request.getRequestDetails().getRequestInfo();
 
  91             ObjectMapper mapper = new ObjectMapper();
 
  92             requestJSON = mapper.writeValueAsString(request.getRequestDetails());
 
  94         } catch (JsonProcessingException e) {
 
  95             logger.error("Exception in JSON processing", e);
 
  96             throw new ValidationException("Parse ServiceInstanceRequest to JSON string", true);
 
 100         if (instanceIdMap != null) {
 
 101             envId = instanceIdMap.get("operationalEnvironmentId");
 
 102             if (envId != null && !UUIDChecker.isValidUUID(envId)) {
 
 103                 throw new ValidationException("operationalEnvironmentId", true);
 
 105             cor.setOperationalEnvironmentId(envId);
 
 108         this.operationalEnvironmentId = envId;
 
 110         RequestDetails requestDetails = request.getRequestDetails();
 
 111         RequestParameters requestParameters = requestDetails.getRequestParameters();
 
 113         requestInfoValidation(action, requestInfo);
 
 115         requestParamsValidation(action, requestParameters);
 
 117         relatedInstanceValidation(action, requestDetails, requestParameters);
 
 121     private void relatedInstanceValidation(Action action, RequestDetails requestDetails,
 
 122             RequestParameters requestParameters) throws ValidationException {
 
 123         RelatedInstanceList[] instanceList = requestDetails.getRelatedInstanceList();
 
 125         if (requestParameters == null) {
 
 126             throw new ValidationException("requestParameters", true);
 
 128         if ((Action.activate.equals(action) || Action.deactivate.equals(action))
 
 129                 && OperationalEnvironment.ECOMP.equals(requestParameters.getOperationalEnvironmentType())) {
 
 130             throw new ValidationException("operationalEnvironmentType in requestParameters", true);
 
 133         if (!Action.deactivate.equals(action)
 
 134                 && OperationalEnvironment.VNF.equals(requestParameters.getOperationalEnvironmentType())) {
 
 135             if (instanceList != null && instanceList.length > 0) {
 
 136                 for (RelatedInstanceList relatedInstanceList : instanceList) {
 
 137                     RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
 
 139                     if (relatedInstance.getResourceType() == null) {
 
 140                         throw new ValidationException("ResourceType in relatedInstance", true);
 
 143                     if (!empty(relatedInstance.getInstanceName())
 
 144                             && !relatedInstance.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
 
 145                         throw new ValidationException("instanceName format", true);
 
 148                     if (empty(relatedInstance.getInstanceId())) {
 
 149                         throw new ValidationException("instanceId in relatedInstance", true);
 
 152                     if (!UUIDChecker.isValidUUID(relatedInstance.getInstanceId())) {
 
 153                         throw new ValidationException("instanceId format in relatedInstance", true);
 
 157                 throw new ValidationException("relatedInstanceList", true);
 
 162     private void requestParamsValidation(Action action, RequestParameters requestParameters)
 
 163             throws ValidationException {
 
 165         if (requestParameters != null) {
 
 166             if (!Action.deactivate.equals(action) && requestParameters.getOperationalEnvironmentType() == null) {
 
 167                 throw new ValidationException("OperationalEnvironmentType", true);
 
 170             if (Action.create.equals(action) && empty(requestParameters.getTenantContext())) {
 
 171                 throw new ValidationException("Tenant Context", true);
 
 173             if (!Action.deactivate.equals(action) && empty(requestParameters.getWorkloadContext())) {
 
 174                 throw new ValidationException("Workload Context", true);
 
 177             Manifest manifest = requestParameters.getManifest();
 
 179             if (Action.activate.equals(action)) {
 
 180                 if (manifest == null) {
 
 181                     throw new ValidationException("Manifest on Activate", true);
 
 183                     List<ServiceModelList> serviceModelList = manifest.getServiceModelList();
 
 185                     if (serviceModelList.isEmpty()) {
 
 186                         throw new ValidationException(" empty ServiceModelList", true);
 
 189                     for (ServiceModelList list : serviceModelList) {
 
 190                         if (empty(list.getServiceModelVersionId())) {
 
 191                             throw new ValidationException("ServiceModelVersionId", true);
 
 194                         if (!UUIDChecker.isValidUUID(list.getServiceModelVersionId())) {
 
 195                             throw new ValidationException("ServiceModelVersionId format", true);
 
 198                         if (list.getRecoveryAction() == null) {
 
 199                             throw new ValidationException("RecoveryAction", true);
 
 204         } else if (!Action.deactivate.equals(action)) {
 
 205             throw new ValidationException("request Parameters", true);
 
 209     private void requestInfoValidation(Action action, RequestInfo requestInfo) throws ValidationException {
 
 211         if (Action.create.equals(action) && empty(requestInfo.getInstanceName())) {
 
 212             throw new ValidationException("instanceName", true);
 
 215         if (!empty(requestInfo.getInstanceName())
 
 216                 && !requestInfo.getInstanceName().matches(Constants.VALID_INSTANCE_NAME_FORMAT)) {
 
 217             throw new ValidationException("instanceName format", true);
 
 220         if (empty(requestInfo.getSource())) {
 
 221             throw new ValidationException("source", true);
 
 224         if (empty(requestInfo.getRequestorId())) {
 
 225             throw new ValidationException("requestorId", true);
 
 228         ResourceType resourceType = requestInfo.getResourceType();
 
 229         if (resourceType == null) {
 
 230             throw new ValidationException("resourceType", true);
 
 233         this.requestScope = resourceType.name();
 
 236     void parseOrchestration(CloudOrchestrationRequest cor) throws ValidationException {
 
 241             ObjectMapper mapper = new ObjectMapper();
 
 242             requestJSON = mapper.writeValueAsString(cor.getRequestDetails());
 
 244         } catch (JsonProcessingException e) {
 
 245             throw new ValidationException("Parse CloudOrchestrationRequest to JSON string", e);
 
 248         if (cor.getRequestDetails() == null) {
 
 249             throw new ValidationException("requestDetails", true);
 
 251         this.requestInfo = cor.getRequestDetails().getRequestInfo();
 
 253         if (this.requestInfo == null) {
 
 254             throw new ValidationException("requestInfo", true);
 
 257         if (empty(requestInfo.getSource())) {
 
 258             throw new ValidationException("source", true);
 
 260         if (empty(requestInfo.getRequestorId())) {
 
 261             throw new ValidationException("requestorId", true);
 
 265     public void createRequestRecord(Status status, Action action) {
 
 267         InfraActiveRequests aq = new InfraActiveRequests();
 
 268         aq.setRequestId(requestId);
 
 270         aq.setRequestAction(action.name());
 
 271         aq.setAction(action.name());
 
 273         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
 
 275         aq.setStartTime(startTimeStamp);
 
 277         if (requestInfo != null) {
 
 279             if (requestInfo.getSource() != null) {
 
 280                 aq.setSource(requestInfo.getSource());
 
 282             if (requestInfo.getRequestorId() != null) {
 
 283                 aq.setRequestorId(requestInfo.getRequestorId());
 
 285             if (requestInfo.getResourceType() != null) {
 
 286                 aq.setRequestScope(requestInfo.getResourceType().name());
 
 290         if (ResourceType.operationalEnvironment.name().equalsIgnoreCase(requestScope) && requestInfo != null) {
 
 291             aq.setOperationalEnvId(operationalEnvironmentId);
 
 292             aq.setOperationalEnvName(requestInfo.getInstanceName());
 
 295         aq.setRequestBody(this.requestJSON);
 
 297         aq.setRequestStatus(status.toString());
 
 298         aq.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
 
 300         if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
 
 301             aq.setStatusMessage(this.errorMessage);
 
 302             aq.setResponseBody(this.responseBody);
 
 303             aq.setProgress(Long.valueOf(100));
 
 305             Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
 
 306             aq.setEndTime(endTimeStamp);
 
 307         } else if (status == Status.IN_PROGRESS) {
 
 308             aq.setProgress(Constants.PROGRESS_REQUEST_IN_PROGRESS);
 
 310         requestsDbClient.save(aq);
 
 314     public Map<String, String> getOrchestrationFilters(MultivaluedMap<String, String> queryParams)
 
 315             throws ValidationException {
 
 316         String queryParam = null;
 
 317         Map<String, String> orchestrationFilterParams = new HashMap<>();
 
 319         for (Entry<String, List<String>> entry : queryParams.entrySet()) {
 
 320             queryParam = entry.getKey();
 
 322                 for (String value : entry.getValue()) {
 
 323                     if (StringUtils.isBlank(value)) {
 
 324                         throw (new Exception(queryParam + " value"));
 
 326                     orchestrationFilterParams.put(queryParam, value);
 
 328             } catch (Exception e) {
 
 329                 logger.error("Exception in getOrchestrationFilters", e);
 
 330                 throw new ValidationException(e.getMessage(), true);
 
 334         return orchestrationFilterParams;
 
 337     private static boolean empty(String s) {
 
 338         return (s == null || s.trim().isEmpty());
 
 341     public String getRequestId() {
 
 345     public void setRequestId(String requestId) {
 
 346         this.requestId = requestId;
 
 349     public void updateFinalStatus() {
 
 351             InfraActiveRequests request = new InfraActiveRequests(requestId);
 
 352             request.setRequestStatus(status.toString());
 
 353             request.setStatusMessage(this.errorMessage);
 
 354             request.setProgress(this.progress);
 
 355             request.setResponseBody(this.responseBody);
 
 356             request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
 
 357             requestsDbClient.save(request);
 
 358         } catch (Exception e) {
 
 359             logger.error("Exception when updating record in DB", e);
 
 360             logger.debug("Exception: ", e);
 
 364     public void setStatus(RequestStatusType status) {
 
 365         this.status = status;
 
 369                 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
 
 372                 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
 
 385     public String getOperationalEnvironmentId() {
 
 386         return operationalEnvironmentId;
 
 389     public void setOperationalEnvironmentId(String operationalEnvironmentId) {
 
 390         this.operationalEnvironmentId = operationalEnvironmentId;