From: Alina Quereilhac Date: Mon, 12 Jan 2015 01:22:14 +0000 (+0100) Subject: examples/openvswitch/ovs_ping_2_switches.py X-Git-Tag: nepi-3.2.0~26 X-Git-Url: http://git.onelab.eu/?p=nepi.git;a=commitdiff_plain;h=c98a137a49a4bffd571b24f4c08d89e90def5771 examples/openvswitch/ovs_ping_2_switches.py --- diff --git a/examples/openvswitch/ovs_ping_2_switches.py b/examples/openvswitch/ovs_ping_2_switches.py new file mode 100644 index 00000000..3fe3d173 --- /dev/null +++ b/examples/openvswitch/ovs_ping_2_switches.py @@ -0,0 +1,273 @@ +#!/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 . +# +# Authors : Julien Tribino +# Alina Quereilhac +# +# Topology : +# +# Switch1 -------- Switch2 +# / \ +# / \ +# / \ +# Host1 Host2 +# +# +# Execution example: +# +# $ PYTHONPATH=$PYTHONPATH:src/ python examples/openvswitch/ovs_ping_2_switches.py -n "192.168.3.0/24" -C "1.1.1.1" -s -i /~/.ssh/id_rsa +# + +from nepi.execution.ec import ExperimentController + +import os +from optparse import OptionParser +import sys +import time + +def add_node(ec, host, user, pl_user, pl_password, identity): + node = ec.register_resource("planetlab::Node") + ec.set(node, "hostname", host) + ec.set(node, "username", user) + + if identity: + ec.set(node, "identity", identity) + if pl_user: + ec.set(node, "pluser", pl_user) + if pl_password: + ec.set(node, "plpassword", pl_password) + + ec.set(node, "cleanExperiment", True) + ec.set(node, "cleanProcesses", True) + + return node + +def add_ovs(ec, bridge_name, virtual_ip_pref, controller_ip, controller_port, node): + ovs = ec.register_resource("planetlab::OVSSwitch") + ec.set(ovs, "bridge_name", bridge_name) + ec.set(ovs, "virtual_ip_pref", virtual_ip_pref) + ec.set(ovs, "controller_ip", controller_ip) + ec.set(ovs, "controller_port", controller_port) + ec.register_connection(ovs, node) + return ovs + +def add_port(ec, port_name, network, ovs): + port = ec.register_resource("planetlab::OVSPort") + ec.set(port, "port_name", port_name) + ec.set(port, "network", network) + ec.register_connection(port, ovs) + return port + +def add_tap(ec, ip, prefix, pointopoint, node): + tap = ec.register_resource("planetlab::Tap") + ec.set(tap, "ip", ip) + ec.set(tap, "prefix", prefix) + ec.set(tap, "pointopoint", pointopoint) + ec.set(tap, "up", True) + ec.register_connection(tap, node) + return tap + +def add_tunnel(ec, port0, tap): + tunnel = ec.register_resource("linux::UdpTunnel") + ec.register_connection(port0, tunnel) + ec.register_connection(tunnel, tap) + return tunnel + +def add_app(ec, command, node): + app = ec.register_resource("linux::Application") + ec.set(app, "command", command) + ec.register_connection(app, node) + return app + +def parse_args(): + pl_slice = os.environ.get("PL_SLICE") + pl_user = os.environ.get("PL_USER") + pl_pass = os.environ.get("PL_PASS") + identity = os.environ.get("PL_SSHKEY") + + usage = ("usage: %prog -a -b -c -d " + "-n -C -s -u " + "-p -i ") + + switch1 = "planetlab2.virtues.fi" + switch2 = "planetlab2.upc.es" + host1 = "planetlab2.ionio.gr" + host2 = "iraplab2.iralab.uni-karlsruhe.de" + + parser = OptionParser(usage = usage) + parser.add_option("-a", "--host1", dest="host1", + help="Hostname for PlanetLab host 1", default=host1) + parser.add_option("-b", "--host2", dest="host2", + help="Hostname for PlanetLab host 2", default=host2) + parser.add_option("-c", "--switch1", dest="switch1", + help="Hostname for PlanetLab switch 1", default=switch1) + parser.add_option("-d", "--switch2", dest="switch2", + help="Hostname for PlanetLab switch 2", default=switch2) + parser.add_option("-n", "--vsys_vnet", dest="vsys_vnet", + help="Overlay network address of the form x.x.x.x/yy. " + "Must correspond to the vsys_vnet tag on the PlanetLab slice") + parser.add_option("-C", "--controller", dest="controller", + help="IP address for the OpenFlow controller, if one has been deployed", + default="1.1.1.1") + parser.add_option("-s", "--slicename", dest="slicename", + help="Name of PlanetLab slice", + default=pl_slice) + parser.add_option("-u", "--pl_user", dest="pl_user", + help="PlanetLab user (email address)", + default=pl_user) + parser.add_option("-p", "--pl_pass", dest="pl_pass", + help="PlanetLab password", + default=pl_pass) + parser.add_option("-i", "--identity", dest="identity", + help="Path to SSH key", + default=identity) + + (options, args) = parser.parse_args() + + return (options.host1, options.host2, options.switch1, options.switch2, + options.vsys_vnet, options.controller, options.slicename, + options.pl_user, options.pl_pass, identity) + +(host1, host2, switch1, switch2, vsys_vnet, controller, slicename, + pl_user, pl_pass, identity) = parse_args() + +# Create the EC +ec = ExperimentController(exp_id = "ovs_2_switch") + +net = vsys_vnet.split("/") +prefix = net[-1] +network = net[0] +net_segs = network.split(".") +ip1 = "%s.1" % ".".join(net_segs[:-1]) # x.x.x.1 +ip2 = "%s.2" % ".".join(net_segs[:-1]) # x.x.x.2 +ip3 = "%s.3" % ".".join(net_segs[:-1]) # x.x.x.3 +ip4 = "%s.4" % ".".join(net_segs[:-1]) # x.x.x.4 + +s1_node = add_node(ec, switch1, slicename, pl_user, pl_pass, identity) +s2_node = add_node(ec, switch2, slicename, pl_user, pl_pass, identity) + +# Add OVS switches +addr1 = "%s/%s" % (ip1, prefix) # x.x.x.1/prefix +addr2 = "%s/%s" % (ip2, prefix) # x.x.x.2/prefix +ovs1 = add_ovs(ec, "nepi_bridge_1", addr1, controller, "6633", s1_node) +ovs2 = add_ovs(ec, "nepi_bridge_2", addr2, controller, "6633", s2_node) + +# Add ports on OVS +port1 = add_port(ec, "nepi_port1", network, ovs1) +port3 = add_port(ec, "nepi_port3", network, ovs1) +port2 = add_port(ec, "nepi_port2", network, ovs2) +port4 = add_port(ec, "nepi_port4", network, ovs2) + +h1_node = add_node(ec, host1, slicename, pl_user, pl_pass, identity) +h2_node = add_node(ec, host2, slicename, pl_user, pl_pass, identity) + +# Add tap devices +tap1 = add_tap(ec, ip3, prefix, ip1, h1_node) +tap2 = add_tap(ec, ip4, prefix, ip2, h2_node) + +# Connect the nodes +tunnel1 = add_tunnel(ec, port1, tap1) +tunnel2 = add_tunnel(ec, port2, tap2) +tunnel3 = add_tunnel(ec, port3, port4) + +# Ping switch 1 to switch2 +app1 = add_app(ec, "ping -c5 %s" % ip2, s1_node) +# Ping switch 1 to host1 +app2 = add_app(ec, "ping -c5 %s" % ip3, s1_node) +# Ping switch 1 to host2 +app3 = add_app(ec, "ping -c5 %s" % ip4, s1_node) + +# Ping switch 2 to switch1 +app4 = add_app(ec, "ping -c5 %s" % ip1, s2_node) +# Ping switch 2 to host1 +app5 = add_app(ec, "ping -c5 %s" % ip3, s2_node) +# Ping switch 2 to host2 +app6 = add_app(ec, "ping -c5 %s" % ip4, s2_node) + +# Ping host 1 to switch 1 +app7 = add_app(ec, "ping -c5 %s" % ip1, h1_node) +# Ping host 1 to switch 2 +app8 = add_app(ec, "ping -c5 %s" % ip2, h1_node) +# Ping host 1 to host 2 +app9 = add_app(ec, "ping -c5 %s" % ip4, h1_node) + +# Ping host 2 to switch 1 +app10 = add_app(ec, "ping -c5 %s" % ip1, h2_node) +# Ping host 2 to switch 2 +app11 = add_app(ec, "ping -c5 %s" % ip2, h2_node) +# Ping host 2 to host1 +app12 = add_app(ec, "ping -c5 %s" % ip3, h2_node) + +ec.deploy() + +ec.wait_finished([app1, app2, app3, app4, app5, app6, + app7, app8, app9, app10, app11, app12]) + +# Retreive ping results and save them in a file +ping1 = ec.trace(app1, "stdout") +ping2 = ec.trace(app2, "stdout") +ping3 = ec.trace(app3, "stdout") +ping4 = ec.trace(app4, "stdout") +ping5 = ec.trace(app5, "stdout") +ping6 = ec.trace(app6, "stdout") +ping7 = ec.trace(app7, "stdout") +ping8 = ec.trace(app8, "stdout") +ping9 = ec.trace(app9, "stdout") +ping10 = ec.trace(app10, "stdout") +ping11 = ec.trace(app11, "stdout") +ping12 = ec.trace(app12, "stdout") + +if not ping12: + ec.shutdown() + sys.exit("No ping found") + +f = open("ovs_ping_2_switches.txt", 'w') +f.write("************ Ping From Switch 1 : %s ********************\n\n\n" % ip1) +f.write(ping1) +f.write("----------------------------------------\n\n") +f.write(ping2) +f.write("----------------------------------------\n\n") +f.write(ping3) + +f.write("************ Ping From Switch 2 : %s ********************\n\n\n" % ip2) +f.write(ping4) +f.write("----------------------------------------\n\n") +f.write(ping5) +f.write("----------------------------------------\n\n") +f.write(ping6) + +f.write("************ Ping From Host 1 : %s ********************\n\n\n" % ip3) +f.write(ping7) +f.write("----------------------------------------\n\n") +f.write(ping8) +f.write("----------------------------------------\n\n") +f.write(ping9) + +f.write("************ Ping From Host 2 : %s ********************\n\n\n" % ip4) +f.write(ping10) +f.write("----------------------------------------\n\n") +f.write(ping11) +f.write("----------------------------------------\n\n") +f.write(ping12) + +f.close() + +# Delete the overlay network +ec.shutdown() + + diff --git a/examples/openvswitch/ovs_ping_2switches.py b/examples/openvswitch/ovs_ping_2switches.py deleted file mode 100644 index 799917f9..00000000 --- a/examples/openvswitch/ovs_ping_2switches.py +++ /dev/null @@ -1,199 +0,0 @@ -#!/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 . -# -# Authors : Julien Tribino -# Alina Quereilhac -# -# Topology : -# -# Switch1 -------- Switch2 -# / \ -# / \ -# / \ -# Host1 Host2 - - - -from nepi.execution.ec import ExperimentController -import os, time -import sys - -def add_node(ec, host, user, pl_user, pl_password): - node = ec.register_resource("planetlab::Node") - ec.set(node, "hostname", host) - ec.set(node, "username", user) - if pl_user: - ec.set(node, "pluser", pl_user) - if pl_password: - ec.set(node, "plpassword", pl_password) - ec.set(node, "cleanExperiment", True) - ec.set(node, "cleanProcesses", True) - - return node - -def add_ovs(ec, bridge_name, virtual_ip_pref, controller_ip, controller_port, node): - ovs = ec.register_resource("planetlab::OVSSwitch") - ec.set(ovs, "bridge_name", bridge_name) - ec.set(ovs, "virtual_ip_pref", virtual_ip_pref) - ec.set(ovs, "controller_ip", controller_ip) - ec.set(ovs, "controller_port", controller_port) - ec.register_connection(ovs, node) - return ovs - -def add_port(ec, port_name, network, ovs): - port = ec.register_resource("planetlab::OVSPort") - ec.set(port, "port_name", port_name) - ec.set(port, "network", network) - ec.register_connection(port, ovs) - return port - -def add_tap(ec, ip, prefix, pointopoint, node): - tap = ec.register_resource("planetlab::Tap") - ec.set(tap, "ip", ip) - ec.set(tap, "prefix", prefix) - ec.set(tap, "pointopoint", pointopoint) - ec.set(tap, "up", True) - ec.register_connection(tap, node) - return tap - -def add_tunnel(ec, port0, tap): - tunnel = ec.register_resource("linux::UdpTunnel") - ec.register_connection(port0, tunnel) - ec.register_connection(tunnel, tap) - return tunnel - -def add_app(ec, command, node): - app = ec.register_resource("linux::Application") - ec.set(app, "command", command) - ec.register_connection(app, node) - return app - -# Create the EC -ec = ExperimentController(exp_id = "test") - -#XXX : Need to put 4 working nodes or to let Nepi find for you -switch1 = "planetlab2.virtues.fi" -switch2 = "planetlab2.upc.es" -host1 = "planetlab2.ionio.gr" -host2 = "iraplab2.iralab.uni-karlsruhe.de" - -ip_controller = "1.1.1.1" - -#XXX : Depends on the Vsys_tag of your slice -network = "192.168.3.0" - -#XXX : Name of your slice -slicename = "inria_nepi" - -pl_user = os.environ.get("PL_USER") -pl_password = os.environ.get("PL_PASS") - -s1_node = add_node(ec, switch1, slicename, pl_user, pl_password) -s2_node = add_node(ec, switch2, slicename, pl_user, pl_password) - -# Add switches -ovs1 = add_ovs(ec, "nepi_bridge_1", "192.168.3.1/24", ip_controller, "6633", s1_node) -ovs2 = add_ovs(ec, "nepi_bridge_2", "192.168.3.2/24", ip_controller, "6633", s2_node) - -# Add ports on ovs -port1 = add_port(ec, "nepi_port1", network, ovs1) -port3 = add_port(ec, "nepi_port3", network, ovs1) -port2 = add_port(ec, "nepi_port2", network, ovs2) -port4 = add_port(ec, "nepi_port4", network, ovs2) - -h1_node = add_node(ec, host1, slicename, pl_user, pl_password) -h2_node = add_node(ec, host2, slicename, pl_user, pl_password) - -# Add tap devices -tap1 = add_tap(ec, "192.168.3.3", "24", "192.168.3.1", h1_node) -tap2 = add_tap(ec, "192.168.3.4", "24", "192.168.3.2", h2_node) - -# Connect the nodes -tunnel1 = add_tunnel(ec, port1, tap1) -tunnel2 = add_tunnel(ec, port2, tap2) -tunnel3 = add_tunnel(ec, port3, port4) - -# Add ping commands -app1 = add_app(ec, "ping -c5 192.168.3.2", s1_node) -app2 = add_app(ec, "ping -c5 192.168.3.3", s1_node) -app3 = add_app(ec, "ping -c5 192.168.3.4", s1_node) -app4 = add_app(ec, "ping -c5 192.168.3.1", s2_node) -app5 = add_app(ec, "ping -c5 192.168.3.3", s2_node) -app6 = add_app(ec, "ping -c5 192.168.3.4", s2_node) -app7 = add_app(ec, "ping -c5 192.168.3.1", h1_node) -app8 = add_app(ec, "ping -c5 192.168.3.2", h1_node) -app9 = add_app(ec, "ping -c5 192.168.3.4", h1_node) -app10 = add_app(ec, "ping -c5 192.168.3.1", h2_node) -app11 = add_app(ec, "ping -c5 192.168.3.2", h2_node) -app12 = add_app(ec, "ping -c5 192.168.3.3", h2_node) - -ec.deploy() - -ec.wait_finished([app1, app2, app3, app4, app5, app6, app7, app8, app9, app10, app11, app12]) - -# Retreive ping results and save -# them in a file -ping1 = ec.trace(app1, 'stdout') -ping2 = ec.trace(app2, 'stdout') -ping3 = ec.trace(app3, 'stdout') -ping4 = ec.trace(app4, 'stdout') -ping5 = ec.trace(app5, 'stdout') -ping6 = ec.trace(app6, 'stdout') -ping7 = ec.trace(app7, 'stdout') -ping8 = ec.trace(app8, 'stdout') -ping9 = ec.trace(app9, 'stdout') -ping10 = ec.trace(app10, 'stdout') -ping11 = ec.trace(app11, 'stdout') -ping12 = ec.trace(app12, 'stdout') - -if not ping12: - ec.shutdown() - sys.exit("No ping found") - -f = open("examples/openvswitch/ovs_ping_2switches.txt", 'w') -f.write("************ Ping From Switch 1 : 192.168.3.1 ********************\n\n") -f.write(ping1) -f.write("----------------------------------------\n\n") -f.write(ping2) -f.write("----------------------------------------\n\n") -f.write(ping3) -f.write("************ Ping From Switch 2 : 192.168.3.2 ********************\n\n") -f.write(ping4) -f.write("----------------------------------------\n\n") -f.write(ping5) -f.write("----------------------------------------\n\n") -f.write(ping6) -f.write("************ Ping From Host 1 : 192.168.3.3 ********************\n\n") -f.write(ping7) -f.write("----------------------------------------\n\n") -f.write(ping8) -f.write("----------------------------------------\n\n") -f.write(ping9) -f.write("************ Ping From Host 2 : 192.168.3.4 ********************\n\n") -f.write(ping10) -f.write("----------------------------------------\n\n") -f.write(ping11) -f.write("----------------------------------------\n\n") -f.write(ping12) - -f.close() - -# Delete the overlay network -ec.shutdown() - - diff --git a/examples/openvswitch/ovs_ping_3switches_line.py b/examples/openvswitch/ovs_ping_3_switches.py similarity index 100% rename from examples/openvswitch/ovs_ping_3switches_line.py rename to examples/openvswitch/ovs_ping_3_switches.py diff --git a/src/nepi/resources/planetlab/plcapi.py b/src/nepi/resources/planetlab/plcapi.py index 86385b7f..6adfdc91 100644 --- a/src/nepi/resources/planetlab/plcapi.py +++ b/src/nepi/resources/planetlab/plcapi.py @@ -177,7 +177,7 @@ class PLCAPI(object): self.threadlocal = threading.local() # Load blacklist from file - if self._ecobj.get_global('PlanetlabNode', 'persist_blacklist'): + if self._ecobj.get_global('planetlab::Node', 'persist_blacklist'): self._set_blacklist() @property