AIRAVATA-2207 Add cloneExperimentByAdmin API method

Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/5f3b778e
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/5f3b778e
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/5f3b778e

Branch: refs/heads/develop
Commit: 5f3b778ef55a9d59bc5cc4dab23dd496e89dd65c
Parents: 0fda5a8
Author: Marcus Christie <[email protected]>
Authored: Thu Nov 10 14:47:45 2016 -0500
Committer: Marcus Christie <[email protected]>
Committed: Thu Nov 10 14:47:45 2016 -0500

----------------------------------------------------------------------
 .../server/handler/AiravataServerHandler.java   |  154 +-
 .../java/org/apache/airavata/api/Airavata.java  | 6676 +++++++++++-------
 .../resources/lib/Airavata/API/Airavata.php     |  503 ++
 .../resources/airavata-default-xacml-policy.xml |    1 +
 .../airavata-apis/airavata_api.thrift           |   54 +
 5 files changed, 4954 insertions(+), 2434 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/5f3b778e/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
----------------------------------------------------------------------
diff --git 
a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
 
b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
index 2f7a014..557c777 100644
--- 
a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
+++ 
b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
@@ -1557,7 +1557,7 @@ public class AiravataServerHandler implements 
Airavata.Iface {
      *    This is the experiment identifier that already exists in the system. 
Will use this experimentID to retrieve
      *    user configuration which is used with the clone experiment.
      *
-     * @param newExperiementName
+     * @param newExperimentName
      *   experiment name that should be used in the cloned experiment
      *
      * @return
@@ -1588,84 +1588,110 @@ public class AiravataServerHandler implements 
Airavata.Iface {
      *
      *
      * @param existingExperimentID
-     * @param newExperiementName
+     * @param newExperimentName
      */
     @Override
     @SecurityCheck
-    public String cloneExperiment(AuthzToken authzToken, String 
existingExperimentID, String newExperiementName, String newExperimentProjectId)
+    public String cloneExperiment(AuthzToken authzToken, String 
existingExperimentID, String newExperimentName, String newExperimentProjectId)
             throws InvalidRequestException, ExperimentNotFoundException, 
AiravataClientException, AiravataSystemException,
             AuthorizationException, ProjectNotFoundException, TException {
         try {
-            RegistryService.Client regClient = getRegistryServiceClient();
-            ExperimentModel existingExperiment = 
regClient.getExperiment(existingExperimentID);
-            if (existingExperiment == null){
-                logger.error(existingExperimentID, "Error while cloning 
experiment {}, experiment doesn't exist.", existingExperimentID);
-                throw new ExperimentNotFoundException("Requested experiment id 
" + existingExperimentID + " does not exist in the system..");
-            }
-            if (newExperimentProjectId != null) {
+            // getExperiment will apply sharing permissions
+            ExperimentModel existingExperiment = 
this.getExperiment(authzToken, existingExperimentID);
+            return cloneExperimentInternal(authzToken, existingExperimentID, 
newExperimentName, newExperimentProjectId, existingExperiment);
+        } catch (Exception e) {
+            logger.error(existingExperimentID, "Error while cloning the 
experiment with existing configuration...", e);
+            AiravataSystemException exception = new AiravataSystemException();
+            exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
+            exception.setMessage("Error while cloning the experiment with 
existing configuration. More info : " + e.getMessage());
+            throw exception;
+        }
+    }
 
-                Project project = regClient.getProject(newExperimentProjectId);
-                if (project == null){
-                    logger.error("Error while cloning experiment {}, project 
{} doesn't exist.", existingExperimentID, newExperimentProjectId);
-                    throw new ProjectNotFoundException("Requested project id " 
+ newExperimentProjectId + " does not exist in the system..");
-                }
-                existingExperiment.setProjectId(project.getProjectID());
-            }
+    @Override
+    @SecurityCheck
+    public String cloneExperimentByAdmin(AuthzToken authzToken, String 
existingExperimentID, String newExperimentName, String newExperimentProjectId)
+            throws InvalidRequestException, ExperimentNotFoundException, 
AiravataClientException, AiravataSystemException,
+            AuthorizationException, ProjectNotFoundException, TException {
+        try {
+            // get existing experiment by bypassing normal sharing permissions 
for the admin user
+            ExperimentModel existingExperiment = 
this.getExperimentByAdmin(authzToken, existingExperimentID);
+            return cloneExperimentInternal(authzToken, existingExperimentID, 
newExperimentName, newExperimentProjectId, existingExperiment);
+        } catch (Exception e) {
+            logger.error(existingExperimentID, "Error while cloning the 
experiment with existing configuration...", e);
+            AiravataSystemException exception = new AiravataSystemException();
+            exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
+            exception.setMessage("Error while cloning the experiment with 
existing configuration. More info : " + e.getMessage());
+            throw exception;
+        }
+    }
 
-            // make sure user has write access to the project
-            String gatewayId = 
authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
-            String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
-            if(!sharingRegistryServerHandler.userHasAccess(gatewayId, userId + 
"@" + gatewayId,
-                    existingExperiment.getProjectId(), gatewayId + ":WRITE")){
-                logger.error("Error while cloning experiment {}, user doesn't 
have write access to project {}", existingExperimentID, 
existingExperiment.getProjectId());
-                throw new AuthorizationException("User does not have 
permission to clone an experiment in this project");
-            }
+    private String cloneExperimentInternal(AuthzToken authzToken, String 
existingExperimentID, String newExperimentName, String newExperimentProjectId, 
ExperimentModel existingExperiment)
+            throws ExperimentNotFoundException, ProjectNotFoundException, 
TException, AuthorizationException, ApplicationSettingsException {
 
-            
existingExperiment.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
-            if (existingExperiment.getExecutionId() != null){
-                List<OutputDataObjectType> applicationOutputs = 
regClient.getApplicationOutputs(existingExperiment.getExecutionId());
-                existingExperiment.setExperimentOutputs(applicationOutputs);
-            }
-            if (validateString(newExperiementName)){
-                existingExperiment.setExperimentName(newExperiementName);
-            }
-            if (existingExperiment.getErrors() != null ){
-                existingExperiment.getErrors().clear();
-            }
-            if(existingExperiment.getUserConfigurationData() != null && 
existingExperiment.getUserConfigurationData()
-                    .getComputationalResourceScheduling() != null){
-                String compResourceId = 
existingExperiment.getUserConfigurationData()
-                        
.getComputationalResourceScheduling().getResourceHostId();
-
-                ComputeResourceDescription computeResourceDescription = 
regClient.getComputeResource(compResourceId);
-                if(!computeResourceDescription.isEnabled()){
-                    
existingExperiment.getUserConfigurationData().setComputationalResourceScheduling(null);
-                }
+        RegistryService.Client regClient = getRegistryServiceClient();
+        if (existingExperiment == null){
+            logger.error(existingExperimentID, "Error while cloning experiment 
{}, experiment doesn't exist.", existingExperimentID);
+            throw new ExperimentNotFoundException("Requested experiment id " + 
existingExperimentID + " does not exist in the system..");
+        }
+        if (newExperimentProjectId != null) {
+
+            // getProject will apply sharing permissions
+            Project project = this.getProject(authzToken, 
newExperimentProjectId);
+            if (project == null){
+                logger.error("Error while cloning experiment {}, project {} 
doesn't exist.", existingExperimentID, newExperimentProjectId);
+                throw new ProjectNotFoundException("Requested project id " + 
newExperimentProjectId + " does not exist in the system..");
             }
-            logger.debug("Airavata cloned experiment with experiment id : " + 
existingExperimentID);
-            existingExperiment.setUserName(userId);
-            String expId = regClient.createExperiment(gatewayId, 
existingExperiment);
+            existingExperiment.setProjectId(project.getProjectID());
+        }
 
-            if(ServerSettings.isEnableSharing()){
-                Entity entity = new Entity();
-                entity.setEntityId(expId);
-                entity.setDomainId(existingExperiment.getGatewayId());
-                
entity.setEntityTypeId(existingExperiment.getGatewayId()+":"+"EXPERIMENT");
-                entity.setOwnerId(existingExperiment.getUserName() + "@" + 
existingExperiment.getGatewayId());
-                entity.setName(existingExperiment.getExperimentName());
-                entity.setDescription(existingExperiment.getDescription());
+        // make sure user has write access to the project
+        String gatewayId = authzToken.getClaimsMap().get(Constants.GATEWAY_ID);
+        String userId = authzToken.getClaimsMap().get(Constants.USER_NAME);
+        if(!sharingRegistryServerHandler.userHasAccess(gatewayId, userId + "@" 
+ gatewayId,
+                existingExperiment.getProjectId(), gatewayId + ":WRITE")){
+            logger.error("Error while cloning experiment {}, user doesn't have 
write access to project {}", existingExperimentID, 
existingExperiment.getProjectId());
+            throw new AuthorizationException("User does not have permission to 
clone an experiment in this project");
+        }
 
-                sharingRegistryServerHandler.createEntity(entity);
+        
existingExperiment.setCreationTime(AiravataUtils.getCurrentTimestamp().getTime());
+        if (existingExperiment.getExecutionId() != null){
+            List<OutputDataObjectType> applicationOutputs = 
regClient.getApplicationOutputs(existingExperiment.getExecutionId());
+            existingExperiment.setExperimentOutputs(applicationOutputs);
+        }
+        if (validateString(newExperimentName)){
+            existingExperiment.setExperimentName(newExperimentName);
+        }
+        if (existingExperiment.getErrors() != null ){
+            existingExperiment.getErrors().clear();
+        }
+        if(existingExperiment.getUserConfigurationData() != null && 
existingExperiment.getUserConfigurationData()
+                .getComputationalResourceScheduling() != null){
+            String compResourceId = 
existingExperiment.getUserConfigurationData()
+                    .getComputationalResourceScheduling().getResourceHostId();
+
+            ComputeResourceDescription computeResourceDescription = 
regClient.getComputeResource(compResourceId);
+            if(!computeResourceDescription.isEnabled()){
+                
existingExperiment.getUserConfigurationData().setComputationalResourceScheduling(null);
             }
+        }
+        logger.debug("Airavata cloned experiment with experiment id : " + 
existingExperimentID);
+        existingExperiment.setUserName(userId);
+        String expId = regClient.createExperiment(gatewayId, 
existingExperiment);
 
-            return expId;
-        } catch (Exception e) {
-            logger.error(existingExperimentID, "Error while cloning the 
experiment with existing configuration...", e);
-            AiravataSystemException exception = new AiravataSystemException();
-            exception.setAiravataErrorType(AiravataErrorType.INTERNAL_ERROR);
-            exception.setMessage("Error while cloning the experiment with 
existing configuration. More info : " + e.getMessage());
-            throw exception;
+        if(ServerSettings.isEnableSharing()){
+            Entity entity = new Entity();
+            entity.setEntityId(expId);
+            entity.setDomainId(existingExperiment.getGatewayId());
+            
entity.setEntityTypeId(existingExperiment.getGatewayId()+":"+"EXPERIMENT");
+            entity.setOwnerId(existingExperiment.getUserName() + "@" + 
existingExperiment.getGatewayId());
+            entity.setName(existingExperiment.getExperimentName());
+            entity.setDescription(existingExperiment.getDescription());
+
+            sharingRegistryServerHandler.createEntity(entity);
         }
+
+        return expId;
     }
 
     /**

Reply via email to