Changes between Initial Version and Version 1 of GEC17Agenda/AdvancedOpenFlow/Procedure/Appendices


Ignore:
Timestamp:
03/09/14 19:39:28 (10 years ago)
Author:
nriga@bbn.com
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GEC17Agenda/AdvancedOpenFlow/Procedure/Appendices

    v1 v1  
     1= Appendix: Hints and Explanations =
     2
     3== A. !LabWiki Script for the LoadBalancer ==
     4
     5{{{
     6
     7}}}
     8== B. About the OpenFlow controller [http://www.gpolab.bbn.com/experiment-support/OpenFlowExampleExperiment/ExoGENI/load-balancer.rb load-balancer.rb] ==
     9  - Trema web site: http://trema.github.io/trema/
     10  - Treme ruby API document: http://rubydoc.info/github/trema/trema/master/frames
     11  - '''Functions used in our tutorial:'''
     12    - '''start()''': is the function that will be called when the OpenFlow Controller is started. Here in our case, we read the file /tmp/portmap and figures out which OpenFlow port points to which path
     13    - '''switch_ready()''': is the function that will be called each time a switch connects to the OpenFlow Controller. Here in our case, we allow all non-TCP flows to pass (including ARP and ICMP packets) and ask new inbound TCP flow to go to the controller. We also starts a "timer" function that calls "query_stats()" once every 2 seconds.
     14    - '''query_stats()''': is the function that sends out a flow_stats_request to get the current statistics about each flow.
     15    - '''packet_in()''': is the function that will be called each time a packet arrives at the controller. Here in our case, we call "decide_path()" to get path decisions, then send flow entry back to the OpenFlow Switch to instruct the switch which path to take for this new TCP flow.
     16    - '''stats_reply()''': is the function that will be called when the OpenFlow Controller receives a flow_stats_reply message from the OpenFlow Switch. Here in our case, we update the flow statistics so that "decide_path()" can make the right decision.
     17    - '''send_flow_mod_add()''': is the function that you should use to add a flow entry into an OpenFlow Switch.
     18    - '''decide_path()''': is the function that makes path decisions. It returns the path choices based on flow statistics.
     19  - '''The Whole Process: '''
     20    - When the OpenFlow switch is ready, our controller starts a function that asks for flow stats once every 2 seconds.
     21    - The OpenFlow switch will reply with statistics information about all flows in its flow table.
     22    - This flow statistics message will be fetched by the "stats_reply" function in the OpenFlow controller implemented by the user on node "Switch".
     23    - As a result, our controller updates its knowledge about both left and right path once every 2 seconds.
     24    - Upon the arrival of a new TCP flow, the OpenFlow controller decides which path to send the new flow to, based on the updated flow statistics.
     25
     26  The !FlowStatsReply message is in the following format:
     27{{{
     28FlowStatsReply.new(
     29  :length => 96,
     30  :table_id => 0,
     31  :match => Match.new
     32  :duration_sec => 10,
     33  :duration_nsec => 106000000,
     34  :priority => 0,
     35  :idle_timeout => 0,
     36  :hard_timeout => 0,
     37  :cookie => 0xabcd,
     38  :packet_count => 1,
     39  :byte_count => 1,
     40  :actions => [ ActionOutput.new ]
     41)
     42}}}
     43
     44== C. About The Rspec file [http://www.gpolab.bbn.com/experiment-support/OpenFlowExampleExperiment/openflow-loadbalancer-kvm.rspec OpenFlowLBExo.rspec] ==
     45  - The Rspec file describes a topology we showed earlier--each node is assigned with certain number of interfaces with pre-defined IP addresses
     46  - Some of the nodes are loaded with softwares and post-scripts. We will take node "Switch" as an example since it is the most complicated one.
     47   - The following section in the Rspec file for node "Switch":
     48   {{{
     49     <install url="http://www.gpolab.bbn.com/experiment-support/OpenFlowExampleExperiment/software/of-switch-exo.tar.gz"
     50                         install_path="/"/>
     51   }}}
     52   means it is going to download that tar ball from the specified URL and extract to directory "/"
     53   - The following section in the Rspec file for node "Switch":
     54   {{{
     55     <execute shell="bash" command="/tmp/postboot_script_exo.sh $sliceName $self.Name() ;
     56                           /tmp/of-topo-setup/lb-setup"/>
     57   }}}
     58   names the post-boot script that ExoGENI is going to run for you after the nodes are booted. 
     59  - More information about "/tmp/postboot_script_exo.sh":
     60   It is a "hook" to the !LabWiki interface. Experimenter run this so that !LabWiki knows the name of the slice and the hostname of the particular node that OML/OMF toolkits are running on.
     61  - More information about "/tmp/of-topo-setup/lb-setup":
     62   "lb-setup" is to setup the load balancing switch. The source code as well as explanation is as follows:
     63   {{{
     64   #!/bin/sh
     65
     66   /tmp/of-topo-setup/prep-trema       # install all libraries for trema
     67   /tmp/of-topo-setup/ovs-start           # create ovs bridge
     68
     69   cp /usr/bin/trace-oml2 /usr/bin/trace        # a hack to the current LabWiki --> needs to be fixed
     70   cp /usr/bin/nmetrics-oml2 /usr/bin/nmetrics       # a hack to the current LabWiki --> needs to be fixed
     71   # download the load balancing openflow controller source code to user directory
     72   wget http://www.gpolab.bbn.com/experiment-support/OpenFlowExampleExperiment/ExoGENI/load-balancer.rb -O /root/load-balancer.rb
     73
     74   INTERFACES="192.168.1.1 192.168.2.1 192.168.3.1"
     75
     76   # wait until all interfaces are up, then fetch the mapping from interface name to its ip/MAC address and save this info in a file /tmp/ifmap
     77   /tmp/of-topo-setup/writeifmap3
     78
     79   # add port to the ovs bridge
     80   /tmp/of-topo-setup/find-interfaces $INTERFACES | while read iface; do
     81       ovs-vsctl add-port br0 $iface < /dev/null
     82   done
     83
     84   # create port map save it to /tmp/portmap
     85   ovs-ofctl show tcp:127.0.0.1:6634 \
     86       | /tmp/of-topo-setup/ovs-id-ports 192.168.1.1=outside 192.168.2.1=left 192.168.3.1=right \
     87       > /tmp/portmap
     88   }}}
     89
     90== D. About the GIMI script you run on !LabWiki ==
     91 - Line 1 to Line 128: the definition of oml trace and oml nmetrics library. It basically defines the command line options for oml2-trace and oml2-nmetrics, as well as the output (the monitoring data that is going to be stored into the oml server)
     92  - users are not supposed to modify them
     93  - the definition here we used is not the same as what is provided by the latest OML2 2.10.0 library because there is some version mis-match between the OMF that !LabWiki is using and the OML2 toolkit that we are using. It is a temporary hack for now --> to be fixed
     94  - we added the definition of option "--oml-config" for trace app (Line 27-28) so that oml2-trace accepts configuration files:
     95  {{{
     96  app.defProperty('config', 'config file to follow', '--oml-config',
     97                  :type => :string, :default => '"/tmp/monitor/conf.xml"')
     98  }}}
     99 - Line 134 to Line 137: user defines the monitoring interfaces here. In our case, we want to monitor the interface on node "Switch" that connects to the left path (with IP 192.168.2.2) and to the right path (with IP 192.168.3.1)
     100 - Line 139 to Line 169: defines on which node the user wants to run which monitoring app; and the "display graph" option.
     101  - group "Monitor" monitors the left path statistics using nmetrics and trace.
     102  - group "Monitor1" monitors the right path statistics using nmetrics and trace.
     103  - To monitor the throughput information, we used oml2-trace with the option of "--oml-config" which uses the configuration file we created at /tmp/monitor/conf.xml, which simply sums up the number of tcp_packet_size (in Bytes) for each second and save the info into the OML Server (in a Postgre database):
     104  {{{
     105<omlc id="switch" encoding="binary">
     106  <collect url="tcp:emmy9.casa.umass.edu:3004" name="traffic">
     107    <stream mp="tcp" interval="1">
     108      <filter field="tcp_packet_size" operation="sum" rename="tcp_throughput" />
     109    </stream>
     110  </collect>
     111</omlc>
     112  }}}
     113  - More information about nmetrics and trace can be found here: http://oml.mytestbed.net/projects/omlapp/wiki/OML-instrumented_Applications#Packet-tracer-trace-oml2
     114 - Line 173 to Line 218: defines the experiment:
     115  - Line 175-177: starts the monitoring app
     116  - Line 179-181: starts the TCP receiver (using iperf)
     117  - Line 183-189: starts the load balancer and connects ovs switch to the load balancer (controller)
     118  - Line 191-200: starts 20 TCP flows, with 5 seconds interval between the initial of each Flow
     119  - Line 205-209: stop the load balancer controller, disconnect the ovs switch from the controller and finish the experiment
     120 - Line 217 to Line 234: defines the two graphs we want to plot:
     121  - The first uses the monitoring data from oml2-nmetrics to display the cumulated number of bytes observed from each of the interfaces;
     122  - The second graph uses the monitoring results from oml2-trace to display the throughput observed from each of the interfaces.
     123
     124= E. Tips: Debugging an OpenFlow Controller =
     125You will find it helpful to know what is going on inside your OpenFlow controller and its associated switch when implementing these exercises. [[BR]]
     126This section contains a few tips that may help you out if you are using the Open vSwitch implementation provided with this tutorial.
     127If you are using a hardware OpenFlow switch, your instructor can help you find equivalent commands. [[BR]]
     128The Open vSwitch installation provided by the RSpec included in this tutorial is located in ''/opt/openvswitch-1.6.1-F15''. You will find Open vSwitch commands in ''/opt/openvswitch-1.6.1-F15/bin'' and ''/opt/openvswitch-1.6.1-F15/sbin''. Some of these commands may be helpful to you. If you add these paths to your shell’s ''$PATH'', you will be able to access their manual pages with man. Note that ''$PATH'' will not affect sudo, so you will still have to provide the absolute path to sudo; the absolute path is omitted from the following examples for clarity and formatting.
     129
     130 - '''ovs-vsctl'''[[BR]]
     131 Open vSwitch switches are primarily configured using the ''ovs-vsctl'' command. For exploring, you may find the ''ovs-vsctl show'' command useful, as it dumps the status of all virtual switches on the local Open vSwitch instance. Once you have some information on the local switch configurations, ''ovs-vsctl'' provides a broad range of capabilities that you will likely find useful for expanding your network setup to more complex configurations for testing and verification. In particular, the subcommands ''add-br'', ''add-port'', and ''set-controller'' may be of interest.
     132 - '''ovs-ofctl''' [[BR]]
     133 The switch host configured by the given rspec listens for incoming OpenFlow connections on localhost port 6634.
     134 You can use this to query the switch state using the ''ovs-ofctl'' command. In particular, you may find the ''dump-tables'' and ''dump-flows'' subcommands useful. For example, ''sudo ovs-ofctl dump-flows tcp:127.0.0.1:6634'' will output lines that look like this:
     135 {{{
     136cookie=0x4, duration=6112.717s, table=0, n packets=1, n bytes=74, idle age=78,priority=5,tcp,
     137nw src=10.10.10.0/24 actions=CONTROLLER:65535
     138 }}}
     139 This indicates that any TCP segment with source IP in the 10.10.10.0/24 subnet should be sent to the OpenFlow controller for processing, that it has been 78 seconds since such a segment was last seen, that one such segment has been seen so far, and the total number of bytes in packets matching this rule is 74. The other fields are perhaps interesting, but you will probably not need them for debugging. (Unless, of course, you choose to use multiple tables — an exercise in OpenFlow 1.1 functionality left to the reader.)
     140 - '''Unix utilities'''[[BR]]
     141 You will want to use a variety of Unix utilities, in addition to the tools listed in [http://groups.geni.net/geni/wiki/GENIEducation/SampleAssignments/OpenFlowAssignment/ExerciseLayout ExerciseLayout], to test your controllers. The standard ping and ''/usr/sbin/arping'' tools are useful for debugging connectivity (but make sure your controller passes ''ICMP ECHO REQUEST'' and ''REPLY'' packets and ''ARP'' traffic, respectively!), and the command ''netstat -an'' will show all active network connections on a Unix host; the TCP connections of interest in this exercise will be at the top of the listing. The format of netstat output is out of the scope of this tutorial, but information is available online and in the manual pages.
     142 - '''Linux netem''' [[BR]]
     143 Use the ''tc'' command to enable and configure delay and lossrate constraints on the outgoing interfaces for traffic traveling from the OpenFlow switch to the Aggregator node. To configure a path with a 20 ms delay and 10% lossrate on eth2, you would issue the command:
     144{{{
     145sudo tc qdisc add dev eth2 root handle 1:0 netem delay 20ms loss 2%
     146}}}
     147 Use the "tc qdisc change" command to reconfigure existing links,instead of "tc qdisc add". [[BR]]