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
@@ -1 +1 @@
1
- --color
1
+ --color
@@ -3,6 +3,27 @@ require 'webmock/rspec'
3
3
  require 'fakefs/safe'
4
4
  require 'rbconfig'
5
5
 
6
+ require 'pry' if ENV['PRY']
7
+
8
+ # Environment reset
9
+ ENV['http_proxy'] = nil
10
+ ENV['HTTP_PROXY'] = nil
11
+
12
+ class FakeFS::Mode
13
+ def initialize(mode_s)
14
+ @s = mode_s
15
+ end
16
+ def to_s(*args)
17
+ @s
18
+ end
19
+ end
20
+ class FakeFS::Stat
21
+ attr_reader :mode
22
+ def initialize(mode_s)
23
+ @mode = FakeFS::Mode.new(mode_s)
24
+ end
25
+ end
26
+
6
27
  # chmod isn't implemented in the released fakefs gem
7
28
  # but is in git. Once the git version is released we
8
29
  # should remove this and actively check permissions
@@ -11,8 +32,21 @@ class FakeFS::File
11
32
  # noop
12
33
  end
13
34
 
14
- # Epic fail - FakeFS manages to redefine this to '/'
15
- const_set('PATH_SEPARATOR', ":")
35
+ def self.stat(path)
36
+ FakeFS::Stat.new(mode(path))
37
+ end
38
+
39
+ def self.mode(path)
40
+ @modes && @modes[path] || '664'
41
+ end
42
+ def self.expect_mode(path, mode)
43
+ (@modes ||= {})[path] = mode
44
+ end
45
+
46
+ # FakeFS incorrectly assigns this to '/'
47
+ remove_const(:PATH_SEPARATOR) rescue nil
48
+ const_set(:PATH_SEPARATOR, ":")
49
+ const_set(:ALT_SEPARATOR, '') rescue nil
16
50
 
17
51
  def self.executable?(path)
18
52
  # if the file exists we will assume it is executable
@@ -50,6 +84,19 @@ module ClassSpecHelpers
50
84
  "#{description}".split(" ").map{|word| word.capitalize}.join.gsub(/[^\w]/, '')
51
85
  end
52
86
  end
87
+
88
+ def with_constants(constants, base=Object, &block)
89
+ constants.each do |constant, val|
90
+ base.const_set(constant, val)
91
+ end
92
+
93
+ block.call
94
+ ensure
95
+ constants.each do |constant, val|
96
+ base.send(:remove_const, constant)
97
+ end
98
+ end
99
+
53
100
  def new_command_runner *args, &block
54
101
  Commander::Runner.instance_variable_set :"@singleton", RHC::CommandRunner.new(args)
55
102
  program :name, 'test'
@@ -65,7 +112,7 @@ module ClassSpecHelpers
65
112
  #
66
113
  #
67
114
  #
68
- def expects_running *args
115
+ def expects_running(*args, &block)
69
116
  mock_terminal
70
117
  r = new_command_runner *args do
71
118
  instance #ensure instance is created before subject :new is mocked
@@ -74,6 +121,18 @@ module ClassSpecHelpers
74
121
  end
75
122
  lambda { r.run! }
76
123
  end
124
+ def command_for(*args)
125
+ mock_terminal
126
+ r = new_command_runner *args do
127
+ instance #ensure instance is created before subject :new is mocked
128
+ subject.should_receive(:new).any_number_of_times.and_return(instance)
129
+ RHC::Commands.to_commander
130
+ end
131
+ command = nil
132
+ RHC::Commands.stub(:execute){ |cmd, method, args| command = cmd; 0 }
133
+ r.run!
134
+ command
135
+ end
77
136
 
78
137
  class MockHighLineTerminal < HighLine
79
138
  def initialize(input, output)
@@ -110,6 +169,9 @@ module ClassSpecHelpers
110
169
  @input.seek(reset_pos)
111
170
  result
112
171
  end
172
+ def close_write
173
+ @input.close_write
174
+ end
113
175
  end
114
176
 
115
177
  def mock_terminal
@@ -118,28 +180,60 @@ module ClassSpecHelpers
118
180
  $stderr = (@error = StringIO.new)
119
181
  $terminal = MockHighLineTerminal.new @input, @output
120
182
  end
183
+ def input_line(s)
184
+ $terminal.write_line s
185
+ end
186
+ def last_output(&block)
187
+ if block_given?
188
+ yield $terminal.read
189
+ else
190
+ $terminal.read
191
+ end
192
+ end
121
193
 
122
194
  def capture(&block)
