You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by pa...@apache.org on 2011/08/26 22:29:29 UTC

svn commit: r1162238 - in /incubator/airavata/trunk/modules/gfac-core/src/main/java: META-INF/ org/apache/airavata/core/gfac/context/impl/ org/apache/airavata/core/gfac/provider/ org/apache/airavata/core/gfac/services/impl/

Author: patanachai
Date: Fri Aug 26 20:29:29 2011
New Revision: 1162238

URL: http://svn.apache.org/viewvc?rev=1162238&view=rev
Log:
Add properties for MyProxy and SSH providers

Added:
    incubator/airavata/trunk/modules/gfac-core/src/main/java/META-INF/
    incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/context/impl/SSHSecurityContextImpl.java
Modified:
    incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/provider/SSHProvider.java
    incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/services/impl/PropertiesBasedServiceImpl.java

Added: incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/context/impl/SSHSecurityContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/context/impl/SSHSecurityContextImpl.java?rev=1162238&view=auto
==============================================================================
--- incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/context/impl/SSHSecurityContextImpl.java (added)
+++ incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/context/impl/SSHSecurityContextImpl.java Fri Aug 26 20:29:29 2011
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.core.gfac.context.impl;
+
+import org.apache.airavata.core.gfac.context.SecurityContext;
+
+public class SSHSecurityContextImpl implements SecurityContext {
+
+    private String username;
+    private String privateKeyLoc;
+    private String keyPass;
+    
+    public String getUsername() {
+        return username;
+    }
+    public void setUsername(String username) {
+        this.username = username;
+    }
+    public String getPrivateKeyLoc() {
+        return privateKeyLoc;
+    }
+    public void setPrivateKeyLoc(String privateKeyLoc) {
+        this.privateKeyLoc = privateKeyLoc;
+    }
+    public String getKeyPass() {
+        return keyPass;
+    }
+    public void setKeyPass(String keyPass) {
+        this.keyPass = keyPass;
+    }
+    
+    
+}

Modified: incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/provider/SSHProvider.java
URL: http://svn.apache.org/viewvc/incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/provider/SSHProvider.java?rev=1162238&r1=1162237&r2=1162238&view=diff
==============================================================================
--- incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/provider/SSHProvider.java (original)
+++ incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/provider/SSHProvider.java Fri Aug 26 20:29:29 2011
@@ -22,6 +22,7 @@
 package org.apache.airavata.core.gfac.provider;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -33,9 +34,11 @@ import javax.xml.namespace.QName;
 import net.schmizz.sshj.SSHClient;
 import net.schmizz.sshj.connection.channel.direct.Session;
 import net.schmizz.sshj.connection.channel.direct.Session.Command;
+import net.schmizz.sshj.userauth.keyprovider.KeyProvider;
 import net.schmizz.sshj.xfer.scp.SCPFileTransfer;
 
 import org.apache.airavata.core.gfac.context.InvocationContext;
+import org.apache.airavata.core.gfac.context.impl.SSHSecurityContextImpl;
 import org.apache.airavata.core.gfac.exception.GfacException;
 import org.apache.airavata.core.gfac.notification.NotificationService;
 import org.apache.airavata.core.gfac.type.HostDescription;
@@ -49,6 +52,7 @@ import edu.indiana.extreme.lead.workflow
 public class SSHProvider extends AbstractProvider {
 
     private static final String SPACE = " ";
+    private static final String SSH_SECURITY_CONTEXT = "ssh";
 
     private String buildCommand(List<String> cmdList) {
         StringBuffer buff = new StringBuffer();
@@ -58,18 +62,34 @@ public class SSHProvider extends Abstrac
         }
         return buff.toString();
     }
