rhc 1.11.4 → 1.12.4

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.
Files changed (43) hide show
  1. data/autocomplete/rhc_bash +39 -23
  2. data/features/domain.feature +8 -3
  3. data/features/lib/rhc_helper/commandify.rb +6 -0
  4. data/features/lib/rhc_helper/domain.rb +1 -1
  5. data/features/step_definitions/domain_steps.rb +9 -4
  6. data/lib/rhc/auth/basic.rb +4 -2
  7. data/lib/rhc/cli.rb +1 -0
  8. data/lib/rhc/commands/apps.rb +2 -4
  9. data/lib/rhc/commands/cartridge.rb +1 -0
  10. data/lib/rhc/commands/domain.rb +25 -11
  11. data/lib/rhc/commands/port_forward.rb +0 -1
  12. data/lib/rhc/commands/sshkey.rb +1 -1
  13. data/lib/rhc/helpers.rb +1 -0
  14. data/lib/rhc/highline_extensions.rb +2 -1
  15. data/lib/rhc/output_helpers.rb +21 -0
  16. data/lib/rhc/rest.rb +4 -2
  17. data/lib/rhc/rest/api.rb +9 -11
  18. data/lib/rhc/rest/application.rb +4 -0
  19. data/lib/rhc/rest/base.rb +11 -1
  20. data/lib/rhc/rest/cartridge.rb +1 -1
  21. data/lib/rhc/rest/client.rb +52 -29
  22. data/lib/rhc/rest/domain.rb +11 -1
  23. data/lib/rhc/rest/httpclient.rb +125 -0
  24. data/lib/rhc/rest/mock.rb +32 -8
  25. data/spec/rhc/auth_spec.rb +29 -22
  26. data/spec/rhc/command_spec.rb +13 -9
  27. data/spec/rhc/commands/account_spec.rb +2 -2
  28. data/spec/rhc/commands/app_spec.rb +9 -9
  29. data/spec/rhc/commands/authorization_spec.rb +11 -11
  30. data/spec/rhc/commands/cartridge_spec.rb +3 -3
  31. data/spec/rhc/commands/domain_spec.rb +51 -1
  32. data/spec/rhc/commands/logout_spec.rb +3 -3
  33. data/spec/rhc/commands/port_forward_spec.rb +7 -7
  34. data/spec/rhc/commands/server_spec.rb +2 -2
  35. data/spec/rhc/commands/setup_spec.rb +6 -6
  36. data/spec/rhc/commands/snapshot_spec.rb +10 -10
  37. data/spec/rhc/helpers_spec.rb +6 -6
  38. data/spec/rhc/rest_application_spec.rb +11 -11
  39. data/spec/rhc/rest_client_spec.rb +148 -36
  40. data/spec/rhc/rest_spec.rb +3 -3
  41. data/spec/rhc/wizard_spec.rb +20 -20
  42. data/spec/spec_helper.rb +52 -3
  43. metadata +5 -4
@@ -10,9 +10,9 @@ _rhc()
10
10
  if [[ "$cur" == -* ]]; then
11
11
  opts="--always-prefix --clean --config --debug --insecure --limit --mock --noprompt --password --raw --rhlogin --server --ssl-ca-file --ssl-client-cert-file --ssl-version --timeout --token"
12
12
  elif [ -z $cur ]; then
13
- opts="account alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert app app-create app-delete app-force-stop app-reload app-restart app-show app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage domain domain-create domain-delete domain-show domain-update git-clone logout port-forward server setup snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show tail threaddump"
13
+ opts="account alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert app app-create app-delete app-force-stop app-reload app-restart app-show app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage domain domain-create domain-delete domain-list domain-show domain-update git-clone logout port-forward server setup snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show tail threaddump"
14
14
  else