195
+ old_stdout = $stdout
123
196
  old_stderr = $stderr
124
197
  old_terminal = $terminal
125
198
  @input = StringIO.new
126
199
  @output = StringIO.new
200
+ $stdout = @output
127
201
  $stderr = (@error = StringIO.new)
128
202
  $terminal = MockHighLineTerminal.new @input, @output
129
203
  yield
204
+ @output.string
130
205
  ensure
206
+ $stdout = old_stdout
207
+ $stderr = old_stderr
208
+ $terminal = old_terminal
209
+ end
210
+
211
+ def capture_all(&block)
212
+ old_stdout = $stdout
213
+ old_stderr = $stderr
214
+ old_terminal = $terminal
215
+ @input = StringIO.new
216
+ @output = StringIO.new
217
+ $stdout = @output
218
+ $stderr = @output
219
+ $terminal = MockHighLineTerminal.new @input, @output
220
+ yield
221
+ @output.string
222
+ ensure
223
+ $stdout = old_stdout
131
224
  $stderr = old_stderr
132
225
  $terminal = old_terminal
133
- @output.to_s
134
226
  end
135
227
 
136
228
  def run(input=[])
137
229
  #Commander::Runner.instance_variable_set :"@singleton", nil
138
230
  mock_terminal
139
231
  input.each { |i| $terminal.write_line(i) }
232
+ $terminal.close_write
233
+ #"#{@output.string}\n#{$stderr.string}"
140
234
  RHC::CLI.start(arguments)
141
- "#{@output.string}\n#{$stderr.string}"
142
235
  end
236
+
143
237
  def run_output(input=[])
144
238
  run(input)
145
239
  rescue SystemExit => e
@@ -153,7 +247,36 @@ module ClassSpecHelpers
153
247
  #
154
248
  def user_agent_header
155
249
  lambda do |request|
156
- request.headers['User-Agent'] =~ %r{\Arhc/\d+\.\d+.\d+ \(.*?ruby.*?\)}
250
+ #User-Agent is not sent to mock by httpclient
251
+ #request.headers['User-Agent'] =~ %r{\Arhc/\d+\.\d+.\d+ \(.*?ruby.*?\)}
252
+ true
253
+ end
254
+ end
255
+
256
+ def base_config(&block)
257
+ config = RHC::Config.new
258
+ config.stub(:load_config_files)
259
+ defaults = config.instance_variable_get(:@defaults)
260
+ yield config, defaults if block_given?
261
+ RHC::Config.stub(:default).and_return(config)
262
+ RHC::Config.stub(:new).and_return(config)
263
+ config
264
+ end
265
+
266
+ def user_config
267
+ user = respond_to?(:username) ? self.username : 'test_user'
268
+ password = respond_to?(:password) ? self.password : 'test pass'
269
+ server = respond_to?(:server) ? self.server : nil
270
+
271
+ base_config do |config, defaults|
272
+ defaults.add 'default_rhlogin', user
273
+ defaults.add 'password', password
274
+ defaults.add 'libra_server', server if server
275
+ end.tap do |c|
276
+ opts = c.to_options
277
+ opts[:rhlogin].should == user
278
+ opts[:password].should == password
279
+ opts[:server].should == server if server
157
280
  end
158
281
  end
159
282
  end
@@ -216,3 +339,14 @@ Spec::Runner.configure do |config|
216
339
  config.include(CommanderInvocationMatchers)
217
340
  config.include(ClassSpecHelpers)
218
341
  end
