omf_ec 6.0.0.pre.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+