15
- opts="account account-logout add-alias add-authorization add-cartridge add-sshkey alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert aliases app app-create app-delete app-force-stop app-reload app-restart app-show app-snapshot app-ssh app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list authorizations cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage cartridges create-app create-domain delete-all-authorization delete-app delete-authorization delete-cert-alias delete-domain domain domain-create domain-delete domain-show domain-update force-stop-app git-clone list-alias list-authorization list-cartridge list-sshkey logout port-forward reload-app reload-cartridge remove-alias remove-cartridge remove-sshkey restart-app restart-cartridge restore-snapshot save-snapshot scale-cartridge server setup show-app show-cartridge show-domain show-sshkey snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-delete sshkey-list sshkey-remove sshkey-show start-app start-cartridge status-cartridge stop-app stop-cartridge storage-cartridge tail threaddump tidy-app update-cert-alias update-domain"
15
+ opts="account account-logout add-alias add-authorization add-cartridge add-sshkey alias alias-add alias-delete-cert alias-list alias-remove alias-update-cert aliases app app-create app-delete app-force-stop app-reload app-restart app-show app-snapshot app-ssh app-start app-stop app-tidy apps authorization authorization-add authorization-delete authorization-delete-all authorization-list authorizations cartridge cartridge-add cartridge-list cartridge-reload cartridge-remove cartridge-restart cartridge-scale cartridge-show cartridge-start cartridge-status cartridge-stop cartridge-storage cartridges create-app create-domain delete-all-authorization delete-app delete-authorization delete-cert-alias delete-domain domain domain-create domain-delete domain-list domain-show domain-update domains force-stop-app git-clone list-alias list-authorization list-cartridge list-domain list-sshkey logout port-forward reload-app reload-cartridge remove-alias remove-cartridge remove-sshkey restart-app restart-cartridge restore-snapshot save-snapshot scale-cartridge server setup show-app show-cartridge show-domain show-sshkey snapshot snapshot-restore snapshot-save ssh sshkey sshkey-add sshkey-list sshkey-remove sshkey-show start-app start-cartridge status-cartridge stop-app stop-cartridge storage-cartridge tail threaddump tidy-app update-cert-alias update-domain"
16
16
  fi
17
17
  else
18
18
  prev="${COMP_WORDS[@]:0:COMP_CWORD}"
@@ -696,7 +696,7 @@ _rhc()
696
696
  if [[ "$cur" == -* ]]; then
697
697
  opts=""
698
698
  else
699
- opts="create update show delete"
699
+ opts="create update show list delete"
700
700
  fi
701
701
  ;;
702
702
 
@@ -716,9 +716,17 @@ _rhc()
716
716
  fi
717
717
  ;;
718
718
 
719
- "rhc domain show")
719
+ "rhc domain list")
720
720
  if [[ "$cur" == -* ]]; then
721
+ opts="--mine"
722
+ else
721
723
  opts=""
724
+ fi
725
+ ;;
726
+
727
+ "rhc domain show")
728
+ if [[ "$cur" == -* ]]; then
729
+ opts="--namespace"
722
730
  else
723
731
  opts=""
724
732
  fi
@@ -748,9 +756,17 @@ _rhc()
748
756
  fi
749
757
  ;;
750
758
 
751
- "rhc domain-show")
759
+ "rhc domain-list")
752
760
  if [[ "$cur" == -* ]]; then
761
+ opts="--mine"
762
+ else
753
763
  opts=""
764
+ fi
765
+ ;;
766
+
767
+ "rhc domain-show")
768
+ if [[ "$cur" == -* ]]; then
769
+ opts="--namespace"
754
770
  else
755
771
  opts=""
756
772
  fi
@@ -764,6 +780,14 @@ _rhc()
764
780
  fi
765
781
  ;;
766
782
 
783
+ "rhc domains")
784
+ if [[ "$cur" == -* ]]; then
785
+ opts="--mine"
786
+ else
787
+ opts=""
788
+ fi
789
+ ;;
790
+
767
791
  "rhc force-stop-app")
768
792
  if [[ "$cur" == -* ]]; then
769
793
  opts="--app --namespace"
