* Planetlab tests
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 21 Apr 2011 09:36:48 +0000 (11:36 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 21 Apr 2011 09:36:48 +0000 (11:36 +0200)
* Only run .py files in make test
* Rename nepi.util.ipaddr to nepi.util.ipaddr2 (conflicts with standard ipaddr)
* Add planetlab to NEPI's testbeds (in setup.py)

Makefile
setup.py
src/nepi/testbeds/planetlab/application.py [new file with mode: 0644]
src/nepi/testbeds/planetlab/execute.py
src/nepi/testbeds/planetlab/interfaces.py
src/nepi/testbeds/planetlab/metadata_v01.py
src/nepi/util/ipaddr2.py [moved from src/nepi/util/ipaddr.py with 100% similarity]
test/testbeds/planetlab/design.py [new file with mode: 0755]
test/testbeds/planetlab/execute.py [new file with mode: 0755]
test/testbeds/planetlab/integration.py [new file with mode: 0755]

index 7f59148..340f097 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ install: all
 
 test: all
        retval=0; \
-              for i in `find "$(TESTDIR)" -perm -u+x -type f`; do \
+              for i in `find "$(TESTDIR)" -iname '*.py' -perm -u+x -type f`; do \
               echo $$i; \
               TESTLIBPATH="$(TESTLIB)" PYTHONPATH="$(PYPATH)" $$i -v || retval=$$?; \
               done; exit $$retval
index 9538824..65b2919 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,7 @@ setup(
         name        = "nepi",
         version     = "0.1",
         description = "High-level abstraction for running network experiments",
-        author      = "Alina Quereilhac and Martín Ferrari",
+        author      = "Alina Quereilhac, Martín Ferrari and Claudio Freire",
         url         = "http://yans.pl.sophia.inria.fr/code/hgwebdir.cgi/nepi/",
         license     = "GPLv2",
         platforms   = "Linux",
@@ -15,6 +15,7 @@ setup(
             "nepi.testbeds",
             "nepi.testbeds.netns",
             "nepi.testbeds.ns3",
+            "nepi.testbeds.planetlab",
             "nepi.core",
             "nepi.util.parser",
             "nepi.util" ],
diff --git a/src/nepi/testbeds/planetlab/application.py b/src/nepi/testbeds/planetlab/application.py
new file mode 100644 (file)
index 0000000..46550c3
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from constants import TESTBED_ID
+import plcapi
+import operator
+
+class Application(object):
+    def __init__(self, api=None):
+        if not api:
+            api = plcapi.PLCAPI()
+        self._api = api
+        
+        # Attributes
+        self.command = None
+        self.sudo = False
+        
+        self.stdout = None
+        self.stderr = None
+        
+        # Those are filled when an actual node is connected
+        self.node = None
+    
+    def validate(self):
+        pass
+
index b2c36b9..9781661 100644 (file)
@@ -124,4 +124,16 @@ class TestbedController(testbed_impl.TestbedController):
     
     def _make_internet(self, parameters):
         return self._node.Internet()
+    
+    def _make_application(self, parameters):
+        app = self._app.Application()
+        
+        # Note: there is 1-to-1 correspondence between attribute names
+        #   If that changes, this has to change as well
+        for attr in parameters.get_attribute_names():
+            setattr(app, attr, parameters.get_attribute_value(attr))
+        
+        return app
         
+
+
index 96e4a42..d1dea80 100644 (file)
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 
 from constants import TESTBED_ID
-import nepi.util.ipaddr
+import nepi.util.ipaddr2 as ipaddr2
 import plcapi
 
 class NodeIface(object):
@@ -95,7 +95,7 @@ class TunIface(object):
         
         self.address = address
         self.netprefix = netprefix
-        self.netmask = nepi.util.ipaddr.ipv4_dot2mask(netprefix)
+        self.netmask = ipaddr2.ipv4_dot2mask(netprefix)
 
     def validate(self):
         pass
index d3541f5..61c918a 100644 (file)
@@ -21,12 +21,15 @@ PL_TESTBED_ID = "planetlab"
 def connect_node_iface_node(testbed_instance, node, iface):
     iface.node = node
 
-def connect_node_iface_inet(testbed_instance, node, internet):
+def connect_node_iface_inet(testbed_instance, iface, inet):
     iface.has_internet = True
 
 def connect_tun_iface_node(testbed_instance, node, iface):
     iface.node = node
 
+def connect_app(testbed_instance, node, app):
+    app.node = node
+
 ### Creation functions ###
 
 def create_node(testbed_instance, guid):
@@ -57,12 +60,12 @@ def create_tuniface(testbed_instance, guid):
 
 def create_application(testbed_instance, guid):
     parameters = testbed_instance._get_parameters(guid)
-    element = testbed_instance._make_internet(parameters)
+    element = testbed_instance._make_application(parameters)
     testbed_instance.elements[guid] = element
 
 def create_internet(testbed_instance, guid):
     parameters = testbed_instance._get_parameters(guid)
-    element = None #TODO
+    element = testbed_instance._make_internet(parameters)
     testbed_instance.elements[guid] = element
 
 ### Start/Stop functions ###
@@ -70,21 +73,13 @@ def create_internet(testbed_instance, guid):
 def start_application(testbed_instance, guid):
     parameters = testbed_instance._get_parameters(guid)
     traces = testbed_instance._get_traces(guid)
-    user = parameters["user"]
+    app = testbed_instance.elements[guid]
+    sudo = parameters["sudo"]
     command = parameters["command"]
-    stdout = stderr = None
-    if "stdout" in traces:
-        # TODO
-        pass
-    if "stderr" in traces:
-        # TODO
-        pass
-
-    node_guids = testbed_instance.get_connected(guid, "node", "apps")
-    if not node_guid:
-        raise RuntimeError, "Can't instantiate interface %d outside planetlab node" % (guid,)
     
-    node = testbed_instance.elements[node_guids[0]]
+    app.stdout = testbed_instance.trace_filename(guid, "stdout")
+    app.stderr = testbed_instance.trace_filename(guid, "stderr")
+    
     # TODO
     pass
 
@@ -189,7 +184,7 @@ connections = [
     dict({
         "from": (TESTBED_ID, NODE, "apps"),
         "to":   (TESTBED_ID, APPLICATION, "node"),
-        "code": None,
+        "code": connect_app,
         "can_cross": False
     })
 ]
@@ -331,12 +326,13 @@ attributes = dict({
                 "flags": Attribute.DesignOnly,
                 "validation_function": validation.is_string
             }),
-    "user": dict({
+    "sudo": dict({
                 "name": "user",
                 "help": "System user",
-                "type": Attribute.STRING,
+                "type": Attribute.BOOL,
                 "flags": Attribute.DesignOnly,
-                "validation_function": validation.is_string
+                "value": False,
+                "validation_function": validation.is_bool
             }),
     "stdin": dict({
                 "name": "stdin",
@@ -409,7 +405,7 @@ factories_info = dict({
             "create_function": create_application,
             "start_function": start_application,
             "status_function": status_application,
-            "box_attributes": ["command", "user"],
+            "box_attributes": ["command", "sudo"],
             "connector_types": ["node"],
             "traces": ["stdout", "stderr"]
         }),
diff --git a/test/testbeds/planetlab/design.py b/test/testbeds/planetlab/design.py
new file mode 100755 (executable)
index 0000000..3ab52b1
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from nepi.core.design import ExperimentDescription, FactoriesProvider
+import os
+import shutil
+import test_util
+import unittest
+import uuid
+
+class NetnsDesignTestCase(unittest.TestCase):
+    def test_design_if(self):
+        exp_desc = ExperimentDescription()
+        testbed_version = "01"
+        testbed_id = "planetlab"
+        provider = FactoriesProvider(testbed_id, testbed_version)
+        tstbd_desc = exp_desc.add_testbed_description(provider)
+        node1 = tstbd_desc.create("Node")
+        node2 = tstbd_desc.create("Node")
+        iface1 = tstbd_desc.create("NodeInterface")
+        node1.connector("devs").connect(iface1.connector("node"))
+        iface2 = tstbd_desc.create("NodeInterface")
+        node2.connector("devs").connect(iface2.connector("node"))
+        switch = tstbd_desc.create("Internet")
+        iface1.connector("inet").connect(switch.connector("devs"))
+        iface2.connector("inet").connect(switch.connector("devs"))
+        app = tstbd_desc.create("Application")
+        app.set_attribute_value("command", "ping -qc10 10.0.0.2")
+        app.connector("node").connect(node1.connector("apps"))
+        xml = exp_desc.to_xml()
+        exp_desc2 = ExperimentDescription()
+        exp_desc2.from_xml(xml)
+        xml2 = exp_desc2.to_xml()
+        self.assertTrue(xml == xml2)
+        
+if __name__ == '__main__':
+    unittest.main()
diff --git a/test/testbeds/planetlab/execute.py b/test/testbeds/planetlab/execute.py
new file mode 100755 (executable)
index 0000000..b02f542
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import getpass
+from nepi.util.constants import STATUS_FINISHED
+from nepi.testbeds import netns
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+class NetnsExecuteTestCase(unittest.TestCase):
+    def setUp(self):
+        self.root_dir = tempfile.mkdtemp()
+        
+    def tearDown(self):
+        shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+    unittest.main()
+
diff --git a/test/testbeds/planetlab/integration.py b/test/testbeds/planetlab/integration.py
new file mode 100755 (executable)
index 0000000..8fa5deb
--- /dev/null
@@ -0,0 +1,24 @@
+#!/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
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+class NetnsIntegrationTestCase(unittest.TestCase):
+    def setUp(self):
+        self.root_dir = tempfile.mkdtemp()
+
+    def tearDown(self):
+        shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+    unittest.main()
+