omf_ec 6.1.9.pre.2 → 6.1.9.pre.3

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4fb7b8aaaec98f0e0002f6bf0acc04ddc7194c0a
4
+ data.tar.gz: 53e1f7bccb0fffde50263c3e1d960346a64ae541
5
+ SHA512:
6
+ metadata.gz: d3cbd93c704afc74f0029a6826f8849308670ed0801a71ee6ce75fbff4b6cd6a4c8bc723a9a5e0d8e022979bfc0f79ff92a6f281a7571f90699afe80312bad9e
7
+ data.tar.gz: 2c0570b792f82fd1db7dc3f24b0de305fcc1a276133f5c0b9be3592edc3019380550e135054f354d9a485f578d66baf2f4ff0fa85deb8f6901ddc7e03a634b65
@@ -19,6 +19,7 @@ module OmfEc
19
19
  v5_style(:defGroup, base)
20
20
  v5_style(:loadOEDL, base)
21
21
  v5_style(:ensureProperty, base)
22
+ v5_style(:defQuery, base)
22
23
  end
23
24
 
24
25
  def v5_style(name, base)
data/lib/omf_ec/dsl.rb CHANGED
@@ -325,5 +325,74 @@ module OmfEc
325
325
  p.name = name
326
326
  block.call(p)
327
327
  end
328
+
329
+ # Define a query for measurements
330
+ # This requires that the EC was started with its JobService related
331
+ # parameters set (e.g. js_url or job_url)
332
+ # The EC contacts the JobService and:
333
+ # 1 - request the creation of a Measurement Point corresponding the query
334
+ # parameter of this function.
335
+ # 2 - read the data generated by that query, and return it.
336
+ #
337
+ # @param query a SQL query
338
+ #
339
+ def def_query(query)
340
+ raise "No valid URL to connect to the Job Service!" if OmfEc.experiment.job_url.nil?
341
+ require 'json'
342
+ require 'net/http'
343
+ begin
344
+ # Create a Measurement Point for that Job item
345
+ unless OmfEc.experiment.job_mps.include?(query)
346
+ mp = { name: "#{Time.now.to_i}", sql: query }
347
+ u = URI.parse(OmfEc.experiment.job_url+'/measurement_points')
348
+ req = Net::HTTP::Post.new(u.path, {'Content-Type' =>'application/json'})
349
+ req.body = JSON.pretty_generate(mp)
350
+ res = Net::HTTP.new(u.host, u.port).start {|http| http.request(req) }
351
+ raise "Could not connect to the service providing measurements\n"+
352
+ "Response #{res.code} #{res.message}:\n#{res.body}" unless res.kind_of? Net::HTTPSuccess
353
+ mp = JSON.parse(res.body)
354
+ raise "No valid URL to connect to the measurement point" if mp['href'].nil?
355
+ OmfEc.experiment.job_mps[query] = mp['href']
356
+ end
357
+ # Read and format data from that Measurement Point
358
+ u = URI.parse(OmfEc.experiment.job_mps[query]+'/data')
359
+ res = Net::HTTP.get(u)
360
+ raise "No valid data from the service providing measurements" if res.nil? || res.empty? || !(res.kind_of? String)
361
+ resjon = JSON.parse(res)
362
+ metrics = resjon['schema'].map { |e| e[0] }
363
+ data = []
364
+ resjon['data'].each do |a|
365
+ row = {}
366
+ a.each_index { |i| row[metrics[i].downcase.to_sym] = a[i] }
367
+ data << row
368
+ end
369
+ return data
370
+ rescue Exception => ex
371
+ error "def_query - #{ex}"
372
+ return nil
373
+ end
374
+ end
375
+
376
+ # Define a query for measurements, using the Sequel Syntax
377
+ # Refer to the def_query method above.
378
+ # In this variant, the query is defined using the Sequel Syntax against a
379
+ # Measurement Stream which must have been previously defined in the OEDl
380
+ # experiment (e.g. app.measure('foo') in a addApplication block)
381
+ #
382
+ # @param ms_name the name of the existing measurement stream on which to run
383
+ # this query
384
+ #
385
+ def ms(ms_name)
386
+ db = Sequel.postgres
387
+ db.instance_variable_set('@server_version', 90105)
388
+ if (table_name = OmfEc.experiment.mp_table_names[ms_name])
389
+ msb = OmfEc::Graph::MSBuilder.new(db[table_name.to_sym])
390
+ else
391
+ warn "Measurement point '#{ms_name}' NOT defined"
392
+ end
393
+ def_query(msb.sql)
394
+ end
395
+
396
+
328
397
  end
329
398
  end
@@ -16,7 +16,7 @@ module OmfEc
16
16
 
17
17
  include MonitorMixin
18
18
 
19
- attr_accessor :name, :sliceID, :oml_uri, :js_url, :app_definitions, :property, :cmdline_properties, :show_graph, :nodes
19
+ attr_accessor :name, :sliceID, :oml_uri, :js_url, :job_url, :job_mps, :app_definitions, :property, :cmdline_properties, :show_graph, :nodes
20
20
  attr_reader :groups, :sub_groups, :state
21
21
 
22
22
  # MP only used for injecting metadata
@@ -41,6 +41,9 @@ module OmfEc
41
41
  @sub_groups ||= []
42
42
  @cmdline_properties ||= Hash.new
43
43
  @show_graph = false
44
+ @js_url = nil
45
+ @job_url = nil
46
+ @job_mps = {}
44
47
  end
45
48
 
46
49
  def property
@@ -198,7 +201,7 @@ module OmfEc
198
201
  def eval_trigger(event)
