rhc 0.80.5 → 0.81.14
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/rhc-chk +31 -24
- data/bin/rhc-create-app +99 -265
- data/bin/rhc-create-domain +98 -17
- data/bin/rhc-ctl-app +14 -38
- data/bin/rhc-snapshot +1 -1
- data/bin/rhc-tail-files +1 -1
- data/bin/rhc-user-info +29 -22
- data/lib/rhc-common.rb +301 -26
- metadata +5 -5
data/bin/rhc-create-domain
CHANGED
@@ -78,8 +78,11 @@ libra_server = get_var('libra_server')
|
|
78
78
|
debug = get_var('debug') == 'false' ? nil : get_var('debug')
|
79
79
|
|
80
80
|
|
81
|
-
|
82
|
-
|
81
|
+
ssh_key_file_path = get_kfile(false)
|
82
|
+
ssh_pub_key_file_path = get_kpfile(ssh_key_file_path, opt['alter'])
|
83
|
+
|
84
|
+
ssh_config = "#{ENV['HOME']}/.ssh/config"
|
85
|
+
ssh_config_d = "#{ENV['HOME']}/.ssh/"
|
83
86
|
|
84
87
|
if opt["help"]
|
85
88
|
p_usage
|
@@ -113,7 +116,6 @@ end
|
|
113
116
|
#
|
114
117
|
# Add a new namespace to configs
|
115
118
|
#
|
116
|
-
|
117
119
|
def add_rhlogin_config(rhlogin, uuid)
|
118
120
|
f = open(File.expand_path(config_path), 'a')
|
119
121
|
unless config.get_value('default_rhlogin')
|
@@ -124,32 +126,108 @@ def add_rhlogin_config(rhlogin, uuid)
|
|
124
126
|
f.close
|
125
127
|
end
|
126
128
|
|
129
|
+
#
|
130
|
+
# Check / add new host to ~/.ssh/config
|
131
|
+
#
|
132
|
+
def add_ssh_config_host(rhc_domain, ssh_key_file_path, ssh_config, ssh_config_d)
|
133
|
+
|
134
|
+
puts "Checking ~/.ssh/config"
|
135
|
+
ssh_key_file_name = File.basename(ssh_key_file_path)
|
136
|
+
if ssh_key_file_path =~ /^#{ENV['HOME']}/
|
137
|
+
ssh_key_file_path = ssh_key_file_path[ENV['HOME'].length..-1]
|
138
|
+
if ssh_key_file_path =~ /^\// || ssh_key_file_path =~ /^\\/
|
139
|
+
ssh_key_file_path = '~' + ssh_key_file_path
|
140
|
+
else
|
141
|
+
ssh_key_file_path = '~/' + ssh_key_file_path
|
142
|
+
end
|
143
|
+
end
|
144
|
+
if (ssh_key_file_name != 'id_rsa')
|
145
|
+
found = false
|
146
|
+
|
147
|
+
begin
|
148
|
+
File.open(ssh_config, "r") do |sline|
|
149
|
+
while(line = sline.gets)
|
150
|
+
if line.to_s.index("Host *.#{rhc_domain}") == 0
|
151
|
+
found = true
|
152
|
+
break
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
rescue Errno::EACCES
|
157
|
+
puts "Could not read from #{ssh_config}"
|
158
|
+
puts "Reason: " + $!
|
159
|
+
puts
|
160
|
+
puts "Please correct this first. Then run rerun."
|
161
|
+
puts
|
162
|
+
exit 213
|
163
|
+
rescue Errno::ENOENT
|
164
|
+
puts "Could not find #{ssh_config}. This is ok, continuing"
|
165
|
+
end
|
166
|
+
if found
|
167
|
+
puts "Found #{rhc_domain} in ~/.ssh/config... No need to adjust"
|
168
|
+
else
|
169
|
+
puts " Adding #{rhc_domain} to ~/.ssh/config"
|
170
|
+
begin
|
171
|
+
f = File.open(ssh_config, "a")
|
172
|
+
f.puts <<SSH
|
173
|
+
|
174
|
+
# Added by rhc-create-domain on #{`date`}
|
175
|
+
Host *.#{rhc_domain}
|
176
|
+
IdentityFile #{ssh_key_file_path}
|
177
|
+
VerifyHostKeyDNS yes
|
178
|
+
StrictHostKeyChecking no
|
179
|
+
UserKnownHostsFile ~/.ssh/libra_known_hosts
|
180
|
+
|
181
|
+
SSH
|
182
|
+
f.close
|
183
|
+
rescue Errno::EACCES
|
184
|
+
puts "Could not write to #{ssh_config}"
|
185
|
+
puts "Reason: " + $!
|
186
|
+
puts
|
187
|
+
puts "Please correct this first. Then run rerun."
|
188
|
+
puts
|
189
|
+
exit 214
|
190
|
+
rescue Errno::ENOENT
|
191
|
+
# Make directory and config if they do not exist
|
192
|
+
puts "Could not find directory: " + $!
|
193
|
+
puts "creating"
|
194
|
+
FileUtils.mkdir_p ssh_config_d
|
195
|
+
file = File.open(ssh_config, 'w')
|
196
|
+
file.close
|
197
|
+
retry
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
File.chmod(0700, ssh_config_d)
|
202
|
+
File.chmod(0600, ssh_config)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
127
206
|
|
128
207
|
#
|
129
|
-
# Check to see if a
|
208
|
+
# Check to see if a ssh_key_file_path exists, if not create it.
|
130
209
|
#
|
131
210
|
|
132
|
-
if File.readable?(
|
133
|
-
puts "OpenShift Express key found at #{
|
211
|
+
if File.readable?(ssh_key_file_path)
|
212
|
+
puts "OpenShift Express key found at #{ssh_key_file_path}. Reusing..."
|
134
213
|
else
|
135
|
-
puts "Generating OpenShift Express ssh key to #{
|
214
|
+
puts "Generating OpenShift Express ssh key to #{ssh_key_file_path}"
|
136
215
|
# Use system for interaction
|
137
|
-
system("ssh-keygen -t rsa -f '#{
|
216
|
+
system("ssh-keygen -t rsa -f '#{ssh_key_file_path}'")
|
138
217
|
end
|
139
218
|
|
140
|
-
ssh_key = File.open(
|
219
|
+
ssh_key = File.open(ssh_pub_key_file_path).gets.chomp.split(' ')[1]
|
141
220
|
|
142
|
-
puts "Contacting https://#{libra_server}"
|
143
221
|
data = {'namespace' => opt['namespace'],
|
144
|
-
|
145
|
-
|
222
|
+
'rhlogin' => opt['rhlogin'],
|
223
|
+
'ssh' => ssh_key}
|
146
224
|
if (opt['alter'])
|
147
|
-
data[
|
225
|
+
data[:alter] = true
|
148
226
|
not_found_message = "A user with rhlogin '#{opt['rhlogin']}' does not have a registered domain. Be sure to run rhc-create-domain without -a|--alter first."
|
149
227
|
user_info = RHC::get_user_info(libra_server, opt['rhlogin'], password, @http, true, not_found_message)
|
150
228
|
end
|
151
229
|
if debug
|
152
|
-
data[
|
230
|
+
data[:debug] = true
|
153
231
|
end
|
154
232
|
RHC::print_post_data(data)
|
155
233
|
json_data = RHC::generate_json(data)
|
@@ -163,6 +241,7 @@ if response.code == '200'
|
|
163
241
|
RHC::print_response_success(json_resp)
|
164
242
|
json_rhlogininfo = JSON.parse(json_resp['data'])
|
165
243
|
add_rhlogin_config(json_rhlogininfo['rhlogin'], json_rhlogininfo['uuid'])
|
244
|
+
add_ssh_config_host(json_rhlogininfo['rhc_domain'], ssh_key_file_path, ssh_config, ssh_config_d)
|
166
245
|
|
167
246
|
if opt['alter'] != ''
|
168
247
|
puts <<EOF
|
@@ -199,11 +278,13 @@ EOF
|
|
199
278
|
dns_success = false
|
200
279
|
end
|
201
280
|
end
|
281
|
+
puts "You can use rhc-user-info to view any url changes. Be sure to update any links"
|
282
|
+
puts "including the url in your local git config: <local_git_repo>/.git/config"
|
202
283
|
end
|
203
284
|
if dns_success
|
204
|
-
puts "Alteration successful.
|
285
|
+
puts "Alteration successful."
|
205
286
|
else
|
206
|
-
puts "Alteration successful but at least one of the urls is still updating in DNS.
|
287
|
+
puts "Alteration successful but at least one of the urls is still updating in DNS."
|
207
288
|
end
|
208
289
|
puts ""
|
209
290
|
end
|
@@ -214,4 +295,4 @@ EOF
|
|
214
295
|
else
|
215
296
|
RHC::print_response_err(response)
|
216
297
|
end
|
217
|
-
exit
|
298
|
+
exit 1
|
data/bin/rhc-ctl-app
CHANGED
@@ -35,12 +35,13 @@ Control an OpenShift express app
|
|
35
35
|
-a|--app application Application name (alphanumeric) (required)
|
36
36
|
-l|--rhlogin rhlogin Red Hat login (RHN or OpenShift login with OpenShift Express access) (#{rhlogin})
|
37
37
|
-p|--password password RHLogin password (optional, will prompt)
|
38
|
-
-c|--command command (start|stop|force-stop|restart|reload|status|destroy)
|
38
|
+
-c|--command command (start|stop|force-stop|restart|reload|status|destroy|add-alias|remove-alias)
|
39
39
|
-L|--embedded-list List supported embedded cartridges
|
40
40
|
-e|--embed (add|remove|stop|start|restart|status|reload)-$cartridge eg: add-mysql-5.1
|
41
41
|
-b|--bypass Bypass warnings
|
42
42
|
-d|--debug Print Debug info
|
43
43
|
-h|--help Show Usage info
|
44
|
+
--alias Specify server alias (when using add/remove-alias)
|
44
45
|
--config path Path of alternate config file
|
45
46
|
--timeout # Timeout, in seconds, for connection
|
46
47
|
|
@@ -69,6 +70,7 @@ begin
|
|
69
70
|
["--embed", "-e", GetoptLong::REQUIRED_ARGUMENT],
|
70
71
|
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
71
72
|
["--app", "-a", GetoptLong::REQUIRED_ARGUMENT],
|
73
|
+
["--alias", GetoptLong::REQUIRED_ARGUMENT],
|
72
74
|
["--config", GetoptLong::REQUIRED_ARGUMENT],
|
73
75
|
["--command", "-c", GetoptLong::REQUIRED_ARGUMENT],
|
74
76
|
["--timeout", GetoptLong::REQUIRED_ARGUMENT]
|
@@ -121,14 +123,14 @@ unless opt["embed"] or opt["command"]
|
|
121
123
|
end
|
122
124
|
|
123
125
|
if opt["command"]
|
124
|
-
unless opt["command"] =~ /^(start|stop|force-stop|restart|reload|status|destroy)$/
|
125
|
-
puts "Invalid command '#{opt["command"]}' specified. Valid commands are (start|stop|force-stop|restart|reload|status|destroy)"
|
126
|
+
unless opt["command"] =~ /^(start|stop|force-stop|restart|reload|status|destroy|add-alias|remove-alias)$/
|
127
|
+
puts "Invalid command '#{opt["command"]}' specified. Valid commands are (start|stop|force-stop|restart|reload|status|destroy|add-alias|remove-alias)"
|
126
128
|
p_usage
|
127
129
|
end
|
128
130
|
elsif opt["embed"]
|
129
131
|
action = opt['embed'].split('-')[0]
|
130
132
|
unless action =~ /^(add|remove|start|stop|restart|status|reload)$/
|
131
|
-
puts "Invalid embed action '#{action}' specified. Valid embed actions are (add|remove|start|stop|restart|status|reload)"
|
133
|
+
puts "Invalid embed action '#{action}' specified. Valid embed actions are (add|remove|start|stop|restart|status|reload|add-alias|remove-alias)"
|
132
134
|
p_usage
|
133
135
|
end
|
134
136
|
end
|
@@ -137,23 +139,17 @@ unless opt['rhlogin'] && opt['app'] && (opt['command'] || opt['embed'])
|
|
137
139
|
p_usage
|
138
140
|
end
|
139
141
|
|
142
|
+
if opt['command'] and (opt['alias'] and !(opt['command'] =~ /-alias$/)) || ((opt['command'] =~ /-alias$/) and ! opt['alias'])
|
143
|
+
puts "When specifying alias make sure to use -c add-alias or -c remove-alias"
|
144
|
+
p_usage
|
145
|
+
end
|
146
|
+
|
147
|
+
|
140
148
|
password = opt['password']
|
141
149
|
if !password
|
142
150
|
password = RHC::get_password
|
143
151
|
end
|
144
152
|
|
145
|
-
user_info = RHC::get_user_info(libra_server, opt['rhlogin'], password, @http, debug, false)
|
146
|
-
app = user_info['app_info'][opt['app']]
|
147
|
-
if app
|
148
|
-
framework = app['framework']
|
149
|
-
else
|
150
|
-
puts "Application not found: #{opt['app']}"
|
151
|
-
exit 101
|
152
|
-
end
|
153
|
-
#
|
154
|
-
# Send Warning
|
155
|
-
#
|
156
|
-
|
157
153
|
opt["command"] = "deconfigure" if opt["command"] == "destroy"
|
158
154
|
|
159
155
|
if !opt["bypass"] and opt["command"] == "deconfigure"
|
@@ -176,6 +172,7 @@ WARNING
|
|
176
172
|
end
|
177
173
|
end
|
178
174
|
|
175
|
+
framework = nil
|
179
176
|
if opt['embed']
|
180
177
|
action = opt['embed'].split('-')[0]
|
181
178
|
# override action if it's in the mapper
|
@@ -187,25 +184,4 @@ else
|
|
187
184
|
url = URI.parse("https://#{libra_server}/broker/cartridge")
|
188
185
|
end
|
189
186
|
|
190
|
-
|
191
|
-
:action => action,
|
192
|
-
:app_name => "#{opt['app']}",
|
193
|
-
:rhlogin => "#{opt['rhlogin']}"
|
194
|
-
}
|
195
|
-
if debug
|
196
|
-
data['debug'] = "true"
|
197
|
-
end
|
198
|
-
|
199
|
-
json_data = RHC::generate_json(data)
|
200
|
-
puts "Submitting form: #{json_data}" if debug
|
201
|
-
|
202
|
-
puts "Contacting https://#{libra_server}"
|
203
|
-
|
204
|
-
response = RHC::http_post(@http, url, json_data, password)
|
205
|
-
|
206
|
-
if response.code == '200'
|
207
|
-
json_resp = JSON.parse(response.body)
|
208
|
-
RHC::print_response_success(json_resp, true)
|
209
|
-
else
|
210
|
-
RHC::print_response_err(response)
|
211
|
-
end
|
187
|
+
RHC::ctl_app(libra_server, @http, opt['app'], opt['rhlogin'], password, action, opt['embed'], framework, opt['alias'])
|
data/bin/rhc-snapshot
CHANGED
data/bin/rhc-tail-files
CHANGED
data/bin/rhc-user-info
CHANGED
@@ -102,7 +102,7 @@ if opt['info']
|
|
102
102
|
puts "User Info"
|
103
103
|
puts "========="
|
104
104
|
puts "Namespace: #{user_info['user_info']['namespace']}"
|
105
|
-
puts " UUID: #{user_info['user_info']['uuid']}"
|
105
|
+
#puts " UUID: #{user_info['user_info']['uuid']}"
|
106
106
|
puts " RHLogin: #{user_info['user_info']['rhlogin']}"
|
107
107
|
puts " ssh_key: #{user_info['user_info']['ssh_key']}"
|
108
108
|
end
|
@@ -112,27 +112,34 @@ if opt['apps']
|
|
112
112
|
|
113
113
|
puts "Application Info"
|
114
114
|
puts "================"
|
115
|
-
user_info['app_info'].
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
115
|
+
unless user_info['app_info'].empty?
|
116
|
+
user_info['app_info'].each do |key, val|
|
117
|
+
puts key
|
118
|
+
puts " Framework: #{val['framework']}"
|
119
|
+
puts " Creation: #{val['creation_time']}"
|
120
|
+
puts " UUID: #{val['uuid']}"
|
121
|
+
puts " Git URL: ssh://#{val['uuid']}@#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/~/git/#{key}.git/"
|
122
|
+
puts " Public URL: http://#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/"
|
123
|
+
if val['aliases'] && !val['aliases'].empty?
|
124
|
+
puts " Aliases: #{val['aliases'].join(', ')}"
|
125
|
+
end
|
126
|
+
puts ""
|
127
|
+
puts " Embedded: "
|
128
|
+
if val['embedded'] && !val['embedded'].empty?
|
129
|
+
val['embedded'].each do |embed_key, embed_val|
|
130
|
+
if embed_val.has_key?('info') && !embed_val['info'].empty?
|
131
|
+
puts " #{embed_key} - #{embed_val['info']}"
|
132
|
+
else
|
133
|
+
puts " #{embed_key}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
else
|
137
|
+
puts " None"
|
138
|
+
end
|
139
|
+
puts ""
|
140
|
+
end
|
141
|
+
else
|
142
|
+
puts "No applications found. You can use rhc-create-app to create new applications."
|
136
143
|
end
|
137
144
|
|
138
145
|
end
|
data/lib/rhc-common.rb
CHANGED
@@ -42,13 +42,23 @@ module RHC
|
|
42
42
|
@mydebug = false
|
43
43
|
broker_version = "?.?.?"
|
44
44
|
api_version = "?.?.?"
|
45
|
+
|
46
|
+
DEBUG_INGORE_KEYS = {
|
47
|
+
'result' => nil,
|
48
|
+
'debug' => nil,
|
49
|
+
'exit_code' => nil,
|
50
|
+
'messages' => nil,
|
51
|
+
'data' => nil,
|
52
|
+
'api' => nil,
|
53
|
+
'broker' => nil
|
54
|
+
}
|
45
55
|
|
46
56
|
def self.timeout(val)
|
47
57
|
if val
|
48
58
|
@mytimeout = val.to_i
|
49
59
|
unless @mytimeout > 0
|
50
60
|
puts 'Timeout must be specified as a number greater than 0'
|
51
|
-
exit
|
61
|
+
exit 1
|
52
62
|
end
|
53
63
|
end
|
54
64
|
end
|
@@ -77,11 +87,10 @@ module RHC
|
|
77
87
|
end
|
78
88
|
|
79
89
|
def self.get_cartridges_list(libra_server, net_http, cart_type="standalone", print_result=nil)
|
80
|
-
puts "
|
81
|
-
puts " (please excuse the delay)"
|
90
|
+
puts "Obtaining list of cartridges (please excuse the delay)..."
|
82
91
|
data = {'cart_type' => cart_type}
|
83
92
|
if @mydebug
|
84
|
-
data[
|
93
|
+
data[:debug] = true
|
85
94
|
end
|
86
95
|
print_post_data(data)
|
87
96
|
json_data = generate_json(data)
|
@@ -96,7 +105,7 @@ module RHC
|
|
96
105
|
begin
|
97
106
|
json_resp = JSON.parse(response.body)
|
98
107
|
rescue JSON::ParserError
|
99
|
-
exit
|
108
|
+
exit 1
|
100
109
|
end
|
101
110
|
update_server_api_v(json_resp)
|
102
111
|
if print_result
|
@@ -105,7 +114,7 @@ module RHC
|
|
105
114
|
begin
|
106
115
|
carts = (JSON.parse(json_resp['data']))['carts']
|
107
116
|
rescue JSON::ParserError
|
108
|
-
exit
|
117
|
+
exit 1
|
109
118
|
end
|
110
119
|
carts
|
111
120
|
end
|
@@ -173,11 +182,9 @@ module RHC
|
|
173
182
|
end
|
174
183
|
|
175
184
|
def self.get_user_info(libra_server, rhlogin, password, net_http, print_result, not_found_message=nil)
|
176
|
-
|
177
|
-
puts "Contacting https://#{libra_server}"
|
178
185
|
data = {'rhlogin' => rhlogin}
|
179
186
|
if @mydebug
|
180
|
-
data[
|
187
|
+
data[:debug] = true
|
181
188
|
end
|
182
189
|
print_post_data(data)
|
183
190
|
json_data = generate_json(data)
|
@@ -199,12 +206,12 @@ module RHC
|
|
199
206
|
else
|
200
207
|
print_response_err(response)
|
201
208
|
end
|
202
|
-
exit
|
209
|
+
exit 1
|
203
210
|
end
|
204
211
|
begin
|
205
212
|
json_resp = JSON.parse(response.body)
|
206
213
|
rescue JSON::ParserError
|
207
|
-
exit
|
214
|
+
exit 1
|
208
215
|
end
|
209
216
|
update_server_api_v(json_resp)
|
210
217
|
if print_result
|
@@ -213,7 +220,7 @@ module RHC
|
|
213
220
|
begin
|
214
221
|
user_info = JSON.parse(json_resp['data'].to_s)
|
215
222
|
rescue JSON::ParserError
|
216
|
-
exit
|
223
|
+
exit 1
|
217
224
|
end
|
218
225
|
user_info
|
219
226
|
end
|
@@ -224,6 +231,9 @@ module RHC
|
|
224
231
|
print "Password: "
|
225
232
|
system "stty -echo"
|
226
233
|
password = gets.chomp
|
234
|
+
rescue Interrupt
|
235
|
+
puts "\n"
|
236
|
+
exit 1
|
227
237
|
ensure
|
228
238
|
system "stty echo"
|
229
239
|
end
|
@@ -234,6 +244,7 @@ module RHC
|
|
234
244
|
def self.http_post(http, url, json_data, password)
|
235
245
|
req = http::Post.new(url.path)
|
236
246
|
|
247
|
+
puts "Contacting #{url.scheme}://#{url.host}" if @mydebug
|
237
248
|
req.set_form_data({'json_data' => json_data, 'password' => password})
|
238
249
|
http = http.new(url.host, url.port)
|
239
250
|
http.open_timeout = @mytimeout
|
@@ -263,14 +274,14 @@ module RHC
|
|
263
274
|
if (!@mydebug)
|
264
275
|
puts "Re-run with -d for more information."
|
265
276
|
end
|
266
|
-
exit_code =
|
277
|
+
exit_code = 1
|
267
278
|
if response.content_type == 'application/json'
|
268
279
|
puts "JSON response:"
|
269
280
|
begin
|
270
281
|
json_resp = JSON.parse(response.body)
|
271
282
|
exit_code = print_json_body(json_resp)
|
272
283
|
rescue JSON::ParserError
|
273
|
-
exit_code =
|
284
|
+
exit_code = 1
|
274
285
|
end
|
275
286
|
elsif @mydebug
|
276
287
|
puts "HTTP response from server is #{response.body}"
|
@@ -288,18 +299,18 @@ module RHC
|
|
288
299
|
end
|
289
300
|
end
|
290
301
|
|
291
|
-
def self.print_response_success(json_resp,
|
302
|
+
def self.print_response_success(json_resp, print_result=false)
|
292
303
|
if @mydebug
|
293
304
|
puts "Response from server:"
|
294
|
-
print_json_body(json_resp)
|
295
|
-
elsif
|
305
|
+
print_json_body(json_resp, print_result)
|
306
|
+
elsif print_result
|
296
307
|
print_json_body(json_resp)
|
297
308
|
else
|
298
309
|
print_response_messages(json_resp)
|
299
310
|
end
|
300
311
|
end
|
301
312
|
|
302
|
-
def self.print_json_body(json_resp)
|
313
|
+
def self.print_json_body(json_resp, print_result=true)
|
303
314
|
print_response_messages(json_resp)
|
304
315
|
exit_code = json_resp['exit_code']
|
305
316
|
if @mydebug
|
@@ -311,20 +322,20 @@ module RHC
|
|
311
322
|
puts "Exit Code: #{exit_code}"
|
312
323
|
if (json_resp.length > 3)
|
313
324
|
json_resp.each do |k,v|
|
314
|
-
if (k
|
325
|
+
if !DEBUG_INGORE_KEYS.has_key?(k)
|
315
326
|
puts "#{k.to_s}: #{v.to_s}"
|
316
327
|
end
|
317
328
|
end
|
318
329
|
end
|
319
330
|
end
|
331
|
+
if json_resp['api']
|
332
|
+
puts "API version: #{json_resp['api']}"
|
333
|
+
end
|
334
|
+
if json_resp['broker']
|
335
|
+
puts "Broker version: #{json_resp['broker']}"
|
336
|
+
end
|
320
337
|
end
|
321
|
-
if json_resp['
|
322
|
-
puts "API version: #{json_resp['api']}"
|
323
|
-
end
|
324
|
-
if json_resp['broker']
|
325
|
-
puts "Broker version: #{json_resp['broker']}"
|
326
|
-
end
|
327
|
-
if json_resp['result']
|
338
|
+
if print_result && json_resp['result']
|
328
339
|
puts ''
|
329
340
|
puts 'RESULT:'
|
330
341
|
puts json_resp['result']
|
@@ -341,6 +352,270 @@ module RHC
|
|
341
352
|
resp = dns.getresources(host, Resolv::DNS::Resource::IN::A)
|
342
353
|
return resp.any?
|
343
354
|
end
|
355
|
+
|
356
|
+
def self.create_app(libra_server, net_http, user_info, app_name, app_type, rhlogin, password, repo_dir=nil, no_dns=false, no_git=false, no_git_message=nil)
|
357
|
+
puts "Attempting to create remote application space: #{app_name}"
|
358
|
+
|
359
|
+
data = {:cartridge => app_type,
|
360
|
+
:action => 'configure',
|
361
|
+
:app_name => app_name,
|
362
|
+
:rhlogin => rhlogin
|
363
|
+
}
|
364
|
+
if @mydebug
|
365
|
+
data[:debug] = true
|
366
|
+
end
|
367
|
+
json_data = generate_json(data)
|
368
|
+
|
369
|
+
url = URI.parse("https://#{libra_server}/broker/cartridge")
|
370
|
+
response = http_post(net_http, url, json_data, password)
|
371
|
+
|
372
|
+
if response.code == '200'
|
373
|
+
json_resp = JSON.parse(response.body)
|
374
|
+
print_response_success(json_resp)
|
375
|
+
json_data = JSON.parse(json_resp['data'])
|
376
|
+
health_check_path = json_data['health_check_path']
|
377
|
+
app_uuid = json_data['uuid']
|
378
|
+
result = json_resp['result']
|
379
|
+
puts "DEBUG: '#{app_name}' creation returned success." if @mydebug
|
380
|
+
else
|
381
|
+
print_response_err(response)
|
382
|
+
end
|
383
|
+
|
384
|
+
#
|
385
|
+
# At this point, we need to register a handler to guarantee app
|
386
|
+
# cleanup on any exceptions or calls to exit
|
387
|
+
#
|
388
|
+
at_exit do
|
389
|
+
unless $!.nil? || $!.is_a?(SystemExit) && $!.success?
|
390
|
+
puts "Cleaning up application"
|
391
|
+
destroy_app(libra_server, net_http, app_name, rhlogin, password)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
namespace = user_info['user_info']['namespace']
|
396
|
+
rhc_domain = user_info['user_info']['rhc_domain']
|
397
|
+
|
398
|
+
fqdn = "#{app_name}-#{namespace}.#{rhc_domain}"
|
399
|
+
|
400
|
+
loop = 0
|
401
|
+
#
|
402
|
+
# Confirm that the host exists in DNS
|
403
|
+
#
|
404
|
+
unless no_dns
|
405
|
+
puts "Now your new domain name is being propagated worldwide (this might take a minute)..."
|
406
|
+
|
407
|
+
# Allow DNS to propogate
|
408
|
+
sleep 15
|
409
|
+
|
410
|
+
# Now start checking for DNS
|
411
|
+
sleep_time = 2
|
412
|
+
while loop < MAX_RETRIES && !hostexist?(fqdn)
|
413
|
+
sleep sleep_time
|
414
|
+
loop+=1
|
415
|
+
puts " retry # #{loop} - Waiting for DNS: #{fqdn}"
|
416
|
+
sleep_time = delay(sleep_time)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
# If the hostname couldn't be resolved, print out the git URL
|
421
|
+
# and exit cleanly. This will help solve issues where DNS times
|
422
|
+
# out in APAC, etc on resolution.
|
423
|
+
if loop >= MAX_RETRIES
|
424
|
+
puts <<WARNING
|
425
|
+
|
426
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
427
|
+
WARNING: We weren't able to lookup your hostname (#{fqdn})
|
428
|
+
in a reasonable amount of time. This can happen periodically and will just
|
429
|
+
take an extra minute or two to propagate depending on where you are in the
|
430
|
+
world. Once you are able to access your application in a browser, you can then
|
431
|
+
clone your git repository.
|
432
|
+
|
433
|
+
Application URL: http://#{fqdn}
|
434
|
+
|
435
|
+
Git Repository URL: #{git_url}
|
436
|
+
|
437
|
+
Git Clone command:
|
438
|
+
git clone #{git_url} #{repo_dir}
|
439
|
+
|
440
|
+
If you can't get your application '#{app_name}' running in the browser, you can
|
441
|
+
also try destroying and recreating the application as well using:
|
442
|
+
|
443
|
+
rhc-ctl-app -c destroy -a #{app_name} -l #{rhlogin}
|
444
|
+
|
445
|
+
If this doesn't work for you, let us know in the forums or in IRC and we'll
|
446
|
+
make sure to get you up and running.
|
447
|
+
|
448
|
+
Forums: https://www.redhat.com/openshift/forums/express
|
449
|
+
|
450
|
+
IRC: #openshift (on Freenode)
|
451
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
452
|
+
|
453
|
+
WARNING
|
454
|
+
exit 0
|
455
|
+
end
|
456
|
+
|
457
|
+
#
|
458
|
+
# Pull new repo locally
|
459
|
+
#
|
460
|
+
|
461
|
+
git_url = "ssh://#{app_uuid}@#{app_name}-#{namespace}.#{rhc_domain}/~/git/#{app_name}.git/"
|
462
|
+
|
463
|
+
unless no_git
|
464
|
+
puts "Pulling new repo down"
|
465
|
+
|
466
|
+
puts "git clone --quiet #{git_url} #{repo_dir}" if @mydebug
|
467
|
+
quiet = (@mydebug ? ' ' : '--quiet ')
|
468
|
+
git_clone = %x<git clone #{quiet} #{git_url} #{repo_dir}>
|
469
|
+
if $?.exitstatus != 0
|
470
|
+
puts "Error in git clone"
|
471
|
+
puts git_clone
|
472
|
+
exit 216
|
473
|
+
end
|
474
|
+
else
|
475
|
+
if no_git_message
|
476
|
+
puts no_git_message
|
477
|
+
else
|
478
|
+
puts <<IMPORTANT
|
479
|
+
|
480
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
481
|
+
IMPORTANT: Since the -n flag was specified, no local repo has been created.
|
482
|
+
This means you can't make changes to your published application until after
|
483
|
+
you clone the repo yourself. See the git url below for more information.
|
484
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
485
|
+
|
486
|
+
IMPORTANT
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
#
|
491
|
+
# At this point, we need to register a handler to guarantee git
|
492
|
+
# repo cleanup on any exceptions or calls to exit
|
493
|
+
#
|
494
|
+
unless no_git
|
495
|
+
at_exit do
|
496
|
+
unless $!.nil? || $!.is_a?(SystemExit) && $!.success?
|
497
|
+
puts "Cleaning up git repo"
|
498
|
+
FileUtils.rm_rf repo_dir
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
502
|
+
return {:app_name => app_name,
|
503
|
+
:fqdn => fqdn,
|
504
|
+
:health_check_path => health_check_path,
|
505
|
+
:git_url => git_url,
|
506
|
+
:repo_dir => repo_dir,
|
507
|
+
:result => result
|
508
|
+
}
|
509
|
+
end
|
510
|
+
|
511
|
+
def self.check_app_available(net_http, app_name, fqdn, health_check_path, result, git_url, repo_dir, no_git)
|
512
|
+
#
|
513
|
+
# Test several times, doubling sleep time between attempts.
|
514
|
+
#
|
515
|
+
sleep_time = 2
|
516
|
+
attempt = 0
|
517
|
+
puts "Confirming application '#{app_name}' is available"
|
518
|
+
while attempt < MAX_RETRIES
|
519
|
+
attempt += 1
|
520
|
+
puts " Attempt # #{attempt}"
|
521
|
+
url = URI.parse("http://#{fqdn}/#{health_check_path}")
|
522
|
+
begin
|
523
|
+
response = net_http.get_response(url)
|
524
|
+
rescue Exception => e
|
525
|
+
response = nil
|
526
|
+
end
|
527
|
+
if !response.nil? && response.code == "200" && response.body[0,1] == "1"
|
528
|
+
puts <<LOOKSGOOD
|
529
|
+
|
530
|
+
Success! Your application '#{app_name}' is now published here:
|
531
|
+
|
532
|
+
http://#{fqdn}/
|
533
|
+
|
534
|
+
The remote repository is located here:
|
535
|
+
|
536
|
+
#{git_url}
|
537
|
+
|
538
|
+
LOOKSGOOD
|
539
|
+
unless no_git
|
540
|
+
puts <<LOOKSGOOD
|
541
|
+
To make changes to '#{app_name}', commit to #{repo_dir}/.
|
542
|
+
LOOKSGOOD
|
543
|
+
else
|
544
|
+
puts <<LOOKSGOOD
|
545
|
+
To make changes to '#{app_name}', you must first clone it with:
|
546
|
+
|
547
|
+
git clone #{git_url}
|
548
|
+
|
549
|
+
LOOKSGOOD
|
550
|
+
puts <<LOOKSGOOD
|
551
|
+
Then run 'git push' to update your OpenShift Express space.
|
552
|
+
|
553
|
+
LOOKSGOOD
|
554
|
+
end
|
555
|
+
if result && !result.empty?
|
556
|
+
|
557
|
+
puts <<LOOKSGOOD
|
558
|
+
|
559
|
+
#{result}
|
560
|
+
|
561
|
+
LOOKSGOOD
|
562
|
+
end
|
563
|
+
return true
|
564
|
+
end
|
565
|
+
if !response.nil? && @mydebug
|
566
|
+
puts "Server responded with #{response.code}"
|
567
|
+
puts response.body unless response.code == '503'
|
568
|
+
end
|
569
|
+
puts
|
570
|
+
puts " sleeping #{sleep_time} seconds"
|
571
|
+
sleep sleep_time
|
572
|
+
sleep_time = delay(sleep_time)
|
573
|
+
end
|
574
|
+
return false
|
575
|
+
end
|
576
|
+
|
577
|
+
def self.destroy_app(libra_server, net_http, app_name, rhlogin, password)
|
578
|
+
json_data = generate_json(
|
579
|
+
{:action => 'deconfigure',
|
580
|
+
:app_name => app_name,
|
581
|
+
:rhlogin => rhlogin
|
582
|
+
})
|
583
|
+
url = URI.parse("https://#{libra_server}/broker/cartridge")
|
584
|
+
http_post(net_http, url, json_data, password)
|
585
|
+
end
|
586
|
+
|
587
|
+
def self.ctl_app(libra_server, net_http, app_name, rhlogin, password, action, embedded=false, framework=nil, server_alias=nil)
|
588
|
+
data = {:action => action,
|
589
|
+
:app_name => app_name,
|
590
|
+
:rhlogin => rhlogin
|
591
|
+
}
|
592
|
+
|
593
|
+
data[:server_alias] = server_alias if server_alias
|
594
|
+
if framework
|
595
|
+
data[:cartridge] = framework
|
596
|
+
end
|
597
|
+
|
598
|
+
if @mydebug
|
599
|
+
data[:debug] = true
|
600
|
+
end
|
601
|
+
|
602
|
+
json_data = generate_json(data)
|
603
|
+
|
604
|
+
url = nil
|
605
|
+
if embedded
|
606
|
+
url = URI.parse("https://#{libra_server}/broker/embed_cartridge")
|
607
|
+
else
|
608
|
+
url = URI.parse("https://#{libra_server}/broker/cartridge")
|
609
|
+
end
|
610
|
+
response = http_post(net_http, url, json_data, password)
|
611
|
+
|
612
|
+
if response.code == '200'
|
613
|
+
json_resp = JSON.parse(response.body)
|
614
|
+
print_response_success(json_resp, true)
|
615
|
+
else
|
616
|
+
print_response_err(response)
|
617
|
+
end
|
618
|
+
end
|
344
619
|
|
345
620
|
end
|
346
621
|
|