Repository: airavata Updated Branches: refs/heads/master e4f149a38 -> c8b7bb1a0
integrate credential store with scp handlers Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/c8b7bb1a Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/c8b7bb1a Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/c8b7bb1a Branch: refs/heads/master Commit: c8b7bb1a0a2c141e035b0996d3a0fd1958ed2d3d Parents: e4f149a Author: Chathuri Wimalasena <[email protected]> Authored: Tue Aug 25 14:06:58 2015 -0400 Committer: Chathuri Wimalasena <[email protected]> Committed: Tue Aug 25 14:06:58 2015 -0400 ---------------------------------------------------------------------- .../impl/task/AdvancedSCPDataStageTask.java | 210 +++++++++++-------- .../gfac/impl/task/SSHEnvironmentSetupTask.java | 2 +- 2 files changed, 122 insertions(+), 90 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/c8b7bb1a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/AdvancedSCPDataStageTask.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/AdvancedSCPDataStageTask.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/AdvancedSCPDataStageTask.java index 29f09e6..4046d36 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/AdvancedSCPDataStageTask.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/AdvancedSCPDataStageTask.java @@ -23,8 +23,15 @@ package org.apache.airavata.gfac.impl.task; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import org.apache.airavata.common.exception.AiravataException; +import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.common.utils.ServerSettings; import org.apache.airavata.common.utils.ThriftUtils; +import org.apache.airavata.credential.store.credential.Credential; +import org.apache.airavata.credential.store.credential.impl.password.PasswordCredential; +import org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential; +import org.apache.airavata.credential.store.store.CredentialReader; +import org.apache.airavata.credential.store.store.CredentialStoreException; +import org.apache.airavata.gfac.core.GFacUtils; import org.apache.airavata.gfac.core.SSHApiException; import org.apache.airavata.gfac.core.authentication.AuthenticationInfo; import org.apache.airavata.gfac.core.authentication.SSHKeyAuthentication; @@ -46,6 +53,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -64,29 +73,62 @@ public class AdvancedSCPDataStageTask implements Task{ @Override public void init(Map<String, String> propertyMap) throws TaskException { - password = propertyMap.get("password"); - passPhrase = propertyMap.get("passPhrase"); - privateKeyPath = propertyMap.get("privateKeyPath"); - publicKeyPath = propertyMap.get("publicKeyPath"); - userName = propertyMap.get("userName"); - hostName = propertyMap.get("hostName"); inputPath = propertyMap.get("inputPath"); + hostName = propertyMap.get("hostName"); + userName = propertyMap.get("userName"); } @Override public TaskStatus execute(TaskContext taskContext) { - AuthenticationInfo authenticationInfo = null; - if (password != null) { - authenticationInfo = getSSHPasswordAuthentication(); - } else { - authenticationInfo = getSSHKeyAuthentication(); - } - TaskStatus status = new TaskStatus(TaskState.COMPLETED); - DataStagingTaskModel subTaskModel = null; - try { - subTaskModel = (DataStagingTaskModel) ThriftUtils.getSubTaskModel - (taskContext.getTaskModel()); - } catch (TException e) { + TaskStatus status = new TaskStatus(TaskState.CREATED); + AuthenticationInfo authenticationInfo = null; + DataStagingTaskModel subTaskModel = null; + try { + String tokenId = taskContext.getParentProcessContext().getTokenId(); + CredentialReader credentialReader = GFacUtils.getCredentialReader(); + Credential credential = credentialReader.getCredential(taskContext.getParentProcessContext().getGatewayId(), tokenId); + if (credential instanceof SSHCredential){ + SSHCredential sshCredential = (SSHCredential)credential; + byte[] publicKey = sshCredential.getPublicKey(); + publicKeyPath = writeFileToDisk(publicKey); + byte[] privateKey = sshCredential.getPrivateKey(); + privateKeyPath = writeFileToDisk(privateKey); + passPhrase = sshCredential.getPassphrase(); +// userName = sshCredential.getPortalUserName(); // this might not same as login user name + authenticationInfo = getSSHKeyAuthentication(); + } + status = new TaskStatus(TaskState.COMPLETED); + subTaskModel = (DataStagingTaskModel) ThriftUtils.getSubTaskModel + (taskContext.getTaskModel()); + URI sourceURI = new URI(subTaskModel.getSource()); + URI destinationURI = new URI(subTaskModel.getDestination()); + + File tempOutputDir = getLocalDir(taskContext); + if (!tempOutputDir.exists()) { + if (!tempOutputDir.mkdirs()) { + // failed to create temp output location + } + } + + String fileName = sourceURI.getPath().substring(sourceURI.getPath().lastIndexOf(File.separator) + 1, + sourceURI.getPath().length()); + String filePath = tempOutputDir + File.separator + fileName; + + ServerInfo serverInfo = new ServerInfo(userName, hostName, DEFAULT_SSH_PORT); + Session sshSession = Factory.getSSHSession(authenticationInfo, serverInfo); + ProcessState processState = taskContext.getParentProcessContext().getProcessState(); + if (processState == ProcessState.INPUT_DATA_STAGING) { + inputDataStaging(taskContext, sshSession, sourceURI, destinationURI, filePath); + status.setReason("Successfully staged input data"); + }else if (processState == ProcessState.OUTPUT_DATA_STAGING) { + outputDataStaging(taskContext, sshSession, sourceURI, destinationURI, filePath); + status.setReason("Successfully staged output data"); + } else { + status.setState(TaskState.FAILED); + status.setReason("Invalid task invocation, Support " + ProcessState.INPUT_DATA_STAGING.name() + " and " + + "" + ProcessState.OUTPUT_DATA_STAGING.name() + " process phases. found " + processState.name()); + } + } catch (TException e) { String msg = "Couldn't create subTask model thrift model"; log.error(msg, e); status.setState(TaskState.FAILED); @@ -96,77 +138,53 @@ public class AdvancedSCPDataStageTask implements Task{ errorModel.setUserFriendlyMessage(msg); taskContext.getTaskModel().setTaskError(errorModel); return status; - } - - try { - URI sourceURI = new URI(subTaskModel.getSource()); - URI destinationURI = new URI(subTaskModel.getDestination()); - - File tempOutputDir = getLocalDir(taskContext); - if (!tempOutputDir.exists()) { - if (!tempOutputDir.mkdirs()) { - // failed to create temp output location - } - } - - String fileName = sourceURI.getPath().substring(sourceURI.getPath().lastIndexOf(File.separator) + 1, - sourceURI.getPath().length()); - String filePath = tempOutputDir + File.separator + fileName; - - ServerInfo serverInfo = new ServerInfo(userName, hostName, DEFAULT_SSH_PORT); - Session sshSession = Factory.getSSHSession(authenticationInfo, serverInfo); - ProcessState processState = taskContext.getParentProcessContext().getProcessState(); - if (processState == ProcessState.INPUT_DATA_STAGING) { - inputDataStaging(taskContext, sshSession, sourceURI, destinationURI, filePath); - status.setReason("Successfully staged input data"); - }else if (processState == ProcessState.OUTPUT_DATA_STAGING) { - outputDataStaging(taskContext, sshSession, sourceURI, destinationURI, filePath); - status.setReason("Successfully staged output data"); - } else { - status.setState(TaskState.FAILED); - status.setReason("Invalid task invocation, Support " + ProcessState.INPUT_DATA_STAGING.name() + " and " + - "" + ProcessState.OUTPUT_DATA_STAGING.name() + " process phases. found " + processState.name()); - } - - }catch (URISyntaxException e) { - String msg = "Sorce or destination uri is not correct source : " + subTaskModel.getSource() + ", " + - "destination : " + subTaskModel.getDestination(); - log.error(msg, e); - status.setState(TaskState.FAILED); - status.setReason(msg); - ErrorModel errorModel = new ErrorModel(); - errorModel.setActualErrorMessage(e.getMessage()); - errorModel.setUserFriendlyMessage(msg); - taskContext.getTaskModel().setTaskError(errorModel); - } catch (SSHApiException e) { - String msg = "Failed to do scp with compute resource"; - log.error(msg, e); - status.setState(TaskState.FAILED); - status.setReason(msg); - ErrorModel errorModel = new ErrorModel(); - errorModel.setActualErrorMessage(e.getMessage()); - errorModel.setUserFriendlyMessage(msg); - taskContext.getTaskModel().setTaskError(errorModel); - } catch (AiravataException e) { - String msg = "Error while creating ssh session with client"; - log.error(msg, e); - status.setState(TaskState.FAILED); - status.setReason(msg); - ErrorModel errorModel = new ErrorModel(); - errorModel.setActualErrorMessage(e.getMessage()); - errorModel.setUserFriendlyMessage(msg); - taskContext.getTaskModel().setTaskError(errorModel); - } catch (JSchException | IOException e ) { - String msg = "Failed to do scp with client"; - log.error(msg, e); - status.setState(TaskState.FAILED); - status.setReason(msg); - ErrorModel errorModel = new ErrorModel(); - errorModel.setActualErrorMessage(e.getMessage()); - errorModel.setUserFriendlyMessage(msg); - taskContext.getTaskModel().setTaskError(errorModel); - } - + } catch (ApplicationSettingsException | FileNotFoundException | CredentialStoreException | IllegalAccessException | InstantiationException e) { + String msg = "Failed while reading credentials"; + log.error(msg, e); + status.setState(TaskState.FAILED); + status.setReason(msg); + ErrorModel errorModel = new ErrorModel(); + errorModel.setActualErrorMessage(e.getMessage()); + errorModel.setUserFriendlyMessage(msg); + taskContext.getTaskModel().setTaskError(errorModel); + } catch (URISyntaxException e) { + String msg = "Sorce or destination uri is not correct source : " + subTaskModel.getSource() + ", " + + "destination : " + subTaskModel.getDestination(); + log.error(msg, e); + status.setState(TaskState.FAILED); + status.setReason(msg); + ErrorModel errorModel = new ErrorModel(); + errorModel.setActualErrorMessage(e.getMessage()); + errorModel.setUserFriendlyMessage(msg); + taskContext.getTaskModel().setTaskError(errorModel); + } catch (SSHApiException e) { + String msg = "Failed to do scp with compute resource"; + log.error(msg, e); + status.setState(TaskState.FAILED); + status.setReason(msg); + ErrorModel errorModel = new ErrorModel(); + errorModel.setActualErrorMessage(e.getMessage()); + errorModel.setUserFriendlyMessage(msg); + taskContext.getTaskModel().setTaskError(errorModel); + } catch (AiravataException e) { + String msg = "Error while creating ssh session with client"; + log.error(msg, e); + status.setState(TaskState.FAILED); + status.setReason(msg); + ErrorModel errorModel = new ErrorModel(); + errorModel.setActualErrorMessage(e.getMessage()); + errorModel.setUserFriendlyMessage(msg); + taskContext.getTaskModel().setTaskError(errorModel); + } catch (JSchException | IOException e ) { + String msg = "Failed to do scp with client"; + log.error(msg, e); + status.setState(TaskState.FAILED); + status.setReason(msg); + ErrorModel errorModel = new ErrorModel(); + errorModel.setActualErrorMessage(e.getMessage()); + errorModel.setUserFriendlyMessage(msg); + taskContext.getTaskModel().setTaskError(errorModel); + } return status; } @@ -229,4 +247,18 @@ public class AdvancedSCPDataStageTask implements Task{ sshKA.setStrictHostKeyChecking("no"); return sshKA; } + + private String writeFileToDisk(byte[] data) { + File temp = null; + try { + temp = File.createTempFile("id_rsa", ""); + //write it + FileOutputStream bw = new FileOutputStream(temp); + bw.write(data); + bw.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return temp.getAbsolutePath(); + } } http://git-wip-us.apache.org/repos/asf/airavata/blob/c8b7bb1a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHEnvironmentSetupTask.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHEnvironmentSetupTask.java b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHEnvironmentSetupTask.java index 74f5826..d28ae3f 100644 --- a/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHEnvironmentSetupTask.java +++ b/modules/gfac/gfac-impl/src/main/java/org/apache/airavata/gfac/impl/task/SSHEnvironmentSetupTask.java @@ -48,7 +48,7 @@ public class SSHEnvironmentSetupTask implements Task { try { RemoteCluster remoteCluster = taskContext.getParentProcessContext().getRemoteCluster(); remoteCluster.makeDirectory(taskContext.getParentProcessContext().getWorkingDir()); - status.setReason("Successfully createded environment"); + status.setReason("Successfully created environment"); } catch (SSHApiException e) { String msg = "Error while environment setup"; log.error(msg, e);
