You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by pq...@apache.org on 2010/03/01 02:07:12 UTC

svn commit: r917338 - /incubator/libcloud/trunk/libcloud/deployment.py

Author: pquerna
Date: Mon Mar  1 01:07:12 2010
New Revision: 917338

URL: http://svn.apache.org/viewvc?rev=917338&view=rev
Log:
Add Script and Multistep Deployment classes

Modified:
    incubator/libcloud/trunk/libcloud/deployment.py

Modified: incubator/libcloud/trunk/libcloud/deployment.py
URL: http://svn.apache.org/viewvc/incubator/libcloud/trunk/libcloud/deployment.py?rev=917338&r1=917337&r2=917338&view=diff
==============================================================================
--- incubator/libcloud/trunk/libcloud/deployment.py (original)
+++ incubator/libcloud/trunk/libcloud/deployment.py Mon Mar  1 01:07:12 2010
@@ -16,11 +16,12 @@
 """
 Provides generic deployment steps for machines post boot.
 """
+import os
 
 class Deployment(object):
   pass
 
-class SSHDeployment(Deployment):
+class SSHKeyDeployment(Deployment):
   def __init__(self, key):
     self.key = key
   
@@ -32,4 +33,49 @@
     ak.write(self.key)
     ak.close()
     sftp.close()
-    return node
\ No newline at end of file
+    return node
+
+class ScriptDeployment(Deployment):
+  def __init__(self, script, name=None, delete=False):
+    self.script = script
+    self.stdout = None
+    self.stderr = None
+    self.delete = delete
+    self.name = name
+    if self.name is None:
+      self.name = "/root/deployment_%s.sh" % (os.urandom(4).encode('hex'))
+
+  def run(self, node, client):
+    sftp = client.open_sftp()
+    ak = sftp.file(self.name,  mode='w')
+    ak.write(self.script)
+    ak.chmod(755)
+    ak.close()
+    sftp.close()
+
+    stdin, stdout, stderr = client.exec_command(self.name)
+    stdin.close()
+    self.stdout = stdout.read()
+    self.stderr = stderr.read()
+
+    if self.delete:
+      sftp = client.open_sftp()
+      sftp.unlink(self.name)
+      sftp.close()
+
+    return node
+
+class MultiStepDeployment(Deployment):
+  def __init__(self, add = None):
+    self.steps = []
+    self.add(add)
+
+  def add(self, add):
+    if add is not None:
+      add = add if isinstance(add, (list, tuple)) else [add]
+      self.steps.extend(add)
+
+  def run(self, node, client):
+    for s in self.steps:
+      node = s.run(node, client)
+    return node