rhc 1.2.7 → 1.3.8

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 (97) hide show
  1. data/bin/rhc +6 -8
  2. data/bin/rhc-chk +23 -10
  3. data/features/domain.feature +1 -1
  4. data/features/lib/rhc_helper.rb +3 -2
  5. data/features/lib/rhc_helper/api.rb +7 -0
  6. data/features/lib/rhc_helper/app.rb +8 -10
  7. data/features/lib/rhc_helper/domain.rb +2 -1
  8. data/features/lib/rhc_helper/runnable.rb +2 -24
  9. data/features/sshkey.feature +3 -3
  10. data/features/step_definitions/cartridge_steps.rb +6 -6
  11. data/features/step_definitions/client_steps.rb +0 -1
  12. data/features/step_definitions/sshkey_steps.rb +2 -2
  13. data/features/support/before_hooks.rb +0 -1
  14. data/features/support/env.rb +5 -3
  15. data/lib/rhc-common.rb +1 -1
  16. data/lib/rhc.rb +9 -8
  17. data/lib/rhc/auth.rb +3 -0
  18. data/lib/rhc/auth/basic.rb +54 -0
  19. data/lib/rhc/cartridge_helpers.rb +11 -5
  20. data/lib/rhc/cli.rb +4 -2
  21. data/lib/rhc/command_runner.rb +35 -30
  22. data/lib/rhc/commands.rb +127 -18
  23. data/lib/rhc/commands/account.rb +24 -0
  24. data/lib/rhc/commands/alias.rb +1 -1
  25. data/lib/rhc/commands/app.rb +210 -209
  26. data/lib/rhc/commands/apps.rb +22 -0
  27. data/lib/rhc/commands/base.rb +10 -77
  28. data/lib/rhc/commands/cartridge.rb +35 -35
  29. data/lib/rhc/commands/domain.rb +20 -13
  30. data/lib/rhc/commands/git_clone.rb +30 -0
  31. data/lib/rhc/commands/{port-forward.rb → port_forward.rb} +3 -3
  32. data/lib/rhc/commands/server.rb +28 -16
  33. data/lib/rhc/commands/setup.rb +18 -1
  34. data/lib/rhc/commands/snapshot.rb +4 -4
  35. data/lib/rhc/commands/sshkey.rb +4 -18
  36. data/lib/rhc/commands/tail.rb +32 -9
  37. data/lib/rhc/config.rb +168 -99
  38. data/lib/rhc/context_helper.rb +22 -9
  39. data/lib/rhc/core_ext.rb +41 -1
  40. data/lib/rhc/exceptions.rb +21 -5
  41. data/lib/rhc/git_helpers.rb +81 -0
  42. data/lib/rhc/help_formatter.rb +21 -1
  43. data/lib/rhc/helpers.rb +222 -87
  44. data/lib/rhc/output_helpers.rb +94 -110
  45. data/lib/rhc/rest.rb +15 -198
  46. data/lib/rhc/rest/api.rb +88 -0
  47. data/lib/rhc/rest/application.rb +29 -30
  48. data/lib/rhc/rest/attributes.rb +27 -0
  49. data/lib/rhc/rest/base.rb +29 -33
  50. data/lib/rhc/rest/cartridge.rb +42 -20
  51. data/lib/rhc/rest/client.rb +351 -89
  52. data/lib/rhc/rest/domain.rb +7 -13
  53. data/lib/rhc/rest/gear_group.rb +1 -1
  54. data/lib/rhc/rest/key.rb +7 -2
  55. data/lib/rhc/rest/mock.rb +609 -0
  56. data/lib/rhc/rest/user.rb +6 -2
  57. data/lib/rhc/{ssh_key_helpers.rb → ssh_helpers.rb} +58 -28
  58. data/lib/rhc/{targz.rb → tar_gz.rb} +0 -0
  59. data/lib/rhc/usage_templates/command_help.erb +4 -1
  60. data/lib/rhc/usage_templates/help.erb +24 -11
  61. data/lib/rhc/usage_templates/options_help.erb +14 -0
  62. data/lib/rhc/wizard.rb +283 -213
  63. data/spec/keys/example.pem +23 -0
  64. data/spec/keys/example_private.pem +27 -0
  65. data/spec/keys/server.pem +19 -0
  66. data/spec/rest_spec_helper.rb +3 -371
  67. data/spec/rhc/auth_spec.rb +226 -0
  68. data/spec/rhc/cli_spec.rb +41 -14
  69. data/spec/rhc/command_spec.rb +44 -15
  70. data/spec/rhc/commands/account_spec.rb +41 -0
  71. data/spec/rhc/commands/alias_spec.rb +16 -15
  72. data/spec/rhc/commands/app_spec.rb +115 -92
  73. data/spec/rhc/commands/apps_spec.rb +39 -0
  74. data/spec/rhc/commands/cartridge_spec.rb +134 -112
  75. data/spec/rhc/commands/domain_spec.rb +31 -86
  76. data/spec/rhc/commands/git_clone_spec.rb +56 -0
  77. data/spec/rhc/commands/{port-forward_spec.rb → port_forward_spec.rb} +27 -32
  78. data/spec/rhc/commands/server_spec.rb +28 -3
  79. data/spec/rhc/commands/setup_spec.rb +29 -11
  80. data/spec/rhc/commands/snapshot_spec.rb +4 -3
  81. data/spec/rhc/commands/sshkey_spec.rb +24 -56
  82. data/spec/rhc/commands/tail_spec.rb +26 -9
  83. data/spec/rhc/commands/threaddump_spec.rb +12 -11
  84. data/spec/rhc/config_spec.rb +211 -164
  85. data/spec/rhc/context_spec.rb +2 -0
  86. data/spec/rhc/helpers_spec.rb +242 -46
  87. data/spec/rhc/rest_application_spec.rb +42 -28
  88. data/spec/rhc/rest_client_spec.rb +110 -93
  89. data/spec/rhc/rest_spec.rb +220 -131
  90. data/spec/rhc/targz_spec.rb +1 -1
  91. data/spec/rhc/wizard_spec.rb +435 -624
  92. data/spec/spec.opts +1 -1
  93. data/spec/spec_helper.rb +140 -6
  94. data/spec/wizard_spec_helper.rb +326 -0
  95. metadata +163 -143
  96. data/lib/rhc/client.rb +0 -17
  97. data/lib/rhc/git_helper.rb +0 -59
