Changes between Initial Version and Version 1 of GENIExperimenter/Tutorials/SystematicExprCaseStudy/SmallTopo/DesignSetup


Ignore:
Timestamp:
08/13/14 09:55:32 (10 years ago)
Author:
xliu@bbn.com
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GENIExperimenter/Tutorials/SystematicExprCaseStudy/SmallTopo/DesignSetup

    v1 v1  
     1[[PageOutline]]
     2
     3'''[http://groups.geni.net/syseng/wiki/XuanSandbox#ATutorialonSystematicExperimentalDesign A Tutorial on Systematic Experimental Design]'''
     4
     5'''[http://groups.geni.net/syseng/wiki/XuanSandbox/InstallSoftware Step I: Single Node]'''
     6
     7'''[http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo Step II: Small Topology]'''
     8
     9 
     10{{{
     11#!html
     12
     13<div style="text-align:center; width:495px; margin-left:auto; margin-right:auto;">
     14<img id="Image-Maps_5201305222028436" src="http://groups.geni.net/geni/attachment/wiki/GENIExperimenter/Tutorials/Graphics/Setup.jpg?format=raw" usemap="#Image-Maps_5201305222028436" border="0" width="495" height="138" alt="" />
     15<map id="_Image-Maps_5201305222028436" name="Image-Maps_5201305222028436">
     16<area shape="rect" coords="18,18,135,110" href="http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/DesignSetup" alt="" title=""    />
     17<area shape="rect" coords="180,18,297,111" href="http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/Execute" alt="" title=""    />
     18<area shape="rect" coords="344,17,460,110" href="http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/Finish" alt="" title=""    />
     19<area shape="rect" coords="493,136,495,138" href="http://www.image-maps.com/index.php?aff=mapped_users_5201305222028436" alt="Image Map" title="Image Map" />
     20</map>
     21<!-- Image map text links - End - -->
     22
     23</div>
     24}}}
     25
     26
     27
     28= 1. Software Configuration =
     29
     30Once we have installed the software on the VM, we may need to configure the software, and automate the configuration process for every node used in an experiment. For this tutorial, since we are setting a virtual routing environment, we will need to configure the routing protocol (e.g., OSPF protocol) for `XORP`. Again, let's start with the smallest reasonable topology, which is a four-router virtual topology as shown below. The reason that we chose the four-router topology is that we need at least one pair of routers that are not directly connected to each other and each router must have at least two virtual interfaces.
     31
     32[[Image(XuanSandbox/SmallTopo/DesignSetup:4node-config.png)]]
     33
     34
     35== a. Create Virtual Network ==
     36
     37As we have mentioned, a four-router topology is the smallest topology to configure and verify the `OSPF` routing. In this part, we illustrate how to create a virtual network with four virtual routers.
     38
     39=== i. Create VMs and Virtual Links ===
     40
     41Create four VMs from the same InstaGENI aggregate and add the links. Modify each VM's name and load the custom image by following [http://groups.geni.net/syseng/wiki/XuanSandbox/InstallSoftware#a4.LoadInstaGENICustomImage Load Custom Image].
     42
     43[[Image(XuanSandbox/SmallTopo/DesignSetup:4node-topo.png)]]
     44
     45=== ii. Configure Virtual Interfaces ===
     46
     47Configure the virtual interfaces' IP addresses of each link by clicking [[Image(XuanSandbox/SmallTopo/DesignSetup:info.jpg)]] at the link icon.
     48
     49[[Image(XuanSandbox/SmallTopo/DesignSetup:lan-config.png, 50%, nolink)]]
     50
     51
     52After configuring all the links, submit the request at the bottom of your canvas.
     53
     54=== iii. Save the Current RSpec and Submit the Request ===
     55
     56For version control purpose, It is important to save (or export) the user request RSpec at each step. Thus, when all VMs are ready for login, we save a copy of current RSpec as `4node-v1.rspec`.
     57We can do so by clicking the '''View'''  and choosing '''Preview requested document(s)''' from the pull-down list. You will see the RSpec generated by Flack looks like the following:
     58
     59{{{
     60<rspec type="request" generated_by="Flack" generated="2014-08-07T22:23:33Z" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd " xmlns:flack="http://www.protogeni.net/resources/rspec/ext/flack/1" xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.geni.net/resources/rspec/3">
     61  <node client_id="router-2" component_manager_id="urn:publicid:IDN+instageni.stanford.edu+authority+cm" exclusive="false" xmlns:rs="http://www.protogeni.net/resources/rspec/ext/emulab/1">
     62    <rs:vnode name="pcvm3-13" xmlns="http://www.protogeni.net/resources/rspec/ext/emulab/1"/>
     63    <sliver_type name="emulab-xen">
     64      <disk_image url="https://www.instageni.clemson.edu/image_metadata.php?uuid=21a48773-f7cc-11e3-aa57-000000000000"/>
     65    </sliver_type>
     66    <interface client_id="xen:if0">
     67      <ip address="192.168.1.2" netmask="255.255.255.0" type="ipv4"/>
     68      <flack:interface_info addressBound="false" bound="false"/>
     69    </interface>
     70    <interface client_id="xen:if1">
     71      <ip address="192.168.2.1" netmask="255.255.255.0" type="ipv4"/>
     72      <flack:interface_info addressBound="false" bound="false"/>
     73    </interface>
     74    <interface client_id="xen:if2">
     75      <ip address="192.168.5.1" netmask="255.255.255.0" type="ipv4"/>
     76      <flack:interface_info addressBound="false" bound="false"/>
     77    </interface>
     78    <flack:node_info x="422" y="170" unbound="true"/>
     79  </node>
     80}}}
     81
     82
     83Choose '''Save to file''' to export the RSpec. In this tutorial, we assume the file is saved to `4node-v1.rspec`, but you can choose any name as you like.
     84
     85[[Image(XuanSandbox/SmallTopo/DesignSetup:export-to-file.jpg)]]
     86
     87
     88
     89
     90== b. Manually Configure OSPF for XORP ==
     91
     92In this tutorial, we configure each VM as an virtual router running `OSPF` routing protocol.  Examples of `XORP` configurations can be found at [http://www.xorp.org/getting_started.html XORPExamples]. For each VM runs as a software router, the `OSPF` configuration file is named as `ospfd.conf` and stored at `/etc/xorp/`.
     93
     94We first configure `OSPF` on `router-1`. The configuration file can be downloaded from [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/DesignSetup/r1-ospf.conf here].
     95
     96There are several key information we observed by manually creating the `OSPF` configuration file for `router-1`.
     97
     98 * Interface Information
     99{{{
     100interface eth1 {
     101    description: "virtual interface-eth1"
     102    disable: false
     103    discard: false
     104    vif eth1 {
     105        disable: false
     106        address 192.168.4.2 {
     107                 prefix-length: 24
     108                 disable: false
     109        }
     110    }
     111  }
     112interface eth2 {
     113......
     114}
     115}}}
     116
     117 * `OSPF` Metrics
     118{{{
     119protocols {
     120    ospf4 {
     121        router-id: 192.168.1.1
     122        area 0.0.0.0 {
     123            area-type:"normal"
     124            interface eth1 {
     125                vif eth1 {
     126                  address 192.168.4.2 {
     127                    interface-cost 10
     128                    hello-interval 5
     129                    router-dead-interval 10
     130                    disable: false
     131                  }
     132                }
     133            }
     134            interface eth2 {
     135            ......
     136            }
     137      }
     138   }
     139}
     140}}}
     141
     142
     143To simplify the configuration process, we assume the `interface-cost` is 10 and the `hello-interval` for every virtual interface. So the main information we need from each node is the virtual interface's `address` and its `prefix-length`, as well as the router's `router-id` that is required for the `protocol` section in the configuration file.
     144
     145Similarly, we manually create `ospfd.conf` under `/etc/xorp/` for the other three virtual routers (see [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/SmallTopo/DesignSetup/r2-ospf.conf `router-2`],  [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/SmallTopo/DesignSetup/r3-ospf.conf `router-3`], and  [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/SmallTopo/DesignSetup/r4-ospf.conf `router-4`]).
     146
     147
     148
     149== c. Start `XORP` and Verify the Routing ==
     150
     151=== i. Start `XORP` Process ===
     152
     153Start `XORP` by specifying the routing protocol configuration file.
     154
     155{{{
     156xuanliu@router-1:~$ cd /usr/local/xorp/sbin/
     157xuanliu@router-1:/usr/local/xorp/sbin$
     158xuanliu@router-1:/usr/local/xorp/sbin$sudo ./xorp_rtrmgr -b /etc/xorp/ospfd.conf -l /tmp/xorp_rtrmgr_log -d
     159}}}
     160
     161Verify the `XORP` process is running
     162{{{
     163xuanliu@router-1:/usr/local/xorp/sbin$ ps -ef | grep xorp
     164root      1972     1  0 13:30 ?        00:00:02 xorp_fea
     165root      1973     1  0 13:30 ?        00:00:00 xorp_rib
     166root      1974     1  0 13:30 ?        00:00:00 xorp_policy
     167root      1975     1  0 13:30 ?        00:00:01 xorp_ospfv2
     168root      1976     1  0 13:30 ?        00:00:00 ./xorp_rtrmgr -b /etc/xorp/ospfd.conf -l /tmp/xorp_rtrmgr_log -d
     169}}}
     170
     171Note that there is no one-key method to stop `XORP` process, so we have to kill every `XORP`-related process. We can use the command like the one below to kill all `XORP` process at one time.
     172
     173{{{
     174ps -ef | grep xorp_ | /usr/bin/awk '{ if ( $1 == "root" ) {print "sudo kill -9 " $2}}' | sh
     175}}}
     176
     177=== ii. Verify the Routing ===
     178
     179Login to `router-1` and view the `OSPF` routing table:
     180
     181{{{
     182xuanliu@router-1:/usr/local/xorp/sbin$ sudo ./xorpsh
     183Welcome to XORP v1.8.5 on router-1.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu
     184Version tag: 00000000  Build Date: 2014-06-05 17:11 64-bit
     185root@router-1.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu> show route table ipv4 unicast ospf
     186192.168.2.0/24  [ospf(110)/20]
     187                > to 192.168.1.2 via eth2/eth2
     188192.168.3.0/24  [ospf(110)/20]
     189                > to 192.168.4.1 via eth1/eth1
     190192.168.5.0/24  [ospf(110)/20]
     191                > to 192.168.1.2 via eth2/eth2
     192}}}
     193
     194
     195Login to `router-3` and view the `OSPF` routing table:
     196{{{
     197xuanliu@router-3:/usr/local/xorp/sbin$ sudo ./xorpsh
     198Welcome to XORP v1.8.5 on router-3.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu
     199Version tag: 00000000  Build Date: 2014-06-05 17:11 64-bit
     200root@router-3.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu> show route table ipv4 unicast ospf
     201192.168.1.0/24  [ospf(110)/20]
     202                > to 192.168.2.1 via eth2/eth2
     203192.168.4.0/24  [ospf(110)/20]
     204                > to 192.168.3.1 via eth1/eth1
     205192.168.5.0/24  [ospf(110)/20]
     206                > to 192.168.2.1 via eth2/eth2
     207root@router-3.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu>
     208}}}
     209
     210Since `router-1` and `router-3` are not directly connected, by `OSPF` routing, we should be able to run `ping` and `traceroute` between them.
     211
     212{{{
     213xuanliu@router-3:/usr/local/xorp/sbin$ ping 192.168.1.1
     214PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
     21564 bytes from 192.168.1.1: icmp_req=1 ttl=63 time=2.15 ms
     21664 bytes from 192.168.1.1: icmp_req=2 ttl=63 time=1.45 ms
     21764 bytes from 192.168.1.1: icmp_req=3 ttl=63 time=1.41 ms
     218^C
     219--- 192.168.1.1 ping statistics ---
     2203 packets transmitted, 3 received, 0% packet loss, time 2003ms
     221rtt min/avg/max/mdev = 1.411/1.673/2.152/0.342 ms
     222xuanliu@router-3:/usr/local/xorp/sbin$ traceroute 192.168.1.1
     223traceroute to 192.168.1.1 (192.168.1.1), 30 hops max, 60 byte packets
     224 1  router-2-lan1 (192.168.2.1)  0.652 ms  0.595 ms  0.563 ms
     225 2  router-1-lan0 (192.168.1.1)  1.146 ms  1.106 ms  1.076 ms
     226xuanliu@router-3:/usr/local/xorp/sbin$
     227}}}
     228
     229== d. Automate `OSPF` Configuration ==
     230
     231By understanding the syntax of the `OSPF` configuration file for `XORP`, we are able to automate the `OSPF` configuration for every virtual router in a topology, assuming these virtual routers are identical. You can download the automation scripts from [http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_autostart.tar.gz XORPAutoStart].
     232
     233=== i. Test the Automation ===
     234
     235To test it, you will need to login to each router (e.g., `router-3`) and run the `start-xorp.sh`. You will see the output similar to the following:
     236
     237{{{
     238dhcp89-69-127:~ xliu$ ssh -p 30781  -i /Users/xliu/.ssh/id_rsa xuanliu@pc3.instageni.stanford.edu
     239Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-56-generic x86_64)
     240
     241 * Documentation:  https://help.ubuntu.com/
     242Last login: Mon Jun 30 14:56:51 2014 from 128.89.69.127
     243xuanliu@router-3:~$ cd /local
     244xuanliu@router-3:/local$ wget http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_autostart.tar.gz
     245xuanliu@router-3:/local$ tar -zxvf xorp_autostart.tar.gz
     246xuanliu@router-3:/local/xorp_autostart$ /bin/bash start-xorp.sh
     247router-3.xuan-wiki-prep.ch-geni-net.instageni.stanford.edu
     2482014-07-01 06:56:28 AM
     249XORP dir exist
     250xorp is already added to the group
     251xorp is running, stop it first
     252XORP is starting ......
     253Not doing pidfile...
     254}}}
     255
     256The key procedure is to obtain the virtual interface's `address` and its `prefix` of the subnet information.
     257
     258In the install script `start-xorp.sh`, the Following components are the key parts to generate `ospfd.conf`.
     259
     260 * Get Hostname and virtual interface information, and store it into a file (`vm_info.txt`)
     261{{{
     262hostname | sudo tee vm_info.txt > /dev/null
     263/sbin/ifconfig | egrep 'eth|inet addr' | sudo tee -a vm_info.txt > /dev/null
     264}}} 
     265  A sample `vm_info.txt` is available at [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/DesignSetup/vm_info.txt.example SampleVMInfo]
     266
     267 * Create `ospfd.conf` by running an `awk` script, available from [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/SmallTopo/DesignSetup/ospfd-conf-gen.awk here]
     268{{{
     269sudo /usr/bin/awk -f $ABS_PATH/ospfd-conf-gen.awk $vm_info_file "$timestamp" 24 | sudo tee $ABS_PATH/ospfd.conf > /dev/null
     270}}}
     271  A sample `ospfd.conf` is available at [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/DesignSetup/ospfd.conf.example SampleOSPFConf]
     272 
     273 * Start `XORP` Process
     274{{{
     275$sudo ./xorp_rtrmgr -b /etc/xorp/ospfd.conf -l /tmp/xorp_rtrmgr_log -d
     276}}}
     277 
     278The complete shell script to wrap up the above procedures is available at [http://groups.geni.net/syseng/attachment/wiki/XuanSandbox/DesignSetup/start-xorp.sh StartXORP]
     279
     280
     281{{{
     282#!html
     283<table id="Table_01" border="0" cellpadding="5" cellspacing="0">
     284        <tr>
     285                <td>
     286                        <img src="http://trac.gpolab.bbn.com/gcf/raw-attachment/wiki/Graphics/4NotesIcon_512x512.png" width="50" height="50" alt="Note">
     287               </td>
     288<td>
     289Please go to [http://groups.geni.net/geni/wiki/HowTo/WriteInstallScript HOWTOWriteInstallScript] for details on how to write an install script.
     290<br/>
     291<i>
     292
     293</i>
     294</td>
     295        </tr>
     296</table>
     297}}}
     298
     299Next we are going to install the automate script as an install script at the postboot stage.
     300
     301{{{
     302#!html
     303<table border="0" cellpadding="0" cellspacing="0"><tr><td><img src="http://groups.geni.net/geni/attachment/wiki/GENIExperimenter/Tutorials/Graphics/warning-icon-hi.png?format=raw" width='50' height='50'/></td><td>If you plan to use the same slice to do the next step, please delete your existing resources in your slice at this time, otherwise you can create a new slice to continue.</td></tr></table>
     304  </li>
     305</ol>
     306</td>
     307</tr>
     308</table>
     309}}}
     310
     311== e. Install Script ==
     312
     313Launch Flack for your slice, and import the RSpec `4node-v1.rspec` we just saved.
     314
     315Click '''Import''' and select '''Import from file''' from the pull-down list, then select `4node-v1.rspec` from the location where you have just saved to, and confirm it. You will see the four-node topology on your canvas, and each node has been configured to have the custom image.
     316
     317[[Image(XuanSandbox/SmallTopo/DesignSetup:import-rspec-from-file.png)]]
     318
     319Now, we are ready to add an install script by editing the node property. For each node, click [[Image(XuanSandbox/SmallTopo/DesignSetup:info.jpg)]] to see the node information. By clicking [[Image(XuanSandbox/SmallTopo/DesignSetup:add-service-btn.png)]], we are able to add a service that usually refers to an install script. In this tutorial, we will enter the link ''http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_autostart.tar.gz'', and the install path is set as ''/local''. By clicking [[Image(XuanSandbox/SmallTopo/DesignSetup:add-exe-serv-btn.png)]], we can add the commend that execute the install script.
     320
     321[[Image(XuanSandbox/SmallTopo/DesignSetup:node-install-service.png)]]
     322
     323Once we added the service and the execute service in Flack, apply the changes and submit the VM reservation request, the OSPF configuration file will be automatically created and the XORP will be started at each virtual router once it is initialized. Setting up the install script will automate installation or configuration process at every node's postboot stage, and we do not need to login to every node to run `start-xorp.sh` manually.
     324
     325= 2. Impact to Request RSpec =
     326
     327Whenever we make a change to node information or link information in Flack, the user request RSpec is modified accordingly. In other words, we can rely on Flack to easily modify the request RSpec.
     328
     329Now let's take a look at how the steps [http://groups.geni.net/syseng/wiki/XuanSandbox/InstallSoftware#a4.LoadInstaGENICustomImage Load a Custom Image] and [http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/DesignSetup#e.PostbootScript Adding Install Scripts] will modify the request RSpec. For instance, before adding the custom image and install scripts, the RSpec describing `router-1` was like:
     330
     331{{{
     332<node client_id="router-1" component_manager_id="urn:publicid:IDN+instageni.stanford.edu+authority+cm" component_id="urn:publicid:IDN+instageni.stanford.edu+node+pc3" component_name="pc3" exclusive="false">
     333    <vnode name="pcvm3-3" xmlns="http://www.protogeni.net/resources/rspec/ext/emulab/1"/>
     334    <location latitude="37.43" longitude="-122.17" country="US"/>
     335    <interface client_id="xen-0:if0">
     336      <ip address="192.168.1.1" netmask="255.255.255.0" type="ipv4"/>
     337      <flack:interface_info addressBound="true" bound="false"/>
     338    </interface>
     339    <interface client_id="xen-0:if1">
     340      <ip address="192.168.4.2" netmask="255.255.255.0" type="ipv4"/>
     341      <flack:interface_info addressBound="true" bound="false"/>
     342    </interface>
     343    <flack:node_info x="150" y="407" unbound="true"/>
     344  </node>
     345}}}
     346
     347First, when we added the custom image (see [http://groups.geni.net/syseng/wiki/XuanSandbox/InstallSoftware#a4.LoadInstaGENICustomImage Load a Custom Image]), a new tag `<sliver>` will be added to `router-1`'s RSpec, which is
     348
     349{{{
     350  <sliver_type name="emulab-xen">
     351      <disk_image url="https://www.instageni.clemson.edu/image_metadata.php?uuid=21a48773-f7cc-11e3-aa57-00000000000"/>
     352  </sliver_type>
     353}}}
     354
     355
     356Secondly, when we added the install scripts (see [http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/DesignSetup#e.PostbootScript Adding Install Scripts]), a new tag `<service>` will be added to `router-1`'s RSpec, which is
     357{{{
     358   <services>
     359      <execute command="/bin/bash /local/xorp_autostart/start-xorp.sh" shell="sh"/>
     360      <install install_path="/local" url="http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_autostart.tar.gz"/>
     361   </services>
     362}}}
     363
     364This indicates that we can add custom image and postboot scripts by directly modifying the request RSpec, this is helpful when we have a larger topology.
     365
     366'''Save''' the RSpec as `4node-v2.rspec` at this stage, we will load this RSpec in the next step to get the same setup.
     367
     368
     369= 3. Script to Capture Routing Table Periodically =
     370
     371
     372In this tutorial, one metric we would like to evaluate is how often the routing table will be updated when there is a link/node failure. To emulate a link failure, we can disable the virtual interfaces, and to emulate a virtual router failure, we can stop the XORP process at the virtual router. A short script (downloaded from [http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_run.tar.gz here] is available to be loaded as an install script.
     373
     374Delete any existing resources or create a new slice, '''LOAD''' the RSpec `4node-v2.rspec`, and add a new install service to every node in Flack. Now, the service portion for each node becomes to
     375{{{
     376    <services>
     377      <execute command="/bin/bash /local/xorp_autostart/start-xorp.sh" shell="sh"/>
     378      <install install_path="/local" url="http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_autostart.tar.gz"/>
     379      <install install_path="/local" url="http://geni-myvini.umkc.gpeni.net/resources/experiments/xorp_run.tar.gz"/>
     380    </services>
     381}}}
     382
     383After adding the new install script to every node, send the resource reservation request. When all nodes are ready to login,  we save the new modified RSpec as `4node-v3.rspec`.
     384
     385In the next step, we will add two end hosts to current four-node topology, so now we can delete existing resources from the current slice.
     386
     387= 4. Add End Hosts and Install `iperf` =
     388
     389
     390
     391Once we have verified the routing functions for the virtual router, we add end hosts to validate the end-to-end communication.  As the figure shows below, we create the same four-node topology by loading `4node-v3.rspec` in Flack, and create two more VMs as a client and a server, and add two virtual links.  For client and server,  we select regular `Ubuntu 12.04` OS in the node information, so we need to install `iperf` separately. We can also write a script to install `iperf` to the client and server, and the script can be loaded as an install script.
     392
     393The install scripts for client and server can be downloaded from [http://geni-myvini.umkc.gpeni.net/resources/experiments/install_script/ here].
     394
     395[[Image(XuanSandbox/SmallTopo/DesignSetup:4node-add-endhosts.png)]]
     396
     397'''SAVE''' the new RSpec to `4node-v4.rspec`.
     398
     399
     400
     401'''[http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo Small Topology: Introduction]'''
     402
     403'''[http://groups.geni.net/syseng/wiki/XuanSandbox/SmallTopo/Execute Small Topology: Execute]'''