199
202
  if event[:callbacks] && !event[:callbacks].empty? && event[:trigger].call(@state)
200
203
  # Periodic check event
201
- event[:periodic_timer].cancel if event[:periodic_timer]
204
+ event[:periodic_timer].cancel if event[:periodic_timer] && event[:consume_event]
202
205
 
203
206
  @events.delete(event) if event[:consume_event]
204
207
  event_names = ([event[:name]] + event[:aliases]).join(', ')
@@ -233,6 +236,30 @@ module OmfEc
233
236
  )
234
237
  end
235
238
 
239
+ # If EC is launched with --job-service setup, then it needs to
240
+ # create a job entry for this experiment trial
241
+ # Do nothing if:
242
+ # - a JobService URL has not been provided, i.e. EC runs without needs to contact JS
243
+ # - we already have a Job URL, i.e. the job entry has already been created
244
+ def create_job
245
+ return unless @job_url.nil?
246
+ return if @js_url.nil?
247
+ require 'json'
248
+ require 'net/http'
249
+ begin
250
+ job = { name: self.id }
251
+ u = URI.parse(@js_url+'/jobs')
252
+ req = Net::HTTP::Post.new(u.path, {'Content-Type' =>'application/json'})
253
+ req.body = JSON.pretty_generate(job)
254
+ res = Net::HTTP.new(u.host, u.port).start {|http| http.request(req) }
255
+ raise "Could not create a job for this experiment trial\n"+
256
+ "Response #{res.code} #{res.message}:\n#{res.body}" unless res.kind_of? Net::HTTPSuccess
257
+ job = JSON.parse(res.body)
258
+ raise "No valid URL received for the created job for this experiment trial" if job['href'].nil?
259
+ @job_url = job['href']
260
+ end
261
+ end
262
+
236
263
  # Purely for backward compatibility
237
264
  class << self
238
265
  # Disconnect communicator, try to delete any XMPP affiliations
data/lib/omf_ec/runner.rb CHANGED
@@ -103,9 +103,14 @@ module OmfEc
103
103
  remove_cmd_opts_from_argv("--slice", slice)
104
104
  end
105
105
 
106
- op.on("--job_service URL", "URL to the JobService [optional]") do |url|
106
+ op.on("--job-service URL", "URL to the JobService [optional]") do |url|
107
107
  OmfEc.experiment.js_url = url
108
- remove_cmd_opts_from_argv("--job_service", url)
108
+ remove_cmd_opts_from_argv("--job-service", url)
109
+ end
110
+
111
+ op.on("--job-url URL", "URL to the Job for this experiment trial [optional]") do |url|
112
+ OmfEc.experiment.job_url = url
113
+ remove_cmd_opts_from_argv("--job-url", url)
109
114
  end
110
115
 
111
116
  op.on("--oml_uri URI", "URI for the OML data collection of experiment applications") do |uri|
@@ -287,6 +292,7 @@ module OmfEc
287
292
  OmfEc.experiment.log_metadata("exp_path", @oedl_path)
288
293
  OmfEc.experiment.log_metadata("ec_pid", "#{Process.pid}")
289
294
  OmfEc.experiment.archive_oedl(@oedl_path)
295
+ OmfEc.experiment.create_job
290
296
 
291
297
  begin
292
298
  load @oedl_path
metadata CHANGED
@@ -1,126 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omf_ec
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.9.pre.2
5
- prerelease: 6
4
+ version: 6.1.9.pre.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - NICTA
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-10-08 00:00:00.000000000 Z
11
+ date: 2014-10-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: minitest
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: simplecov
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: pry
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: mocha
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: evented-spec
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: omf_common
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - '='
100
88
  - !ruby/object:Gem::Version
101
- version: 6.1.9.pre.2
89
+ version: 6.1.9.pre.3
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - '='
108
95
  - !ruby/object:Gem::Version
109
- version: 6.1.9.pre.2
96
+ version: 6.1.9.pre.3
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: sequel
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  description: Experiment controller of OMF, a generic framework for controlling and
@@ -186,26 +171,34 @@ files:
186
171
  homepage: http://omf.mytestbed.net
187
172
  licenses:
188
173
  - MIT
174
+ metadata: {}
189
175
  post_install_message:
190
176
  rdoc_options: []
191
177
  require_paths:
192
178
  - lib
193
179
  required_ruby_version: !ruby/object:Gem::Requirement
194
- none: false
195
180
  requirements:
196
- - - ! '>='
181
+ - - '>='
197
182
  - !ruby/object:Gem::Version
198
183
  version: 1.9.3
199
184
  required_rubygems_version: !ruby/object:Gem::Requirement
200
- none: false
201
185
  requirements:
202
- - - ! '>'
186
+ - - '>'
203
187
  - !ruby/object:Gem::Version
204
188
  version: 1.3.1
205
189
  requirements: []
206
190
  rubyforge_project: omf_ec
207
- rubygems_version: 1.8.23
191
+ rubygems_version: 2.1.11
208
192
  signing_key:
209
- specification_version: 3
193
+ specification_version: 4
210
194
  summary: OMF experiment controller
211
- test_files: []
195
+ test_files:
196
+ - test/oedls/empty.oedl
197
+ - test/omf_ec/app_context_spec.rb
198
+ - test/omf_ec/context_spec.rb
199
+ - test/omf_ec/dsl_spec.rb
200
+ - test/omf_ec/experiment_property_spec.rb
201
+ - test/omf_ec/experiment_spec.rb
202
+ - test/omf_ec/group_spec.rb
203
+ - test/omf_ec/runner_spec.rb
204
+ - test/test_helper.rb