@@ -0,0 +1,22 @@
1
+ require 'rhc/commands/base'
2
+
3
+ module RHC::Commands
4
+ class Apps < Base
5
+ summary "List all your applications"
6
+ description "Display the list of applications that you own. Includes information about each application."
7
+ def run
8
+ domains = rest_client.domains
9
+
10
+ info "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc domain create'." and return 1 if domains.empty?
11
+
12
+ applications = domains.map{ |d| d.applications(:include => :cartridges) }.flatten.sort
13
+
14
+ applications.each{ |a| display_app(a, a.cartridges) }.blank? and
15
+ info "No applications. Use 'rhc app create'." and
16
+ return 1
17
+
18
+ success "You have #{applications.length} applications"
19
+ 0
20
+ end
21
+ end
22
+ end
@@ -10,58 +10,10 @@ require 'rhc/context_helper'
10
10
  class RHC::Commands::Base
11
11
 
12
12
  attr_writer :options, :config
13
- attr_reader :messages
14
13
 
15
14
  def initialize(options=Commander::Command::Options.new,
16
- config=nil)
15
+ config=RHC::Config.new)
17
16
  @options, @config = options, config
18
- @messages = []
19
- end
20
-
21
- def validate_args_and_options(args_metadata, options_metadata, args)
22
- # process options
23
- options_metadata.each do |option_meta|
24
- arg = option_meta[:arg]
25
-
26
- # Check to see if we've provided a value for an option tagged as deprecated
27
- if (!(val = @options.__hash__[arg]).nil? && dep_info = option_meta[:deprecated])
28
- # Get the arg for the correct option and what the value should be
29
- (correct_arg, default) = dep_info.values_at(:key, :value)
30
- # Set the default value for the correct option to the passed value
31
- ## Note: If this isn't triggered, then the original default will be honored
32
- ## If the user specifies any value for the correct option, it will be used
33
- options.default correct_arg => default
34
- # Alert the users if they're using a deprecated option
35
- (correct, incorrect) = [options_metadata.find{|x| x[:arg] == correct_arg },option_meta].flatten.map{|x| x[:switches].join(", ") }
36
- deprecated_option(incorrect, correct)
37
- end
38
-
39
- context_helper = option_meta[:context_helper]
40
-
41
- @options.__hash__[arg] = self.send(context_helper) if @options.__hash__[arg].nil? and context_helper
42
- raise ArgumentError.new("Missing required option '#{arg}'.") if option_meta[:required] and @options.__hash__[arg].nil?
43
- end
44
-
45
- # process args
46
- arg_slots = [].fill(nil, 0, args_metadata.length)
47
- fill_args = args.reverse
48
- args_metadata.each_with_index do |arg_meta, i|
49
- # check options
50
- value = @options.__hash__[arg_meta[:option_symbol]] unless arg_meta[:option_symbol].nil?
51
- if value
52
- arg_slots[i] = value
53
- elsif arg_meta[:arg_type] == :list
54
- arg_slots[i] = fill_args.reverse
55
- fill_args = []
56
- else
57
- raise ArgumentError.new("Missing required argument '#{arg_meta[:name]}'.") if fill_args.empty?
58
- arg_slots[i] = fill_args.pop
59
- end
60
- end
61
-
62
- raise ArgumentError.new("Too many arguments passed in: #{fill_args.reverse.join(" ")}") unless fill_args.empty?
63
-
64
- arg_slots
65
17
  end
