From dbbdae09cbc0c1a4dd98f3b0a27cf3a95262384b Mon Sep 17 00:00:00 2001 From: Alina Quereilhac Date: Fri, 16 Nov 2012 17:25:50 +0100 Subject: [PATCH] Adding ability to wait on planetlab dependencies + examples. --- examples/planetlab_fix_gpgkeys.py | 87 ++++++++++++++++++++++ examples/planetlab_package_install.py | 85 +++++++++++++++++++++ src/nepi/testbeds/planetlab/application.py | 5 +- src/nepi/testbeds/planetlab/metadata.py | 10 +++ 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 examples/planetlab_fix_gpgkeys.py create mode 100644 examples/planetlab_package_install.py diff --git a/examples/planetlab_fix_gpgkeys.py b/examples/planetlab_fix_gpgkeys.py new file mode 100644 index 00000000..efb45716 --- /dev/null +++ b/examples/planetlab_fix_gpgkeys.py @@ -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 index 00000000..73115772 --- /dev/null +++ b/examples/planetlab_package_install.py @@ -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() + diff --git a/src/nepi/testbeds/planetlab/application.py b/src/nepi/testbeds/planetlab/application.py index e0850f78..55883f48 100644 --- a/src/nepi/testbeds/planetlab/application.py +++ b/src/nepi/testbeds/planetlab/application.py @@ -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" diff --git a/src/nepi/testbeds/planetlab/metadata.py b/src/nepi/testbeds/planetlab/metadata.py index 3c7872fe..9f1d14fa 100644 --- a/src/nepi/testbeds/planetlab/metadata.py +++ b/src/nepi/testbeds/planetlab/metadata.py @@ -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"], -- 2.43.0