omf_ec 6.0.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Rakefile +7 -0
  4. data/bin/omf_test +161 -0
  5. data/config/ec.yml +164 -0
  6. data/exp_repo/system/exp/eventlib.rb +96 -0
  7. data/exp_repo/system/exp/imageNode.rb +283 -0
  8. data/exp_repo/system/exp/reset.rb +21 -0
  9. data/exp_repo/system/exp/saveNode.rb +99 -0
  10. data/exp_repo/system/exp/stat.rb +49 -0
  11. data/exp_repo/system/exp/stdlib.rb +122 -0
  12. data/exp_repo/system/exp/tell.rb +53 -0
  13. data/exp_repo/system/exp/testlib.rb +12 -0
  14. data/exp_repo/system/exp/winlib.rb +154 -0
  15. data/exp_repo/system/topo/active.rb +9 -0
  16. data/exp_repo/system/topo/all.rb +10 -0
  17. data/exp_repo/system/topo/circle.rb +23 -0
  18. data/exp_repo/test/app/aodvd.rb +73 -0
  19. data/exp_repo/test/app/appDef1.rb +102 -0
  20. data/exp_repo/test/app/athstats.rb +76 -0
  21. data/exp_repo/test/app/echo.rb +36 -0
  22. data/exp_repo/test/app/gennyReceiverAppDef.rb +100 -0
  23. data/exp_repo/test/app/gennySenderAppDef.rb +106 -0
  24. data/exp_repo/test/app/itgdec.rb +79 -0
  25. data/exp_repo/test/app/itgr.rb +77 -0
  26. data/exp_repo/test/app/itgs.rb +105 -0
  27. data/exp_repo/test/app/nop.rb +36 -0
  28. data/exp_repo/test/app/otg2.rb +68 -0
  29. data/exp_repo/test/app/otg2_mp.rb +56 -0
  30. data/exp_repo/test/app/otr2.rb +56 -0
  31. data/exp_repo/test/app/otr2_mp.rb +51 -0
  32. data/exp_repo/test/app/trace_oml2.rb +62 -0
  33. data/exp_repo/test/app/wlanconfig_oml2.rb +42 -0
  34. data/exp_repo/test/exp/conf-room-demo.rb +118 -0
  35. data/exp_repo/test/exp/planetlab.rb +82 -0
  36. data/exp_repo/test/exp/test01.rb +42 -0
  37. data/exp_repo/test/exp/test02.rb +60 -0
  38. data/exp_repo/test/exp/test03.rb +95 -0
  39. data/exp_repo/test/exp/test04.rb +105 -0
  40. data/exp_repo/test/exp/test05.rb +87 -0
  41. data/exp_repo/test/exp/test06.rb +71 -0
  42. data/exp_repo/test/exp/tutorial/hello-world-wired.rb +79 -0
  43. data/exp_repo/test/exp/tutorial/hello-world-wireless.rb +87 -0
  44. data/exp_repo/test/exp/tutorial/using-filters.rb +69 -0
  45. data/exp_repo/test/exp/tutorial/using-groups.rb +64 -0
  46. data/exp_repo/test/exp/tutorial/using-properties.rb +93 -0
  47. data/exp_repo/test/exp/tutorial/using-prototypes.rb +111 -0
  48. data/exp_repo/test/proto/aodvrouter.rb +55 -0
  49. data/exp_repo/test/proto/driverqueryapp.rb +59 -0
  50. data/exp_repo/test/proto/forwarder.rb +73 -0
  51. data/exp_repo/test/proto/itgcbrsender.rb +70 -0
  52. data/exp_repo/test/proto/itgdecoder.rb +64 -0
  53. data/exp_repo/test/proto/itgreceiver.rb +55 -0
  54. data/exp_repo/test/proto/itgvoipsender.rb +64 -0
  55. data/exp_repo/test/proto/listener2.rb +62 -0
  56. data/exp_repo/test/proto/nop.rb +47 -0
  57. data/exp_repo/test/proto/probelink.rb +48 -0
  58. data/exp_repo/test/proto/raw_receiver.rb +64 -0
  59. data/exp_repo/test/proto/receiver2_mp.rb +48 -0
  60. data/exp_repo/test/proto/sender2_mp.rb +54 -0
  61. data/exp_repo/test/proto/udp_receiver.rb +55 -0
  62. data/exp_repo/test/proto/udp_sender.rb +61 -0
  63. data/lib/omf_ec/version.rb +3 -0
  64. data/lib/omf_ec.rb +5 -0
  65. data/omf_ec.gemspec +24 -0
  66. metadata +145 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in omf_ec.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'rake/testtask'
