3 # NEPI, a framework to manage network experiments
4 # Copyright (C) 2013 INRIA
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
21 from nepi.execution.ec import ExperimentController
22 from nepi.execution.resource import ResourceManager, ResourceState, \
23 clsinit_copy, ResourceAction, ResourceFactory
24 from nepi.execution.runner import ExperimentRunner
33 reschedule_delay = "0.5s"
37 class Link(ResourceManager):
38 _rtype = "dummy::Link"
40 time.sleep(deploy_time)
41 super(Link, self).do_deploy()
42 self.logger.debug(" -------- DEPLOYED ------- ")
44 class Interface(ResourceManager):
45 _rtype = "dummy::Interface"
48 node = self.get_connected(Node.get_rtype())[0]
49 link = self.get_connected(Link.get_rtype())[0]
51 if node.state < ResourceState.READY or \
52 link.state < ResourceState.READY:
53 self.ec.schedule(reschedule_delay, self.deploy)
54 self.logger.debug(" -------- RESCHEDULING ------- ")
56 time.sleep(deploy_time)
57 super(Interface, self).do_deploy()
58 self.logger.debug(" -------- DEPLOYED ------- ")
60 class Node(ResourceManager):
61 _rtype = "dummy::Node"
64 self.logger.debug(" -------- DO_DEPLOY ------- ")
65 time.sleep(deploy_time)
66 super(Node, self).do_deploy()
67 self.logger.debug(" -------- DEPLOYED ------- ")
69 class Application(ResourceManager):
70 _rtype = "dummy::Application"
73 node = self.get_connected(Node.get_rtype())[0]
75 if node.state < ResourceState.READY:
76 self.ec.schedule(reschedule_delay, self.deploy)
77 self.logger.debug(" -------- RESCHEDULING ------- ")
79 time.sleep(deploy_time)
80 super(Application, self).do_deploy()
81 self.logger.debug(" -------- DEPLOYED ------- ")
84 super(Application, self).do_start()
86 self.ec.schedule("0s", self.stop)
88 ResourceFactory.register_type(Application)
89 ResourceFactory.register_type(Node)
90 ResourceFactory.register_type(Interface)
91 ResourceFactory.register_type(Link)
93 class RunnerTestCase(unittest.TestCase):
94 def test_runner_max_runs(self):
98 ec = ExperimentController(exp_id = "max-runs-test")
100 # Add simulated nodes and applications
105 for i in xrange(node_count):
106 node = ec.register_resource("dummy::Node")
109 iface = ec.register_resource("dummy::Interface")
110 ec.register_connection(node, iface)
113 for i in xrange(app_count):
114 app = ec.register_resource("dummy::Application")
115 ec.register_connection(node, app)
118 link = ec.register_resource("dummy::Link")
121 ec.register_connection(link, iface)
123 rnr = ExperimentRunner()
124 runs = rnr.run(ec, min_runs = 5, max_runs = 10, wait_guids = apps,
127 self.assertEquals(runs, 10)
129 def test_runner_convergence(self):
133 ec = ExperimentController(exp_id = "convergence-test")
135 # Add simulated nodes and applications
140 for i in xrange(node_count):
141 node = ec.register_resource("dummy::Node")
144 iface = ec.register_resource("dummy::Interface")
145 ec.register_connection(node, iface)
148 for i in xrange(app_count):
149 app = ec.register_resource("dummy::Application")
150 ec.register_connection(node, app)
153 link = ec.register_resource("dummy::Link")
156 ec.register_connection(link, iface)
158 samples = [10, 10, 10, 10, 12, 10, 12, 10, 10, 11]
160 def compute_metric_callback(samples, ec, run):
161 return samples[run-1]
163 metric_callback = functools.partial(compute_metric_callback, samples)
165 rnr = ExperimentRunner()
166 runs = rnr.run(ec, min_runs = 5,
167 compute_metric_callback = metric_callback,
171 self.assertEquals(runs, 10)
173 if __name__ == '__main__':