iron_worker_ng 0.2.0 → 0.2.1

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ group :extra do
4
+ gem 'pry'
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'pry'
2
+ require 'jeweler'
3
+ puts "hello"
@@ -0,0 +1,66 @@
1
+ require 'iron_worker_ng'
2
+
3
+ # to run examples, you must specify iron.io authentication token and project id
4
+ token, project_id = [ ENV['IRON_IO_TOKEN'], ENV['IRON_IO_PROJECT_ID'] ]
5
+ raise("please set $IRON_IO_TOKEN and $IRON_IO_PROJECT_ID " +
6
+ "environment variables") unless token and project_id
7
+
8
+ IronWorkerNG::Logger.logger.level = ::Logger::DEBUG
9
+
10
+ # initializing api object with them
11
+ client = IronWorkerNG::Client.new(:token => token,
12
+ :project_id => project_id,
13
+ # rest are optinal
14
+ :scheme => 'https',
15
+ :port => 443,
16
+ :api_version => 2,
17
+ :host => 'worker-aws-us-east-1.iron.io')
18
+
19
+ # creating code bundle
20
+
21
+ # if not specified, name default to worker name converted from underscore to camel style
22
+ code = IronWorkerNG::Code::Ruby.new
23
+ code.merge_worker('/sample_worker.rb')
24
+ #> code.name == 'SampleWorker'
25
+
26
+ # still can pass name in constructor
27
+ code = IronWorkerNG::Code::Ruby.new('transmogrify')
28
+ #> code.name == 'transmogrify'
29
+ code.merge_worker(File.dirname(__FILE__) + '/sample_worker.rb')
30
+
31
+ # once worker merged, following attempts will be ignored
32
+ code.merge_worker('anything')
33
+ #> code.worker.path.end_with? '/worker.rb'
34
+
35
+ # if worker requires some gems, we
36
+
37
+ # we can specify worker dependency on gem
38
+ code.merge_gem('jeweler')
39
+ # or on Gemfile, which is recommended
40
+ code.merge_gemfile(File.dirname(__FILE__) + '/Gemfile',
41
+ :default, :extra)
42
+ # all those dependencies will be resolved using bundler gem
43
+
44
+ # upload code bundle to iron.io
45
+ client.codes_create(code)
46
+
47
+ # we can retrive code packages list
48
+ codes = client.codes_list
49
+ #> codes.map{|c| c.name}.include?('transmogrify')
50
+
51
+ code_info = codes.find{|c| c.name == 'transmogrify'}
52
+ # other way to get such info is codes.get:
53
+ same_code_info = client.codes_get(code_info.id)
54
+ #> same_code_info == code_info
55
+
56
+ # create task to run the bundle
57
+ task_id = client.tasks_create('transmogrify').id
58
+
59
+ # wait for the task to finish
60
+ client.tasks_wait_for(task_id)
61
+
62
+ # retriving task log
63
+ log = client.tasks_log(task_id) #> log == "hello\n" -- worker stdout is in log
64
+
65
+ # cleanup
66
+ client.codes_delete(code_info.id)
@@ -5,3 +5,4 @@ require_relative 'iron_worker_ng/code/base'
5
5
  require_relative 'iron_worker_ng/code/ruby'
6
6
  require_relative 'iron_worker_ng/code/java'
7
7
  require_relative 'iron_worker_ng/code/node'
8
+ require_relative 'iron_worker_ng/code/binary'
@@ -60,23 +60,20 @@ module IronWorkerNG
60
60
  end
61
61
 
62
62
  def create_zip
63
- fixate
64
-
65
- init_code = ''
66
-
67
- @features.each do |f|
68
- if f.respond_to?(:code_for_init)
69
- init_code += f.send(:code_for_init) + "\n"
70
- end
63
+ unless @worker
64
+ IronWorkerNG::Logger.error 'No worker specified'
65
+ raise 'No worker specified'
71
66
  end
72
67
 