@@ -804,6 +828,14 @@ _rhc()
804
828
  fi
805
829
  ;;
806
830
 
831
+ "rhc list-domain")
832
+ if [[ "$cur" == -* ]]; then
833
+ opts="--mine"
834
+ else
835
+ opts=""
836
+ fi
837
+ ;;
838
+
807
839
  "rhc list-sshkey")
808
840
  if [[ "$cur" == -* ]]; then
809
841
  opts=""
@@ -942,7 +974,7 @@ _rhc()
942
974
 
943
975
  "rhc show-domain")
944
976
  if [[ "$cur" == -* ]]; then
945
- opts=""
977
+ opts="--namespace"
946
978
  else
947
979
  opts=""
948
980
  fi
@@ -1008,7 +1040,7 @@ _rhc()
1008
1040
  if [[ "$cur" == -* ]]; then
1009
1041
  opts=""
1010
1042
  else
1011
- opts="list show add delete remove"
1043
+ opts="list show add remove"
1012
1044
  fi
1013
1045
  ;;
1014
1046
 
@@ -1020,14 +1052,6 @@ _rhc()
1020
1052
  fi
1021
1053
  ;;
1022
1054
 
1023
- "rhc sshkey delete")
1024
- if [[ "$cur" == -* ]]; then
1025
- opts=""
1026
- else
1027
- opts=""
1028
- fi
1029
- ;;
1030
-
1031
1055
  "rhc sshkey list")
1032
1056
  if [[ "$cur" == -* ]]; then
1033
1057
  opts=""
@@ -1060,14 +1084,6 @@ _rhc()
1060
1084
  fi
1061
1085
  ;;
1062
1086
 
1063
- "rhc sshkey-delete")
1064
- if [[ "$cur" == -* ]]; then
1065
- opts=""
1066
- else
1067
- opts=""
1068
- fi
1069
- ;;
1070
-
1071
1087
  "rhc sshkey-list")
1072
1088
  if [[ "$cur" == -* ]]; then
1073
1089
  opts=""
@@ -10,14 +10,19 @@ Feature: Existing Domain Operations
10
10
  When domain is updated
11
11
  Then the domain should be reserved
12
12
 
13
- Scenario: Domain Show
13
+ Scenario: Domain List
14
14
  When rhc domain is run
15
+ When rhc domain list is run
16
+ Then the default domain action output should equal the list action output
17
+
18
+ Scenario: Domain Show
15
19
  When rhc domain show is run
16
- Then the default domain action output should equal the show action output
20
+ Then the domain show command output should show the domain
21
+ Then the domain command should exit with an exitcode of 0
17
22
 
18
23
  Scenario: Domain Create Fails
19
24
  When rhc domain create is called
20
- Then the domain command should fail with an exitcode of 1
25
+ Then the domain command should exit with an exitcode of 1
21
26
 
22
27
  Scenario: Domain Delete
23
28
  When domain is deleted
@@ -65,6 +65,8 @@ module RHCHelper
65
65
  case cmd
66
66
  when /app delete/
67
67
  args << "--confirm "
68
+ when /domain list/
69
+ # domain list doesn't take arguments
68
70
  when /domain show/
69
71
  # domain show doesn't take arguments
70
72
  when /domain update/
@@ -174,6 +176,10 @@ module RHCHelper
174
176
  @domain_output = stdout
175
177
  end
176
178
 
179
+ def domain_list_callback(exitcode, stdout, stderr, arg)
180
+ @domain_list_output = stdout
181
+ end
182
+
177
183
  def domain_show_callback(exitcode, stdout, stderr, arg)
178
184
  @domain_show_output = stdout
179
185
  end
@@ -10,7 +10,7 @@ module RHCHelper
10
10
  extend API
11
11
 
12
12
  class << self
13
- attr_reader :domain_output, :domain_show_output, :exitcode
13
+ attr_reader :domain_output, :domain_list_output, :domain_show_output, :exitcode
14
14
  end
15
15
 
