#!/usr/bin/env python # # NEPI, a framework to manage network experiments # Copyright (C) 2013 INRIA # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Author: Julien Tribino from nepi.execution.resource import ResourceFactory, ResourceManager, ResourceAction, ResourceState from nepi.execution.ec import ExperimentController from nepi.resources.omf.node import OMFNode from nepi.resources.omf.application import OMFApplication from nepi.resources.omf.interface import OMFWifiInterface from nepi.resources.omf.channel import OMFChannel from nepi.resources.omf.omf_api import OMFAPIFactory from nepi.util.timefuncs import * import time import unittest class DummyEC(ExperimentController): pass class DummyRM(ResourceManager): pass class OMFResourceFactoryTestCase(unittest.TestCase): def test_creation_phase(self): self.assertEquals(OMFNode.rtype(), "OMFNode") self.assertEquals(len(OMFNode._attributes), 5) self.assertEquals(OMFWifiInterface.rtype(), "OMFWifiInterface") self.assertEquals(len(OMFWifiInterface._attributes), 9) self.assertEquals(OMFChannel.rtype(), "OMFChannel") self.assertEquals(len(OMFChannel._attributes), 5) self.assertEquals(OMFApplication.rtype(), "OMFApplication") self.assertEquals(len(OMFApplication._attributes), 12) class OMFEachTestCase(unittest.TestCase): def setUp(self): self.ec = DummyEC(exp_id = "99999") self.node1 = self.ec.register_resource("OMFNode") self.ec.set(self.node1, 'hostname', 'omf.plexus.wlab17') self.ec.set(self.node1, 'xmppSlice', "nepi") self.ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu") self.ec.set(self.node1, 'xmppPort', "5222") self.ec.set(self.node1, 'xmppPassword', "1234") self.iface1 = self.ec.register_resource("OMFWifiInterface") self.ec.set(self.iface1, 'alias', "w0") self.ec.set(self.iface1, 'mode', "adhoc") self.ec.set(self.iface1, 'type', "g") self.ec.set(self.iface1, 'essid', "vlcexp") self.ec.set(self.iface1, 'ip', "10.0.0.17") self.ec.set(self.iface1, 'xmppSlice', "nepi") self.ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu") self.ec.set(self.iface1, 'xmppPort', "5222") self.ec.set(self.iface1, 'xmppPassword', "1234") self.channel = self.ec.register_resource("OMFChannel") self.ec.set(self.channel, 'channel', "6") self.ec.set(self.channel, 'xmppSlice', "nepi") self.ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu") self.ec.set(self.channel, 'xmppPort', "5222") self.ec.set(self.channel, 'xmppPassword', "1234") self.app1 = self.ec.register_resource("OMFApplication") self.ec.set(self.app1, 'appid', 'Vlc#1') self.ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc") self.ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'") self.ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority") self.app2 = self.ec.register_resource("OMFApplication") self.app3 = self.ec.register_resource("OMFApplication") self.app4 = self.ec.register_resource("OMFApplication") self.app5 = self.ec.register_resource("OMFApplication") self.ec.register_connection(self.app1, self.node1) self.ec.register_connection(self.app2, self.node1) self.ec.register_connection(self.app3, self.node1) self.ec.register_connection(self.app4, self.node1) self.ec.register_connection(self.app5, self.node1) self.ec.register_connection(self.node1, self.iface1) self.ec.register_connection(self.iface1, self.channel) self.ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s") self.ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s") self.ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s") self.ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s") self.ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s") self.ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s") def tearDown(self): self.ec.shutdown() def test_creation_and_configuration_node(self): self.assertEquals(self.ec.get(self.node1, 'hostname'), 'omf.plexus.wlab17') self.assertEquals(self.ec.get(self.node1, 'xmppSlice'), 'nepi') self.assertEquals(self.ec.get(self.node1, 'xmppHost'), 'xmpp-plexus.onelab.eu') self.assertEquals(self.ec.get(self.node1, 'xmppPort'), '5222') self.assertEquals(self.ec.get(self.node1, 'xmppPassword'), '1234') def test_creation_and_configuration_interface(self): self.assertEquals(self.ec.get(self.iface1, 'alias'), 'w0') self.assertEquals(self.ec.get(self.iface1, 'mode'), 'adhoc') self.assertEquals(self.ec.get(self.iface1, 'type'), 'g') self.assertEquals(self.ec.get(self.iface1, 'essid'), 'vlcexp') self.assertEquals(self.ec.get(self.iface1, 'ip'), '10.0.0.17') self.assertEquals(self.ec.get(self.iface1, 'xmppSlice'), 'nepi') self.assertEquals(self.ec.get(self.iface1, 'xmppHost'), 'xmpp-plexus.onelab.eu') self.assertEquals(self.ec.get(self.iface1, 'xmppPort'), '5222') self.assertEquals(self.ec.get(self.iface1, 'xmppPassword'), '1234') def test_creation_and_configuration_channel(self): self.assertEquals(self.ec.get(self.channel, 'channel'), '6') self.assertEquals(self.ec.get(self.channel, 'xmppSlice'), 'nepi') self.assertEquals(self.ec.get(self.channel, 'xmppHost'), 'xmpp-plexus.onelab.eu') self.assertEquals(self.ec.get(self.channel, 'xmppPort'), '5222') self.assertEquals(self.ec.get(self.channel, 'xmppPassword'), '1234') def test_creation_and_configuration_application(self): self.assertEquals(self.ec.get(self.app1, 'appid'), 'Vlc#1') self.assertEquals(self.ec.get(self.app1, 'path'), '/opt/vlc-1.1.13/cvlc') self.assertEquals(self.ec.get(self.app1, 'args'), "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'") self.assertEquals(self.ec.get(self.app1, 'env'), 'DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority') def test_connection(self): self.assertEquals(len(self.ec.get_resource(self.node1).connections), 6) self.assertEquals(len(self.ec.get_resource(self.iface1).connections), 2) self.assertEquals(len(self.ec.get_resource(self.channel).connections), 1) self.assertEquals(len(self.ec.get_resource(self.app1).connections), 1) self.assertEquals(len(self.ec.get_resource(self.app2).connections), 1) def test_condition(self): self.assertEquals(len(self.ec.get_resource(self.app1).conditions[ResourceAction.STOP]), 1) self.assertEquals(len(self.ec.get_resource(self.app2).conditions[ResourceAction.START]), 1) self.assertEquals(len(self.ec.get_resource(self.app3).conditions[ResourceAction.START]), 1) self.assertEquals(len(self.ec.get_resource(self.app4).conditions[ResourceAction.STOP]), 1) self.assertEquals(len(self.ec.get_resource(self.app5).conditions[ResourceAction.START]), 2) class OMFVLCTestCaseComplete(unittest.TestCase): def test_deploy(self): ec = DummyEC(exp_id = "5421" ) self.node1 = ec.register_resource("OMFNode") ec.set(self.node1, 'hostname', 'omf.plexus.wlab17') ec.set(self.node1, 'xmppSlice', "nepi") ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.node1, 'xmppPort', "5222") ec.set(self.node1, 'xmppPassword', "1234") self.iface1 = ec.register_resource("OMFWifiInterface") ec.set(self.iface1, 'alias', "w0") ec.set(self.iface1, 'mode', "adhoc") ec.set(self.iface1, 'type', "g") ec.set(self.iface1, 'essid', "vlcexp") ec.set(self.iface1, 'ip', "10.0.0.17") ec.set(self.iface1, 'xmppSlice', "nepi") ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.iface1, 'xmppPort', "5222") ec.set(self.iface1, 'xmppPassword', "1234") self.channel = ec.register_resource("OMFChannel") ec.set(self.channel, 'channel', "6") ec.set(self.channel, 'xmppSlice', "nepi") ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.channel, 'xmppPort', "5222") ec.set(self.channel, 'xmppPassword', "1234") self.app1 = ec.register_resource("OMFApplication") ec.set(self.app1, 'appid', 'Vlc#1') ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc") ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'") ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority") self.app2 = ec.register_resource("OMFApplication") ec.set(self.app2, 'appid', 'Test#1') ec.set(self.app2, 'path', "/usr/bin/test") ec.set(self.app2, 'args', "-1") ec.set(self.app2, 'env', " ") self.app3 = ec.register_resource("OMFApplication") ec.set(self.app3, 'appid', 'Test#2') ec.set(self.app3, 'path', "/usr/bin/test") ec.set(self.app3, 'args', "-2") ec.set(self.app3, 'env', " ") self.app4 = ec.register_resource("OMFApplication") ec.set(self.app4, 'appid', 'Test#3') ec.set(self.app4, 'path', "/usr/bin/test") ec.set(self.app4, 'args', "-3") ec.set(self.app4, 'env', " ") self.app5 = ec.register_resource("OMFApplication") ec.set(self.app5, 'appid', 'Kill#2') ec.set(self.app5, 'path', "/usr/bin/killall") ec.set(self.app5, 'args', "vlc") ec.set(self.app5, 'env', " ") ec.register_connection(self.app1, self.node1) ec.register_connection(self.app2, self.node1) ec.register_connection(self.app3, self.node1) ec.register_connection(self.app4, self.node1) ec.register_connection(self.app5, self.node1) ec.register_connection(self.node1, self.iface1) ec.register_connection(self.iface1, self.channel) ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "3s") ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s") ec.register_condition(self.app4, ResourceAction.START, self.app3, ResourceState.STARTED , "3s") ec.register_condition(self.app5, ResourceAction.START, [self.app3, self.app2], ResourceState.STARTED , "2s") ec.register_condition(self.app5, ResourceAction.START, self.app1, ResourceState.STARTED , "25s") ec.register_condition([self.app1, self.app2, self.app3,self.app4, self.app5], ResourceAction.STOP, self.app5, ResourceState.STARTED , "1s") ec.deploy() ec.wait_finished([self.app1, self.app2, self.app3,self.app4, self.app5]) time.sleep(1) self.assertEquals(round(tdiffsec(ec.get_resource(self.app2).start_time, ec.get_resource(self.app1).start_time),0), 3.0) self.assertEquals(round(tdiffsec(ec.get_resource(self.app3).start_time, ec.get_resource(self.app2).start_time),0), 2.0) self.assertEquals(round(tdiffsec(ec.get_resource(self.app4).start_time, ec.get_resource(self.app3).start_time),0), 3.0) self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app3).start_time),0), 20.0) self.assertEquals(round(tdiffsec(ec.get_resource(self.app5).start_time, ec.get_resource(self.app1).start_time),0), 25.0) self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED) self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FINISHED) self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FINISHED) self.assertEquals(ec.get_resource(self.app4).state, ResourceState.FINISHED) self.assertEquals(ec.get_resource(self.app5).state, ResourceState.FINISHED) ec.shutdown() time.sleep(1) self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app4).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app5).state, ResourceState.RELEASED) class OMFVLCTestCaseNoComplete(unittest.TestCase): def xtest_deploy(self): ec = DummyEC(exp_id = "1245" ) self.node1 = ec.register_resource("OMFNode") ec.set(self.node1, 'hostname', 'omf.plexus.wlab17') ec.set(self.node1, 'xmppSlice', "nepi") ec.set(self.node1, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.node1, 'xmppPort', "5222") ec.set(self.node1, 'xmppPassword', "1234") self.node2 = ec.register_resource("OMFNode") self.iface1 = ec.register_resource("OMFWifiInterface") ec.set(self.iface1, 'alias', "w0") ec.set(self.iface1, 'mode', "adhoc") ec.set(self.iface1, 'type', "g") ec.set(self.iface1, 'essid', "vlcexp") ec.set(self.iface1, 'ip', "10.0.0.17") ec.set(self.iface1, 'xmppSlice', "nepi") ec.set(self.iface1, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.iface1, 'xmppPort', "5222") ec.set(self.iface1, 'xmppPassword', "1234") self.iface2 = ec.register_resource("OMFWifiInterface") self.channel = ec.register_resource("OMFChannel") ec.set(self.channel, 'channel', "6") ec.set(self.channel, 'xmppSlice', "nepi") ec.set(self.channel, 'xmppHost', "xmpp-plexus.onelab.eu") ec.set(self.channel, 'xmppPort', "5222") ec.set(self.channel, 'xmppPassword', "1234") self.app1 = ec.register_resource("OMFApplication") ec.set(self.app1, 'appid', 'Vlc#1') ec.set(self.app1, 'path', "/opt/vlc-1.1.13/cvlc") ec.set(self.app1, 'args', "/opt/10-by-p0d.avi --sout '#rtp{dst=10.0.0.37,port=1234,mux=ts}'") ec.set(self.app1, 'env', "DISPLAY=localhost:10.0 XAUTHORITY=/root/.Xauthority") self.app2 = ec.register_resource("OMFApplication") self.app3 = ec.register_resource("OMFApplication") ec.set(self.app3, 'appid', 'Kill#2') ec.set(self.app3, 'path', "/usr/bin/killall") ec.set(self.app3, 'args', "vlc") ec.set(self.app3, 'env', " ") ec.register_connection(self.app1, self.node1) ec.register_connection(self.app2, self.node1) ec.register_connection(self.app3, self.node1) ec.register_connection(self.node1, self.iface1) ec.register_connection(self.iface1, self.channel) ec.register_connection(self.node2, self.iface2) ec.register_connection(self.iface2, self.channel) ec.register_condition(self.app2, ResourceAction.START, self.app1, ResourceState.STARTED , "2s") ec.register_condition(self.app3, ResourceAction.START, self.app2, ResourceState.STARTED , "2s") ec.register_condition([self.app1, self.app2, self.app3], ResourceAction.STOP, self.app1, ResourceState.STARTED , "6s") ec.deploy() ec.wait_finished([self.app1, self.app2, self.app3]) self.assertEquals(ec.get_resource(self.node1).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.node2).state, ResourceState.FAILED) self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.FAILED) self.assertEquals(ec.get_resource(self.channel).state, ResourceState.STARTED) self.assertEquals(ec.get_resource(self.app1).state, ResourceState.FINISHED) self.assertEquals(ec.get_resource(self.app2).state, ResourceState.FAILED) self.assertEquals(ec.get_resource(self.app3).state, ResourceState.FINISHED) time.sleep(1) ec.shutdown() self.assertEquals(ec.get_resource(self.node1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.node2).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.iface1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.iface2).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.channel).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app1).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app2).state, ResourceState.RELEASED) self.assertEquals(ec.get_resource(self.app3).state, ResourceState.RELEASED) if __name__ == '__main__': unittest.main()