66
18
 
67
19
  protected
@@ -70,23 +22,6 @@ class RHC::Commands::Base
70
22
 
71
23
  attr_reader :options, :config
72
24
 
73
- #
74
- # The implicit config object provides no defaults.
75
- #
76
- def config
77
- @config ||= begin
78
- RHC::Config.new
79
- end
80
- end
81
-
82
- def application
83
- #@application ||= ... identify current application or throw,
84
- # indicating one is needed. Should check
85
- # options (commands which have it as an ARG
86
- # should set it onto options), then check
87
- # current git repo for remote, fail.
88
- end
89
-
90
25
  # Return a client object capable of making calls
91
26
  # to the OpenShift API that transforms intent
92
27
  # and options, to remote calls, and then handle
@@ -94,16 +29,7 @@ class RHC::Commands::Base
94
29
  # formatted object output. Most interactions
95
30
  # should be through this call pattern.
96
31
  def rest_client
97
- @rest_client ||= begin
98
- username = config.username
99
- unless username
100
- username = ask "Login to #{openshift_server}: "
101
- config.config_user(username)
102
- end
103
- config.password = config.password || RHC::get_password
104
-
105
- RHC::Rest::Client.new(openshift_rest_node, username, config.password, @options.debug)
106
- end
32
+ @rest_client ||= client_from_options(:auth => RHC::Auth::Basic.new(options))
107
33
  end
108
34
 
109
35
  def help(*args)
@@ -149,7 +75,13 @@ class RHC::Commands::Base
149
75
  end
150
76
 
151
77
  def self.description(*args)
