rhc 1.8.9 → 1.9.6
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/bin/rhc +2 -0
- data/lib/rhc.rb +0 -1
- data/lib/rhc/command_runner.rb +11 -8
- data/lib/rhc/commands.rb +1 -0
- data/lib/rhc/commands/base.rb +0 -4
- data/lib/rhc/commands/port_forward.rb +3 -1
- data/lib/rhc/config.rb +1 -1
- data/lib/rhc/helpers.rb +6 -5
- data/lib/rhc/highline_extensions.rb +25 -4
- data/lib/rhc/output_helpers.rb +1 -0
- data/lib/rhc/rest.rb +2 -0
- data/lib/rhc/rest/alias.rb +9 -15
- data/lib/rhc/rest/application.rb +11 -4
- data/lib/rhc/rest/base.rb +12 -2
- data/lib/rhc/rest/cartridge.rb +3 -1
- data/lib/rhc/rest/client.rb +12 -45
- data/lib/rhc/rest/domain.rb +6 -1
- data/lib/rhc/rest/mock.rb +4 -9
- data/lib/rhc/wizard.rb +0 -5
- data/spec/rhc/commands/app_spec.rb +14 -0
- data/spec/rhc/commands/port_forward_spec.rb +1 -1
- data/spec/rhc/helpers_spec.rb +1 -1
- data/spec/rhc/highline_extensions_spec.rb +8 -0
- data/spec/rhc/rest_application_spec.rb +6 -0
- data/spec/rhc/rest_client_spec.rb +6 -51
- data/spec/rhc/rest_spec.rb +3 -23
- data/spec/spec_helper.rb +1 -0
- metadata +4 -4
data/bin/rhc
CHANGED
data/lib/rhc.rb
CHANGED
data/lib/rhc/command_runner.rb
CHANGED
@@ -22,6 +22,15 @@ module RHC
|
|
22
22
|
false
|
23
23
|
end
|
24
24
|
|
25
|
+
def options_parse_debug
|
26
|
+
if @args.include?("-d") or @args.include?("--debug")
|
27
|
+
@args.delete "-d"
|
28
|
+
@args.delete "--debug"
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
25
34
|
def options_parse_version
|
26
35
|
if @args.include? "--version"
|
27
36
|
say version
|
@@ -43,18 +52,12 @@ module RHC
|
|
43
52
|
def run!
|
44
53
|
trace = false
|
45
54
|
require_program :version, :description
|
46
|
-
#trap('INT') { abort program(:int_message) } if program(:int_message)
|
47
|
-
#trap('INT') { program(:int_block).call } if program(:int_block)
|
48
55
|
|
49
56
|
global_option('-h', '--help', 'Help on any command', :hide => true)
|
50
57
|
global_option('--version', 'Display version information', :hide => true)
|
51
58
|
|
52
|
-
#
|
53
|
-
|
54
|
-
# code left here just in case someone compares this with the original
|
55
|
-
# commander code
|
56
|
-
#parse_global_options
|
57
|
-
#remove_global_options options, @args
|
59
|
+
# special case --debug so all commands can output relevant info on it
|
60
|
+
$terminal.debug = options_parse_debug
|
58
61
|
|
59
62
|
# special case --trace because we need to use it in the runner
|
60
63
|
trace = options_parse_trace
|
data/lib/rhc/commands.rb
CHANGED
data/lib/rhc/commands/base.rb
CHANGED
@@ -85,7 +85,9 @@ module RHC::Commands
|
|
85
85
|
say "Checking available ports ... "
|
86
86
|
|
87
87
|
Net::SSH.start(ssh_uri.host, ssh_uri.user) do |ssh|
|
88
|
-
|
88
|
+
# If a specific gear is targeted, do not include remote (e.g. database) ports
|
89
|
+
list_ports_cmd = "rhc-list-ports#{options.gear ? ' --exclude-remote' : ''}"
|
90
|
+
ssh.exec! list_ports_cmd do |channel, stream, data|
|
89
91
|
if stream == :stderr
|
90
92
|
data.each_line do |line|
|
91
93
|
line.chomp!
|
data/lib/rhc/config.rb
CHANGED
data/lib/rhc/helpers.rb
CHANGED
@@ -198,14 +198,14 @@ module RHC
|
|
198
198
|
$stdout.tty? and not options.noprompt
|
199
199
|
end
|
200
200
|
|
201
|
-
def debug(
|
202
|
-
$
|
201
|
+
def debug(*args)
|
202
|
+
$terminal.debug(*args)
|
203
203
|
end
|
204
|
-
def debug_error(
|
205
|
-
|
204
|
+
def debug_error(*args)
|
205
|
+
$terminal.debug_error(*args)
|
206
206
|
end
|
207
207
|
def debug?
|
208
|
-
|
208
|
+
$terminal.debug?
|
209
209
|
end
|
210
210
|
|
211
211
|
def disable_deprecated?
|
@@ -295,6 +295,7 @@ module RHC
|
|
295
295
|
:connection_info => "Connection URL",
|
296
296
|
:gear_profile => "Gear Size",
|
297
297
|
:visible_to_ssh? => 'Available',
|
298
|
+
:downloaded_cartridge_url => 'From',
|
298
299
|
})
|
299
300
|
|
300
301
|
headings[value]
|
@@ -4,6 +4,8 @@ require 'delegate'
|
|
4
4
|
# Add specific improved functionality
|
5
5
|
#
|
6
6
|
class HighLineExtension < HighLine
|
7
|
+
attr_writer :debug
|
8
|
+
|
7
9
|
[:ask, :agree].each do |sym|
|
8
10
|
define_method(sym) do |*args, &block|
|
9
11
|
separate_blocks
|
@@ -13,6 +15,16 @@ class HighLineExtension < HighLine
|
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
18
|
+
def debug(msg)
|
19
|
+
$stderr.puts "DEBUG: #{msg}" if debug?
|
20
|
+
end
|
21
|
+
def debug_error(e)
|
22
|
+
debug "#{e.message} (#{e.class})\n #{e.backtrace.join("\n ")}"
|
23
|
+
end
|
24
|
+
def debug?
|
25
|
+
@debug
|
26
|
+
end
|
27
|
+
|
16
28
|
# OVERRIDE
|
17
29
|
def say(msg)
|
18
30
|
if msg.respond_to? :to_str
|
@@ -392,19 +404,28 @@ class HighLine::Table
|
|
392
404
|
|
393
405
|
def header_rows
|
394
406
|
@header_rows ||= begin
|
395
|
-
headers <<
|
407
|
+
headers << widths.map{ |w| '-' * w } if headers.present?
|
396
408
|
headers
|
397
409
|
end
|
398
410
|
end
|
399
411
|
|
400
412
|
def rows
|
401
413
|
@rows ||= begin
|
402
|
-
fmt = "#{indent}#{widths.zip(align).map{ |w, al| "%#{al == :right ? '' : '-'}#{w}s" }.join(joiner)}"
|
403
|
-
|
404
414
|
body = (header_rows + source_rows).inject([]) do |a,row|
|
405
415
|
row = row.zip(widths).map{ |column,w| w && w > 0 ? column.textwrap_ansi(w, false) : [column] }
|
406
416
|
(row.map(&:length).max || 0).times do |i|
|
407
|
-
|
417
|
+
s = []
|
418
|
+
row.each_with_index do |lines, j|
|
419
|
+
cell = lines[i]
|
420
|
+
l = cell ? cell.strip_ansi.length : 0
|
421
|
+
s <<
|
422
|
+
if align[j] == :right
|
423
|
+
"#{' '*(widths[j]-l) if l < widths[j]}#{cell}"
|
424
|
+
else
|
425
|
+
"#{cell}#{' '*(widths[j]-l) if l < widths[j]}"
|
426
|
+
end
|
427
|
+
end
|
428
|
+
a << "#{indent}#{s.join(joiner).rstrip}"
|
408
429
|
end
|
409
430
|
a
|
410
431
|
end
|
data/lib/rhc/output_helpers.rb
CHANGED
@@ -90,6 +90,7 @@ module RHC
|
|
90
90
|
say format_table \
|
91
91
|
format_cart_header(cart),
|
92
92
|
get_properties(cart, *properties).
|
93
|
+
concat([[:downloaded_cartridge_url, cart.url]]).
|
93
94
|
concat([[cart.scalable? ? :scaling : :gears, format_cart_gears(cart)]]).
|
94
95
|
concat(cart.properties.map{ |p| ["#{table_heading(p['name'])}:", p['value']] }.sort{ |a,b| a[0] <=> b[0] }),
|
95
96
|
:delete => true
|
data/lib/rhc/rest.rb
CHANGED
@@ -113,6 +113,8 @@ module RHC
|
|
113
113
|
|
114
114
|
class MultipleCartridgeCreationNotSupported < Exception; end
|
115
115
|
|
116
|
+
class DownloadingCartridgesNotSupported < Exception; end
|
117
|
+
|
116
118
|
class InitialGitUrlNotSupported < Exception; end
|
117
119
|
|
118
120
|
class SslCertificatesNotSupported < Exception; end
|
data/lib/rhc/rest/alias.rb
CHANGED
@@ -10,30 +10,24 @@ module RHC
|
|
10
10
|
|
11
11
|
def destroy
|
12
12
|
debug "Deleting alias #{self.id}"
|
13
|
-
rest_method
|
13
|
+
rest_method :delete
|
14
14
|
end
|
15
15
|
alias :delete :destroy
|
16
16
|
|
17
17
|
def add_certificate(ssl_certificate_content, private_key_content, pass_phrase)
|
18
18
|
debug "Running add_certificate for alias #{@id}"
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
else
|
26
|
-
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases."
|
27
|
-
end
|
19
|
+
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases." unless supports? :update
|
20
|
+
foo = rest_method :update, {
|
21
|
+
:ssl_certificate => ssl_certificate_content,
|
22
|
+
:private_key => private_key_content,
|
23
|
+
:pass_phrase => pass_phrase
|
24
|
+
}
|
28
25
|
end
|
29
26
|
|
30
27
|
def delete_certificate
|
31
28
|
debug "Running delete_certificate for alias #{@id}"
|
32
|
-
|
33
|
-
|
34
|
-
else
|
35
|
-
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases."
|
36
|
-
end
|
29
|
+
raise RHC::Rest::SslCertificatesNotSupported, "The server does not support SSL certificates for custom aliases." unless supports? :update
|
30
|
+
rest_method :update, {}
|
37
31
|
end
|
38
32
|
|
39
33
|
def <=>(a)
|
data/lib/rhc/rest/application.rb
CHANGED
@@ -24,25 +24,32 @@ module RHC
|
|
24
24
|
def add_cartridge(cart, options={})
|
25
25
|
debug "Adding cartridge #{name}"
|
26
26
|
clear_attribute :cartridges
|
27
|
-
|
28
|
-
"ADD_CARTRIDGE",
|
27
|
+
cart =
|
29
28
|
if cart.is_a? String
|
30
29
|
{:name => cart}
|
31
30
|
elsif cart.respond_to? :[]
|
32
31
|
cart
|
33
32
|
else
|
34
33
|
cart.url ? {:url => cart.url} : {:name => cart.name}
|
35
|
-
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if cart.respond_to?(:[]) and cart[:url] and !has_param?('ADD_CARTRIDGE', 'url')
|
37
|
+
raise RHC::Rest::DownloadingCartridgesNotSupported, "The server does not support downloading cartridges."
|
38
|
+
end
|
39
|
+
|
40
|
+
rest_method(
|
41
|
+
"ADD_CARTRIDGE",
|
42
|
+
cart,
|
36
43
|
options
|
37
44
|
)
|
38
45
|
end
|
39
46
|
|
40
47
|
def cartridges
|
41
|
-
debug "Getting all cartridges for application #{name}"
|
42
48
|
@cartridges ||=
|
43
49
|
unless (carts = attributes['cartridges']).nil?
|
44
50
|
carts.map{|x| Cartridge.new(x, client) }
|
45
51
|
else
|
52
|
+
debug "Getting all cartridges for application #{name}"
|
46
53
|
rest_method "LIST_CARTRIDGES"
|
47
54
|
end
|
48
55
|
end
|
data/lib/rhc/rest/base.rb
CHANGED
@@ -17,7 +17,7 @@ module RHC
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def rest_method(link_name, payload={}, options={})
|
20
|
-
link =
|
20
|
+
link = link(link_name)
|
21
21
|
raise "No link defined for #{link_name}" unless link
|
22
22
|
url = link['href']
|
23
23
|
url = url.gsub(/:\w+/) { |s| options[:params][s] } if options[:params]
|
@@ -35,12 +35,22 @@ module RHC
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def supports?(sym)
|
38
|
-
!!(
|
38
|
+
!!link(sym)
|
39
|
+
end
|
40
|
+
|
41
|
+
def has_param?(sym, name)
|
42
|
+
if l = link(sym)
|
43
|
+
(l['required_params'] || []).any?{ |p| p['name'] == name} or (l['optional_params'] || []).any?{ |p| p['name'] == name}
|
44
|
+
end
|
39
45
|
end
|
40
46
|
|
41
47
|
protected
|
42
48
|
attr_reader :client
|
43
49
|
|
50
|
+
def link(sym)
|
51
|
+
(links[sym.to_s] || links[sym.to_s.upcase])
|
52
|
+
end
|
53
|
+
|
44
54
|
def debug(msg, obj=nil)
|
45
55
|
client.debug("#{msg}#{obj ? " #{obj}" : ''}") if client && client.debug?
|
46
56
|
end
|
data/lib/rhc/rest/cartridge.rb
CHANGED
@@ -3,7 +3,9 @@ module RHC
|
|
3
3
|
class Cartridge < Base
|
4
4
|
HIDDEN_TAGS = [:framework, :web_framework, :cartridge].map(&:to_s)
|
5
5
|
|
6
|
-
define_attr :type, :name, :display_name, :properties, :gear_profile, :status_messages, :scales_to, :scales_from, :scales_with,
|
6
|
+
define_attr :type, :name, :display_name, :properties, :gear_profile, :status_messages, :scales_to, :scales_from, :scales_with,
|
7
|
+
:current_scale, :supported_scales_to, :supported_scales_from, :tags, :description, :collocated_with, :base_gear_storage,
|
8
|
+
:additional_gear_storage, :url
|
7
9
|
|
8
10
|
def scalable?
|
9
11
|
supported_scales_to != supported_scales_from
|
data/lib/rhc/rest/client.rb
CHANGED
@@ -36,26 +36,10 @@ module RHC
|
|
36
36
|
@user ||= api.rest_method "GET_USER"
|
37
37
|
end
|
38
38
|
|
39
|
-
def sshkeys
|
40
|
-
debug "Finding all keys for #{user.login}"
|
41
|
-
user.keys
|
42
|
-
end
|
43
|
-
|
44
|
-
def add_key(name, key, content)
|
45
|
-
debug "Adding key #{key} for #{user.login}"
|
46
|
-
user.add_key name, key, content
|
47
|
-
end
|
48
|
-
|
49
|
-
def delete_key(name)
|
50
|
-
debug "Deleting key '#{name}'"
|
51
|
-
key = find_key(name)
|
52
|
-
key.destroy
|
53
|
-
end
|
54
|
-
|
55
39
|
#Find Domain by namesapce
|
56
40
|
def find_domain(id)
|
57
41
|
debug "Finding domain #{id}"
|
58
|
-
domains.each { |domain| return domain if domain.id == id }
|
42
|
+
domains.each { |domain| return domain if domain.id.downcase == id.downcase }
|
59
43
|
|
60
44
|
raise DomainNotFoundException.new("Domain #{id} not found")
|
61
45
|
end
|
@@ -120,17 +104,17 @@ module RHC
|
|
120
104
|
end
|
121
105
|
|
122
106
|
def sshkeys
|
123
|
-
|
107
|
+
debug "Finding all keys for #{user.login}"
|
124
108
|
user.keys
|
125
109
|
end
|
126
110
|
|
127
111
|
def add_key(name, key, content)
|
128
|
-
|
112
|
+
debug "Adding key #{key} for #{user.login}"
|
129
113
|
user.add_key name, key, content
|
130
114
|
end
|
131
115
|
|
132
116
|
def delete_key(name)
|
133
|
-
|
117
|
+
debug "Deleting key '#{name}'"
|
134
118
|
key = find_key(name)
|
135
119
|
key.destroy
|
136
120
|
end
|
@@ -182,12 +166,6 @@ module RHC
|
|
182
166
|
h
|
183
167
|
end
|
184
168
|
end
|
185
|
-
|
186
|
-
def logout
|
187
|
-
#TODO logout
|
188
|
-
debug "Logout/Close client"
|
189
|
-
end
|
190
|
-
alias :close :logout
|
191
169
|
end
|
192
170
|
|
193
171
|
class Client < Base
|
@@ -234,10 +212,6 @@ module RHC
|
|
234
212
|
debug "Connecting to #{@end_point}"
|
235
213
|
end
|
236
214
|
|
237
|
-
def debug?
|
238
|
-
@debug
|
239
|
-
end
|
240
|
-
|
241
215
|
def url
|
242
216
|
@end_point
|
243
217
|
end
|
@@ -260,9 +234,9 @@ module RHC
|
|
260
234
|
auth = options[:auth] || self.auth
|
261
235
|
response = nil
|
262
236
|
|
263
|
-
debug "Request #{args[0].to_s.upcase} #{args[1]}#{"?#{args[2].map{|a| a.join('=')}.join(' ')}" if args[2] && args[0] == 'GET'}"
|
237
|
+
debug "Request #{args[0].to_s.upcase} #{args[1]}#{"?#{args[2].map{|a| a.join('=')}.join(' ')}" if args[2] && args[0] == 'GET'}"
|
264
238
|
time = Benchmark.realtime{ response = client.request(*(args << true)) }
|
265
|
-
debug " code %s %4i ms" % [response.status, (time*1000).to_i] if
|
239
|
+
debug " code %s %4i ms" % [response.status, (time*1000).to_i] if response
|
266
240
|
|
267
241
|
next if retry_proxy(response, i, args, client)
|
268
242
|
auth.retry_auth?(response, self) and next if auth
|
@@ -335,10 +309,7 @@ module RHC
|
|
335
309
|
rescue RHC::Rest::Exception
|
336
310
|
raise
|
337
311
|
rescue => e
|
338
|
-
|
339
|
-
logger.debug "#{e.message} (#{e.class})"
|
340
|
-
logger.debug e.backtrace.join("\n ")
|
341
|
-
end
|
312
|
+
debug_error(e)
|
342
313
|
raise ConnectionException.new("An unexpected error occured: #{e.message}").tap{ |n| n.set_backtrace(e.backtrace) }
|
343
314
|
end
|
344
315
|
end
|
@@ -389,9 +360,9 @@ module RHC
|
|
389
360
|
cert = ctx.current_cert
|
390
361
|
if cert && (cert.subject.cmp(cert.issuer) == 0)
|
391
362
|
@self_signed = true
|
392
|
-
debug "SSL Verification failed -- Using self signed cert"
|
363
|
+
debug "SSL Verification failed -- Using self signed cert"
|
393
364
|
else
|
394
|
-
debug "SSL Verification failed -- Preverify: #{is_ok}, Error: #{ctx.error_string} (#{ctx.error})"
|
365
|
+
debug "SSL Verification failed -- Preverify: #{is_ok}, Error: #{ctx.error_string} (#{ctx.error})"
|
395
366
|
end
|
396
367
|
return false
|
397
368
|
end
|
@@ -456,7 +427,7 @@ module RHC
|
|
456
427
|
|
457
428
|
def retry_proxy(response, i, args, client)
|
458
429
|
if response.status == 502
|
459
|
-
debug "ERROR: Received bad gateway from server, will retry once if this is a GET"
|
430
|
+
debug "ERROR: Received bad gateway from server, will retry once if this is a GET"
|
460
431
|
return true if i == 0 && args[0] == :get
|
461
432
|
raise ConnectionException.new(
|
462
433
|
"An error occurred while communicating with the server. This problem may only be temporary."\
|
@@ -529,7 +500,7 @@ module RHC
|
|
529
500
|
m.blank?
|
530
501
|
end
|
531
502
|
rescue => e
|
532
|
-
|
503
|
+
debug "Response did not include a message from server: #{e.message}"
|
533
504
|
end
|
534
505
|
case response.status
|
535
506
|
when 400
|
@@ -571,10 +542,6 @@ module RHC
|
|
571
542
|
end
|
572
543
|
|
573
544
|
private
|
574
|
-
def logger
|
575
|
-
@logger ||= Logger.new(STDOUT)
|
576
|
-
end
|
577
|
-
|
578
545
|
def messages_to_error(messages)
|
579
546
|
errors, remaining = messages.partition{ |m| (m['severity'] || "").upcase == 'ERROR' }
|
580
547
|
if errors.present?
|
@@ -598,7 +565,7 @@ module RHC
|
|
598
565
|
# HTTPClient, being sure to add the http protocol
|
599
566
|
# if not specified already
|
600
567
|
proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
601
|
-
ENV['http_proxy'] = "http://#{proxy}" if proxy && proxy !~ /^(\w+):\/\//
|
568
|
+
ENV['http_proxy'] = "http://#{proxy}" if proxy.present? && proxy !~ /^(\w+):\/\//
|
602
569
|
end
|
603
570
|
end
|
604
571
|
end
|
data/lib/rhc/rest/domain.rb
CHANGED
@@ -22,6 +22,11 @@ module RHC
|
|
22
22
|
cart.url ? {:url => cart.url} : cart.name
|
23
23
|
end
|
24
24
|
end.compact.uniq
|
25
|
+
|
26
|
+
if cartridges.any?{ |c| c.is_a?(Hash) and c[:url] } and !has_param?('ADD_APPLICATION', 'cartridges[][url]')
|
27
|
+
raise RHC::Rest::DownloadingCartridgesNotSupported, "The server does not support downloading cartridges."
|
28
|
+
end
|
29
|
+
|
25
30
|
if client.api_version_negotiated >= 1.3
|
26
31
|
payload[:cartridges] = cartridges
|
27
32
|
else
|
@@ -29,7 +34,7 @@ module RHC
|
|
29
34
|
payload[:cartridge] = cartridges.first
|
30
35
|
end
|
31
36
|
|
32
|
-
if
|
37
|
+
if payload[:initial_git_url] and !has_param?('ADD_APPLICATION', 'initial_git_url')
|
33
38
|
raise RHC::Rest::InitialGitUrlNotSupported, "The server does not support creating applications from a source repository."
|
34
39
|
end
|
35
40
|
|
data/lib/rhc/rest/mock.rb
CHANGED
@@ -161,14 +161,14 @@ module RHC::Rest::Mock
|
|
161
161
|
def stub_no_domains
|
162
162
|
stub_api_request(:get, 'broker/rest/domains', mock_user_auth).to_return(empty_domains)
|
163
163
|
end
|
164
|
-
def stub_one_domain(name)
|
164
|
+
def stub_one_domain(name, optional_params=nil)
|
165
165
|
stub_api_request(:get, 'broker/rest/domains', mock_user_auth).
|
166
166
|
to_return({
|
167
167
|
:body => {
|
168
168
|
:type => 'domains',
|
169
169
|
:data => [{:id => name, :links => mock_response_links([
|
170
170
|
['LIST_APPLICATIONS', "broker/rest/domains/#{name}/applications", 'get'],
|
171
|
-
['ADD_APPLICATION', "broker/rest/domains/#{name}/applications", 'post'],
|
171
|
+
['ADD_APPLICATION', "broker/rest/domains/#{name}/applications", 'post', ({:optional_params => optional_params} if optional_params)],
|
172
172
|
])}],
|
173
173
|
}.to_json
|
174
174
|
})
|
@@ -313,16 +313,11 @@ module RHC::Rest::Mock
|
|
313
313
|
"https://#{uri_string}/#{relative}"
|
314
314
|
end
|
315
315
|
|
316
|
-
# This formats link lists for JSONification
|
317
316
|
def mock_response_links(links)
|
318
317
|
link_set = {}
|
319
318
|
links.each do |link|
|
320
|
-
|
321
|
-
|
322
|
-
method = link[2]
|
323
|
-
# Note that the 'relative' key/value pair below is a convenience for testing;
|
324
|
-
# this is not used by the API classes.
|
325
|
-
link_set[operation] = { 'href' => mock_href(href), 'method' => method, 'relative' => href }
|
319
|
+
options = link[3] || {}
|
320
|
+
link_set[link[0]] = { 'href' => mock_href(link[1]), 'method' => link[2], 'relative' => link[1]}.merge(options)
|
326
321
|
end
|
327
322
|
link_set
|
328
323
|
end
|
data/lib/rhc/wizard.rb
CHANGED
@@ -45,7 +45,6 @@ module RHC
|
|
45
45
|
def initialize(config=RHC::Config.new, opts=Commander::Command::Options.new)
|
46
46
|
@config = config
|
47
47
|
@options = opts
|
48
|
-
@debug = opts.debug if opts
|
49
48
|
end
|
50
49
|
|
51
50
|
# Public: Runs the setup wizard to make sure ~/.openshift and ~/.ssh are correct
|
@@ -76,10 +75,6 @@ module RHC
|
|
76
75
|
attr_accessor :auth, :user
|
77
76
|
attr_writer :rest_client
|
78
77
|
|
79
|
-
def debug?
|
80
|
-
@debug
|
81
|
-
end
|
82
|
-
|
83
78
|
def hostname
|
84
79
|
Socket.gethostname
|
85
80
|
end
|
@@ -522,6 +522,20 @@ describe RHC::Commands::App do
|
|
522
522
|
it { run_output.should match(/Gears:\s+Located with mock_type/) }
|
523
523
|
it { run_output.should match(/Gears:\s+1 medium/) }
|
524
524
|
end
|
525
|
+
|
526
|
+
context 'when run with custom app' do
|
527
|
+
before(:each) do
|
528
|
+
@domain = rest_client.add_domain("mockdomain")
|
529
|
+
app = @domain.add_application("app1", "mock_type", true)
|
530
|
+
cart1 = app.add_cartridge('mock_cart-1')
|
531
|
+
cart1.url = 'https://foo.bar.com'
|
532
|
+
end
|
533
|
+
it { run_output.should match("app1 @ https://app1-mockdomain.fake.foo/") }
|
534
|
+
it { run_output.should match(/Scaling:.*x2/) }
|
535
|
+
it { run_output.should match(/Gears:\s+Located with mock_type/) }
|
536
|
+
it { run_output.should match(/Gears:\s+1 small/) }
|
537
|
+
it { run_output.should match(%r(From:\s+ https://foo.bar.com)) }
|
538
|
+
end
|
525
539
|
end
|
526
540
|
|
527
541
|
describe 'app show' do
|
@@ -181,7 +181,7 @@ describe RHC::Commands::PortForward do
|
|
181
181
|
@gear_id = 'fakegearid'
|
182
182
|
Net::SSH.should_receive(:start).with(gear_host, gear_user).and_yield(@ssh).twice
|
183
183
|
|
184
|
-
@ssh.should_receive(:exec!).with("rhc-list-ports").
|
184
|
+
@ssh.should_receive(:exec!).with("rhc-list-ports --exclude-remote").
|
185
185
|
and_yield(nil, :stderr, "mongodb -> #{gear_host}:35541")
|
186
186
|
forward = mock(Net::SSH::Service::Forward)
|
187
187
|
@ssh.should_receive(:forward).and_return(forward)
|
data/spec/rhc/helpers_spec.rb
CHANGED
@@ -71,7 +71,7 @@ describe RHC::Helpers do
|
|
71
71
|
it_should_behave_like "colorized output"
|
72
72
|
end
|
73
73
|
|
74
|
-
it("should invoke debug from debug_error"){ expect{ subject.debug_error(mock(:class => "Mock", :message => 'msg', :backtrace => [])) }.to call(:debug).on(
|
74
|
+
it("should invoke debug from debug_error"){ expect{ subject.debug_error(mock(:class => "Mock", :message => 'msg', :backtrace => [])) }.to call(:debug).on($terminal).with("msg (Mock)\n ") }
|
75
75
|
|
76
76
|
it("should draw a table") do
|
77
77
|
subject.table([[10,2], [3,40]]) do |i|
|
@@ -182,6 +182,14 @@ describe HighLineExtension do
|
|
182
182
|
]
|
183
183
|
end
|
184
184
|
|
185
|
+
it "should give the header priority over width when color is involved" do
|
186
|
+
subject.table([["\e[31mabcd\e[0m", "1234567890"]], :header => ['abcdef', '123'], :width => 12).to_a.should == [
|
187
|
+
'abcdef 123',
|
188
|
+
'------ ----------',
|
189
|
+
"\e[31mabcd\e[0m 1234567890",
|
190
|
+
]
|
191
|
+
end
|
192
|
+
|
185
193
|
it "should add a header to a table" do
|
186
194
|
subject.table([["abcd efgh", "1234 6789 a"]], :width => 9, :heading => "Alongtextstring").to_a.should == [
|
187
195
|
"Alongtext",
|
@@ -75,7 +75,12 @@ module RHC
|
|
75
75
|
|
76
76
|
context "with a URL cart" do
|
77
77
|
before{ stub_api_request(:any, app_links['ADD_CARTRIDGE']['relative']).with(:body => {:url => 'http://foo.com'}.to_json).to_return(mock_cartridge_response(1, true)) }
|
78
|
+
it "raises without a param" do
|
79
|
+
app_obj.should_receive(:has_param?).with('ADD_CARTRIDGE','url').and_return(false)
|
80
|
+
expect{ app_obj.add_cartridge({:url => 'http://foo.com'}) }.to raise_error(RHC::Rest::DownloadingCartridgesNotSupported)
|
81
|
+
end
|
78
82
|
it "accepts a hash" do
|
83
|
+
app_obj.should_receive(:has_param?).with('ADD_CARTRIDGE','url').and_return(true)
|
79
84
|
cart = app_obj.add_cartridge({:url => 'http://foo.com'})
|
80
85
|
cart.should be_an_instance_of RHC::Rest::Cartridge
|
81
86
|
cart.name.should == 'mock_cart_0'
|
@@ -86,6 +91,7 @@ module RHC
|
|
86
91
|
cart.only_in_existing?.should be_false
|
87
92
|
end
|
88
93
|
it "accepts an object" do
|
94
|
+
app_obj.should_receive(:has_param?).with('ADD_CARTRIDGE','url').and_return(true)
|
89
95
|
cart = app_obj.add_cartridge(stub(:url => 'http://foo.com'))
|
90
96
|
cart.should be_an_instance_of RHC::Rest::Cartridge
|
91
97
|
cart.name.should == 'mock_cart_0'
|
@@ -4,20 +4,6 @@ require 'stringio'
|
|
4
4
|
require 'rest_spec_helper'
|
5
5
|
require 'rhc/rest'
|
6
6
|
|
7
|
-
# This object is used in a few cases where we need to inspect
|
8
|
-
# the logged output.
|
9
|
-
class MockClient < RHC::Rest::Client
|
10
|
-
def logger
|
11
|
-
Logger.new((@output = StringIO.new))
|
12
|
-
end
|
13
|
-
def use_debug
|
14
|
-
@debug = true
|
15
|
-
end
|
16
|
-
def logged
|
17
|
-
@output.string
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
7
|
module RHC
|
22
8
|
module Rest
|
23
9
|
describe Client do
|
@@ -228,7 +214,12 @@ module RHC
|
|
228
214
|
it "returns a domain object for matching domain IDs" do
|
229
215
|
match = nil
|
230
216
|
expect { match = client.find_domain('mock_domain_0') }.to_not raise_error
|
231
|
-
|
217
|
+
match.id.should == 'mock_domain_0'
|
218
|
+
match.class.should == RHC::Rest::Domain
|
219
|
+
end
|
220
|
+
it "returns a domain object for matching case-insensitive domain IDs" do
|
221
|
+
match = nil
|
222
|
+
expect { match = client.find_domain('MOCK_DOMAIN_0') }.to_not raise_error
|
232
223
|
match.id.should == 'mock_domain_0'
|
233
224
|
match.class.should == RHC::Rest::Domain
|
234
225
|
end
|
@@ -458,32 +449,6 @@ module RHC
|
|
458
449
|
end
|
459
450
|
end
|
460
451
|
|
461
|
-
shared_examples_for "a logout method" do
|
462
|
-
before(:each) do
|
463
|
-
stub_api_request(:get, '').
|
464
|
-
to_return({ :body => { :data => client_links, :supported_api_versions => [1.0, 1.1] }.to_json,
|
465
|
-
:status => 200
|
466
|
-
})
|
467
|
-
end
|
468
|
-
context "debug mode is on" do
|
469
|
-
let(:use_debug){ true }
|
470
|
-
it "writes a message to the logger" do
|
471
|
-
capture do
|
472
|
-
client.send logout_method.to_sym
|
473
|
-
stderr.should match(/Logout\/Close client$/)
|
474
|
-
end
|
475
|
-
end
|
476
|
-
end
|
477
|
-
context "debug mode is off" do
|
478
|
-
it "does nothing" do
|
479
|
-
capture do
|
480
|
-
client.send logout_method.to_sym
|
481
|
-
stderr.should be_empty
|
482
|
-
end
|
483
|
-
end
|
484
|
-
end
|
485
|
-
end
|
486
|
-
|
487
452
|
context "#delete_key" do
|
488
453
|
before(:each) do
|
489
454
|
stub_api_request(:any, client_links['GET_USER']['relative']).
|
@@ -528,16 +493,6 @@ module RHC
|
|
528
493
|
expect { client.find_key('no_match') }.to raise_error(RHC::KeyNotFoundException)
|
529
494
|
end
|
530
495
|
end
|
531
|
-
|
532
|
-
context "#logout" do
|
533
|
-
let(:logout_method) { :logout }
|
534
|
-
it_should_behave_like "a logout method"
|
535
|
-
end
|
536
|
-
|
537
|
-
context "#close" do
|
538
|
-
let(:logout_method) { :close }
|
539
|
-
it_should_behave_like "a logout method"
|
540
|
-
end
|
541
496
|
end
|
542
497
|
|
543
498
|
context "when server supports API versions 1.0 and 1.1" do
|
data/spec/rhc/rest_spec.rb
CHANGED
@@ -2,16 +2,6 @@ require 'spec_helper'
|
|
2
2
|
require 'rest_spec_helper'
|
3
3
|
require 'rhc/rest'
|
4
4
|
|
5
|
-
class RHCRest
|
6
|
-
include RHC::Rest
|
7
|
-
def debug?
|
8
|
-
false
|
9
|
-
end
|
10
|
-
def debug(*args)
|
11
|
-
raise "Unchecked debug"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
module MockRestResponse
|
16
6
|
attr_accessor :code, :read
|
17
7
|
end
|
@@ -44,13 +34,14 @@ describe RHC::Rest::Domain do
|
|
44
34
|
it{ domain.add_application('foo', :cartridges => ['bar']).should be_true }
|
45
35
|
it{ expect{ domain.add_application('foo', :cartridges => ['bar', 'other']) }.to raise_error(RHC::Rest::MultipleCartridgeCreationNotSupported) }
|
46
36
|
it{ expect{ domain.add_application('foo', :initial_git_url => 'a_url') }.to raise_error(RHC::Rest::InitialGitUrlNotSupported) }
|
37
|
+
it{ expect{ domain.add_application('foo', :cartridges => [{:url => 'a_url'}]) }.to raise_error(RHC::Rest::DownloadingCartridgesNotSupported) }
|
47
38
|
it{ domain.add_application('foo', :cartridges => 'bar').should be_true }
|
48
39
|
it{ domain.add_application('foo', :cartridge => 'bar').should be_true }
|
49
40
|
it{ domain.add_application('foo', :cartridge => ['bar']).should be_true }
|
50
41
|
end
|
51
|
-
context "against a server
|
42
|
+
context "against a server that supports initial git urls and downloaded carts" do
|
52
43
|
let(:cartridges){ ['bar'] }
|
53
|
-
before{ stub_api; stub_one_domain('bar') }
|
44
|
+
before{ stub_api; stub_one_domain('bar', [{:name => 'initial_git_url'},{:name => 'cartridges[][url]'}]) }
|
54
45
|
before do
|
55
46
|
stub_api_request(:post, 'broker/rest/domains/bar/applications', false).
|
56
47
|
with(:body => {:name => 'foo', :cartridges => cartridges}.to_json).
|
@@ -95,17 +86,6 @@ module RHC
|
|
95
86
|
describe Rest do
|
96
87
|
subject{ RHC::Rest::Client.new }
|
97
88
|
|
98
|
-
# logger function
|
99
|
-
describe "#logger" do
|
100
|
-
it "establishes a logger" do
|
101
|
-
logger = Logger.new(STDOUT)
|
102
|
-
subject.send(:logger).should have_same_attributes_as(logger)
|
103
|
-
end
|
104
|
-
it "reuses a logger" do
|
105
|
-
subject.send(:logger).should equal(subject.send(:logger))
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
89
|
describe "#default_verify_callback" do
|
110
90
|
def invoked_with(is_ok, ctx)
|
111
91
|
subject.send(:default_verify_callback).call(is_ok, ctx)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 8
|
9
8
|
- 9
|
10
|
-
|
9
|
+
- 6
|
10
|
+
version: 1.9.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Red Hat
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-05
|
18
|
+
date: 2013-06-05 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: net-ssh
|