16
16
  def self.unique_namespace(prefix)
@@ -27,18 +27,23 @@ When /^rhc domain (.*)is run$/ do |action|
27
27
  Domain.send(:"#{cmd}")
28
28
  end
29
29
 
30
- Then /^the default domain action output should equal the show action output$/ do
30
+ Then /^the default domain action output should equal the list action output$/ do
31
31
  Domain.domain_output.should match($namespace)
32
32
 
33
33
  domain_output = Domain.domain_output.lines.sort
34
- domain_show_output = Domain.domain_show_output.lines.sort
34
+ domain_list_output = Domain.domain_list_output.lines.sort
35
35
 
36
36
  # check line by line while ignoring debug output which is timestamped
37
- domain_output.zip(domain_show_output) do |a, b|
37
+ domain_output.zip(domain_list_output) do |a, b|
38
38
  a.should == b unless a.match("DEBUG")
39
39
  end
40
40
  end
41
41
 
42
+ Then /^the domain show command output should show the domain$/ do
43
+ domain_show_output = Domain.domain_show_output.lines
44
+ domain_show_output.find {|line| line["Domain #{$namespace}"] }.should be_true, "Unable to find \"Domain #{$namespace}\" in #{domain_show_output.inspect}"
45
+ end
46
+
42
47
  Then /^the domain should be reserved?$/ do
43
48
  # Sleep to allow DNS to propogate
44
49
  sleep 5
@@ -54,7 +59,7 @@ Then /^the domain should be reserved?$/ do
54
59
  resolved.should be_true, 'Not able to lookup DNS TXT record in time.'
55
60
  end
56
61
 
57
- Then /^the domain command should fail with an exitcode of (\d*)$/ do |exitcode|
62
+ Then /^the domain command should exit with an exitcode of (\d*)$/ do |exitcode|
58
63
  exitcode = exitcode.to_i
59
64
  Domain.exitcode.should == exitcode
60
65
  end
@@ -13,8 +13,10 @@ module RHC::Auth
13
13
  end
14
14
 
15
15
  def to_request(request)
16
- request[:user] ||= username || (request[:lazy_auth] != true && ask_username) || nil
17
- request[:password] ||= password || (username? && request[:lazy_auth] != true && ask_password) || nil
16
+ request[:user] ||=
17
+ lambda{ username || (request[:lazy_auth] != true && ask_username) || nil }
18
+ request[:password] ||=
19
+ lambda{ password || (username? && request[:lazy_auth] != true && ask_password) || nil }
18
20
  request
19
21
  end
20
22
 
@@ -15,6 +15,7 @@ module RHC
15
15
 
16
16
  def self.set_terminal
17
17
  $terminal.wrap_at = HighLine::SystemExtensions.terminal_size.first rescue 80 if $stdin.tty?
18
+ $terminal.wrap_at = nil if $terminal.wrap_at == 0
18
19
  #$terminal.page_at = :auto if $stdin.tty? and $stdout.tty?
19
20
  # FIXME: ANSI terminals are not default on windows but we may just be
20
21
  # hitting a bug in highline if windows does support another method.
@@ -5,11 +5,9 @@ module RHC::Commands
5
5
  summary "List all your applications"
6
6
  description "Display the list of applications that you own. Includes information about each application."
7
7
  def run
8
- domains = rest_client.domains
8
+ applications = rest_client.applications(:include => :cartridges).sort
9
9
 
10
- info "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc create-domain'." and return 1 if domains.empty?
11
-
12
- applications = domains.map{ |d| d.applications(:include => :cartridges) }.flatten.sort
10
+ info "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc create-domain'." and return 1 if applications.empty? && rest_client.domains.empty?
13
11
 
14
12
  applications.each{ |a| display_app(a, a.cartridges) }.blank? and
15
13
  info "No applications. Use 'rhc create-app'." and
@@ -33,6 +33,7 @@ module RHC::Commands
33
33
  default_action :list
34
34
 