152
- options[:description] = args.join(' ')
78
+ o = args.join(' ')
79
+ indent = o.scan(/^[ \t]*(?=\S)/).min.size || 0
80
+ options[:description] =
81
+ o.gsub(/^[ \t]{#{indent}}/, '').
82
+ gsub(/(\b)\s*\n(?!\s*\n)(\S)/m, '\1 \2').
83
+ gsub(/\n+\Z/, '').
84
+ gsub(/\n{3,}/, "\n\n")
153
85
  end
154
86
  def self.summary(value)
155
87
  options[:summary] = value
@@ -196,6 +128,7 @@ class RHC::Commands::Base
196
128
  args_metadata << {:name => name,
197
129
  :description => description,
198
130
  :switches => switches,
131
+ :context_helper => options[:context],
199
132
  :option_symbol => option_symbol,
200
133
  :arg_type => arg_type}
201
134
  end
@@ -8,27 +8,29 @@ module RHC::Commands
8
8
  alias_action :"app cartridge", :root_command => true, :deprecated => true
9
9
  default_action :list
10
10
 
11
- summary "List supported embedded cartridges"
11
+ summary "List available cartridges"
12
+ option ["-v", "--verbose"], "Display more details about each cartridge"
12
13
  alias_action :"app cartridge list", :root_command => true, :deprecated => true
13
14
  def list
14
- rest_client = RHC::Rest::Client.new(openshift_rest_node, nil, nil)
15
- list = rest_client.cartridges.
16
- map{ |c| [c.name, c.display_name || '', c.type == 'standalone' ? 'Y' : ''] }.
17
- sort do |a,b|
18
- if a[2] == 'Y' && b[2] == ''
19
- -1
20
- elsif a[2] == '' && b[2] == 'Y'
21
- 1
22
- else
23
- a[1].downcase <=> b[1].downcase
24
- end
25
- end
26
- list.unshift ['==========', '=========', '=============']
27
- list.unshift ['Short Name', 'Full name', 'New apps only']
15
+ carts = rest_client.cartridges.sort_by{ |c| "#{c.type == 'standalone' && 1}_#{c.tags.include?('experimental') ? 1 : 0}_#{(c.display_name || c.name).downcase}" }
16
+
17
+ list = if options.verbose
18
+ carts.map do |c|
19
+ name = c.display_name != c.name && "#{color(c.display_name, :cyan)} [#{c.name}]" || c.name
20
+ tags = c.tags - RHC::Rest::Cartridge::HIDDEN_TAGS
21
+ [
22
+ underline("#{name} (#{c.only_in_new? ? 'web' : 'addon'})"),
23
+ c.description,
24
+ tags.present? ? "\nTagged with: #{tags.sort.join(', ')}" : nil,
25
+ ].compact << "\n"
26
+ end.flatten
27
+ else
28
+ table(carts.map{ |c| [c.name, c.display_name, c.only_in_new? ? 'web' : 'addon'] })
29
+ end
28
30
 
29
- paragraph{ say "Use the short name of a cartridge when interacting with your applications." }
30
31
 
31
- say table(list).join("\n")
32
+ say list.join("\n")
33
+ paragraph{ say "Note: Web cartridges can only be added to new applications." }
32
34
 
33
35
  0
34
36
  end
@@ -42,14 +44,17 @@ module RHC::Commands
42
44
  def add(cart_type)
43
45
  cart = find_cartridge rest_client, cart_type
44
46
 
45
- say "Adding '#{cart.name}' to application '#{options.app}'"
47
+ say "Adding #{cart.name} to application '#{options.app}' ... "
46
48
 
47
49
  rest_domain = rest_client.find_domain(options.namespace)
48
50
  rest_app = rest_domain.find_application(options.app)
49
51
  rest_cartridge = rest_app.add_cartridge(cart.name)
50
- say "Success"
51
52
 
52
- display_cart(rest_cartridge,rest_cartridge.properties[:cart_data])
53
+ success "Success"
54
+
55
+ paragraph{ display_cart(rest_cartridge) }
56
+
57
+ results{ rest_cartridge.messages.each { |msg| success msg } }
53
58
 
54
59
  0
55
60
  end
@@ -64,7 +69,7 @@ module RHC::Commands
64
69
  rest_app = rest_domain.find_application(options.app)
65
70
  rest_cartridge = find_cartridge rest_app, cartridge, nil
66
71
 
67
- display_cart(rest_cartridge,rest_cartridge.properties[:cart_data])
72
+ display_cart(rest_cartridge)
68
73
 
69
74
  0
70
75
  end
@@ -74,20 +79,20 @@ module RHC::Commands
74
79
  argument :cartridge, "The name of the cartridge you are removing", ["-c", "--cartridge cartridge"]
75
80
  option ["-n", "--namespace namespace"], "Namespace of the application you are removing the cartridge from", :context => :namespace_context, :required => true
76
81
  option ["-a", "--app app"], "Application you are removing the cartridge from", :context => :app_context, :required => true
77
- option ["--confirm"], "Safety switch - if this switch is not passed a warning is printed out and the cartridge will not be removed"
82
+ option ["--confirm"], "Pass to confirm removing the cartridge"
78
83
  alias_action :"app cartridge remove", :root_command => true, :deprecated => true
79
84
  def remove(cartridge)
80
- unless options.confirm
81
- results { say "Removing a cartridge is a destructive operation that may result in loss of data associated with the cartridge. You must pass the --confirm switch to this command in order to to remove the cartridge." }
82
- return 1
83
- end
84
85
 
85
86
  rest_domain = rest_client.find_domain(options.namespace)
86
87
  rest_app = rest_domain.find_application(options.app)
87
88
  rest_cartridge = rest_app.find_cartridge cartridge, :type => "embedded"
89
+
90
+ confirm_action "Removing a cartridge is a destructive operation that may result in loss of data associated with the cartridge.\n\nAre you sure you wish to remove #{rest_cartridge.name} from '#{rest_app.name}'?"
91
+
92
+ say "Removing #{rest_cartridge.name} from '#{rest_app.name}' ... "
88
93
  rest_cartridge.destroy
94
+ success "removed"
89
95
 
90
- results { say "Success: Cartridge '#{rest_cartridge.name}' removed from application '#{rest_app.name}'." }
91
96
  0
92
97
  end
93
98
 
@@ -140,12 +145,7 @@ module RHC::Commands
140
145
  rest_domain = rest_client.find_domain(options.namespace)
141
146
  rest_app = rest_domain.find_application(options.app)
142
147
  rest_cartridge = find_cartridge(rest_app, cartridge)
143
- msgs = rest_cartridge.status
144
- results {
145
- msgs.each do |msg|
146
- say msg['message']
147
- end
148
- }
148
+ results { rest_cartridge.status.each{ |msg| say msg['message'] } }
149
149
  0
150
150
  end
151
151
 
@@ -184,8 +184,8 @@ module RHC::Commands
184
184
  })
