wiki:GIMIv1.1Tutorial/Orchestrate

Version 26 (modified by zink@cs.umass.edu, 7 years ago) (diff)

--

C. Orchestrate/Run Experiment

Image Map

C.1 Initial Setup

C.1.1 Starting the OML Server (if needed)

For this tutorial we have an OML server running on emmy9.casa.umass.edu, which collects the measurement data in an sqlite3 database and at the end of the experiment it pushes the data to IRODS.

  • Here is how you would have to start an OML server if you wanted to run this on a different machine (OML2.8 is required.) DO NOT perform this task in the tutorial.

This is explained the [OML installation file].

$ /usr/bin/oml2-server -l 3003 --logfile=/var/log/oml2-server-2.9.log --user=oml2 --group=oml2 -H /usr/share/oml2-server/oml2-server-hook.sh

The latest version of OML offers the capability of executing a script after the measurement has finished. In OML terminology this is called a "hook". The hook script we use is attached at the bottom of this wiki page (oml2-server-hook.sh).

List and explain final hook script here!

C.1.2 Verification of Topology

After establishing the slice on which the experiment will be executed, the experimenter will be most likely be interested in verifying if the slice has been initiated correctly. In this tutorial, we use an http://emmy9.casa.umass.edu:/GEC15-GIMI-Tutorial/ping_all.rb OMF experiment script that executes pings between neighboring nodes.

defProperty('source1', "nodeA", "ID of a resource")
defProperty('source2', "nodeB", "ID of a resource")
defProperty('source3', "nodeC", "ID of a resource")
defProperty('source4', "nodeD", "ID of a resource")
defProperty('source5', "nodeE", "ID of a resource")

#defProperty('sink1', "nodeA", "ID of a sink")
#defProperty('sink2', "nodeB", "ID of a sink")
#defProperty('sink3', "nodeC", "ID of a sink")
#defProperty('sink4', "nodeD", "ID of a sink")
#defProperty('sink5', "nodeE", "ID of a sink")

defProperty('sinkaddr11', '192.168.4.10', "Ping destination address")
defProperty('sinkaddr12', '192.168.5.12', "Ping destination address")

defProperty('sinkaddr21', '192.168.4.11', "Ping destination address")
defProperty('sinkaddr22', '192.168.2.12', "Ping destination address")
defProperty('sinkaddr23', '192.168.1.13', "Ping destination address")

defProperty('sinkaddr31', '192.168.5.11', "Ping destination address")
defProperty('sinkaddr32', '192.168.2.10', "Ping destination address")
defProperty('sinkaddr33', '192.168.3.13', "Ping destination address")
defProperty('sinkaddr34', '192.168.6.14', "Ping destination address")

defProperty('sinkaddr41', '192.168.1.10', "Ping destination address")
defProperty('sinkaddr42', '192.168.3.12', "Ping destination address")

defProperty('sinkaddr51', '192.168.6.12', "Ping destination address")

defApplication('ping_app', 'pingmonitor') do |a|
    a.path = "/root/pingWrap.rb" 
    a.version(1, 2, 0)
    a.shortDescription = "Wrapper around ping" 
    a.description = "ping application"
    a.defProperty('dest_addr', 'Address to ping', '-a', {:type => :string, :dynamic => false})
    a.defProperty('count', 'Number of times to ping', '-c', {:type => :integer, :dynamic => false}) 
    a.defProperty('interval', 'Interval between pings in s', '-i', {:type => :integer, :dynamic => false})

    a.defMeasurement('myping') do |m|
     m.defMetric('dest_addr',:string) 
     m.defMetric('ttl',:int)
     m.defMetric('rtt',:float)
     m.defMetric('rtt_unit',:string)
   end
end

defGroup('Source1', property.source1) do |node|
  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr11)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr12)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end
end

defGroup('Source2', property.source2) do |node|
  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr21)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr22)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr23)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end
end

defGroup('Source3', property.source3) do |node|
  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr31)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr32)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr33)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr34)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end
end

defGroup('Source4', property.source4) do |node|

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr41)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end

  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr42)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end
end

defGroup('Source5', property.source5) do |node|
  node.addApplication("ping_app") do |app|
    app.setProperty('dest_addr', property.sinkaddr51)
    app.setProperty('count', 30)
    app.setProperty('interval', 1)
    app.measure('myping', :samples => 1)
  end
end

onEvent(:ALL_UP_AND_INSTALLED) do |event|
  info "Starting the ping"
  allGroups.startApplications
  wait 5
  info "Stopping the ping"
  allGroups.stopApplications
  Experiment.done
end

The script is executed from the user workspace as follows:

$ cd ~/Tutorials/GIMI/common/
$ omf-5.4 exec --no-am -S gimiXX ping_all.rb

Where gimiXX has to be replaced by the slice name you are using for your experiment.

C.1.3 Setup Routing in Experiment Topology