+    
+    private void initSSHSecurity(InvocationContext context, SSHClient ssh) throws GfacException, IOException{
+        try {
+            SSHSecurityContextImpl sshContext = ((SSHSecurityContextImpl) context.getSecurityContext(SSH_SECURITY_CONTEXT));
+
+            KeyProvider pkey = ssh.loadKeys(sshContext.getPrivateKeyLoc(), sshContext.getKeyPass());
+
+            ssh.loadKnownHosts();            
+            ssh.authPublickey(sshContext.getUsername(), pkey);
+
+        } catch (NullPointerException ne) {
+            throw new GfacException("Cannot load security context for SSH", ne);
+        } catch (IOException e){
+            throw e;
+        }
+        
+    }
 
     public void initialize(InvocationContext context) throws GfacException {
         HostDescription host = context.getGfacContext().getHost();
-        ShellApplicationDeployment app = (ShellApplicationDeployment)context.getGfacContext().getApp();
+        ShellApplicationDeployment app = (ShellApplicationDeployment) context.getGfacContext().getApp();
 
         SSHClient ssh = new SSHClient();
         try {
-            ssh.loadKnownHosts();
+
+            initSSHSecurity(context, ssh);            
             ssh.connect(host.getName());
 
-            // TODO how to authenticate with system
-            ssh.authPublickey(System.getProperty("user.name"));
             final Session session = ssh.startSession();
             try {
                 StringBuilder command = new StringBuilder();
@@ -103,10 +123,10 @@ public class SSHProvider extends Abstrac
             }
         }
     }
-    
+
     public void execute(InvocationContext context) throws GfacException {
         HostDescription host = context.getGfacContext().getHost();
-        ShellApplicationDeployment app = (ShellApplicationDeployment)context.getGfacContext().getApp();
+        ShellApplicationDeployment app = (ShellApplicationDeployment) context.getGfacContext().getApp();
 
         // input parameter
         ArrayList<String> tmp = new ArrayList<String>();
@@ -114,7 +134,7 @@ public class SSHProvider extends Abstrac
             String key = iterator.next();
             tmp.add(context.getMessageContext("input").getStringParameterValue(key));
         }
-        
+
         List<String> cmdList = new ArrayList<String>();
 
         SSHClient ssh = new SSHClient();
@@ -154,15 +174,8 @@ public class SSHProvider extends Abstrac
             // notify start
             DurationObj compObj = notifier.computationStarted();
 
-            /*
-             * Create ssh connection
-             */
-            ssh.loadKnownHosts();
+            initSSHSecurity(context, ssh);
             ssh.connect(host.getName());
