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.
- data/lib/oozie_admin.rb +33 -0
- data/lib/oozie_api.rb +132 -0
- data/lib/oozie_jobs.rb +126 -0
- data/lib/oozie_objects.rb +55 -0
- data/lib/ruboozie.rb +2 -0
- metadata +97 -0
data/lib/oozie_admin.rb
ADDED
@@ -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
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
|
+
|