185
185
 
186
186
  results do
187
- say "Success: Scaling values updated"
188
- display_cart(cart)
187
+ paragraph{ display_cart(cart) }
188
+ success "Success: Scaling values updated"
189
189
  end
190
190
 
191
191
  0
@@ -41,28 +41,35 @@ module RHC::Commands
41
41
  0
42
42
  end
43
43
 
44
- summary "Display the applications in your domain"
44
+ summary "Display your domain and any applications"
45
45
  def show
46
46
  domain = rest_client.domains.first
47
47
 
48
- display_domain(domain)
48
+ warn "In order to deploy applications, you must create a domain with 'rhc setup' or 'rhc domain create'." and return 1 unless domain
49
+
50
+ applications = domain.applications(:include => :cartridges)
51
+
52
+ if applications.present?
53
+ header "Applications in #{domain.id} domain" do
54
+ applications.each do |a|
55
+ display_app(a,a.cartridges)
56
+ end
57
+ end
58
+ success "You have #{applications.length} applications in your domain."
59
+ else
60
+ success "The domain #{domain.id} exists but has no applications. You can use 'rhc app create' to create a new application."
61
+ end
49
62
 
50
63
  0
51
64
  end
52
65
 
53
- summary "Run a status check on your domain"
66
+ summary "DEPRECATED use 'setup' instead"
67
+ deprecated 'rhc setup'
68
+ # :nocov:
54
69
  def status
55
- args = []
56
-
57
- options.__hash__.each do |key, value|
58
- value = value.to_s
59
- if value.length > 0 && value.to_s.strip.length == 0; value = "'#{value}'" end
60
- args << "--#{key} #{value}"
61
- end
62
-
63
- Kernel.system("rhc-chk #{args.join(' ')} 2>&1")
64
- $?.exitstatus.nil? ? 1 : $?.exitstatus
70
+ 1 # return error status
65
71
  end
72
+ # :nocov:
66
73
 
67
74
  summary "Deletes your domain."
68
75
  syntax "<namespace>"
@@ -0,0 +1,30 @@
1
+ require 'rhc/commands/base'
2
+ require 'rhc/git_helpers'
3
+
4
+ module RHC::Commands
5
+ class GitClone < Base
6
+ summary "Clone and configure an application's repository locally"
7
+ description "This is a convenience wrapper for 'git clone' with the added",
8
+ "benefit of adding configuration data such as the application's",
9
+ "UUID to the local repository. It also automatically",
10
+ "figures out the git url from the application name so you don't",
11
+ "have to look it up."
12
+ syntax "<app> [--namespace namespace]"
13
+ option ["-n", "--namespace namespace"], "Namespace of the application", :context => :namespace_context, :required => true
14
+ option ["-r", "--repo dir"], "Path to the Git repository (defaults to ./$app_name)"
15
+ argument :app, "The application you wish to clone", ["-a", "--app name"]
16
+ alias_action 'app git-clone', :deprecated => true, :root_command => true
17
+ # TODO: Implement default values for arguments once ffranz has added context arguments
18
+ # argument :directory, "The name of a new directory to clone into", [], :default => nil
19
+ def run(app_name)
20
+ domain = rest_client.find_domain(options.namespace)
21
+ app = domain.find_application(app_name)
22
+ git_clone_application(app)
23
+
24
+ 0
25
+ end
26
+
27
+ private
28
+ include RHC::GitHelpers
29
+ end
30
+ end
@@ -180,10 +180,10 @@ module RHC::Commands
180
180
  raise RHC::PortForwardFailedException.new("#{e.message + "\n" if options.debug}Error trying to forward ports. You can try to forward manually by running:\n" + ssh_cmd.join(" "))
