Adding ability to wait on planetlab dependencies + examples.
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 16 Nov 2012 16:25:50 +0000 (17:25 +0100)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 16 Nov 2012 16:25:50 +0000 (17:25 +0100)
examples/planetlab_fix_gpgkeys.py [new file with mode: 0644]
examples/planetlab_package_install.py [new file with mode: 0644]
src/nepi/testbeds/planetlab/application.py
src/nepi/testbeds/planetlab/metadata.py

diff --git a/examples/planetlab_fix_gpgkeys.py b/examples/planetlab_fix_gpgkeys.py
new file mode 100644 (file)
index 0000000..efb4571
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import getpass
+from nepi.core.design import ExperimentDescription, FactoriesProvider
+from nepi.core.execute import ExperimentController
+from nepi.util import proxy
+from nepi.util.constants import DeploymentConfiguration as DC
+import os
+import shutil
+import tempfile
+import time
+
+def add_node(pl_desc, pl_inet, hostname):
+    pl_node = pl_desc.create("Node")
+    pl_node.set_attribute_value("hostname", hostname)
+    pl_iface = pl_desc.create("NodeInterface")
+    pl_iface.connector("inet").connect(pl_inet.connector("devs"))
+    pl_node.connector("devs").connect(pl_iface.connector("node"))
+
+    return pl_node
+
+def add_app(pl_desc, pl_node):
+    pl_app = pl_desc.create("Application")
+    pl_app.set_attribute_value("command", "yum reinstall -y --nogpgcheck fedora-release")
+    pl_app.set_attribute_value("sudo", True)
+    pl_app.enable_trace("stderr")
+    pl_app.enable_trace("stdout")
+    pl_app.connector("node").connect(pl_node.connector("apps"))
+    
+    return pl_app
+
+root_dir = tempfile.mkdtemp()
+user = getpass.getuser()
+slicename = os.environ["PL_SLICE"]
+plchost = "www.planet-lab.eu"
+port_base = 2000 + (os.getpid() % 1000) * 13
+pl_ssh_key = os.environ.get(
+    "PL_SSH_KEY",
+    "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'],) )
+pl_user = os.environ.get('PL_USER')
+pl_pwd = os.environ.get('PL_PASS')
+
+exp_desc = ExperimentDescription()
+
+pl_provider = FactoriesProvider("planetlab")
+pl_desc = exp_desc.add_testbed_description(pl_provider)
+pl_desc.set_attribute_value("homeDirectory", root_dir)
+pl_desc.set_attribute_value("slice", slicename)
+pl_desc.set_attribute_value("sliceSSHKey", pl_ssh_key)
+pl_desc.set_attribute_value("authUser", pl_user)
+pl_desc.set_attribute_value("authPass", pl_pwd)
+pl_desc.set_attribute_value("plcHost", plchost)
+pl_desc.set_attribute_value("tapPortBase", port_base)
+pl_desc.set_attribute_value("p2pDeployment", False) # it's interactive, we don't want it in tests
+pl_desc.set_attribute_value("cleanProc", True)
+pl_desc.set_attribute_value("plLogLevel", "DEBUG")
+       
+pl_inet = pl_desc.create("Internet")
+
+hostnames = ["ait21.us.es", "planetlab4.cslab.ece.ntua.gr", "kostis.di.uoa.gr", "pl1.uni-rostock.de" ]
+apps = []
+
+for hostname in hostnames:
+    pl_node = add_node(pl_desc, pl_inet, hostname)
+    pl_app = add_app(pl_desc, pl_node)
+    apps.append(pl_app)
+
+xml = exp_desc.to_xml()
+
+controller = ExperimentController(xml, root_dir)
+controller.start()
+
+stop = False
+while not stop:
+    stop = True
+    for pl_app in set(apps):
+        if not controller.is_finished(pl_app.guid):
+            apps.remove(pl_app)
+            stop = False
+            break
+
+    time.sleep(0.5)
+
+controller.stop()
+controller.shutdown()
+
diff --git a/examples/planetlab_package_install.py b/examples/planetlab_package_install.py
new file mode 100644 (file)
index 0000000..7311577
--- /dev/null
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import getpass
+from nepi.core.design import ExperimentDescription, FactoriesProvider
+from nepi.core.execute import ExperimentController
+from nepi.util import proxy
+from nepi.util.constants import DeploymentConfiguration as DC
+import os
+import shutil
+import tempfile
+import time
+
+def add_node(pl_desc, pl_inet, hostname):
+    pl_node = pl_desc.create("Node")
+    pl_node.set_attribute_value("hostname", hostname)
+    pl_iface = pl_desc.create("NodeInterface")
+    pl_iface.connector("inet").connect(pl_inet.connector("devs"))
+    pl_node.connector("devs").connect(pl_iface.connector("node"))
+
+    return pl_node
+
+def add_dependency(pl_desc, pl_node):
+    pl_dep = pl_desc.create("Dependency")
+    pl_dep.set_attribute_value("depends", "gcc vim emacs")
+    pl_dep.connector("node").connect(pl_node.connector("deps"))
+    
+    return pl_dep
+
+root_dir = tempfile.mkdtemp()
+user = getpass.getuser()
+slicename = os.environ["PL_SLICE"]
+plchost = "www.planet-lab.eu"
+port_base = 2000 + (os.getpid() % 1000) * 13
+pl_ssh_key = os.environ.get(
+    "PL_SSH_KEY",
+    "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'],) )
+pl_user = os.environ.get('PL_USER')
+pl_pwd = os.environ.get('PL_PASS')
+
+exp_desc = ExperimentDescription()
+
+pl_provider = FactoriesProvider("planetlab")
+pl_desc = exp_desc.add_testbed_description(pl_provider)
+pl_desc.set_attribute_value("homeDirectory", root_dir)
+pl_desc.set_attribute_value("slice", slicename)
+pl_desc.set_attribute_value("sliceSSHKey", pl_ssh_key)
+pl_desc.set_attribute_value("authUser", pl_user)
+pl_desc.set_attribute_value("authPass", pl_pwd)
+pl_desc.set_attribute_value("plcHost", plchost)
+pl_desc.set_attribute_value("tapPortBase", port_base)
+pl_desc.set_attribute_value("p2pDeployment", False) # it's interactive, we don't want it in tests
+pl_desc.set_attribute_value("cleanProc", True)
+pl_desc.set_attribute_value("plLogLevel", "DEBUG")
+       
+pl_inet = pl_desc.create("Internet")
+
+hostnames = ["ait21.us.es", "planetlab4.cslab.ece.ntua.gr", "kostis.di.uoa.gr", "pl1.uni-rostock.de" ]
+deps = []
+
+for hostname in hostnames:
+    pl_node = add_node(pl_desc, pl_inet, hostname)
+    pl_dep = add_dependency(pl_desc, pl_node)
+    deps.append(pl_dep)
+
+xml = exp_desc.to_xml()
+
+controller = ExperimentController(xml, root_dir)
+controller.start()
+
+stop = False
+
+while not stop:
+    stop = True
+    for pl_dep in set(deps):
+        if not controller.is_finished(pl_dep.guid):
+            deps.remove(pl_dep)
+            stop = False
+            break
+
+    time.sleep(0.5)
+
+controller.stop()
+controller.shutdown()
+
index e0850f7..55883f4 100644 (file)
@@ -91,7 +91,10 @@ class Dependency(object):
             self.__class__.__name__,
             ' '.join(filter(bool,(self.depends, self.sources)))
         )
-    
+   
+    def deployed(self):
+        return self._setup
+
     def validate(self):
         if self.home_path is None:
             raise AssertionError, "Misconfigured application: missing home path"
index 3c7872f..9f1d14f 100644 (file)
@@ -440,6 +440,15 @@ def status_application(testbed_instance, guid):
     app = testbed_instance.elements[guid]
     return app.status()
 
+def status_dependency(testbed_instance, guid):
+    if guid not in testbed_instance.elements.keys():
+        return AS.STATUS_NOT_STARTED
+    
+    dep = testbed_instance.elements[guid]
+    if dep.deployed():
+        return AS.STATUS_RUNNING
+    return AS.STATUS_FINISHED
+
 ### Configure functions ###
 
 def configure_nodeiface(testbed_instance, guid):
@@ -1636,6 +1645,7 @@ factories_info = dict({
             "category": FC.CATEGORY_APPLICATIONS,
             "create_function": create_dependency,
             "preconfigure_function": configure_dependency,
+            "status_function": status_dependency,
             "box_attributes": ["depends", "build-depends", "build", "install",
                                "sources", "rpm-fusion" ],
             "connector_types": ["node"],