ruboozie 0.1.0

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.
@@ -0,0 +1,33 @@
1
+ module OozieAdmin
2
+
3
+ def status
4
+ resource = "/admin/status"
5
+ oozie_get(resource)
6
+ end
7
+
8
+ def os_env
9
+ resource = "/admin/os-env"
10
+ oozie_get(resource)
11
+ end
12
+
13
+ def java_sys_properties
14
+ resource = "/admin/java-sys-properties"
15
+ oozie_get(resource)
16
+ end
17
+
18
+ def configuration
19
+ resource = "/admin/configuration"
20
+ oozie_get(resource)
21
+ end
22
+
23
+ def instrumentation
24
+ resource = "/admin/instrumentation"
25
+ oozie_get(resource)
26
+ end
27
+ end
28
+
29
+ # /oozie/v0/admin/status
30
+ # /oozie/v0/admin/os-env
31
+ # /oozie/v0/admin/java-sys-properties
32
+ # /oozie/v0/admin/configuration
33
+ # /oozie/v0/admin/instrumentation
data/lib/oozie_api.rb ADDED
@@ -0,0 +1,132 @@
1
+ require 'oozie_objects'
2
+ require 'oozie_jobs'
3
+ require 'httparty'
4
+
5
+ class OozieException < StandardError
6
+
7
+ end
8
+ # so oozie responds in json, only accepts XML, and if there's an error the response is in HTML
9
+ class OozieApi
10
+ extend OozieJobs
11
+
12
+ include HTTParty
13
+ format :plain
14
+ def self.setup(url)
15
+ @@prefix = url
16
+ @@prefix += "/oozie" unless url.include?("/oozie")
17
+ @@prefix += "/v0" unless url.include?("/v0")
18
+ end
19
+
20
+ # def self.extended(other)
21
+ # other.send :include, HTTParty
22
+ # end
23
+
24
+ def self.oozie_get(resource, fmt = :plain)
25
+ response = nil
26
+ begin
27
+ response = get(@@prefix + resource)
28
+ rescue StandardError => ex
29
+ raise OozieException.new(ex)
30
+ end
31
+
32
+ case fmt
33
+ when :plain
34
+ response.body
35
+
36
+ when :json
37
+ begin
38
+ MultiJson.decode(response.body)
39
+ rescue StandardError => e
40
+ error = OozieException.new("#{response.headers['oozie-error-code']}: #{response.headers['oozie-error-message']}")
41
+ raise error
42
+ end
43
+ end
44
+ end
45
+
46
+ def self.oozie_post(resource, fmt = :plain, params={})
47
+ response = nil
48
+ begin
49
+ response = post(@@prefix + resource, params)
50
+ rescue StandardError => ex
51
+ raise OozieException.new(ex)
52
+ end
53
+
54
+ case fmt
55
+ when :plain
56
+ response.body
57
+
58
+ when :json
59
+ begin
60
+ MultiJson.decode(response.body)
61
+ rescue StandardError => e
62
+ error = OozieException.new("#{response.headers['oozie-error-code']}: #{response.headers['oozie-error-message']}")
63
+ raise error
64
+ end
65
+ end
66
+
67
+
68
+ end
69
+
70
+ def self.oozie_put(resource, fmt = :plain, opts={})
71
+ response = nil
72
+ begin
73
+ response = put(@@prefix + resource)
74
+ rescue StandardError => ex
75
+ raise OozieException.new(ex)
76
+ end
77
+
78
+ case fmt
79
+ when :plain
80
+ response.body
81
+
82
+ when :json
83
+ begin
84
+ MultiJson.decode(response.body)
85
+ rescue StandardError => e
86
+ error = OozieException.new("#{response.headers['oozie-error-code']}: #{response.headers['oozie-error-message']}")
87
+ raise error
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+
95
+ # GET
96
+ # /oozie/versions
97
+ # /oozie/v0/admin/status
98
+ # /oozie/v0/admin/os-env
99
+ # /oozie/v0/admin/java-sys-properties
100
+ # /oozie/v0/admin/configuration
101
+ # /oozie/v0/admin/instrumentation
102
+ # /oozie/v0/job/job-3?show=info
103
+ # /oozie/v0/job/job-3?show=definition
104
+ # /oozie/v0/job/job-3?show=log
105
+ # /oozie/v0/jobs?filter=user%3Dtucu&offset=1&len=50
106
+ # * name: the workflow application name from the workflow definition
107
+ # * user: the user that submitted the job
108
+ # * group: the group for the job
109
+ # * status: the status of the job
110
+
111
+
112
+ # PUT
113
+ # /oozie/v0/job/job-3?action=start #=> 'start', 'suspend', 'resume' and 'kill'.
114
+ # /oozie/v0/admin/status?safemode=true
115
+
116
+ # POST
117
+ # /oozie/v0/jobs
118
+ # Content-Type: application/xml;charset=UTF-8
119
+ # .
120
+ # <?xml version="1.0" encoding="UTF-8"?>
121
+ # <configuration>
122
+ # <property>
123
+ # <name>user.name</name>
124
+ # <value>tucu</value>
125
+ # </property>
126
+ # <property>
127
+ # <name>oozie.wf.application.path</name>
128
+ # <value>hdfs://foo:9000/user/tucu/myapp/</value>
129
+ # </property>
130
+ # ...
131
+ # </configuration>
132
+
data/lib/oozie_jobs.rb ADDED
@@ -0,0 +1,126 @@
1
+ require 'builder'
2
+ module OozieJobs
3
+
4
+ def workflows(params={})
5
+ # TODO: checking for filter/user, offset, len
6
+ resource = "/jobs?jobtype=wf"
7
+ results = oozie_get(resource, :json)
8
+ results['workflows'] ||= []
9
+ results['workflows'].map{|wf| OozieJob.new(wf)}
10
+ end
11
+
12
+ def coordinators(params={})
13
+ # TODO: checking for filter/user, offset, len
14
+
15
+ resource = "/jobs?jobtype=coord"
16
+ results = oozie_get(resource, :json)
17
+ results['coordinatorjobs'] ||= []
18
+ results['coordinatorjobs'].map{|wf| OozieJob.new(wf)}
19
+ end
20
+
21
+ def log(job_id)
22
+
23
+ resource = "/job/#{job_id}?show=log"
24
+ oozie_get(resource)
25
+ end
26
+
27
+ def definition(job_id)
28
+
29
+ resource = "/job/#{job_id}?show=definition"
30
+ oozie_get(resource)
31
+ end
32
+
33
+ def info(job_id)
34
+
35
+ resource = "/job/#{job_id}?show=info"
36
+ OozieJob.new oozie_get(resource, :json)
37
+ end
38
+
39
+ def submit_job(params)
40
+ conf = params[:conf_xml]
41
+ properties = params[:properties_hash]
42
+
43
+ body = conf || properties_hash_to_conf_xml(properties)
44
+
45
+ start_now = params[:start_now]
46
+
47
+ resource = "/jobs"
48
+ resource += "?action=start" if start_now
49
+
50
+ response = oozie_post(resource, :json, :body => body, :headers => {"Content-Type" => "application/xml"})
51
+ id = response['id']
52
+ id
53
+ end
54
+
55
+ def start_job(job_id)
56
+ resource = "/job/#{job_id}?action=start"
57
+ oozie_put(resource)
58
+ end
59
+
60
+ def suspend_job(job_id)
61
+ resource = "/job/#{job_id}?action=suspend"
62
+ oozie_put(resource)
63
+ end
64
+
65
+ def resume_job(job_id)
66
+ resource = "/job/#{job_id}?action=resume"
67
+ oozie_put(resource)
68
+ end
69
+
70
+ def kill_job(job_id)
71
+ resource = "/job/#{job_id}?action=kill"
72
+ oozie_put(resource)
73
+ end
74
+
75
+ def properties_hash_to_conf_xml(properties_hash)
76
+ conf_xml = ConfMaker.new(properties_hash).conf
77
+ return conf_xml
78
+ end
79
+
80
+ def conf_xml_to_properties_hash(conf_xml)
81
+ doc = REXML::Document.new(conf_xml)
82
+
83
+ properties = {}
84
+ doc.elements.each("//property") do |property|
85
+ name = property.elements["name"].text
86
+ value = property.elements["value"].text
87
+ properties[name] = value
88
+ end
89
+
90
+ return properties
91
+ end
92
+
93
+ class ConfMaker
94
+
95
+ attr_reader :conf
96
+
97
+ def initialize(params)
98
+ @conf = ""
99
+ @xb = Builder::XmlMarkup.new(:target => @conf, :indent => 2)
100
+ @xb.configuration do
101
+ params.each do |name, value|
102
+ name = name.to_s unless name.is_a? String
103
+ value = value.to_s unless value.is_a? String
104
+ @xb.property do
105
+ @xb.name(name)
106
+ @xb.value(value)
107
+ end
108
+ end
109
+ end
110
+ return @conf
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+
117
+
118
+
119
+ # /oozie/v0/job/job-3?show=info
120
+ # /oozie/v0/job/job-3?show=definition
121
+ # /oozie/v0/job/job-3?show=log
122
+ # /oozie/v0/jobs?filter=user%3Dtucu&offset=1&len=50
123
+
124
+ # PUT
125
+ # /oozie/v0/job/job-3?action=start #=> 'start', 'suspend', 'resume' and 'kill'.
126
+ # /oozie/v0/admin/status?safemode=true
@@ -0,0 +1,55 @@
1
+ require 'ostruct'
2
+ OpenStruct.__send__(:define_method, :id) { @table[:id] || self.object_id }
3
+
4
+ class OozieObject < OpenStruct
5
+ attr_reader :table
6
+ end
7
+
8
+ class OozieJob < OozieObject
9
+
10
+ def log
11
+ OozieApi.log(self.id)
12
+ end
13
+
14
+ def info
15
+ OozieJobInfo.new(OozieApi.info(self.id))
16
+ end
17
+
18
+ def definition
19
+ OozieApi.definition(self.id)
20
+ end
21
+
22
+ def start
23
+ OozieApi.start_job(self.id)
24
+ end
25
+
26
+ def suspend
27
+ OozieApi.suspend_job(self.id)
28
+ end
29
+
30
+ def resume
31
+ OozieApi.resume_job(self.id)
32
+ end
33
+
34
+ def kill
35
+ OozieApi.kill_job(self.id)
36
+ end
37
+
38
+ def name; appName; end
39
+ def path; appPath; end
40
+ def console_url; consoleUrl; end
41
+ def created_at; Time.parse(createdTime) if createdTime; end
42
+ def started_at; Time.parse(startTime) if startTime; end
43
+ def ended_at; Time.parse(endTime) if endTime; end
44
+ def external_id; externalId; end
45
+ def actions
46
+ @table[:actions] ||= []
47
+ @actions = @table[:actions].map {|a| OozieAction.new(a)} unless @actions
48
+ @actions
49
+ end
50
+ end
51
+
52
+ class OozieAction < OozieObject
53
+ def started_at; Time.parse(startTime) if startTime; end
54
+ def ended_at; Time.parse(endTime) if endTime; end
55
+ end
data/lib/ruboozie.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'oozie_api.rb'
2
+ require 'oozie_admin.rb'
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruboozie
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - dguttman
14
+ - Matthew Rathbone
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2012-04-04 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: httparty
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: builder
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: Apache Oozie [http://incubator.apache.org/oozie/] is a workflow engine for Apache MapReduce jobs. This wrapper lets you submit jobs and stuff from any ruby project
50
+ email: matthew@foursquare.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - lib/ruboozie.rb
59
+ - lib/oozie_admin.rb
60
+ - lib/oozie_api.rb
61
+ - lib/oozie_jobs.rb
62
+ - lib/oozie_objects.rb
63
+ homepage: http://github.com/rathboma/ruboozie
64
+ licenses: []
65
+
66
+ post_install_message:
67
+ rdoc_options: []
68
+
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 3
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ requirements: []
90
+
91
+ rubyforge_project:
92
+ rubygems_version: 1.8.10
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: A pure-ruby API for Apache oozie
96
+ test_files: []
97
+