rhc 0.90.7 → 0.91.11
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/README.md +75 -0
- data/Rakefile +27 -11
- data/bin/rhc +8 -8
- data/bin/rhc-app +18 -12
- data/bin/rhc-chk +11 -6
- data/bin/rhc-create-app +10 -10
- data/bin/rhc-create-domain +10 -10
- data/bin/rhc-ctl-app +9 -10
- data/bin/rhc-ctl-domain +6 -8
- data/bin/rhc-domain +17 -10
- data/bin/rhc-domain-info +10 -10
- data/bin/rhc-port-forward +10 -10
- data/bin/rhc-snapshot +10 -10
- data/bin/rhc-sshkey +18 -12
- data/bin/rhc-tail-files +10 -10
- data/bin/rhc-user-info +2 -4
- data/ext/mkrf_conf.rb +54 -15
- data/lib/rhc-common.rb +27 -9
- data/lib/rhc-rest.rb +159 -0
- data/lib/rhc-rest/application.rb +82 -0
- data/lib/rhc-rest/cartridge.rb +64 -0
- data/lib/rhc-rest/client.rb +123 -0
- data/lib/rhc-rest/domain.rb +65 -0
- data/lib/rhc-rest/exceptions/exceptions.rb +73 -0
- data/lib/rhc-rest/key.rb +34 -0
- data/lib/rhc-rest/user.rb +41 -0
- data/lib/rhc-rest/version.rb +5 -0
- metadata +31 -24
- data/README +0 -69
data/lib/rhc-rest.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rest-client'
|
3
|
+
require 'logger'
|
4
|
+
require 'json'
|
5
|
+
require 'rhc-rest/exceptions/exceptions'
|
6
|
+
require 'rhc-rest/application'
|
7
|
+
require 'rhc-rest/cartridge'
|
8
|
+
require 'rhc-rest/client'
|
9
|
+
require 'rhc-rest/domain'
|
10
|
+
require 'rhc-rest/key'
|
11
|
+
require 'rhc-rest/user'
|
12
|
+
|
13
|
+
@@end_point = ""
|
14
|
+
@@headers = {:accept => :json}
|
15
|
+
|
16
|
+
module Rhc
|
17
|
+
module Rest
|
18
|
+
def logger
|
19
|
+
if defined?Rails.logger
|
20
|
+
Rails.logger
|
21
|
+
else
|
22
|
+
Logger.new(STDOUT)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_response(response)
|
27
|
+
result = JSON.parse(response)
|
28
|
+
type = result['type']
|
29
|
+
data = result['data']
|
30
|
+
case type
|
31
|
+
when 'domains'
|
32
|
+
domains = Array.new
|
33
|
+
data.each do |domain_json|
|
34
|
+
domains.push(Domain.new(domain_json))
|
35
|
+
end
|
36
|
+
return domains
|
37
|
+
when 'domain'
|
38
|
+
return Domain.new(data)
|
39
|
+
when 'applications'
|
40
|
+
apps = Array.new
|
41
|
+
data.each do |app_json|
|
42
|
+
apps.push(Application.new(app_json))
|
43
|
+
end
|
44
|
+
return apps
|
45
|
+
when 'application'
|
46
|
+
return Application.new(data)
|
47
|
+
when 'cartridges'
|
48
|
+
carts = Array.new
|
49
|
+
data.each do |cart_json|
|
50
|
+
carts.push(Cartridge.new(cart_json))
|
51
|
+
end
|
52
|
+
return carts
|
53
|
+
when 'cartridge'
|
54
|
+
return Cartridge.new(data)
|
55
|
+
when 'user'
|
56
|
+
return User.new(data)
|
57
|
+
when 'keys'
|
58
|
+
keys = Array.new
|
59
|
+
data.each do |key_json|
|
60
|
+
keys.push(Key.new(key_json))
|
61
|
+
end
|
62
|
+
return keys
|
63
|
+
when 'key'
|
64
|
+
return Key.new(data)
|
65
|
+
else
|
66
|
+
data
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def send(request)
|
71
|
+
begin
|
72
|
+
#puts request.headers
|
73
|
+
response = request.execute
|
74
|
+
#set cookie
|
75
|
+
rh_sso = response.cookies['rh_sso']
|
76
|
+
#puts response.cookies
|
77
|
+
if not rh_sso.nil?
|
78
|
+
@@headers["cookie"] = "rh_sso=#{rh_sso}"
|
79
|
+
end
|
80
|
+
#puts "#{response}"
|
81
|
+
return parse_response(response) unless response.nil? or response.code == 204
|
82
|
+
rescue RestClient::RequestTimeout, RestClient::ServerBrokeConnection, RestClient::SSLCertificateNotVerified => e
|
83
|
+
raise ResourceAccessException.new("Failed to access resource: #{e.message}")
|
84
|
+
rescue RestClient::ExceptionWithResponse => e
|
85
|
+
#puts "#{e.response}"
|
86
|
+
process_error_response(e.response)
|
87
|
+
rescue Exception => e
|
88
|
+
raise ResourceAccessException.new("Failed to access resource: #{e.message}")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def process_error_response(response)
|
93
|
+
messages = Array.new
|
94
|
+
begin
|
95
|
+
result = JSON.parse(response)
|
96
|
+
messages = result['messages']
|
97
|
+
rescue Exception => e
|
98
|
+
logger.debug "Response did not include a message from server" if @mydebug
|
99
|
+
#puts response
|
100
|
+
end
|
101
|
+
case response.code
|
102
|
+
when 401
|
103
|
+
raise UnAuthorizedException.new("Not authenticated")
|
104
|
+
when 403
|
105
|
+
messages.each do |message|
|
106
|
+
if message['severity'].upcase == "ERROR"
|
107
|
+
raise RequestDeniedException.new(message['text'])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
when 404
|
111
|
+
messages.each do |message|
|
112
|
+
if message['severity'].upcase == "ERROR"
|
113
|
+
raise ResourceNotFoundException.new(message['text'])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
when 409
|
117
|
+
messages.each do |message|
|
118
|
+
if message['severity'] and message['severity'].upcase == "ERROR"
|
119
|
+
raise ValidationException.new(message['text'])
|
120
|
+
end
|
121
|
+
end
|
122
|
+
when 422
|
123
|
+
#puts response
|
124
|
+
e = nil
|
125
|
+
messages.each do |message|
|
126
|
+
if message["field"]
|
127
|
+
if e and e.field ==message["field"]
|
128
|
+
e.message << " #{message["text"]}"
|
129
|
+
else
|
130
|
+
e = ValidationException.new(message["text"], message["field"])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
raise e
|
135
|
+
when 400
|
136
|
+
messages.each do |message|
|
137
|
+
if message['severity'].upcase == "ERROR"
|
138
|
+
raise ClientErrorException.new(message['text'])
|
139
|
+
end
|
140
|
+
end
|
141
|
+
when 500
|
142
|
+
messages.each do |message|
|
143
|
+
if message['severity'].upcase == "ERROR"
|
144
|
+
raise ServerErrorException.new(message['text'])
|
145
|
+
end
|
146
|
+
end
|
147
|
+
when 503
|
148
|
+
messages.each do |message|
|
149
|
+
if message['severity'].upcase == "ERROR"
|
150
|
+
raise ServiceUnavailableException.new(message['text'])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
else
|
154
|
+
raise ResourceAccessException.new("Server returned error code with no output: #{response.code}")
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
module Rhc
|
3
|
+
module Rest
|
4
|
+
class Application
|
5
|
+
include Rest
|
6
|
+
attr_reader :domain_id, :name, :creation_time, :uuid, :aliases, :git_url, :app_url, :node_profile, :framework, :scalable, :health_check_path, :embedded
|
7
|
+
def initialize(args)
|
8
|
+
#logger.debug args
|
9
|
+
@domain_id = args[:domain_id] || args["domain_id"]
|
10
|
+
@name = args[:name] || args["name"]
|
11
|
+
@creation_time = args[:creation_time] || args["creation_time"]
|
12
|
+
@uuid = args[:uuid] || args["uuid"]
|
13
|
+
@aliases = args[:aliases] || args["aliases"]
|
14
|
+
@server_identity = args[:server_identity] || args["server_identity"]
|
15
|
+
@links = args[:links] || args["links"]
|
16
|
+
end
|
17
|
+
|
18
|
+
#Add Cartridge
|
19
|
+
def add_cartridge(name)
|
20
|
+
logger.debug "Adding cartridge #{name}" if @mydebug
|
21
|
+
url = @links['ADD_CARTRIDGE']['href']
|
22
|
+
method = @links['ADD_CARTRIDGE']['method']
|
23
|
+
payload = {:name => name}
|
24
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
25
|
+
return send(request)
|
26
|
+
end
|
27
|
+
|
28
|
+
#Get all Cartridge for this applications
|
29
|
+
def cartridges
|
30
|
+
logger.debug "Getting all cartridges for application #{self.name}" if @mydebug
|
31
|
+
url = @links['LIST_CARTRIDGES']['href']
|
32
|
+
method = @links['LIST_CARTRIDGES']['method']
|
33
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
34
|
+
return send(request)
|
35
|
+
end
|
36
|
+
|
37
|
+
#Start Application
|
38
|
+
def start
|
39
|
+
logger.debug "Starting application #{self.name}" if @mydebug
|
40
|
+
url = @links['START']['href']
|
41
|
+
method = @links['START']['method']
|
42
|
+
payload = {:event=> "start"}
|
43
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
44
|
+
return send(request)
|
45
|
+
end
|
46
|
+
|
47
|
+
#Stop Application
|
48
|
+
def stop(force=false)
|
49
|
+
logger.debug "Stopping application #{self.name} force-#{force}" if @mydebug
|
50
|
+
url = @links['STOP']['href']
|
51
|
+
method = @links['STOP']['method']
|
52
|
+
if force
|
53
|
+
payload = {:event=> "force-stop"}
|
54
|
+
else
|
55
|
+
payload = {:event=> "stop"}
|
56
|
+
end
|
57
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
58
|
+
return send(request)
|
59
|
+
end
|
60
|
+
|
61
|
+
#Restart Application
|
62
|
+
def restart
|
63
|
+
logger.debug "Restarting application #{self.name}" if @mydebug
|
64
|
+
url = @links['RESTART']['href']
|
65
|
+
method = @links['RESTART']['method']
|
66
|
+
payload = {:event=> "restart"}
|
67
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
68
|
+
return send(request)
|
69
|
+
end
|
70
|
+
|
71
|
+
#Delete Application
|
72
|
+
def destroy
|
73
|
+
logger.debug "Deleting application #{self.name}" if @mydebug
|
74
|
+
url = @links['DELETE']['href']
|
75
|
+
method = @links['DELETE']['method']
|
76
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
77
|
+
return send(request)
|
78
|
+
end
|
79
|
+
alias :delete :destroy
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Rhc
|
2
|
+
module Rest
|
3
|
+
class Cartridge
|
4
|
+
include Rest
|
5
|
+
attr_reader :type, :name
|
6
|
+
def initialize(args)
|
7
|
+
@name = args[:name] || args["name"]
|
8
|
+
@type = args[:type] || args["type"]
|
9
|
+
@links = args[:links] || args["links"]
|
10
|
+
end
|
11
|
+
|
12
|
+
#Start Cartridge
|
13
|
+
def start
|
14
|
+
logger.debug "Starting cartridge #{self.name}" if @mydebug
|
15
|
+
url = @links['START']['href']
|
16
|
+
method = @links['START']['method']
|
17
|
+
payload = {:event=> "start"}
|
18
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
19
|
+
return send(request)
|
20
|
+
end
|
21
|
+
|
22
|
+
#Stop Cartridge
|
23
|
+
def stop()
|
24
|
+
logger.debug "Stopping cartridge #{self.name}" if @mydebug
|
25
|
+
url = @links['STOP']['href']
|
26
|
+
method = @links['STOP']['method']
|
27
|
+
payload = {:event=> "stop"}
|
28
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
29
|
+
return send(request)
|
30
|
+
end
|
31
|
+
|
32
|
+
#Restart Cartridge
|
33
|
+
def restart
|
34
|
+
logger.debug "Restarting cartridge #{self.name}" if @mydebug
|
35
|
+
url = @links['RESTART']['href']
|
36
|
+
method = @links['RESTART']['method']
|
37
|
+
payload = {:event=> "restart"}
|
38
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
39
|
+
return send(request)
|
40
|
+
end
|
41
|
+
|
42
|
+
#Reload Cartridge
|
43
|
+
def reload
|
44
|
+
logger.debug "Reloading cartridge #{self.name}" if @mydebug
|
45
|
+
url = @links['RESTART']['href']
|
46
|
+
method = @links['RESTART']['method']
|
47
|
+
payload = {:event=> "reload"}
|
48
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
49
|
+
return send(request)
|
50
|
+
end
|
51
|
+
|
52
|
+
#Delete Cartridge
|
53
|
+
def destroy
|
54
|
+
logger.debug "Deleting cartridge #{self.name}" if @mydebug
|
55
|
+
url = @links['DELETE']['href']
|
56
|
+
method = @links['DELETE']['method']
|
57
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
58
|
+
return send(request)
|
59
|
+
end
|
60
|
+
alias :delete :destroy
|
61
|
+
alias :delete :destroy
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module Rhc
|
4
|
+
module Rest
|
5
|
+
class Client
|
6
|
+
include Rest
|
7
|
+
def initialize(end_point, username, password)
|
8
|
+
logger.debug "Connecting to #{end_point}" if @mydebug
|
9
|
+
credentials = Base64.encode64("#{username}:#{password}")
|
10
|
+
@@headers["Authorization"] = "Basic #{credentials}"
|
11
|
+
#first get the API
|
12
|
+
RestClient.proxy = ENV['http_proxy']
|
13
|
+
request = RestClient::Request.new(:url => end_point, :method => :get, :headers => @@headers)
|
14
|
+
begin
|
15
|
+
response = request.execute
|
16
|
+
result = JSON.parse(response)
|
17
|
+
@links = send(request)
|
18
|
+
rescue RestClient::ExceptionWithResponse => e
|
19
|
+
logger.error "Failed to get API #{e.response}"
|
20
|
+
rescue Exception => e
|
21
|
+
raise ResourceAccessException.new("Resource could not be accessed:#{e.message}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
#Add Domain
|
26
|
+
def add_domain(id)
|
27
|
+
logger.debug "Adding domain #{id}" if @mydebug
|
28
|
+
url = @links['ADD_DOMAIN']['href']
|
29
|
+
method = @links['ADD_DOMAIN']['method']
|
30
|
+
payload = {:id => id}
|
31
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
32
|
+
return send(request)
|
33
|
+
end
|
34
|
+
|
35
|
+
#Get all Domain
|
36
|
+
def domains
|
37
|
+
logger.debug "Getting all domains" if @mydebug
|
38
|
+
url = @links['LIST_DOMAINS']['href']
|
39
|
+
method = @links['LIST_DOMAINS']['method']
|
40
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
41
|
+
return send(request)
|
42
|
+
end
|
43
|
+
|
44
|
+
#Find Domain by namesapce
|
45
|
+
def find_domain(id)
|
46
|
+
logger.debug "Finding domain #{id}" if @mydebug
|
47
|
+
filtered = Array.new
|
48
|
+
domains.each do |domain|
|
49
|
+
#TODO do a regex caomparison
|
50
|
+
if domain.id == id
|
51
|
+
filtered.push(domain)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
return filtered
|
55
|
+
end
|
56
|
+
|
57
|
+
#Find Application by name
|
58
|
+
def find_application(name)
|
59
|
+
logger.debug "Finding application #{name}" if @mydebug
|
60
|
+
filtered = Array.new
|
61
|
+
domains.each do |domain|
|
62
|
+
#TODO do a regex caomparison
|
63
|
+
domain.applications.each do |app|
|
64
|
+
if app.name == name
|
65
|
+
filtered.push(app)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
return filtered
|
70
|
+
end
|
71
|
+
|
72
|
+
#Get all Cartridge
|
73
|
+
def cartridges
|
74
|
+
logger.debug "Getting all cartridges" if @mydebug
|
75
|
+
url = @links['LIST_CARTRIDGES']['href']
|
76
|
+
method = @links['LIST_CARTRIDGES']['method']
|
77
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
78
|
+
return send(request)
|
79
|
+
end
|
80
|
+
|
81
|
+
#Find Cartridge by name
|
82
|
+
def find_cartridge(name)
|
83
|
+
logger.debug "Finding cartridge #{name}" if @mydebug
|
84
|
+
filtered = Array.new
|
85
|
+
cartridges.each do |cart|
|
86
|
+
#TODO do a regex caomparison
|
87
|
+
if cart.name == name
|
88
|
+
filtered.push(cart)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return filtered
|
92
|
+
end
|
93
|
+
|
94
|
+
#Get User info
|
95
|
+
def user
|
96
|
+
url = @links['GET_USER']['href']
|
97
|
+
method = @links['GET_USER']['method']
|
98
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
99
|
+
return send(request)
|
100
|
+
end
|
101
|
+
|
102
|
+
#find Key by name
|
103
|
+
def find_key(name)
|
104
|
+
logger.debug "Finding key #{name}" if @mydebug
|
105
|
+
filtered = Array.new
|
106
|
+
user.keys.each do |key|
|
107
|
+
#TODO do a regex caomparison
|
108
|
+
if key.name == name
|
109
|
+
filtered.push(key)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
return filtered
|
113
|
+
end
|
114
|
+
|
115
|
+
def logout
|
116
|
+
#TODO logout
|
117
|
+
logger.debug "Logout/Close client" if @mydebug
|
118
|
+
end
|
119
|
+
alias :close :logout
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Rhc
|
2
|
+
module Rest
|
3
|
+
class Domain
|
4
|
+
include Rest
|
5
|
+
attr_reader :id
|
6
|
+
def initialize(args)
|
7
|
+
@id = args[:id] || args["id"]
|
8
|
+
@links = args[:links] || args["links"]
|
9
|
+
end
|
10
|
+
|
11
|
+
#Add Application to this domain
|
12
|
+
# options
|
13
|
+
# cartrdige
|
14
|
+
# template
|
15
|
+
# scale
|
16
|
+
# node_profile
|
17
|
+
def add_application(name, options)
|
18
|
+
logger.debug "Adding application #{name} to domain #{self.id}" if @mydebug
|
19
|
+
url = @links['ADD_APPLICATION']['href']
|
20
|
+
method = @links['ADD_APPLICATION']['method']
|
21
|
+
payload = {:name => name}
|
22
|
+
options.each do |key, value|
|
23
|
+
payload[key] = value
|
24
|
+
end
|
25
|
+
timeout = nil
|
26
|
+
if options[:scale]
|
27
|
+
timeout = 180 # 3 minute timeout for scalable app
|
28
|
+
end
|
29
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload, :timeout => timeout)
|
30
|
+
return send(request)
|
31
|
+
end
|
32
|
+
|
33
|
+
#Get all Application for this domain
|
34
|
+
def applications
|
35
|
+
logger.debug "Getting all applications for domain #{self.id}" if @mydebug
|
36
|
+
url = @links['LIST_APPLICATIONS']['href']
|
37
|
+
method = @links['LIST_APPLICATIONS']['method']
|
38
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers)
|
39
|
+
return send(request)
|
40
|
+
end
|
41
|
+
|
42
|
+
#Update Domain
|
43
|
+
def update(new_id)
|
44
|
+
logger.debug "Updating domain #{self.id} to #{new_id}" if @mydebug
|
45
|
+
url = @links['UPDATE']['href']
|
46
|
+
method = @links['UPDATE']['method']
|
47
|
+
payload = {:id => new_id}
|
48
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
49
|
+
return send(request)
|
50
|
+
end
|
51
|
+
alias :save :update
|
52
|
+
|
53
|
+
#Delete Domain
|
54
|
+
def destroy(force=false)
|
55
|
+
logger.debug "Deleting domain #{self.id}" if @mydebug
|
56
|
+
url = @links['DELETE']['href']
|
57
|
+
method = @links['DELETE']['method']
|
58
|
+
payload = {:force => force}
|
59
|
+
request = RestClient::Request.new(:url => url, :method => method, :headers => @@headers, :payload => payload)
|
60
|
+
return send(request)
|
61
|
+
end
|
62
|
+
alias :delete :destroy
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|