2
+ require "bundler/gem_tasks"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/**/*_spec.rb"
6
+ t.verbose = true
7
+ end
data/bin/omf_test ADDED
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+ require 'omf_common'
5
+ $stdout.sync = true
6
+
7
+ options = {
8
+ dsl: 'xmpp_blather',
9
+ pubsub_host: 'pubsub',
10
+ }
11
+
12
+ executable_name = File.basename($PROGRAM_NAME)
13
+
14
+ option_parser = OptionParser.new do |opts|
15
+ opts.banner = "usage: #{executable_name} [options]"
16
+
17
+ opts.on("-u USER", "Username") do |user|
18
+ options[:user] = user
19
+ end
20
+
21
+ opts.on("-p PASSWORD", "Password") do |password|
22
+ options[:password] = password
23
+ end
24
+
25
+ opts.on("-s SERVER", "XMPP server") do |server|
26
+ options[:server] = server
27
+ end
28
+
29
+ opts.on("-n NODE", "PubSub node to subscribe") do |node|
30
+ options[:uid] = node
31
+ end
32
+
33
+ opts.on("-d", "--debug", "Debug mode") do
34
+ options[:debug] = true
35
+ end
36
+ end
37
+
38
+ begin
39
+ option_parser.parse!
40
+ rescue => e
41
+ puts e.message
42
+ puts ""
43
+ puts option_parser.help
44
+ exit(1)
45
+ end
46
+
47
+ unless options[:server] && options[:user] && options[:server]
48
+ puts option_parser.help
49
+ exit(1)
50
+ end
51
+
52
+ Logging.logger.root.level = :debug if options[:debug]
53
+ Blather.logger = logger
54
+
55
+ comm = OmfCommon::Comm.new(options[:dsl])
56
+ host = nil
57
+
58
+ # Create a resource of type mock
59
+ create_msg = OmfCommon::Message.create { |v| v.property('type', 'mock') }.sign
60
+
61
+ create_wifi_msg = OmfCommon::Message.create do |v|
62
+ v.property('hrn', 'wlan0')
63
+ v.property('type', 'wifi')
64
+ end.sign
65
+
66
+ # A request message to be sent to mock
67
+ request_mock_property = OmfCommon::Message.request do |v|
68
+ v.property('available_properties')
69
+ v.property('kernel_version')
70
+ v.property('resource_proxy_list')
71
+ v.property('resource_utility_list')
72
+ v.property('bob')
73
+ end.sign
74
+
75
+ request_wifi_property = OmfCommon::Message.request do |v|
76
+ v.property('link')
77
+ v.property('available_properties')
78
+ end.sign
79
+
80
+ # A request message to be sent to node
81
+ request_node_property = OmfCommon::Message.request do |v|
82
+ v.property('available_properties')
83
+ v.property('proxies')
84
+ end
85
+
86
+ # A configure message to be sent to mock
87
+ configure_mock_property = OmfCommon::Message.configure do |v|
88
+ v.property('hrn', 'human_readable_name')
89
+ end.sign
90
+
91
+ # Simple release message
92
+ release_message = OmfCommon::Message.release.sign
93
+
94
+ # For simplicity, use comm instance directly
95
+ comm.when_ready do
96
+ logger.info "CONNECTED: #{comm.jid.inspect}"
97
+ host = "#{options[:pubsub_host]}.#{comm.jid.domain}"
98
+
99
+ # We assume the node where RC runs started already
100
+ comm.subscribe(options[:uid], host) do |e|
101
+ if e.error?
102
+ comm.disconnect(host)
103
+ else
104
+ # Publish the create message to RC's pubsub node
105
+ comm.publish(options[:uid], request_node_property, host)
106
+ comm.publish(options[:uid], create_wifi_msg, host)
107
+ end
108
+ end
109
+ end
110
+
111
+ # Fired when messages published to the nodes I subscribed to
112
+ comm.node_event do |e|
113
+ e.items.each do |item|
114
+ begin
115
+ # Parse the message (pubsub item payload)
116
+ message = OmfCommon::Message.parse(item.payload)
117
+ context_id = message.read_content("context_id")
118
+
119
+ # We are only interested in inform messages for the moment
120
+ if message.operation == :inform
121
+ inform_type = message.read_content("inform_type")
122
+
123
+ case inform_type
124
+ when 'CREATED'
125
+ resource_id = message.read_content("resource_id")
126
+ logger.info "Resource #{resource_id} created"
127
+
128
+ comm.subscribe(resource_id, host) do |m|
129
+ EM.add_periodic_timer(2) do
130
+ comm.publish(resource_id, request_wifi_property, host)
131
+ #comm.publish(resource_id, request_mock_property, host)
132
+ #comm.publish(resource_id, configure_mock_property, host)
133
+ end
134
+ end
135
+
136
+ when 'STATUS'
137
+ message.read_element("//property").each do |p|
138
+ logger.info "#{p.attr('key')} => #{p.content.strip}"
139
+ end
140
+ when 'RELEASED'
141
+ logger.info "Resource #{message.read_content("resource_id")} released"
142
+ when 'FAILED'
143
+ logger.error message.read_content("error_message")
144
+ end
145
+ end
146
+ rescue => e
147
+ logger.error "#{e.message}\n#{e.backtrace.join("\n")}"
148
+ end
149
+ end
150
+ end
151
+
152
+ trap(:INT) { comm.disconnect(host) }
153
+ trap(:TERM) { comm.disconnect(host) }
154
+
155
+ EM.run do
156
+ comm.connect(options[:user], options[:password], options[:server])
157
+
158
+ EM.add_timer(5) do
159
+ comm.publish(options[:uid], release_message, host)
160
+ end
161
+ end
data/config/ec.yml ADDED
@@ -0,0 +1,164 @@
1
+ #
2
+ # Copyright (c) 2006-2009 National ICT Australia (NICTA), Australia
3
+ #
4
+ # Copyright (c) 2004-2009 WINLAB, Rutgers University, USA
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+ #
24
+ #
25
+ # This is the config file for the OMF Experiment Controller
26
+ #
27
+ # NOTE: use only 'spaces' to indent !
28
+ # ('tab' indents are not supported by the ruby yaml parser, which is used to
29
+ # read this file)
30
+ #
31
+ ---
32
+ :econtroller:
33
+
34
+ :config:
35
+
36
+ # Config Parameter for the "default" profile
37
+ # IMPORTANT: There has to be a default entry. It should contain a complete
38
+ # set of parameters, so other profiles can fall back to it
39
+ :default:
40
+
41
+ # This is the domain name of the testbed
42
+ # You need a corresponding entry in the testbed table of your inventory
43
+ # that has this name set in the 'node_domain' column
44
+ :domain: 'norbit'
45
+ :slice: 'default_slice'
46
+
47
+ # This is the Path where EC should look for its repository of built-in
48
+ # experiments (e.g. example experiments, maintenance experiments, etc...)
49
+ :repository:
50
+ :path: ["../share/repository", "/usr/share/omf-expctl-5.4/repository"]
51
+
52
+ # URI to the OML server to use for this EC
53
+ # (can be overwritten on the EC command line)
54
+ :omluri: 'tcp:norbit.npc.nicta.com.au:3003'
55
+
56
+ # This should be the IP address of the local interface that is accessible
57
+ # from the nodes. This address will be given to the nodes so they can
58
+ # retrieve applications from the EC via HTTP.
59
+ :web:
60
+ :host: '10.0.0.200'
61
+ :resource_dir: ["../../omf-common/share/htdocs", "/usr/share/omf-common-5.4/share/htdocs"]
62
+
63
+ :communicator:
64
+
65
+ # set this to false if you want to disable signature checks and message signing
66
+ :authenticate_messages: false
67
+ # your RSA/DSA SSH private key file
68
+ :private_key: '~/.ssh/id_rsa'
69
+ # directory holding the public keys of your OMF peers
70
+ :public_key_dir: '~/.omf-expctl/peer_keys'
71
+
72
+ :type: 'xmpp'
73
+ :xmpp:
74
+ # Address of the server to use as gateway for PubSub communication
75
+ :pubsub_gateway: 'norbit.npc.nicta.com.au'
76
+ #:pubsub_port: 5222
77
+ # The 'pubsub_domain' is the hostname of the pubsub server on which
78
+ # you would like to host your slice's communications. Leave this
79
+ # commented if you wish to host them on the 'pubsub_gateway' server
80
+ # which you selected above.
81
+ #:pubsub_domain: 'norbit.npc.nicta.com.au'
82
+ # The following 'pubsub_user' and 'pubsub_pwd' are optional
83
+ # EC will create a unique user/pwd for itself if this is not provided
84
+ # In a typical OMF install, you should not uncomment these lines
85
+ # (do so only if you need to manually set user/password for
86
+ # your client to connect to your pubsub server)
87
+ #:pubsub_user: 'my_EC_name'
88
+ #:pubsub_pwd: 'my_EC_password'
89
+ # set this to "true" if you have a DNS SRV record pointing to the
90
+ # real pubsub server hostname
91
+ :pubsub_use_dnssrv: false
92
+
93
+ # AM contact details. By default, the AM is contacted through the EC's XMPP
94
+ # connection as specified in the ':communicator:' section above. In this
95
+ # ':services:' section, you can specify additional AM contact details.
96
+ # Supported protocols are XMPP and HTTP for legacy services.
97
+ :services:
98
+ -
99
+ :type: :http
100
+ :uri: 'http://norbit.npc.nicta.com.au:5054'
101
+ # -
102
+ # :type: :xmpp
103
+ # :uri: 'norbit.npc.nicta.com.au'
104
+ # :user: 'joe'
105
+ # :password: 'fluffy'
106
+
107
+
108
+ ##########################
109
+ # config parameters for the "p2p" profile
110
+ :p2p:
111
+ :domain: 'planetlab'
112
+ :repository:
113
+ :path: [".", "../share/repository", "/usr/share/omf-expctl-5.4/repository"]
114
+ :inventory:
115
+ :url: 'http://planetlab-europe-07.ipv6.lip6.fr:5054/inventory'
116
+ # :web:
117
+ # :host: 'your_hostname_or_ip_here'
118
+ :result:
119
+ :url: 'http://planetlab-europe-07.ipv6.lip6.fr:5054/result/'
120
+ :communicator:
121
+ :type: 'xmpp'
122
+ :xmpp:
123
+ :server: planetlab-europe-07.ipv6.lip6.fr
124
+ :password: '123'
125
+ ####
126
+ :planetlab:
127
+ :domain: 'planetlab'
128
+ :slice: 'ost_securexmpp'
129
+ :repository:
130
+ :path: ["../share/repository", "/usr/share/omf-expctl-5.4/repository"]
131
+ :inventory:
132
+ :url: 'http://mytestbed.net:5054/inventory'
133
+
134
+ :web:
135
+ :host: '10.0.0.200'
136
+ :resource_dir: ["../../omf-common/share/htdocs", "/usr/share/omf-common-5.4/share/htdocs"]
137
+
138
+ :communicator:
139
+
140
+ :authenticate_messages: true
141
+ :private_key: '~/.ssh/id_rsa'
142
+ :public_key_dir: '~/.omf-expctl/peer_keys'
143
+
144
+ :type: 'xmpp'
145
+ :xmpp:
146
+ :pubsub_gateway: 'mytestbed.net'
147
+
148
+ ##########################
149
+ # config parameters for the "p2p" profile
150
+ #
151
+ # To use this testbed, call EC with the option PRINT_ONLY or "-d debug"
152
+ # Any parameter settings within this section will override the settings
153
+ # done in the "default" section. The EC first loads the "default"
154
+ # settings, then it uses the "debug" specific settings to override the
155
+ # relevant parameters
156
+ :debug:
157
+ :repository:
158
+ :path: ['.', '../share/repository']
159
+ :communicator:
160
+ :type: 'mock'
161
+ :log: '../etc/omf-expctl/debug_log.xml'
162
+ :inventory:
163
+ :url: 'http://norbit.npc.nicta.com.au:5054/inventory'
164
+
@@ -0,0 +1,96 @@
1
+ #
2
+ # Copyright (c) 2006-2010 National ICT Australia (NICTA), Australia
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ #
23
+ # = eventlib.rb
24
+ #
25
+ # == Description
26
+ #
27
+ # This Ruby file contains various common Event declarations, which the EC will
28
+ # load before the user's experiment file
29
+ #
30
+
31
+ #
32
+ # This provide some default Event definition that the user may use in his
33
+ # experiment, without having to worry about how to define them.
34
+ # To start one of the event monitoring defined here, the user need to associate
35
+ # at least one block of tasks to it, using the onEvent() OEDL call.
36
+ # See the OEDL documentation for more info and a tutorial
37
+ #
38
+
39
+ defEvent(:ALL_UP_AND_INSTALLED) do |event|
40
+ node_status = allGroups.state("status/@value")
41
+ app_status = allGroups.state("apps/app/status/@value")
42
+ if allEqual(node_status, "UP") && allEqual(app_status, "INSTALLED.OK")
43
+ event.fire
44
+ end
45
+ end
46
+
47
+ defEvent(:ALL_UP) do |event|
48
+ node_status = allGroups.state("status/@value")
49
+ event.fire if allEqual(node_status, "UP")
50
+ end
51
+
52
+ defEvent(:ALL_INTERFACE_UP) do |event|
53
+ iface_status = allGroups.state("net/*/*/current/@status")
54
+ #info "TDEBUG - #{if_status.join(" ")}"
55
+ event.fire if allEqual(iface_status, "CONFIGURED.OK")
56
+ end
57
+
58
+ defEvent(:EXPERIMENT_DONE) do |event|
59
+ exp_status = Experiment.state("status/text()")
60
+ event.fire if allEqual(exp_status, "DONE")
61
+ end
62
+
63
+ onEvent(:EXPERIMENT_DONE, true) do |event|
64
+ Experiment.close
65
+ end
66
+
67
+ defEvent(:INTERRUPT, 1) do |event|
68
+ exp_status = Experiment.state("status/text()")
69
+ event.fire if allEqual(exp_status, "INTERRUPTED")
70
+ end
71
+
72
+ onEvent(:INTERRUPT) do |event|
73
+ MObject.info(:INTERRUPT, "\n\nUser issued an Interruption. Stopping the experiment now! Please wait...\n")
74
+ Experiment.done
75
+ end
76
+
77
+ defEvent(:NO_USER_DEFINED_EVENTS) do |event|
78
+ if Experiment.running? && !Experiment.disconnection_allowed?
79
+ if Event.empty?(:ignore => [:EXPERIMENT_DONE, :NO_USER_DEFINED_EVENTS])
80
+ event.fire
81
+ end
82
+ end
83
+ end
84
+
85
+ onEvent(:NO_USER_DEFINED_EVENTS) do |event|
86
+ warn " "
87
+ warn "Warning!!! Your experiment has no user-defined events!"
88
+ warn "It is likely that nothing will happen from now one..."
89
+ warn "Press CTRL-C only ONCE to stop your experiment.\n"
90
+ # An alternative... not sure what is the best here, for now use the above
91
+ # warn "Closing down your experiment now..."
92
+ # Experiment.done
93
+ end
94
+
95
+
96
+