342
+
343
+ module TestEnv
344
+ extend ClassSpecHelpers
345
+ class << self
346
+ attr_accessor :instance, :subject
347
+ def instance=(i)
348
+ self.subject = i.class
349
+ @instance = i
350
+ end
351
+ end
352
+ end
@@ -0,0 +1,326 @@
1
+
2
+ module WizardStepsHelper
3
+ def should_greet_user
4
+ next_stage.should_not be_nil
5
+
6
+ last_output do |s|
7
+ s.count("\n").should >= 3
8
+ s.should match(/OpenShift Client Tools \(RHC\) Setup Wizard/)
9
+ end
10
+ end
11
+
12
+ def should_challenge_for(username, password)
13
+ input_line username.to_s if username
14
+ input_line password.to_s if password
15
+ next_stage.should_not be_nil
16
+
17
+ last_output do |s|
18
+ s.send(username ? :should : :should_not, match("Login to "))
19
+ s.send(password ? :should : :should_not, match(/Password: [\*]{8}$/))
20
+ end
21
+ end
22
+
23
+ def should_write_config
24
+ test_config_file(false)
25
+ end
26
+ def should_overwrite_config
27
+ test_config_file(true)
28
+ end
29
+ def test_config_file(present)
30
+ File.exists?(current_config_path).should be present
31
+
32
+ next_stage.should_not be_nil
33
+
34
+ last_output.should match("Saving configuration to #{current_config_path}")
35
+
36
+ File.readable?(current_config_path).should be true
37
+ RHC::Vendor::ParseConfig.new(current_config_path).tap do |cp|
38
+ cp["default_rhlogin"].should == username
39
+ cp["libra_server"].should == mock_uri
40
+ end
41
+ end
42
+
43
+ def should_create_an_ssh_keypair
44
+ setup_mock_ssh
45
+ keys_should_not_exist
46
+
47
+ next_stage.should_not be_nil
48
+
49
+ keys_should_exist
50
+ last_output.should match('No SSH keys were found. We will generate a pair of keys')
51
+ end
52
+
53
+ def should_not_create_an_ssh_keypair
54
+ next_stage.should_not be_nil
55
+
56
+ last_output.should == ''
57
+ end
58
+
59
+ def should_upload_default_key
60
+ input_line 'yes'
61
+
62
+ next_stage.should_not be_nil
63
+
64
+ last_output do |s|
65
+ s.should match('Since you do not have any keys associated')
66
+ s.should match(/Fingerprint\: (?:[a-f0-9]{2}\:){15}/)
67
+ s.should match("Uploading key 'default' from #{current_ssh_dir}/id_rsa.pub ... ")
68
+ end
69
+ end
70
+
71
+ def should_skip_uploading_key
72
+ input_line 'no'
73
+
74
+ next_stage.should_not be_nil
75
+
76
+ last_output.should match('You can upload your SSH key at a later time using ')
77
+ end
78
+
79
+ def should_find_matching_server_key
80
+ next_stage.should_not be_nil
81
+
82
+ last_output.should == ""
83
+ end
84
+
85
+ def should_find_git
86
+ setup_mock_has_git(true)
87
+
88
+ next_stage.should_not be_nil
89
+
90
+ last_output.should match(/Checking for git .*found/)
91
+ end
92
+
93
+ def should_display_windows_info
94
+ next_stage.should_not be_nil
95
+
96
+ last_output do |s|
97
+ s.should match('Git for Windows')
98
+ s.should match('In order to fully interact with OpenShift you will need to install and configure a git client')
99
+ end
100
+ end
101
+
102
+ def should_not_find_git
103
+ setup_mock_has_git(false)
104
+
105
+ next_stage.should_not be_nil
106
+
107
+ last_output do |s|
108
+ s.should match(/Checking for git .*needs to be installed/)
109
+ s.should match("Automated installation of client tools is not supported for your platform")
110
+ end
111
+ end
112
+
113
+ def should_not_find_problems
114
+ FakeFS::File.expect_mode(RHC::Config.ssh_priv_key_file_path, '600')
115
+
116
+ next_stage.should_not be_nil
117
+ last_output do |s|
118
+ s.should match(/Checking common problems \.+.+?done/)
119
+ end
120
+ end
121
+
122
+ def should_check_remote_server
123
+ FakeFS::File.expect_mode(RHC::Config.ssh_priv_key_file_path, '600')
124
+
125
+ ssh = Object.new
126
+ ssh.should_receive(:close)
127
+ Net::SSH.should_receive(:start).once.and_return(ssh)
128
+ subject.should_receive(:ssh_key_uploaded?).and_return(true)
129
+
130
+ next_stage.should_not be_nil
131
+ last_output do |s|
132
+ s.should match(/Checking common problems \.+.+?done/)
133
+ end
134
+ end
135
+
136
+ def should_find_ssh_keys
137
+ next_stage.should_not be_nil
138
+
139
+ last_output do |s|
140
+ s.should_not match(/Remote server does not have the corresponding SSH key/)
141
+ end
142
+ end
143
+
144
+ def should_not_find_ssh_keys
145
+ next_stage.should_not be_nil
146
+
147
+ last_output do |s|
148
+ s.should match(/Remote server does not have the corresponding SSH key/)
149
+ end
150
+ end
151
+
152
+ def should_create_a_namespace
153
+ input_line "thisnamespaceistoobigandhastoomanycharacterstobevalid"
154
+ input_line "invalidnamespace"
155
+ input_line "testnamespace"
156
+
157
+ next_stage.should_not be_nil
158
+
159
+ last_output do |s|
160
+ s.should match(/Checking your namespace .*none/)
161
+ s.should match(/(?:Too long.*?){2}/m)
162
+ end
163
+ end
164
+
165
+ def should_skip_creating_namespace
166
+ input_line ""
167
+
168
+ next_stage.should_not be_nil
169
+
170
+ last_output do |s|
171
+ s.should match(/Checking your namespace .*none/)
172
+ s.should match("You will not be able to create applications without first creating a namespace")
173
+ s.should match("You may create a namespace later through 'rhc domain create'")
174
+ end
175
+ end
176
+
177
+ def should_find_a_namespace(namespace)
178
+ next_stage.should_not be_nil
179
+
180
+ last_output.should match(/Checking your namespace .*#{namespace}/)
181
+ end
182
+
183
+ def should_list_types_of_apps_to_create
184
+ next_stage.should_not be_nil
185
+
186
+ last_output do |s|
187
+ s.should match('rhc app create <app name> mock_standalone_cart-1')
188
+ s.should match('rhc app create <app name> mock_standalone_cart-2')
189
+ end
190
+ end
191
+
192
+ def should_find_apps(*args)
193
+ next_stage.should_not be_nil
194
+
195
+ last_output do |s|
196
+ s.should match("found #{args.length}")
197
+ args.each do |(name, domain_name)|
198
+ s.should match("#{name} http://#{name}-#{domain_name}.rhcloud.com")
199
+ end
200
+ s.should match("You are using ")
201
+ s.should match("The following gear sizes are available to you")
202
+ end
203
+ end
204
+
205
+ def should_be_done
206
+ next_stage.should be_true
207
+
208
+ last_output.should match("Your client tools are now configured.")
209
+ end
210
+ end
211
+
212
+
213
+ module WizardHelper
214
+ def next_stage
215
+ @stages ||= subject.stages
216
+ @stage ||= -1
217
+ @current_stage = @stages[@stage+=1]
218
+ subject.send(@current_stage)
219
+ end
220
+
221
+ def current_config_path
222
+ subject.send(:config).config_path
223
+ end
224
+
225
+ def setup_mock_has_git(bool)
226
+ subject.stub(:"has_git?") { bool }
227
+ end
228
+
229
+ def current_ssh_dir
230
+ subject.send(:config).ssh_dir
231
+ end
232
+ def setup_mock_ssh(add_ssh_key=false)
233
+ FileUtils.mkdir_p current_ssh_dir
234
+ if add_ssh_key
235
+ setup_mock_ssh_keys
236
+ end
237
+ end
238
+
239
+ def keys_should_exist
240
+ File.exists?(File.join(current_ssh_dir, "id_rsa")).should be true
241
+ File.exists?(File.join(current_ssh_dir, "id_rsa.pub")).should be true
242
+ end
243
+ def keys_should_not_exist
244
+ File.exists?(File.join(current_ssh_dir, "id_rsa")).should be false
245
+ File.exists?(File.join(current_ssh_dir, "id_rsa.pub")).should be false
246
+ end
247
+
248
+ def priv_key
249
+ <<EOF
250
+ -----BEGIN RSA PRIVATE KEY-----
251
+ MIICWwIBAAKBgQDIXpBBs7g93z/5JqW5IJNJR8bG6DWhpL2vR2ROEfzGqDHLZ+Xb
252
+ saS/Ogc3nZNSav3juHWdiBFIc0unPpLdwmXtcL3tjN52CJqPgU/W0q061fL/tk77
253
+ fFqW2upluo0ZRZQdPc3vTI3tWWZcpyE2LPHHUOI3KN+lRqxgw0Y6z/3SfwIDAQAB
254
+ AoGAbMC+xZp5TsPEokOywWeH6cdWgZF5wpF7Dw7Nx34F2AFkfYWYAgVKaSxizHHv
255
+ i1VdFmOBGw7Gaq+BiXXyGwEvdpmgDoZDwvJrShZef5LwYnJ/NCqjZ8Xbb9z4VxCL
256
+ pkqMFFpEeNQcIDLZRF8Z1prRQnOL+Z498P6d3G/UWkR5NXkCQQDsGlpJzJwAPpwr
257
+ YZ98LgKT0n2WHeCrMQ9ZyJQl3Dz40qasQmIotB+mdIh87EFex7vvyiuzRC5rfcoX
258
+ CBHEkQpVAkEA2UFNBKgI1v5+16K0/CXPakQ25AlGODDv2VXlHwRPOayUG/Tn2joj
259
+ fj0T4/pu9AGhz0oVXFlz7iO8PEwFU+plgwJAKD2tmdp31ErXj0VKS34EDnHX2dgp
260
+ zMPF3AWlynYpJjexFLcTx+A7bMF76d7SnXbpf0sz+4/pYYTFBvvnG1ulKQJACJsR
261
+ lfGiCAIkvB3x1VsaEDeLhRTo9yjZF17TqJrfGIXBiCn3VSmgZku9EfbFllzKMA/b
262
+ MMFKWlCIEEtimqRaSQJAPVA1E7AiEvfUv0kRT73tDf4p/BRJ7p2YwjxrGpDBQhG1
263
+ YI+4NOhWtAG3Uips++8RhvmLjv8y+TNKU31J1EJmYA==
264
+ -----END RSA PRIVATE KEY-----
265
+ EOF
266
+ end
267
+
268
+ def pub_key
269
+ <<EOF
270
+ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIXpBBs7g93z/5JqW5IJNJR8bG6DWhpL2vR2ROEfzGqDHLZ+XbsaS/Ogc3nZNSav3juHWdiBFIc0unPpLdwmXtcL3tjN52CJqPgU/W0q061fL/tk77fFqW2upluo0ZRZQdPc3vTI3tWWZcpyE2LPHHUOI3KN+lRqxgw0Y6z/3Sfw== OpenShift-Key
271
+ EOF
272
+ end
273
+
274
+ def rsa_key_content_public
275
+ 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDJ54a/MlApilkfv7VCQS3lyUL5tHkJbuKNHOk6BtREsdrATZOpB3En3bRlgDMeGR0tAuRanvBai8TQG2kZluwdqAuTER0hiuZrAimrUHWbkQGZlwGWHBzNw/98gliZJYkZchAJjyzdQULbzq9xhcXzfYhUbZH1SGq6sThmR63tiYZHlbqQ+a56vpyFQsVEzvq5uqkvcJpSX74gDo0xqAAxSdNYZTBpLgFMB9Xzk/1UNlZ9C1SNDxEwFQZgzNriVyrGsJWaXfZdJRBa0PwScPEpJ4VlDFEgdtynjE1LabUAdMBoBXlr8QZgNHCuc3hUq/IVm3NShx+J3hVO3mP8HcLJ'
276
+ end
277
+ def rsa_key_fingerprint_public
278
+ '18:2a:99:6c:9b:65:6f:a5:13:57:c9:41:c7:b4:24:36'
279
+ end
280
+
281
+ class Sshkey < OpenStruct
282
+ def type
283
+ @table[:type]
284
+ end
285
+ def type=(type)
286
+ @table[:type] = type
287
+ end
288
+ end
289
+
290
+ def mock_key_objects
291
+ [
292
+ Sshkey.new(:name => 'default', :type => 'ssh-rsa', :fingerprint => "0f:97:4b:82:87:bb:c6:dc:40:a3:c1:bc:bb:55:1e:fa"),
293
+ Sshkey.new(:name => 'cb490595', :type => 'ssh-rsa', :fingerprint => "cb:49:05:95:b4:42:1c:95:74:f7:2d:41:0d:f0:37:3b"),
294
+ Sshkey.new(:name => '96d90241', :type => 'ssh-rsa', :fingerprint => "96:d9:02:41:e1:cb:0d:ce:e5:3b:fc:da:13:65:3e:32"),
295
+ Sshkey.new(:name => '73ce2cc1', :type => 'ssh-rsa', :fingerprint => "73:ce:2c:c1:01:ea:79:cc:f6:be:86:45:67:96:7f:e3")
296
+ ]
297
+ end
298
+
299
+ def setup_mock_ssh_keys(dir=current_ssh_dir)
300
+ private_key_file = File.join(dir, "id_rsa")
301
+ public_key_file = File.join(dir, "id_rsa.pub")
302
+ File.open(private_key_file, 'w') { |f| f.write priv_key }
303
+
304
+ File.open(public_key_file, 'w') { |f| f.write pub_key }
305
+ end
306
+
307
+ def setup_different_config
308
+ path = File.join(File.join(home_dir, '.openshift'), 'express.conf')
309
+ FileUtils.mkdir_p File.dirname(path)
310
+ File.open(path, "w") do |file|
311
+ file.puts <<EOF
312
+ # Default user login
313
+ default_rhlogin='a_different_user'
314
+
315
+ # Server API
316
+ libra_server = 'a_different_server.com'
317
+ EOF
318
+ end
319
+ path
320
+ end
321
+ end
322
+
323
+ Spec::Runner.configure do |config|
324
+ config.include(WizardHelper)
325
+ config.include(WizardStepsHelper)
326
+ end