35
35
  summary "List available cartridges"
36
+ syntax ''
36
37
  option ["-v", "--verbose"], "Display more details about each cartridge"
37
38
  alias_action :"app cartridge list", :root_command => true, :deprecated => true
38
39
  alias_action :"cartridges", :root_command => true
@@ -13,9 +13,9 @@ module RHC::Commands
13
13
 
14
14
  http://<appname>-test.rhcloud.com
15
15
 
16
- Today, each account may have a single domain.
16
+ Each account may have access to one or more domains shared by others.
17
17
  DESC
18
- default_action :show
18
+ default_action :list
19
19
 
20
20
  summary "Define a namespace for your applications to share."
21
21
  syntax "<namespace>"
@@ -50,21 +50,18 @@ module RHC::Commands
50
50
  0
51
51
  end
52
52
 
53
- summary "Display your domain and any applications"
54
- def show
55
- domain = rest_client.domains.first
53
+ summary "Display a domain and its applications"
54
+ argument :namespace, "Namespace of the domain", ["-n", "--namespace NAME"], :optional => true
55
+ def show(namespace)
56
+ domain = (rest_client.find_domain(namespace) if namespace) || rest_client.domains.first
56
57
 
57
58
  warn "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc create-domain'." and return 1 unless domain
58
59
 
59
60
  applications = domain.applications(:include => :cartridges)
61
+ display_domain(domain, applications)
60
62
 
61
63
  if applications.present?
62
- header "Applications in #{domain.id} domain" do
63
- applications.each do |a|
64
- display_app(a,a.cartridges)
65
- end
66
- end
67
- success "You have #{applications.length} applications in your domain."
64
+ success "You have #{pluralize(applications.length, 'application')} in your domain."
68
65
  else
69
66
  success "The domain #{domain.id} exists but has no applications. You can use 'rhc create-app' to create a new application."
70
67
  end
@@ -72,6 +69,23 @@ module RHC::Commands
72
69
  0
73
70
  end
74
71
 
72
+ summary "Display all domains you have access to"
73
+ option ['--mine'], "Display only domains you own"
74
+ alias_action :domains, :root_command => true
75
+ def list
76
+ domains = rest_client.send(options.mine ? :owned_domains : :domains)
77
+
78
+ warn "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc create-domain'." and return 1 unless domains.present?
79
+
80
+ domains.each do |d|
81
+ display_domain(d)
82
+ end
83
+
84
+ success "You have access to #{pluralize(domains.length, 'domain')}."
85
+
86
+ 0
87
+ end
88
+
75
89
  summary "DEPRECATED use 'setup' instead"
76
90
  deprecated 'rhc setup'
77
91
  # :nocov:
@@ -1,4 +1,3 @@
1
- require 'rhc/commands/base'
2
1
  require 'uri'
3
2
 
4
3
  module RHC::Commands
@@ -68,7 +68,7 @@ module RHC::Commands
68
68
 
69
69
  summary 'Remove SSH key from your account'
70
70
  syntax '<name>'
71
- alias_action :delete
71
+ alias_action :delete, :deprecated => true
72
72
  argument :name, 'Name of SSH key to remove'
73
73
  def remove(name)
74
74
  say "Removing the key '#{name} ... "
@@ -52,6 +52,7 @@ module RHC
52
52
  end
53
53
 
54
54
  def date(s)
55
+ return nil unless s.present?
55
56
  now = Date.today
56
57
  d = datetime_rfc3339(s).to_time
57
58
  if now.year == d.year
@@ -257,9 +257,10 @@ class HighLine::Header < Struct.new(:text, :width, :indent, :color)
257
257
  def rows
258
258
  @rows ||= begin
259
259
  if !width || width == 0
260
- [text.is_a?(Array) ? text.join(' ') : text]
260
+ [text.is_a?(Array) ? text.compact.join(' ') : text]
261
261
 
262
262
  elsif text.is_a? Array
