ruboozie 0.1.0

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