Changes between Initial Version and Version 1 of GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Execute


Ignore:
Timestamp:
10/23/13 12:02:35 (11 years ago)
Author:
divyashri.bhat@gmail.com
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Execute

    v1 v1  
     1= Execute =
     2
     3{{{
     4#!html
     5
     6<div style="text-align:center; width:495px; margin-left:auto; margin-right:auto;">
     7<img id="Image-Maps_5201305222028436" src="http://groups.geni.net/geni/attachment/wiki/GENIExperimenter/Tutorials/Graphics/Execute.jpg?format=raw" usemap="#Image-Maps_5201305222028436" border="0" width="495" height="138" alt="" />
     8<map id="_Image-Maps_5201305222028436" name="Image-Maps_5201305222028436">
     9<area shape="rect" coords="18,18,135,110" href="http://groups.geni.net/geni/wiki/GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/DesignSetup" alt="" title=""    />
     10<area shape="rect" coords="180,18,297,111" href="http://groups.geni.net/geni/wiki/GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Execute" alt="" title=""    />
     11<area shape="rect" coords="344,17,460,110" href="http://groups.geni.net/geni/wiki/GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Finish" alt="" title=""    />
     12<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" />
     13</map>
     14<!-- Image map text links - End - -->
     15
     16</div>
     17}}}
     18
     19== 3. Initial Setup ==
     20
     21=== 3.1 Starting the OML Server (if needed) ===
     22
     23For this tutorial, you can skip this step. The OML Server is already running on [http://emmy9.casa.umass.edu Emmy9].[[BR]]
     24
     25
     26At the [http://groups.geni.net/geni/wiki/GEC17Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Execute/OmlServer following page] we give the interested experimenter additional information on how they can run their own OML server independent of the one offered by GIMI.
     27
     28----
     29
     30
     31=== 3.2 Verification of Topology ===
     32After establishing the slice on which the experiment will be executed, the experimenter will be most likely
     33be interested in verifying if the slice has been initiated correctly. In this tutorial, we use an [[http://emmy9.casa.umass.edu/GEC15-GIMI-Tutorial/step1-ping_all.rb OMF experiment script]] that executes pings between neighboring nodes.
     34
     35
     36
     37[[BR]]
     38The following figure shows that a total of 12 (between each pair of nodes and in each direction) ping are performed.
     39
     40[[Image(ping.png)]]
     41
     42'''In !LabWiki''' [[BR]]
     43step1-ping_oml.rb
     44
     45[[Image(LabWiki_4.png)]]
     46
     47{{{
     48defProperty('source1', "nodeA", "ID of a resource")
     49defProperty('source2', "nodeB", "ID of a resource")
     50defProperty('source3', "nodeC", "ID of a resource")
     51defProperty('source4', "nodeD", "ID of a resource")
     52defProperty('source5', "nodeE", "ID of a resource")
     53
     54#defProperty('sink1', "nodeA", "ID of a sink")
     55#defProperty('sink2', "nodeB", "ID of a sink")
     56#defProperty('sink3', "nodeC", "ID of a sink")
     57#defProperty('sink4', "nodeD", "ID of a sink")
     58#defProperty('sink5', "nodeE", "ID of a sink")
     59
     60defProperty('sinkaddr11', '192.168.4.10', "Ping destination address")
     61defProperty('sinkaddr12', '192.168.5.12', "Ping destination address")
     62
     63defProperty('sinkaddr21', '192.168.4.11', "Ping destination address")
     64defProperty('sinkaddr22', '192.168.2.12', "Ping destination address")
     65defProperty('sinkaddr23', '192.168.1.13', "Ping destination address")
     66
     67defProperty('sinkaddr31', '192.168.5.11', "Ping destination address")
     68defProperty('sinkaddr32', '192.168.2.10', "Ping destination address")
     69defProperty('sinkaddr33', '192.168.3.13', "Ping destination address")
     70defProperty('sinkaddr34', '192.168.6.14', "Ping destination address")
     71
     72defProperty('sinkaddr41', '192.168.1.10', "Ping destination address")
     73defProperty('sinkaddr42', '192.168.3.12', "Ping destination address")
     74
     75defProperty('sinkaddr51', '192.168.6.12', "Ping destination address")
     76
     77defApplication('ping_app', 'pingmonitor') do |a|
     78    a.path = "/root/pingWrap.rb"
     79    a.version(1, 2, 0)
     80    a.shortDescription = "Wrapper around ping"
     81    a.description = "ping application"
     82    a.defProperty('dest_addr', 'Address to ping', '-a', {:type => :string, :dynamic => false})
     83    a.defProperty('count', 'Number of times to ping', '-c', {:type => :integer, :dynamic => false})
     84    a.defProperty('interval', 'Interval between pings in s', '-i', {:type => :integer, :dynamic => false})
     85
     86    a.defMeasurement('myping') do |m|
     87     m.defMetric('dest_addr',:string)
     88     m.defMetric('ttl',:int)
     89     m.defMetric('rtt',:float)
     90     m.defMetric('rtt_unit',:string)
     91   end
     92end
     93
     94defGroup('Source1', property.source1) do |node|
     95  node.addApplication("ping_app") do |app|
     96    app.setProperty('dest_addr', property.sinkaddr11)
     97    app.setProperty('count', 30)
     98    app.setProperty('interval', 1)
     99    app.measure('myping', :samples => 1)
     100  end
     101
     102  node.addApplication("ping_app") do |app|
     103    app.setProperty('dest_addr', property.sinkaddr12)
     104    app.setProperty('count', 30)
     105    app.setProperty('interval', 1)
     106    app.measure('myping', :samples => 1)
     107  end
     108end
     109
     110defGroup('Source2', property.source2) do |node|
     111  node.addApplication("ping_app") do |app|
     112    app.setProperty('dest_addr', property.sinkaddr21)
     113    app.setProperty('count', 30)
     114    app.setProperty('interval', 1)
     115    app.measure('myping', :samples => 1)
     116  end
     117
     118  node.addApplication("ping_app") do |app|
     119    app.setProperty('dest_addr', property.sinkaddr22)
     120    app.setProperty('count', 30)
     121    app.setProperty('interval', 1)
     122    app.measure('myping', :samples => 1)
     123  end
     124
     125  node.addApplication("ping_app") do |app|
     126    app.setProperty('dest_addr', property.sinkaddr23)
     127    app.setProperty('count', 30)
     128    app.setProperty('interval', 1)
     129    app.measure('myping', :samples => 1)
     130  end
     131end
     132
     133defGroup('Source3', property.source3) do |node|
     134  node.addApplication("ping_app") do |app|
     135    app.setProperty('dest_addr', property.sinkaddr31)
     136    app.setProperty('count', 30)
     137    app.setProperty('interval', 1)
     138    app.measure('myping', :samples => 1)
     139  end
     140
     141  node.addApplication("ping_app") do |app|
     142    app.setProperty('dest_addr', property.sinkaddr32)
     143    app.setProperty('count', 30)
     144    app.setProperty('interval', 1)
     145    app.measure('myping', :samples => 1)
     146  end
     147
     148  node.addApplication("ping_app") do |app|
     149    app.setProperty('dest_addr', property.sinkaddr33)
     150    app.setProperty('count', 30)
     151    app.setProperty('interval', 1)
     152    app.measure('myping', :samples => 1)
     153  end
     154
     155  node.addApplication("ping_app") do |app|
     156    app.setProperty('dest_addr', property.sinkaddr34)
     157    app.setProperty('count', 30)
     158    app.setProperty('interval', 1)
     159    app.measure('myping', :samples => 1)
     160  end
     161end
     162
     163defGroup('Source4', property.source4) do |node|
     164
     165  node.addApplication("ping_app") do |app|
     166    app.setProperty('dest_addr', property.sinkaddr41)
     167    app.setProperty('count', 30)
     168    app.setProperty('interval', 1)
     169    app.measure('myping', :samples => 1)
     170  end
     171
     172  node.addApplication("ping_app") do |app|
     173    app.setProperty('dest_addr', property.sinkaddr42)
     174    app.setProperty('count', 30)
     175    app.setProperty('interval', 1)
     176    app.measure('myping', :samples => 1)
     177  end
     178end
     179
     180defGroup('Source5', property.source5) do |node|
     181  node.addApplication("ping_app") do |app|
     182    app.setProperty('dest_addr', property.sinkaddr51)
     183    app.setProperty('count', 30)
     184    app.setProperty('interval', 1)
     185    app.measure('myping', :samples => 1)
     186  end
     187end
     188
     189onEvent(:ALL_UP_AND_INSTALLED) do |event|
     190  info "Starting the ping"
     191  allGroups.startApplications
     192  wait 5
     193  info "Stopping the ping"
     194  allGroups.stopApplications
     195  Experiment.done
     196end
     197}}}
     198
     199=== 3.3 Setup Routing in Experiment Topology ===
     200In more complex topologies routing has to be set up. In our case, this is achieved with the aid of an [[http://emmy9.casa.umass.edu/GEC15-GIMI-Tutorial/step2-routing.rb OMF experiment script]]. The one we use for this tutorial is shown below.
     201
     202
     203'''In !LabWiki''' [[BR]]
     204step2-routing.rb
     205
     206{{{
     207defGroup('Node1', "nodeA")
     208defGroup('Node2', "nodeB")
     209defGroup('Node3', "nodeC")
     210defGroup('Node4', "nodeD")
     211defGroup('Node5', "nodeE")
     212
     213
     214onEvent(:ALL_UP) do |event|
     215  wait 1
     216  info 'Changing routing setup'
     217
     218  group('Node1').exec("route add -net 192.168.1.0/24 gw 192.168.4.10")
     219  group('Node1').exec("route add -net 192.168.2.0/24 gw 192.168.4.10")
     220  group('Node1').exec("route add -net 192.168.3.0/24 gw 192.168.5.12")
     221  group('Node1').exec("route add -net 192.168.6.0/24 gw 192.168.5.12")
     222  group('Node1').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")
     223
     224  group('Node2').exec("route add -net 192.168.3.0/24 gw 192.168.1.13")
     225  group('Node2').exec("route add -net 192.168.5.0/24 gw 192.168.4.11")
     226  group('Node2').exec("route add -net 192.168.6.0/24 gw 192.168.2.12")
     227  group('Node2').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")
     228
     229  group('Node3').exec("route add -net 192.168.1.0/24 gw 192.168.3.13")
     230  group('Node3').exec("route add -net 192.168.4.0/24 gw 192.168.5.11")
     231  group('Node3').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")
     232
     233  group('Node4').exec("route add -net 192.168.2.0/24 gw 192.168.3.12")
     234  group('Node4').exec("route add -net 192.168.4.0/24 gw 192.168.1.10")
     235  group('Node4').exec("route add -net 192.168.5.0/24 gw 192.168.3.12")
     236  group('Node4').exec("route add -net 192.168.6.0/24 gw 192.168.3.12")
     237  group('Node4').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")
     238
     239  group('Node5').exec("route add -net 192.168.2.0/24 gw 192.168.6.12")
     240  group('Node5').exec("route add -net 192.168.1.0/24 gw 192.168.6.12")
     241  group('Node5').exec("route add -net 192.168.3.0/24 gw 192.168.6.12")
     242  group('Node5').exec("route add -net 192.168.4.0/24 gw 192.168.6.12")
     243  group('Node5').exec("route add -net 192.168.5.0/24 gw 192.168.6.12")
     244
     245  info 'Routing setup finished'
     246  wait 5
     247  info 'Stopping applications'
     248  allGroups.stopApplications
     249  wait 1
     250  Experiment.done
     251end
     252}}}
     253
     254This script can be easily adapted if the experimenter wishes to set up the routing between the nodes
     255differently.
     256
     257=== 3.4 Verification of Routing ===
     258After establishing the routing, we use an [[http://emmy9.casa.umass.edu/GEC15-GIMI-Tutorial/step3-ping_e2e.rb OMF experiment script]] that executes pings between each pair of nodes that contains one hop, to verify the correctness of routing setup.
     259
     260[[Image(GIMIPing_e2e.png)]]
     261
     262'''In !LabWiki''' [[BR]]
     263step3-ping_e2e.rb
     264
     265{{{
     266defProperty('source1', "nodeA", "ID of a resource")
     267defProperty('source2', "nodeB", "ID of a resource")
     268defProperty('source3', "nodeC", "ID of a resource")
     269defProperty('source4', "nodeD", "ID of a resource")
     270defProperty('source5', "nodeE", "ID of a resource")
     271
     272defProperty('sinkaddr11', '192.168.1.13', "Ping destination address")
     273defProperty('sinkaddr12', '192.168.3.13', "Ping destination address")
     274defProperty('sinkaddr13', '192.168.6.14', "Ping destination address")
     275
     276defProperty('sinkaddr21', '192.168.6.14', "Ping destination address")
     277
     278defProperty('sinkaddr41', '192.168.4.11', "Ping destination address")
     279defProperty('sinkaddr42', '192.168.5.11', "Ping destination address")
     280defProperty('sinkaddr43', '192.168.6.14', "Ping destination address")
     281
     282defProperty('sinkaddr51', '192.168.5.11', "Ping destination address")
     283defProperty('sinkaddr52', '192.168.2.10', "Ping destination address")
     284defProperty('sinkaddr53', '192.168.3.13', "Ping destination address")
     285
     286defApplication('ping_app', 'pingmonitor') do |a|
     287        a.path = "/root/pingWrap.rb"
     288        a.version(1, 2, 0)
     289        a.shortDescription = "Wrapper around ping"
     290        a.description = "ping application"
     291        a.defProperty('dest_addr', 'Address to ping', '-a', {:type => :string, :dynamic => false})
     292        a.defProperty('count', 'Number of times to ping', '-c', {:type => :integer, :dynamic => false})
     293        a.defProperty('interval', 'Interval between pings in s', '-i', {:type => :integer, :dynamic => false})
     294       
     295        a.defMeasurement('myping') do |m|
     296            m.defMetric('dest_addr',:string)
     297            m.defMetric('ttl',:int)
     298            m.defMetric('rtt',:float)
     299            m.defMetric('rtt_unit',:string)
     300        end
     301end
     302
     303defGroup('Source1', property.source1) do |node|
     304      node.addApplication("ping_app") do |app|
     305          app.setProperty('dest_addr', property.sinkaddr11)
     306          app.setProperty('count', 30)
     307          app.setProperty('interval', 1)
     308          app.measure('myping', :samples => 1)
     309      end
     310     
     311      node.addApplication("ping_app") do |app|
     312          app.setProperty('dest_addr', property.sinkaddr12)
     313          app.setProperty('count', 30)
     314          app.setProperty('interval', 1)
     315          app.measure('myping', :samples => 1)
     316      end
     317
     318      node.addApplication("ping_app") do |app|         
     319          app.setProperty('dest_addr', property.sinkaddr13)
     320          app.setProperty('count', 30)             
     321          app.setProperty('interval', 1)                 
     322          app.measure('myping', :samples => 1)
     323      end
     324end
     325
     326defGroup('Source2', property.source1) do |node|
     327    node.addApplication("ping_app") do |app|             
     328        app.setProperty('dest_addr', property.sinkaddr21)       
     329        app.setProperty('count', 30)           
     330        app.setProperty('interval', 1)               
     331        app.measure('myping', :samples => 1)                 
     332    end               
     333end
     334
     335defGroup('Source4', property.source3) do |node|
     336      node.addApplication("ping_app") do |app|
     337          app.setProperty('dest_addr', property.sinkaddr41)
     338          app.setProperty('count', 30)
     339          app.setProperty('interval', 1)
     340          app.measure('myping', :samples => 1)
     341      end
     342
     343      node.addApplication("ping_app") do |app|
     344          app.setProperty('dest_addr', property.sinkaddr42)
     345          app.setProperty('count', 30)
     346          app.setProperty('interval', 1)
     347          app.measure('myping', :samples => 1)
     348      end
     349
     350      node.addApplication("ping_app") do |app|
     351          app.setProperty('dest_addr', property.sinkaddr43)
     352          app.setProperty('count', 30)
     353          app.setProperty('interval', 1)
     354          app.measure('myping', :samples => 1)
     355      end
     356end
     357
     358defGroup('Source5', property.source3) do |node|
     359          node.addApplication("ping_app") do |app|
     360              app.setProperty('dest_addr', property.sinkaddr51)
     361              app.setProperty('count', 30)
     362              app.setProperty('interval', 1)
     363              app.measure('myping', :samples => 1)
     364          end
     365
     366          node.addApplication("ping_app") do |app|
     367              app.setProperty('dest_addr', property.sinkaddr52)
     368              app.setProperty('count', 30)
     369              app.setProperty('interval', 1)
     370              app.measure('myping', :samples => 1)
     371          end
     372
     373          node.addApplication("ping_app") do |app|
     374              app.setProperty('dest_addr', property.sinkaddr53)
     375              app.setProperty('count', 30)
     376              app.setProperty('interval', 1)
     377              app.measure('myping', :samples => 1)
     378          end
     379end
     380
     381onEvent(:ALL_UP_AND_INSTALLED) do |event|
     382      info "Starting the ping"
     383      allGroups.startApplications
     384      wait 5
     385      info "Stopping the ping"
     386      allGroups.stopApplications
     387      Experiment.done
     388end
     389}}}
     390
     391
     392
     393== 4. Running Actual Experiment ==
     394
     395We will use an [[http://emmy9.casa.umass.edu/GEC15-GIMI-Tutorial/step4-otg_nmetrics.rb OMF experiment script]] to execute oml enabled traffic generator and receiver (otg and otr) to simulate network traffic, and use oml enabled nmetrics to measure the system usage (e.g., CUP, memory) and network interface usage on each of the participated ExoGENI nodes.
     396
     397[[Image(otg_nmetrics.png)]]
     398
     399
     400The one we use for this tutorial is shown below.
     401
     402'''In !LabWiki''' [[BR]]
     403step4-otg_nmetrics.rb
     404
     405{{{
     406defProperty('theSender','nodeB','ID of sender node')
     407defProperty('theReceiver1', 'nodeE', "ID of receiver node")
     408defProperty('theReceiver2', 'nodeA', "ID of receiver node")
     409defProperty('theReceiver3', 'nodeD', "ID of receiver node")
     410defProperty('packetsize', 128, "Packet size (byte) from the sender node")
     411defProperty('bitrate', 2048, "Bitrate (bit/s) from the sender node")
     412defProperty('runtime', 40, "Time in second for the experiment is to run")
     413
     414defGroup('Sender',property.theSender) do |node|
     415    options = { 'sample-interval' => 2 }
     416    node.addPrototype("system_monitor", options)
     417    node.addApplication("test:app:otg2") do |app|
     418        app.setProperty('udp:local_host', '192.168.2.10')
     419        app.setProperty('udp:dst_host', '192.168.6.14')
     420        app.setProperty('udp:dst_port', 3000)
     421        app.setProperty('cbr:size', property.packetsize)
     422        app.setProperty('cbr:rate', property.bitrate * 2)
     423        app.measure('udp_out', :samples => 1)
     424    end
     425   
     426    node.addApplication("test:app:otg2") do |app|
     427        app.setProperty('udp:local_host', '192.168.4.10')
     428        app.setProperty('udp:dst_host', '192.168.4.11')
     429        app.setProperty('udp:dst_port', 3000)
     430        app.setProperty('cbr:size', property.packetsize)
     431        app.setProperty('cbr:rate', property.bitrate * 2)
     432        app.measure('udp_out', :samples => 1)
     433    end
     434   
     435    node.addApplication("test:app:otg2") do |app|
     436        app.setProperty('udp:local_host', '192.168.1.10')
     437        app.setProperty('udp:dst_host', '192.168.1.13')
     438        app.setProperty('udp:dst_port', 3000)                                   
     439        app.setProperty('cbr:size', property.packetsize)                                           
     440        app.setProperty('cbr:rate', property.bitrate * 2)                                                   
     441        app.measure('udp_out', :samples => 1)                                                       
     442    end
     443end
     444
     445defGroup('Receiver1',property.theReceiver1) do |node|
     446    options = { 'sample-interval' => 2 }
     447    node.addPrototype("system_monitor", options)
     448
     449    node.addApplication("test:app:otr2") do |app|
     450        app.setProperty('udp:local_host', '192.168.6.14')
     451        app.setProperty('udp:local_port', 3000)
     452        app.measure('udp_in', :samples => 1)
     453    end
     454end
     455
     456defGroup('Receiver2',property.theReceiver2) do |node|
     457    options = { 'sample-interval' => 2 }
     458    node.addPrototype("system_monitor", options)
     459    node.addApplication("test:app:otr2") do |app|
     460        app.setProperty('udp:local_host', '192.168.4.11')
     461        app.setProperty('udp:local_port', 3000)
     462        app.measure('udp_in', :samples => 1)
     463    end
     464end
     465
     466defGroup('Receiver3',property.theReceiver3) do |node|     
     467    options = { 'sample-interval' => 2 }
     468    node.addPrototype("system_monitor", options)
     469    node.addApplication("test:app:otr2") do |app|                   
     470        app.setProperty('udp:local_host', '192.168.1.13')
     471        app.setProperty('udp:local_port', 3000)                               
     472        app.measure('udp_in', :samples => 1)                                   
     473    end
     474end
     475
     476onEvent(:ALL_UP_AND_INSTALLED) do |event|
     477    info "starting"
     478    wait 5
     479    allGroups.exec("ln -s /usr/local/bin/otr2 /usr/bin/otr2")
     480    allGroups.exec("ln -s /usr/local/bin/otg2 /usr/bin/otg2")
     481    allGroups.exec("ln -s /usr/local/bin/oml2-nmetrics /usr/bin/oml2-nmetrics")
     482    allGroups.startApplications
     483    info "All applications started..."
     484    wait property.runtime / 4
     485    property.packetsize = 256
     486    wait property.runtime / 4
     487    property.packetsize = 512
     488    wait property.runtime / 4
     489    property.packetsize = 1024
     490    wait property.runtime / 4
     491    allGroups.stopApplications
     492    info "All applications stopped."
     493    Experiment.done
     494end
     495}}}
     496
     497
     498[[BR]]
     499[[BR]]
     500
     501== 5. !LabWiki ==
     502
     503!LabWiki is a tool which provides a user-friendly interface to visualize your experiment. To know more about !LabWiki please visit [https://github.com/mytestbed/labwiki LabWiki] [[BR]]
     504!LabWiki can be used to Plan, Prepare and Run your Experiment.[[BR]]
     505
     506=== 5.1 Login using OpenID ===
     507
     508If you are logged in to the GENI Portal you will be logged in to !LabWiki automatically when you click Login. [[BR]]
     509
     510'''Otherwise please enter the same username and password you use for the GENI Portal'''[[BR]]
     511
     512There is a link to !LabWiki now available through the GENI Portal or you can click [http://labwiki.casa.umass.edu:4000 here] to use !LabWiki
     513
     514[[Image(Labwiki_OpenID.png)]]
     515
     516
     517'''Figure (1)'''
     518
     519'''Send your information. This allows !LabWiki to use the GENI Portal ID to log you in to !LabWiki.'''[[BR]]
     520[[Image(Labwiki_sendinfo.png)]]
     521
     522
     523'''Figure (2)'''
     524=== 5.2 Plan ===
     525
     526
     527After you have successfully been signed in you will be able to see a screen like the one below. [[BR]]
     528
     529
     530[[Image(Labwiki_1.png)]]
     531
     532'''Figure (3)'''
     533
     534
     535The left column could contain the steps to run the experiment or general information about the experiment.[[BR]] The scripts are written using a simple [http://daringfireball.net/projects/markdown/syntax markdown scripts].
     536
     537
     538[[Image(Labwiki_2.png)]]
     539
     540'''Figure (4)'''
     541
     542=== 5.3 Prepare ===
     543In the Prepare column, you can select the experiment that you want to execute. In this column you will also be able to edit your experiment script.[[BR]]
     544
     545[[Image(Labwiki_4.png)]]
     546
     547'''Figure (5)'''
     548
     549After editing, click on the save icon at the top of the column to save your script. [[BR]]
     550Next, click and drag the icon at the top left corner over to the right column Execute.[[BR]]
     551
     552=== 5.4 Execute ===
     553
     554Here, you can start your experiment and Visualise it. In the name tab, type in the name you wish to give the experiment. Your name should only consist of alphanumeric characters. Only '_' is allowed as a special character.[[BR]]
     555
     556==== 5.4.1 Add a Context ====
     557
     558If you do not want to create a new context, skip this step. [[BR]]
     559
     560At the top-right corner there is a button called 'Add Context'. This allows you to create an Experiment context which can be useful when you want to store related experiments in the same folder with associated metadata. This Context can then be browsed using the iRODs web interface. [[BR]]
     561
     562Give the context a name, as shown below and click on 'Save': [[BR]]
     563
     564[[Image(Labwiki_15.png)]]
     565
     566'''Figure (6)'''
     567
     568
     569==== 5.4.2 Run Experiment ====
     570
     571Give your task a name. Select the Project, Experiment Context and Slice from the drop down menu on the screen.[[BR]]
     572
     573
     574Then scroll towards the bottom of this column and under the tab named Graph, type 'true'.This enables the graph view on your execute column.[[BR]]
     575
     576
     577Once the experiment starts running you will be able to scroll down and view the graph.[[BR]]
     578
     579[[Image(Labwiki_16.png)]]
     580
     581'''Figure (7)'''
     582
     583Click on 'Start Experiment' at the bottom of the screen.
     584
     585[[Image(Labwiki_19.png)]]
     586
     587'''Figure (8)'''
     588
     589After a couple of seconds, you can see the graph at the bottom of the screen.[[BR]]
     590
     591At any point during the run of your experiment, click on Dump at the top of the Execute column to save your experiment data in iRODs.[[BR]]
     592
     593You can click and drag it to the Plan screen just above Figure 1. This will display the graph along with the experiment description. This graph is also dynamic.[[BR]]
     594This allows you to add any comments or details about the experiment results.[[BR]]
     595Similarly, Experiments 2 and 3 can be run using the same procedure. Experiment 2 does not have a graph.[[BR]]
     596
     597[[Image(Labwiki_12.png)]]
     598
     599'''Figure(9)'''
     600
     601Once you have your slice up and running you can visualize any experiment using !LabWiki.
     602
     603==== 5.4.3 View results in iDrop ====
     604
     605Any measurement related data will be stored on iRODs under the folder named with your experiment context. You can use iDrop to download your measurement data in .sql format.
     606
     607[[Image(idrop2.png)]]
     608
     609
     610As you can see on the right pane at the top, there is a button that says "Download". Browse to the desired project, Experiment Context and click on this to save your measurement data to your local system.[[BR]]
     611
     612
     613
     614
     615
     616[http://groups.geni.net/geni/wiki/GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/Finish Next Step: Finish Experiment]
     617
     618[http://groups.geni.net/geni/wiki/GEC18Agenda/GettingStartedWithGENI_III_GIMI/Procedure/DesignSetup Back to Design/Setup]