68
+ fixate
69
+
73
70
  zip_name = Dir.tmpdir + '/' + Dir::Tmpname.make_tmpname("iron-worker-ng-", "code.zip")
74
71
 
75
72
  IronWorkerNG::Logger.debug "Creating code zip '#{zip_name}'"
76
73
 
77
74
  Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) do |zip|
78
75
  bundle(zip)
79
- create_runner(zip, init_code)
76
+ create_runner(zip)
80
77
  end
81
78
 
82
79
  zip_name
@@ -0,0 +1,43 @@
1
+ require_relative '../feature/binary/merge_worker'
2
+
3
+ module IronWorkerNG
4
+ module Code
5
+ class Binary < IronWorkerNG::Code::Base
6
+ include IronWorkerNG::Feature::Binary::MergeWorker::InstanceMethods
7
+
8
+ def create_runner(zip)
9
+ zip.get_output_stream(runner) do |runner|
10
+ runner.write <<RUNNER
11
+ #!/bin/sh
12
+ # iron_worker_ng-#{IronWorkerNG.version}
13
+
14
+ root() {
15
+ while [ $# -gt 0 ]; do
16
+ if [ "$1" = "-d" ]; then
17
+ printf "%s\n" "$2"
18
+ break
19
+ fi
20
+ done
21
+ }
22
+
23
+ cd "$(root "$@")"
24
+
25
+ chmod +x #{File.basename(worker.path)}
26
+
27
+ LD_LIBRARY_PATH=. ./#{File.basename(worker.path)} "$@"
28
+ RUNNER
29
+ end
30
+ end
31
+
32
+ def runtime
33
+ 'sh'
34
+ end
35
+
36
+ def runner
37
+ '__runner__.sh'
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ IronWorkerNG::Code::Base.register_type(:name => 'binary', :klass => IronWorkerNG::Code::Binary)
@@ -7,14 +7,7 @@ module IronWorkerNG
7
7
  include IronWorkerNG::Feature::Java::MergeJar::InstanceMethods
8
8
  include IronWorkerNG::Feature::Java::MergeWorker::InstanceMethods
9
9
 
10
- def create_runner(zip, init_code)
11
- IronWorkerNG::Logger.info 'Creating java runner'
12
-
13
- unless @worker
14
- IronWorkerNG::Logger.error 'No worker specified'
15
- raise 'No worker specified'
16
- end
17
-
10
+ def create_runner(zip)
18
11
  classpath_array = []
19
12
 
20
13
  @features.each do |f|
@@ -27,31 +20,33 @@ module IronWorkerNG
27
20
 
28
21
  IronWorkerNG::Logger.info "Collected '#{classpath}' classpath"
29
22
 
30
- zip.get_output_stream('runner.rb') do |runner|
23
+ zip.get_output_stream(runner) do |runner|
31
24
  runner.write <<RUNNER
25
+ #!/bin/sh
32
26
  # iron_worker_ng-#{IronWorkerNG.version}
33
27
 
34
- root = nil
35
-
36
- ($*.length - 2).downto(0) do |i|
37
- root = $*[i + 1] if $*[i] == '-d'
38
- end
39
-
40
- Dir.chdir(root)
28
+ root() {
29
+ while [ $# -gt 0 ]; do
30
+ if [ "$1" = "-d" ]; then
31
+ printf "%s\n" "$2"
32
+ break
33
+ fi
34
+ done
35
+ }
41
36
 
42
- #{init_code}
37
+ cd "$(root "$@")"
43
38
 
44
- puts `java -cp #{classpath} #{worker.klass} \#{$*.join(' ')}`
39
+ java -cp #{classpath} #{worker.klass} "$@"
45
40
  RUNNER
46
41
  end
47
42
  end
48
43
 
49
44
  def runtime
50
- 'ruby'
45
+ 'sh'
51
46
  end
52
47
 
53
48
  def runner
54
- 'runner.rb'
49
+ '__runner__.sh'
55
50
  end
56
51
  end
57
52
  end
@@ -5,39 +5,34 @@ module IronWorkerNG
5
5
  class Node < IronWorkerNG::Code::Base
6
6
  include IronWorkerNG::Feature::Node::MergeWorker::InstanceMethods
7
7
 
8
- def create_runner(zip, init_code)
9
- IronWorkerNG::Logger.info 'Creating node runner'
10
-
11
- unless @worker
12
- IronWorkerNG::Logger.error 'No worker specified'
13
- raise 'No worker specified'
14
- end
15
-
16
- zip.get_output_stream('runner.rb') do |runner|
8
+ def create_runner(zip)
9
+ zip.get_output_stream(runner) do |runner|
17
10
  runner.write <<RUNNER
11
+ #!/bin/sh
18
12
  # iron_worker_ng-#{IronWorkerNG.version}
19
13
 
20
- root = nil
21
-
22
- ($*.length - 2).downto(0) do |i|
23
- root = $*[i + 1] if $*[i] == '-d'
24
- end
25
-
26
- Dir.chdir(root)
14
+ root() {
15
+ while [ $# -gt 0 ]; do
16
+ if [ "$1" = "-d" ]; then
17
+ printf "%s\n" "$2"
18
+ break
19
+ fi
20
+ done
21
+ }
27
22
 
28
- #{init_code}
23
+ cd "$(root "$@")"
29
24
 
30
- puts `node \#{worker_file_name} \#{$*.join(' ')}`
25
+ node #{File.basename(worker.path)} "$@"
31
26
  RUNNER
32
27
  end
33
28
  end
34
29
 
35
30
  def runtime
36
- 'ruby'
31
+ 'sh'
37
32
  end
38
33
 
39
34
  def runner
40
- 'runner.rb'
35
+ '__runner__.sh'
41
36
  end
42
37
  end
43
38
  end
@@ -9,15 +9,18 @@ module IronWorkerNG
9
9
  include IronWorkerNG::Feature::Ruby::MergeGemfile::InstanceMethods
10
10
  include IronWorkerNG::Feature::Ruby::MergeWorker::InstanceMethods
11
11
 
12
- def create_runner(zip, init_code)
13
- IronWorkerNG::Logger.info 'Creating ruby runner'
14
-
15
- unless @worker
16
- IronWorkerNG::Logger.error 'No worker specified'
17
- raise 'No worker specified'
12
+ def create_runner(zip)
13
+ gempath_code_array = []
14
+
15
+ @features.each do |f|
16
+ if f.respond_to?(:code_for_gempath)
17
+ gempath_code_array << f.send(:code_for_gempath)
18
+ end
18
19
  end
19
20
 
20
- zip.get_output_stream('runner.rb') do |runner|
21
+ gempath_code = gempath_code_array.join("\n")
22
+
23
+ zip.get_output_stream(runner) do |runner|
21
24
  runner.write <<RUNNER
22
25
  # iron_worker_ng-#{IronWorkerNG.version}
23
26
 
@@ -25,7 +28,7 @@ root = nil
25
28
  payload_file = nil
26
29
  task_id = nil
27
30
 
28
- ($*.length - 2).downto(0) do |i|
31
+ 0.upto($*.length - 2) do |i|
29
32
  root = $*[i + 1] if $*[i] == '-d'
30
33
  payload_file = $*[i + 1] if $*[i] == '-payload'
31
34
  task_id = $*[i + 1] if $*[i] == '-id'
@@ -33,7 +36,7 @@ end
33
36
 
34
37
  Dir.chdir(root)
35
38
 
36
- #{init_code}
39
+ #{gempath_code}
37
40
  $:.unshift("\#{root}")
38
41
 
39
42
  def log(*args)
@@ -81,12 +84,12 @@ def params
81
84
  @params
82
85
  end
83
86
 
84
- require worker_file_name
87
+ require '#{File.basename(worker.path)}'
85
88
 
86
89
  worker_class = nil
87
90
 
88
91
  begin
89
- worker_class = Kernel.const_get(worker_class_name)
92
+ worker_class = Kernel.const_get('#{worker.klass}')
90
93
  rescue
91
94
  end
92
95
 
@@ -112,7 +115,7 @@ RUNNER
112
115
  end
113
116
 
114
117
  def runner
115
- 'runner.rb'
118
+ '__runner__.rb'
116
119
  end
117
120
  end
118
121
  end
@@ -0,0 +1,50 @@
1
+ module IronWorkerNG
2
+ module Feature
3
+ module Binary
4
+ module MergeWorker
5
+ class Feature < IronWorkerNG::Feature::Base
6
+ attr_reader :path
7
+
8
+ def initialize(path)
9
+ @path = File.expand_path(path)
10
+ end
11
+
12
+ def hash_string
13
+ Digest::MD5.hexdigest(@path + File.mtime(@path).to_i.to_s)
14
+ end
15
+
16
+ def bundle(zip)
17
+ IronWorkerNG::Logger.debug "Bundling binary worker with path='#{@path}'"
18
+
19
+ zip.add(File.basename(@path), @path)
20
+ end
21
+ end
22
+
23
+ module InstanceMethods
24
+ attr_reader :worker
25
+
26
+ def merge_worker(path)
27
+ @worker ||= nil
28
+
29
+ unless @worker.nil?
30
+ IronWorkerNG::Logger.warn "Ignoring attempt to merge binary worker with path='#{path}'"
31
+ return
32
+ end
33
+
34
+ @name ||= File.basename(path).gsub(/\..*$/, '').capitalize.gsub(/_./) { |x| x[1].upcase }
35
+
36
+ @worker = IronWorkerNG::Feature::Binary::MergeWorker::Feature.new(path)
37
+
38
+ IronWorkerNG::Logger.info "Merging binary worker with path='#{path}'"
39
+
40
+ @features << @worker
41
+ end
42
+
43
+ def self.included(base)
44
+ IronWorkerNG::Code::Base.register_feature(:name => 'merge_worker', :for_klass => base, :args => 'PATH')
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -18,10 +18,6 @@ module IronWorkerNG
18
18
 
19
19
  zip.add(File.basename(@path), @path)
20
20
  end
21
-
22
- def code_for_init
23
- "worker_file_name = '#{File.basename(@path)}'"
24
- end
25
21
  end
26
22
 
27
23
  module InstanceMethods
@@ -4,6 +4,14 @@ module IronWorkerNG
4
4
  module Feature
5
5
  module Ruby
6
6
  module MergeGem
7
+ def self.merge_binary?
8
+ @merge_binary ||= false
9
+ end
10
+
11
+ def self.merge_binary=(merge_binary)
12
+ @merge_binary = merge_binary
13
+ end
14
+
7
15
  class Feature < IronWorkerNG::Feature::Base
8
16
  attr_reader :spec
9
17
 
@@ -31,7 +39,7 @@ module IronWorkerNG
31
39
  end
32
40
 
33
41
  def bundle(zip)
34
- if @spec.extensions.length == 0
42
+ if @spec.extensions.length == 0 || IronWorkerNG::Feature::Ruby::MergeGem.merge_binary?
35
43
  IronWorkerNG::Logger.debug "Bundling ruby gem with name='#{@spec.name}' and version='#{@spec.version}'"
36
44
 
37
45
  zip.add('gems/' + @spec.full_name, gem_path)
@@ -43,7 +51,7 @@ module IronWorkerNG
43
51
  end
44
52
  end
45
53
 
46
- def code_for_init
54
+ def code_for_gempath
47
55
  if @spec.extensions.length == 0
48
56
  '$:.unshift("#{root}/gems/' + @spec.full_name + '/lib")'
49
57
  else
@@ -20,10 +20,6 @@ module IronWorkerNG
20
20
 
21
21
  zip.add(File.basename(@path), @path)
22
22
  end
23
-
24
- def code_for_init
25
- "worker_file_name = '#{File.basename(@path)}'\nworker_class_name='#{@klass}'"
26
- end
27
23
  end
28
24
 
29
25
  module InstanceMethods
data/test/hello.rb ADDED
@@ -0,0 +1 @@
1
+ puts "hello"
@@ -0,0 +1,37 @@
1
+ require './lib/iron_worker_ng.rb'
2
+ require 'test/unit'
3
+
4
+ class BasicTest < Test::Unit::TestCase
5
+ attr_accessor :client
6
+
7
+ def setup
8
+ IronWorkerNG::Logger.logger.level = ::Logger::DEBUG
9
+
10
+ token, project_id = [ ENV['IRON_IO_TOKEN'], ENV['IRON_IO_PROJECT_ID'] ]
11
+ raise("please set $IRON_IO_TOKEN and $IRON_IO_PROJECT_ID " +
12
+ "environment variables") unless token and project_id
13
+
14
+ @client = IronWorkerNG::Client.new(:token => token,
15
+ :project_id => project_id )
16
+ end
17
+
18
+ def test_basic
19
+ code = IronWorkerNG::Code::Ruby.new('test_basic')
20
+ code.merge_worker(File.dirname(__FILE__) + '/hello.rb')
21
+ client.codes_create(code)
22
+ task_id = client.tasks_create('test_basic').id
23
+ client.tasks_wait_for(task_id)
24
+ log = client.tasks_log(task_id)
25
+ assert_equal( "hello\n", log, "worker stdout is in log" )
26
+ end
27
+
28
+ def test_30_codes
29
+ 31.times do |i|
30
+ code = IronWorkerNG::Code::Ruby.new("test_30_codes_code#{i}")
31
+ code.merge_worker(File.dirname(__FILE__) + '/hello.rb')
32
+ client.codes_create(code)
33
+ end
34
+ assert_equal( 31, client.codes_list.size )
35
+ end
36
+
37
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iron_worker_ng
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-09 00:00:00.000000000 Z
13
+ date: 2012-04-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: zip
@@ -126,15 +126,20 @@ files:
126
126
  - examples/ruby/master_slave/master_slave.rb
127
127
  - examples/ruby/master_slave/master_worker.rb
128
128
  - examples/ruby/master_slave/slave_worker.rb
129
+ - examples/ruby/simple/Gemfile
130
+ - examples/ruby/simple/sample_worker.rb
131
+ - examples/ruby/simple/simple.rb
129
132
  - lib/iron_worker_ng.rb
130
133
  - lib/iron_worker_ng/api_client.rb
131
134
  - lib/iron_worker_ng/api_client_error.rb
132
135
  - lib/iron_worker_ng/client.rb
133
136
  - lib/iron_worker_ng/code/base.rb
137
+ - lib/iron_worker_ng/code/binary.rb
134
138
  - lib/iron_worker_ng/code/java.rb
135
139
  - lib/iron_worker_ng/code/node.rb
136
140
  - lib/iron_worker_ng/code/ruby.rb
137
141
  - lib/iron_worker_ng/feature/base.rb
142
+ - lib/iron_worker_ng/feature/binary/merge_worker.rb
138
143
  - lib/iron_worker_ng/feature/common/merge_dir.rb
139
144
  - lib/iron_worker_ng/feature/common/merge_file.rb
140
145
  - lib/iron_worker_ng/feature/java/merge_jar.rb
@@ -145,7 +150,9 @@ files:
145
150
  - lib/iron_worker_ng/feature/ruby/merge_worker.rb
146
151
  - lib/iron_worker_ng/logger.rb
147
152
  - lib/iron_worker_ng/version.rb
153
+ - test/hello.rb
148
154
  - test/helpers.rb
155
+ - test/test_basic.rb
149
156
  homepage: https://github.com/iron-io/iron_worker_ruby_ng
150
157
  licenses: []
151
158
  post_install_message:
@@ -160,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
167
  version: '0'
161
168
  segments:
162
169
  - 0
163
- hash: 862609601
170
+ hash: 989401361
164
171
  required_rubygems_version: !ruby/object:Gem::Requirement
165
172
  none: false
166
173
  requirements: