iron_worker_ng 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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: