0edcb1e383b90e7d9969f872e7e9fbfd750b518f
[nepi.git] / test / testbeds / planetlab / integration.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import getpass
5 from nepi.core.design import ExperimentDescription, FactoriesProvider
6 from nepi.core.execute import ExperimentController
7 from nepi.util import proxy
8 import os
9 import shutil
10 import tempfile
11 import test_util
12 import time
13 import unittest
14 import re
15
16 class PlanetLabIntegrationTestCase(unittest.TestCase):
17     def setUp(self):
18         self.root_dir = tempfile.mkdtemp()
19
20     def tearDown(self):
21         try:
22             shutil.rmtree(self.root_dir)
23         except:
24             # retry
25             time.sleep(0.1)
26             shutil.rmtree(self.root_dir)
27
28     def make_experiment_desc(self):
29         testbed_id = "planetlab"
30         testbed_version = "01"
31         slicename = "inria_nepi12"
32         pl_ssh_key = os.environ.get(
33             "PL_SSH_KEY",
34             "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'],) )
35         pl_user, pl_pwd = test_util.pl_auth()
36
37         exp_desc = ExperimentDescription()
38         pl_provider = FactoriesProvider(testbed_id, testbed_version)
39         pl_desc = exp_desc.add_testbed_description(pl_provider)
40         pl_desc.set_attribute_value("homeDirectory", self.root_dir)
41         pl_desc.set_attribute_value("slice", slicename)
42         pl_desc.set_attribute_value("sliceSSHKey", pl_ssh_key)
43         pl_desc.set_attribute_value("authUser", pl_user)
44         pl_desc.set_attribute_value("authPass", pl_pwd)
45         
46         return pl_desc, exp_desc
47
48     @test_util.skipUnless(test_util.pl_auth() is not None, "Test requires PlanetLab authentication info (PL_USER and PL_PASS environment variables)")
49     def test_simple(self):
50         pl, exp = self.make_experiment_desc()
51         
52         node1 = pl.create("Node")
53         node2 = pl.create("Node")
54         node1.set_attribute_value("hostname", "onelab11.pl.sophia.inria.fr")
55         node2.set_attribute_value("hostname", "onelab10.pl.sophia.inria.fr")
56         iface1 = pl.create("NodeInterface")
57         iface2 = pl.create("NodeInterface")
58         iface2.set_attribute_value("label", "node2iface")
59         inet = pl.create("Internet")
60         node1.connector("devs").connect(iface1.connector("node"))
61         node2.connector("devs").connect(iface2.connector("node"))
62         iface1.connector("inet").connect(inet.connector("devs"))
63         iface2.connector("inet").connect(inet.connector("devs"))
64         app = pl.create("Application")
65         app.set_attribute_value("command", "ping -qc1 {#[node2iface].addr[0].[Address]#}")
66         app.enable_trace("stdout")
67         app.connector("node").connect(node1.connector("apps"))
68
69         xml = exp.to_xml()
70
71         controller = ExperimentController(xml, self.root_dir)
72         controller.start()
73         while not controller.is_finished(app.guid):
74             time.sleep(0.5)
75         ping_result = controller.trace(pl.guid, app.guid, "stdout")
76         comp_result = r"""PING .* \(.*\) \d*\(\d*\) bytes of data.
77
78 --- .* ping statistics ---
79 1 packets transmitted, 1 received, 0% packet loss, time \d*ms.*
80 """
81         self.assertTrue(re.match(comp_result, ping_result, re.MULTILINE),
82             "Unexpected trace:\n" + ping_result)
83         controller.stop()
84         controller.shutdown()
85
86 if __name__ == '__main__':
87     unittest.main()
88