In 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/routing.rb OMF experiment script. The one we use for this tutorial is shown below.

defGroup('Node1', "nodeA")
defGroup('Node2', "nodeB")
defGroup('Node3', "nodeC")
defGroup('Node4', "nodeD")
defGroup('Node5', "nodeE")


onEvent(:ALL_UP) do |event|
  wait 1
  info 'Changing routing setup'

  group('Node1').exec("route add -net 192.168.1.0/24 gw 192.168.4.10")
  group('Node1').exec("route add -net 192.168.2.0/24 gw 192.168.4.10")
  group('Node1').exec("route add -net 192.168.3.0/24 gw 192.168.5.12")
  group('Node1').exec("route add -net 192.168.6.0/24 gw 192.168.5.12")
  group('Node1').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")

  group('Node2').exec("route add -net 192.168.3.0/24 gw 192.168.1.13")
  group('Node2').exec("route add -net 192.168.5.0/24 gw 192.168.4.11")
  group('Node2').exec("route add -net 192.168.6.0/24 gw 192.168.2.12")
  group('Node2').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")

  group('Node3').exec("route add -net 192.168.1.0/24 gw 192.168.3.13")
  group('Node3').exec("route add -net 192.168.4.0/24 gw 192.168.5.11")
  group('Node3').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")

  group('Node4').exec("route add -net 192.168.2.0/24 gw 192.168.3.12")
  group('Node4').exec("route add -net 192.168.4.0/24 gw 192.168.1.10")
  group('Node4').exec("route add -net 192.168.5.0/24 gw 192.168.3.12")
  group('Node4').exec("route add -net 192.168.6.0/24 gw 192.168.3.12")
  group('Node4').exec("echo 1 >  /proc/sys/net/ipv4/ip_forward")

  group('Node5').exec("route add -net 192.168.2.0/24 gw 192.168.6.12")
  group('Node5').exec("route add -net 192.168.1.0/24 gw 192.168.6.12")
  group('Node5').exec("route add -net 192.168.3.0/24 gw 192.168.6.12")
  group('Node5').exec("route add -net 192.168.4.0/24 gw 192.168.6.12")
  group('Node5').exec("route add -net 192.168.5.0/24 gw 192.168.6.12")

  info 'Routing setup finished'
  wait 5
  info 'Stopping applications'
  allGroups.stopApplications
  wait 1
  Experiment.done
end

This script can be easily adapted if the experimenter wishes to set up the routing between the nodes differently.

The script is executed from the user workspace as follows:

$ cd ~/Tutorials/GIMI/common/
$ omf-5.4 exec --no-am -S gimiXX routing.rb

Where gimiXX has to be replaced by the slice name you are using for your experiment.


C.1.4 Running Actual Experiment


4) Run and orchestrate I&M services and experiment services to complete run of experiment

4.1) Initial setup: start basic host measurements and basic ping active network measurements

  • objectives:
    • verify functionality of hosts
    • verify topology of slice
  • observe measurements with a real-time presentation service

  • continue measurements throughout duration of the test/tutorial/experiment

  • at completion:
    • functionality of hosts and topology of slice has been verified throughout duration of the experiment

4.2) Continuity test: for a limited time, run iperf active network measurements

  • objectives:
    • verify ability of slice to carry traffic expected from experiment
  • observe measurements with a real-time presentation service

  • once satisfactory measurements have been observed, stop continuity test

  • at completion:
    • capability of slice to carry traffic expected from experiment has been verified

4.3) Instrument and run experiment:

  • objectives:
    • gather measurements during experiment that allow experiment goals to be met

  • include desired measurement points within hosts and/or experiment services to instrument test/tutorial/experiment

  • begin to run and orchestrate measurement services

  • begin to run and orchestrate experiment services

  • observe measurements with a real-time presentation service, to verify expected operation of experiment

  • collect all measurements for duration of experiment

  • stop experiment services, when this run of the experiment has been completed

  • stop measurement services

  • at completion:
    • one run of experiment has been completed
    • real-time look at measurements has verfied expected operation of experiment
    • a full set of measurements has been collected, for later analysis and presentation
    • collected measurments have been transfered to storage service, so that slice resources can be released (if desired)

4.4) Store collected measurements and other artifacts from test/tutorial/experiment in storage service

  • at completion:
    • collected measurements and other artifacts have been transfered to storage service
    • collected measurements and other artifacts are available for later analysis
    • slice resources can then be released at any time, without loss of any measurements or artifacts



http://groups.geni.net/geni/wiki/GIMIv1.1Tutorial/Slice Back to previous step

http://groups.geni.net/geni/wiki/GIMIv1.1Tutorial/Observe Forward to next step

http://groups.geni.net/geni/wiki/GIMIv1.1Tutorial/ Back to tutorial main page

Attachments (5)

Download all attachments as: .zip