181
181
  end
182
182
 
183
- return 0
184
- rescue RestClient::Exception => e
183
+ 0
184
+ rescue RHC::Rest::ConnectionException => e
185
185
  error "Connection to #{openshift_server} failed: #{e.message}"
186
- return 1
186
+ 1
187
187
  end
188
188
  end
189
189
  end
@@ -1,28 +1,40 @@
1
- require 'rhc/commands/base'
2
-
3
1
  module RHC::Commands
4
2
  class Server < Base
5
3
  suppress_wizard
6
4
 
7
5
  summary "Display information about the status of the OpenShift service."
8
- description "Retrieves any open issues or notices about the operation of the OpenShift service and displays them in the order they were opened."
6
+ description <<-DESC
7
+ Retrieves any open issues or notices about the operation of the
8
+ OpenShift service and displays them in the order they were opened.
9
+
10
+ When connected to an OpenShift Enterprise server, will only display
11
+ the version of the API that it is connecting to.
12
+ DESC
9
13
  def run
10
- status = decode_json(get("#{openshift_url}/app/status/status.json").body)
11
- open = status['open']
14
+ say "Connected to #{openshift_server}"
12
15
 
13
- (success 'All systems running fine' and return 0) if open.blank?
16
+ if openshift_online_server?
17
+ #status = decode_json(get("#{openshift_url}/app/status/status.json").body)
18
+ status = rest_client.request(:method => :get, :url => "#{openshift_url}/app/status/status.json", :lazy_auth => true){ |res| decode_json(res.content) }
19
+ open = status['open']
14
20
 
15
- open.each do |i|
16
- i = i['issue']
17
- say color("%-3s %s" % ["##{i['id']}", i['title']], :bold)
18
- items = i['updates'].map{ |u| [u['description'], date(u['created_at'])] }
19
- items.unshift ['Opened', date(i['created_at'])]
20
- table(items, :align => [nil,:right], :join => ' ').each{ |s| say " #{s}" }
21
- end
22
- say "\n"
23
- warn pluralize(open.length, "open issue")
21
+ (success 'All systems running fine' and return 0) if open.blank?
24
22
 
25
- open.length #exit with the count of open items
23
+ open.each do |i|
24
+ i = i['issue']
25
+ say color("%-3s %s" % ["##{i['id']}", i['title']], :bold)
26
+ items = i['updates'].map{ |u| [u['description'], date(u['created_at'])] }
27
+ items.unshift ['Opened', date(i['created_at'])]
28
+ table(items, :align => [nil,:right], :join => ' ').each{ |s| say " #{s}" }
29
+ end
30
+ say "\n"
31
+ warn pluralize(open.length, "open issue")
32
+
33
+ open.length #exit with the count of open items
34
+ else
35
+ success "Using API version #{rest_client.api_version_negotiated}"
36
+ 0
37
+ end
26
38
  end
27
39
  end
28
40
  end
@@ -6,7 +6,24 @@ module RHC::Commands
6
6
  class Setup < Base
7
7
  suppress_wizard
8
8
 
9
- summary "Easy to use wizard for getting started with OpenShift."
9
+ summary "Connects to OpenShift and sets up your keys and domain"
10
+ description <<-DESC
11
+ Connects to an OpenShift server to get you started. Will help you
12
+ configure your SSH keys, set up a domain, and check for any potential
13
+ problems with Git or SSH.
14
+
15
+ Any options you pass to the setup command will be stored in a
16
+ .openshift/express.conf file in your home directory. If you run
17
+ setup at a later time, any previous configuration will be reused.
18
+
19
+
20
+ Pass the --clean option to ignore your saved configuration and only
21
+ use options you pass on the command line. Pass --config FILE to use
22
+ default values from another config (the values will still be written
23
+ to .openshift/express.conf).
24
+ DESC
25
+ option ["--server NAME"], "Hostname of an OpenShift server", :context => :server_context, :required => true
26
+ option ['--clean'], "Ignore any saved configuration options"
10
27
  def run
11
28
  raise OptionParser::InvalidOption, "Setup can not be run with the --noprompt option" if options.noprompt
12
29
  RHC::RerunWizard.new(config, options).run ? 0 : 1