-
-            // TODO how to authenticate with system
-            ssh.authPublickey(System.getProperty("user.name"));
-
             final Session session = ssh.startSession();
             try {
                 /*
@@ -190,8 +203,9 @@ public class SSHProvider extends Abstrac
                 notifier.computationFinished(compObj);
 
                 /*
-                 * check return value. usually not very helpful to draw conclusions based on return values so don't
-                 * bother. just provide warning in the log messages
+                 * check return value. usually not very helpful to draw
+                 * conclusions based on return values so don't bother. just
+                 * provide warning in the log messages
                  */
                 if (cmd.getExitStatus() != 0) {
                     log.error("Process finished with non zero return value. Process may have failed");

Modified: incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/services/impl/PropertiesBasedServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/services/impl/PropertiesBasedServiceImpl.java?rev=1162238&r1=1162237&r2=1162238&view=diff
==============================================================================
--- incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/services/impl/PropertiesBasedServiceImpl.java (original)
+++ incubator/airavata/trunk/modules/gfac-core/src/main/java/org/apache/airavata/core/gfac/services/impl/PropertiesBasedServiceImpl.java Fri Aug 26 20:29:29 2011
@@ -31,6 +31,8 @@ import java.util.Properties;
 import org.apache.airavata.core.gfac.api.Registry;
 import org.apache.airavata.core.gfac.api.impl.JCRRegistry;
 import org.apache.airavata.core.gfac.context.InvocationContext;
+import org.apache.airavata.core.gfac.context.impl.GSISecurityContext;
+import org.apache.airavata.core.gfac.context.impl.SSHSecurityContextImpl;
 import org.apache.airavata.core.gfac.exception.GfacException;
 import org.apache.airavata.core.gfac.exception.GfacException.FaultCode;
 import org.apache.airavata.core.gfac.extension.DataServiceChain;
@@ -58,6 +60,12 @@ public class PropertiesBasedServiceImpl 
     private static final String FILENAME = "service.properties";
 
     /*
+     * context name
+     */
+    public static final String MYPROXY_SECURITY_CONTEXT = "myproxy";
+    public static final String SSH_SECURITY_CONTEXT = "ssh";
+
+    /*
      * Scheduler and chains
      */
     public static final String SCHEDULER_CLASS = "scheduler.class";
@@ -72,6 +80,21 @@ public class PropertiesBasedServiceImpl 
     public static final String JCR_USER = "jcr.user";
     public static final String JCR_PASS = "jcr.pass";
 
+    /*
+     * SSH properties
+     */
+    public static final String SSH_PRIVATE_KEY = "ssh.key";
+    public static final String SSH_PRIVATE_KEY_PASS = "ssh.keypass";
+    public static final String SSH_USER_NAME = "ssh.username";
+
+    /*
+     * My proxy properties
+     */
+    public static final String MYPROXY_SERVER = "myproxy.server";
+    public static final String MYPROXY_USER = "myproxy.user";
+    public static final String MYPROXY_PASS = "myproxy.pass";
+    public static final String MYPROXY_LIFE = "myproxy.life";
+
     private Properties properties;
     private Scheduler scheduler;
     private PreExecuteChain[] preChain;
@@ -138,11 +161,50 @@ public class PropertiesBasedServiceImpl 
 
     @Override
     public void preProcess(InvocationContext context) throws GfacException {
+        /*
+         * Check Gram header
+         */
+        if (context.getSecurityContext(MYPROXY_SECURITY_CONTEXT) == null) {
+            String proxyServer = loadFromProperty(MYPROXY_SERVER, false);
+            String proxyUser = loadFromProperty(MYPROXY_USER, false);
+            String proxyPass = loadFromProperty(MYPROXY_PASS, false);
+            String proxyTime = loadFromProperty(MYPROXY_LIFE, false);
+            if (proxyServer != null && proxyUser != null && proxyPass != null) {
+                GSISecurityContext gsi = new GSISecurityContext();
+                gsi.setMyproxyServer(proxyServer);
+                gsi.setMyproxyUserName(proxyUser);
+                gsi.setMyproxyPasswd(proxyPass);
+                if (proxyTime != null) {
+                    gsi.setMyproxyLifetime(Integer.parseInt(proxyTime));
+                }
+                context.addSecurityContext(MYPROXY_SECURITY_CONTEXT, gsi);
+            }
+        }
+
+        /*
+         * Check SSH properties
+         */
+        if (context.getSecurityContext(SSH_SECURITY_CONTEXT) == null) {
+            String key = loadFromProperty(SSH_PRIVATE_KEY, false);
+            String pass = loadFromProperty(SSH_PRIVATE_KEY_PASS, false);
+            String user = loadFromProperty(SSH_USER_NAME, false);
+            if (key != null && user != null) {
+                SSHSecurityContextImpl ssh = new SSHSecurityContextImpl();
+                ssh.setKeyPass(pass);
+                ssh.setPrivateKeyLoc(key);
+                ssh.setUsername(user);
+                context.addSecurityContext(SSH_SECURITY_CONTEXT, ssh);
+            }
+        }
+
+        /*
+         * Check registry
+         */
         if (context.getExecutionContext() == null || context.getExecutionContext().getRegistryService() == null) {
 
             if (this.registryService == null) {
                 log.info("try to create default registry service (JCR Implementation)");
-                                
+
                 // JCR
                 String jcrClass = loadFromProperty(JCR_CLASS, true);
                 String userName = loadFromProperty(JCR_USER, false);
@@ -153,22 +215,33 @@ public class PropertiesBasedServiceImpl 
                  */
                 Map<String, String> map = new HashMap<String, String>((Map) this.properties);
                 map.remove(JCR_CLASS);
+                map.remove(JCR_USER);
+                map.remove(JCR_PASS);
+
                 map.remove(SCHEDULER_CLASS);
                 map.remove(DATA_CHAIN_CLASS);
                 map.remove(PRE_CHAIN_CLASS);
                 map.remove(POST_CHAIN_CLASS);
-                map.remove(JCR_USER);
-                map.remove(JCR_PASS);
+
+                map.remove(MYPROXY_SERVER);
+                map.remove(MYPROXY_USER);
+                map.remove(MYPROXY_PASS);
+                map.remove(MYPROXY_LIFE);
+
+                map.remove(SSH_USER_NAME);
+                map.remove(SSH_PRIVATE_KEY);
+                map.remove(SSH_PRIVATE_KEY_PASS);
+
                 if (map.size() == 0)
                     map = null;
 
                 this.registryService = new JCRRegistry(jcrClass, userName, password, map);
-                
+
                 log.info("Default registry service is created");
             }
 
             /*
-             * If there is no specific registry service, use the default one. 
+             * If there is no specific registry service, use the default one.
              */
             context.getExecutionContext().setRegistryService(this.registryService);
         }
@@ -189,7 +262,7 @@ public class PropertiesBasedServiceImpl 
         String className = null;
         if (this.scheduler == null) {
             log.info("try to create scheduler");
-            
+
             /*
              * get class names
              */