263
+ text.compact!
263
264
  widths = text.map{ |s| s.strip_ansi.length }
264
265
  chars, join, indented = 0, 1, (indent || '').length
265
266
  narrow = width - indented
@@ -1,6 +1,26 @@
1
1
  module RHC
2
2
  module OutputHelpers
3
3
 
4
+ def display_domain(domain, applications=nil)
5
+ paragraph do
6
+ header ["Domain #{domain.id}", ("(owned by #{domain.owner})" if domain.owner.present?)] do
7
+ section(:bottom => 1) do
8
+ say format_table \
9
+ nil,
10
+ get_properties(
11
+ domain,
12
+ :creation_time,
13
+ :allowed_gear_sizes
14
+ ),
15
+ :delete => true
16
+ end
17
+ applications.each do |a|
18
+ display_app(a,a.cartridges)
19
+ end if applications.present?
20
+ end
21
+ end
22
+ end
23
+
4
24
  #---------------------------
5
25
  # Application information
6
26
  #---------------------------
@@ -12,6 +32,7 @@ module RHC
12
32
  nil,
13
33
  get_properties(
14
34
  app,
35
+ :domain,
15
36
  :creation_time,
16
37
  :gear_info,
17
38
  :git_url,
@@ -1,8 +1,10 @@
1
1
  module RHC
2
2
  module Rest
3
3
 
4
- autoload :Base, 'rhc/rest/base'
5
- autoload :Attributes, 'rhc/rest/attributes'
4
+ autoload :Base, 'rhc/rest/base'
5
+ autoload :Attributes, 'rhc/rest/attributes'
6
+
7
+ autoload :HTTPClient, 'rhc/rest/httpclient'
6
8
 
7
9
  autoload :Api, 'rhc/rest/api'
8
10
  autoload :Application, 'rhc/rest/application'
@@ -10,18 +10,20 @@ module RHC
10
10
  @server_api_versions = []
11
11
  debug "Client supports API versions #{preferred_api_versions.join(', ')}"
12
12
  @client_api_versions = preferred_api_versions
13
- @server_api_versions, links = api_info({
13
+ @server_api_versions, @current_api_version, links = api_info({
14
14
  :url => client.url,
15
15
  :method => :get,
16
+ :accept => :json,
16
17
  :lazy_auth => true,
17
18
  })
18
19
  debug "Server supports API versions #{@server_api_versions.join(', ')}"
19
20
 
20
21
  if api_version_negotiated
21
- unless server_api_version_current?
22
+ debug " Using API version #{api_version_negotiated}"
23
+ unless client_api_version_current?
22
24
  debug "Client API version #{api_version_negotiated} is not current. Refetching API"
23
25
  # need to re-fetch API
24
- @server_api_versions, links = api_info({
26
+ @server_api_versions, @current_api_version, links = api_info({
25
27
  :url => client.url,
26
28
  :method => :get,
27
29
  :accept => :json,
@@ -54,15 +56,11 @@ module RHC
54
56
  end
55
57
 
56
58
  def client_api_version_current?
57
- current_client_api_version == api_version_negotiated
59
+ current_api_version == api_version_negotiated
58
60
  end
59
61
 
60
- def current_client_api_version
61
- client_api_versions.last
62
- end
63
-
64
- def server_api_version_current?
65
- @server_api_versions && @server_api_versions.max == api_version_negotiated
62
+ def current_api_version
63
+ @current_api_version
66
64
  end
67
65
 
68
66
  def warn_about_api_versions
@@ -81,7 +79,7 @@ server at #{URI.parse(client.url).host} supports #{@server_api_versions.join(',
81
79
  def api_info(req)
82
80
  client.request(req) do |response|
83
81
  json_response = ::RHC::Json.decode(response.content)
84
- [ json_response['supported_api_versions'], json_response['data'] ]
82
+ [ json_response['supported_api_versions'], json_response['api_version'] || json_response['version'].to_f, json_response['data'] ]
85
83
  end
86
84
  end
87
85
  end