= GENI Network Stitching Example = This page uses gcf 2.4 preview 7 to show an example experiment that creates a network stitching path between the GPO InstaGENI and the Utah InstaGENI racks. [[Image(IG-GPO-IG-Utah.jpg)]] The experiment uses [http://groups.geni.net/geni/wiki/GeniClearinghouse GENI Clearinghouse] credentials with the new Omni tool named ''stitcher.py''. GENI network stitching does not require any special configuration. If you haven't already configured Omni, please follow [http://trac.gpolab.bbn.com/gcf/wiki/OmniConfigure/Automatic these configuration instructions]. If you need further assistance, please contact [mailto:help@geni.net]. == 1. Design the Stitching Experiment == {{{ #!html Design/Setup }}} At this time, GENI network stitching is supported by several aggregates. This example shows a simple stitching scenario with one server VM in the GPO InstaGENI rack and one client VM in the Utah InstaGENI rack. The server-gpo host is configured as a Web, Iperf and !PingPlus server; it also has a routable IP address that is used to access the web server and display results for all traffic types. We define an RSpec with 2 nodes and one link between them. The link ''' ''must'' ''' specify the 2 aggregates that are the endpoints of the link. The tools will do the rest of the work required to stitch the topology. This is the request RSpec used for this experiment: {{{ }}} In the above RSpec, ''stitcher.py'' uses the link information in the ''component_manager name'' to contact the GENI Stitching Computation Service (SCS) and determine a path between the end-point hosts. == 2. Execute the Stitching experiment == {{{ #!html Execute }}} We now use ''stitcher.py'' to set up a stitched topology between the two nodes. - ''Stitcher.py'' simplifies experiment set-up because it creates slivers at all aggregates, including the network stitching path. - ''Stitcher.py'' determines all your experiment compute resource aggregates from your RSpec. (You no longer need to enter “-a aggregateName”.) - ''Stitcher.py'' uses the MAX Stitching Computation Service (SCS) to determine VLAN paths needed for your experiment. - VLANs are a scarce commodity, and failures can happen. ''Stitcher.py'' will retry if it fails to create a sliver at an aggregate. We first create a slice for this experiment: {{{ $ omni.py createslice gpo2utah 13:23:22 INFO omni: Loading config file /home/lnevers/.gcf/omni_config 13:23:22 INFO omni: Using control framework portal 13:23:23 INFO omni: Created slice with Name gpo2utah, URN urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah, Expiration 2013-07-25 14:41:19 13:23:23 INFO omni: ------------------------------------------------------------ 13:23:23 INFO omni: Completed createslice: Options as run: framework: portal project: ln-prj Args: createslice gpo2utah Result Summary: Created slice with Name gpo2utah, URN urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah, Expiration 2013-07-25 14:41:19 13:23:23 INFO omni: ============================================================ }}} Next, we create all necessary slivers using ''stitcher.py''. (Remember there is no need to specify the ''-a'' aggregate option.) The ''stitcher.py'' tool records the aggregates associated with the slice in a file that it creates in the directory where you run the tool. We type this command: {{{ $ stitcher.py createsliver gpo2utah stitch-ig-gpo-ig-utah.rspec -o 13:25:59 INFO stitcher: Loading config file /home/lnevers/.gcf/omni_config 13:25:59 INFO stitcher: Using control framework portal 13:25:59 INFO stitcher: Checking that slice gpo2utah is valid... <==(1) 13:26:00 INFO stitcher: Slice urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah expires on 2013-07-25 14:41:19 UTC 13:26:00 INFO stitcher: speaks AM API v3, but sticking with v2 <==(2) 13:26:00 INFO stitcher: speaks AM API v3, but sticking with v2 <==(2) 13:26:00 INFO stitcher: speaks AM API v3, but sticking with v2 <==(2) 13:26:00 INFO stitch.Aggregate: Writing to '/tmp/gpo2utah-createsliver-request-11-instageni-gpolab-bbn-com.xml' <==(3) 13:26:00 INFO stitch.Aggregate: Stitcher doing createsliver at https://boss.instageni.gpolab.bbn.com:12369/protogeni/xmlrpc/am <==(4) 13:26:16 INFO stitch.Aggregate: Allocation at complete. 13:26:16 INFO stitch.Aggregate: Writing to '/tmp/gpo2utah-createsliver-request-11-emulab-net.xml' <==(3) 13:26:16 INFO stitch.Aggregate: Stitcher doing createsliver at https://www.emulab.net:12369/protogeni/xmlrpc/am <==(4) 13:26:58 INFO stitch.Aggregate: Allocation at complete. 13:26:58 INFO stitch.Aggregate: Writing to '/tmp/gpo2utah-createsliver-request-11-utah-geniracks-net.xml' <==(3) 13:26:58 INFO stitch.Aggregate: Stitcher doing createsliver at https://boss.utah.geniracks.net:12369/protogeni/xmlrpc/am <==(4) 13:27:17 INFO stitch.Aggregate: Allocation at complete. 13:27:17 INFO stitch.Aggregate: Writing to '/tmp/gpo2utah-createsliver-request-11-ion-internet2-edu.xml' <==(3) 13:27:17 INFO stitch.Aggregate: Stitcher doing createsliver at http://geni-am.net.internet2.edu:12346 <==(4) 13:28:02 INFO stitch.Aggregate: DCN AM : must wait for status ready.... 13:28:02 INFO stitch.Aggregate: Pause to let circuit become ready... <==(5) 13:28:39 INFO stitch.Aggregate: DCN circuit 23221 is ready 13:28:45 INFO stitch.Aggregate: Allocation at complete. 13:28:45 INFO stitch.launcher: All aggregates are complete. 13:28:45 INFO stitcher: Writing to 'gpo2utah-manifest-rspec-stitching-combined.xml' 13:28:45 INFO stitcher: Saved combined reservation RSpec at 4 AMs to file gpo2utah-manifest-rspec-stitching-combined.xml <==(6) Stitching success: Reserved resources in slice gpo2utah at 4 Aggregates (including 2 intermediate aggregate(s) not in the original request), creating 1 link(s). }}} (1) ''Sticher.py'' gets the experimenter's slice credentials to make sure the named slice if valid. It also runs rspeclint on the ''stitch-ig-gpo-ig-utah.rspec '' file, if rspeclint is found in your search path. [[BR]] (2) ''Sticher.py'' contacts the Stitching Computation Service (SCS) and returns the list of AMs that are needed to establish the stitching path, including the Internet2/ION aggregate.[[BR]] (3) ''Stitcher.py'' generates a request RSpec for each of the aggregates in the path to request both network and compute resources. [[BR]] (4) ''Stitcher.py'' creates slivers at each aggregate (path & end-points) [[BR]] (5) The request to Internet2/ION waits for DCN circuits to be created. If this request fails, ''stitcher.py'' will try again after 600 seconds. [[BR]] (6) A combined manifest Rspec is assembled by ''stitcher.py'' to show all aggregates and VLANs used in the slice. The above stitched scenario sliver creation accomplishes several steps that previously required manual set-up: - Switch configuration at rack endpoints - Static circuit configuration to reach ION in the aggregate - ION/OSCARS creation of a dynamic circuit with VLAN translation - A static connection over UEN - A routed connection across PG Utah - A dynamic circuit and then a fixed circuit to Utah InstaGENI. The combined manifest [http://groups.geni.net/geni/attachment/wiki/GENIExperimenter/ExperimentExample-stitching/gpo2utah-manifest-rspec-stitching-combined.xml gpo2utah-manifest-rspec-stitching-combined.xml] is attached. Also, the overall information about allocated resources that can be found in the file are shown here: [[Image(IG-GPO-IG-Utah-tags.jpg)]] Below is part of the ig-gpo-ig-utah-manifest-rspec-stitching-combined.xml file showing the stitching manifest that includes all hops along the stitched VLAN path: {{{ ion.internet2.edu-23221 2013-07-25T14:41:19.000Z 2013-07-18T17:28:32.833Z 10 100000 l2sc ethernet 9000 3748 3748 false 2 10 100000 l2sc ethernet 9000 973 973 false 5 10 100000 l2sc ethernet 9000 973 973 false 6 10 100000 l2sc ethernet 9000 973 973 false null }}} In the stitching definition: - is for the GPO InstaGENI switch (procurve2:5.24) and uses VLAN 3748. - is for PG Utah switch that connects PG Utah to ION (procurve-pgeni-atla:3.21) and uses VLAN 973 - is for the Utah PG switch that connects to Utah IG (procurveA:3.19) and uses VLAN 973 - is for the Utah InstaGENI switch (procurve2:1.19) and uses VLAN 973 At this point the experiment has been set up, and you may determine the login information at each compute aggregate: {{{ $ readyToLogin.py gpo2utah -a ig-gpo ... server-gpo's geni_status is: ready (am_status:ready) User lnevers logs in to server-gpo using: ssh -i /home/lnevers/.ssh/geni_cert_portal_key lnevers@pcvm2-9.instageni.gpolab.bbn.com $ readyToLogin.py gpo2utah -a ig-utah client-utah's geni_status is: ready (am_status:ready) User lnevers logs in to client-utah using: ssh -p 30010 -i /home/lnevers/.ssh/geni_cert_portal_key lnevers@pc1.utah.geniracks.net }}} We will use the ''server-gpo'' login to determine the routable IP address that was requested for the Web Server: {{{ $ ssh -i /home/lnevers/.ssh/geni_cert_portal_key lnevers@pcvm2-9.instageni.gpolab.bbn.com [lnevers@server-gpo ~]$ /sbin/ifconfig eth999 Link encap:Ethernet HWaddr 02:95:5A:60:81:53 inet addr:192.1.242.150 Bcast:192.1.242.255 Mask:255.255.255.128 <==(a) UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:17401 errors:0 dropped:0 overruns:0 frame:0 TX packets:11652 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:25455837 (24.2 MiB) TX bytes:649907 (634.6 KiB) eth3748 Link encap:Ethernet HWaddr 02:01:C4:83:9D:2B inet addr:192.168.4.1 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:57977 errors:0 dropped:0 overruns:0 frame:0 TX packets:32719 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:83362299 (79.5 MiB) TX bytes:1785072 (1.7 MiB) }}} (a) publically routable IP address is 192.1.242.150 We can now connect to the web server to verify that iperf tests were run and that the client completed wget operations: [[Image(web-server.jpg)]] [[BR]] Select the ''' ''Web Server Statistics'' ''' link, and verify that wget was sucessfull for images: [[Image(web-server-stats.jpg)]] [[BR]] Next, select the ''' ''Iperf Server Logs'' ''' link to verify that the iperf test completed: [[Image(web-server-iperf.jpg)]] Before starting the !PingPlus portion of the experiment, verify that no information existing for !PingPlus by selecting the link ''' ''Layer 2 !PingPlus Statistics'' '''. Now we start the Layer 2 !PingPlus experiment, by logging into ''client-utah,'' determining its dataplane MAC address and then shutting down IP on that interface: {{{ $ ssh -p 30010 -i /home/lnevers/.ssh/geni_cert_portal_key lnevers@pc1.utah.geniracks.net [lnevers@client-utah ~]$ /sbin/ifconfig eth973 Link encap:Ethernet HWaddr 02:B6:06:CF:92:79 inet addr:192.168.4.2 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:32745 errors:0 dropped:0 overruns:0 frame:0 TX packets:58027 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1761582 (1.6 MiB) TX bytes:83465168 (79.5 MiB) eth999 Link encap:Ethernet HWaddr 02:C0:05:4F:14:5E inet addr:172.17.1.1 Bcast:172.31.255.255 Mask:255.240.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16505 errors:0 dropped:0 overruns:0 frame:0 TX packets:8041 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:22910002 (21.8 MiB) TX bytes:431936 (421.8 KiB) [lnevers@client-utah ~]$ sudo /sbin/ifconfig eth973 0 [lnevers@client-utah ~]$ }}} Now on the server, shutdown IP on the dataplane interface and run Layer 2 !PingPLus: {{{ [lnevers@server-gpo ~]$ sudo /sbin/ifconfig eth3748 0 [lnevers@server-gpo ~]$ sudo /local/scripts/runPingPlus.sh 02:B6:06:CF:92:79 eth3748 [lnevers@server-gpo ~]$ }}} Now, we go back to the web server and select the ''' ''Layer 2 !PingPlus Statistics'' ''' link. You will find new statistics: [[Image(web-server-pingplus.jpg)]] We have now completed the experiment. == 3. Finish the Stitching Experiment == {{{ #!html Finish }}} Now that the experiment is completed, we release all resources: {{{ $ stitcher.py deletesliver gpo2utah 14:06:49 INFO stitcher: Loading config file /home/lnevers/.gcf/omni_config 14:06:49 INFO stitcher: Using control framework portal 14:06:49 INFO stitcher: Reading stitching slice gpo2utah aggregates from file ch\.geni\.net.ln-prj.gpo2utah-amlist.txt 14:06:49 INFO stitcher: Adding aggregate option https://boss.utah.geniracks.net:12369/protogeni/xmlrpc/am (urn:publicid:IDN+utah.geniracks.net+authority+cm) 14:06:49 INFO stitcher: Adding aggregate option https://boss.instageni.gpolab.bbn.com:12369/protogeni/xmlrpc/am (urn:publicid:IDN+instageni.gpolab.bbn.com+authority+cm) 14:06:49 INFO stitcher: Adding aggregate option https://www.emulab.net:12369/protogeni/xmlrpc/am (urn:publicid:IDN+emulab.net+authority+cm) 14:06:49 INFO stitcher: Adding aggregate option http://geni-am.net.internet2.edu:12346 (urn:publicid:IDN+ion.internet2.edu+authority+am) 14:06:49 INFO omni: Loading config file /home/lnevers/.gcf/omni_config 14:06:49 INFO omni: Using control framework portal 14:06:50 INFO omni: Slice urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah expires on 2013-07-25 14:41:19 UTC 14:07:42 INFO omni: (PG log url - look here for details on any failures: https://boss.utah.geniracks.net/spewlogfile.php3?logfile=e3d387c4d5ad58f9b889a2c7790b0ed0) 14:07:42 INFO omni: Deleted sliver urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah on unspecified_AM_URN at https://boss.utah.geniracks.net:12369/protogeni/xmlrpc/am 14:09:20 INFO omni: (PG log url - look here for details on any failures: https://www.emulab.net/spewlogfile.php3?logfile=1bb4c8c04af55227d54b5e21419ccdd3) 14:09:20 INFO omni: Deleted sliver urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah on unspecified_AM_URN++ at https://www.emulab.net:12369/protogeni/xmlrpc/am 14:09:25 INFO omni: Deleted sliver urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah on unspecified_AM_URN+++ at http://geni-am.net.internet2.edu:12346 14:10:21 INFO omni: (PG log url - look here for details on any failures: https://boss.instageni.gpolab.bbn.com/spewlogfile.php3?logfile=65c7e0135a681d30e9f4ac46c088a5d8) 14:10:21 INFO omni: Deleted sliver urn:publicid:IDN+ch.geni.net:ln-prj+slice+gpo2utah on unspecified_AM_URN+ at https://boss.instageni.gpolab.bbn.com:12369/protogeni/xmlrpc/am Deleted slivers on 4 out of a possible 4 aggregates $ }}} Stitcher.py uses the files '' ch\.geni\.net.ln-prj.gpo2utah-amlist.txt'' which has the AM list associated with the slice. Note, that is this file does not exist in the current working directory, stitcher.py will try to delete the sliver at all know aggregates, but you will still have to delete the sliver manually at the Internet2/ION aggregate (http://geni-am.net.internet2.edu:12346). Now the sliver has been deleted and compute and network resources are released at all aggregates. == Additional Stitching Scenarios == Additional stitching scenarios have been tested and some example request RSpecs can be used as a reference at this [http://groups.geni.net/geni/browser/trunk/stitch-examples location]: - stitch-pg-utah-ig-utah.rspec - Utah PG to Utah InstaGENI - stitch-ig-gpo-pg-uky.rspec - GPO InstaGENI to UKY PG - stitch-eg-gpo-ig-utah.rspec - GPO ExoGENI to Utah InstaGENI - stitch-ig-gpo-pg-utah.rspec - GPO IG to Utah PG - stitch-pg-uky-ig-utah.rspec - UKY PG to Utah InstaGENI - stitch-pg-utah-pg-uky.rspec - Utah PG to UKY PG - stitch-max-ig-utah.rspec - MAX MyPLC to Utah InstaGENI - stitch-pg-utah-ig-gpo.rspec - Utah PG to Utah InstaGENI - stitch-3linear.rspec - 3 node linear topology (Utah IG <=> Utah PG <=> GPO IG) - stitch-4linear.rspec - 4 node linear topology (Utah IG <=> Utah PG <=> GPO IG <=> MAX MyPLC) - stitch-triangle.rspec - triangle topology (Utah PG<=>Utah KY<=> GPO IG <==> Utah PG) If additional help is needed please contact [mailto:help@geni.net].