rhc 1.2.7 → 1.3.8
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/rhc +6 -8
- data/bin/rhc-chk +23 -10
- data/features/domain.feature +1 -1
- data/features/lib/rhc_helper.rb +3 -2
- data/features/lib/rhc_helper/api.rb +7 -0
- data/features/lib/rhc_helper/app.rb +8 -10
- data/features/lib/rhc_helper/domain.rb +2 -1
- data/features/lib/rhc_helper/runnable.rb +2 -24
- data/features/sshkey.feature +3 -3
- data/features/step_definitions/cartridge_steps.rb +6 -6
- data/features/step_definitions/client_steps.rb +0 -1
- data/features/step_definitions/sshkey_steps.rb +2 -2
- data/features/support/before_hooks.rb +0 -1
- data/features/support/env.rb +5 -3
- data/lib/rhc-common.rb +1 -1
- data/lib/rhc.rb +9 -8
- data/lib/rhc/auth.rb +3 -0
- data/lib/rhc/auth/basic.rb +54 -0
- data/lib/rhc/cartridge_helpers.rb +11 -5
- data/lib/rhc/cli.rb +4 -2
- data/lib/rhc/command_runner.rb +35 -30
- data/lib/rhc/commands.rb +127 -18
- data/lib/rhc/commands/account.rb +24 -0
- data/lib/rhc/commands/alias.rb +1 -1
- data/lib/rhc/commands/app.rb +210 -209
- data/lib/rhc/commands/apps.rb +22 -0
- data/lib/rhc/commands/base.rb +10 -77
- data/lib/rhc/commands/cartridge.rb +35 -35
- data/lib/rhc/commands/domain.rb +20 -13
- data/lib/rhc/commands/git_clone.rb +30 -0
- data/lib/rhc/commands/{port-forward.rb → port_forward.rb} +3 -3
- data/lib/rhc/commands/server.rb +28 -16
- data/lib/rhc/commands/setup.rb +18 -1
- data/lib/rhc/commands/snapshot.rb +4 -4
- data/lib/rhc/commands/sshkey.rb +4 -18
- data/lib/rhc/commands/tail.rb +32 -9
- data/lib/rhc/config.rb +168 -99
- data/lib/rhc/context_helper.rb +22 -9
- data/lib/rhc/core_ext.rb +41 -1
- data/lib/rhc/exceptions.rb +21 -5
- data/lib/rhc/git_helpers.rb +81 -0
- data/lib/rhc/help_formatter.rb +21 -1
- data/lib/rhc/helpers.rb +222 -87
- data/lib/rhc/output_helpers.rb +94 -110
- data/lib/rhc/rest.rb +15 -198
- data/lib/rhc/rest/api.rb +88 -0
- data/lib/rhc/rest/application.rb +29 -30
- data/lib/rhc/rest/attributes.rb +27 -0
- data/lib/rhc/rest/base.rb +29 -33
- data/lib/rhc/rest/cartridge.rb +42 -20
- data/lib/rhc/rest/client.rb +351 -89
- data/lib/rhc/rest/domain.rb +7 -13
- data/lib/rhc/rest/gear_group.rb +1 -1
- data/lib/rhc/rest/key.rb +7 -2
- data/lib/rhc/rest/mock.rb +609 -0
- data/lib/rhc/rest/user.rb +6 -2
- data/lib/rhc/{ssh_key_helpers.rb → ssh_helpers.rb} +58 -28
- data/lib/rhc/{targz.rb → tar_gz.rb} +0 -0
- data/lib/rhc/usage_templates/command_help.erb +4 -1
- data/lib/rhc/usage_templates/help.erb +24 -11
- data/lib/rhc/usage_templates/options_help.erb +14 -0
- data/lib/rhc/wizard.rb +283 -213
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +3 -371
- data/spec/rhc/auth_spec.rb +226 -0
- data/spec/rhc/cli_spec.rb +41 -14
- data/spec/rhc/command_spec.rb +44 -15
- data/spec/rhc/commands/account_spec.rb +41 -0
- data/spec/rhc/commands/alias_spec.rb +16 -15
- data/spec/rhc/commands/app_spec.rb +115 -92
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/cartridge_spec.rb +134 -112
- data/spec/rhc/commands/domain_spec.rb +31 -86
- data/spec/rhc/commands/git_clone_spec.rb +56 -0
- data/spec/rhc/commands/{port-forward_spec.rb → port_forward_spec.rb} +27 -32
- data/spec/rhc/commands/server_spec.rb +28 -3
- data/spec/rhc/commands/setup_spec.rb +29 -11
- data/spec/rhc/commands/snapshot_spec.rb +4 -3
- data/spec/rhc/commands/sshkey_spec.rb +24 -56
- data/spec/rhc/commands/tail_spec.rb +26 -9
- data/spec/rhc/commands/threaddump_spec.rb +12 -11
- data/spec/rhc/config_spec.rb +211 -164
- data/spec/rhc/context_spec.rb +2 -0
- data/spec/rhc/helpers_spec.rb +242 -46
- data/spec/rhc/rest_application_spec.rb +42 -28
- data/spec/rhc/rest_client_spec.rb +110 -93
- data/spec/rhc/rest_spec.rb +220 -131
- data/spec/rhc/targz_spec.rb +1 -1
- data/spec/rhc/wizard_spec.rb +435 -624
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +140 -6
- data/spec/wizard_spec_helper.rb +326 -0
- metadata +163 -143
- data/lib/rhc/client.rb +0 -17
- data/lib/rhc/git_helper.rb +0 -59
@@ -1,21 +1,23 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require '
|
3
|
-
require 'rhc/config'
|
2
|
+
require 'rest_spec_helper'
|
4
3
|
require 'rhc/commands/setup'
|
5
|
-
require 'webmock/rspec'
|
6
4
|
|
7
5
|
# just test the command runner as we already have extensive wizard tests
|
8
6
|
describe RHC::Commands::Setup do
|
7
|
+
subject{ RHC::Commands::Setup }
|
8
|
+
let(:instance){ subject.new }
|
9
|
+
let!(:config){ base_config }
|
10
|
+
before{ described_class.send(:public, *described_class.protected_instance_methods) }
|
9
11
|
|
10
|
-
|
12
|
+
describe '#run' do
|
13
|
+
it{ expects_running('setup').should call(:run).on(instance).with(no_args) }
|
11
14
|
|
12
|
-
describe 'run' do
|
13
15
|
let(:arguments) { ['setup', '--config', 'test.conf', '-l', 'test@test.foo', '-p', 'password'] }
|
14
16
|
|
15
17
|
before(:each) do
|
16
18
|
@wizard = mock('wizard')
|
17
19
|
@wizard.stub!(:run).and_return(true)
|
18
|
-
RHC::RerunWizard.stub!(:new)
|
20
|
+
RHC::RerunWizard.stub!(:new){ @wizard }
|
19
21
|
end
|
20
22
|
|
21
23
|
context 'when no issues' do
|
@@ -32,12 +34,29 @@ describe RHC::Commands::Setup do
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
37
|
+
it{ expects_running('setup').should call(:run).on(instance).with(no_args) }
|
38
|
+
it{ command_for('setup', '--clean').options.clean.should be_true }
|
39
|
+
|
40
|
+
it{ command_for('setup').options.server.should == 'openshift.redhat.com' }
|
41
|
+
it{ command_for('setup', '--server', 'foo.com').options.server.should == 'foo.com' }
|
42
|
+
=begin context 'when libra_server is set' do
|
43
|
+
before{ ENV.should_receive(:[]).any_number_of_times.with('LIBRA_SERVER').and_return('bar.com') }
|
44
|
+
it{ command_for('setup').config['libra_server'].should == 'bar.com' }
|
45
|
+
it{ command_for('setup').options.server.should == 'bar.com' }
|
46
|
+
it{ command_for('setup', '--server', 'foo.com').options.server.should == 'foo.com' }
|
47
|
+
=end end
|
48
|
+
|
49
|
+
context 'when --clean is used' do
|
50
|
+
let!(:config){ base_config{ |config, defaults| defaults.add 'libra_server', 'test.com' } }
|
51
|
+
|
52
|
+
it("should ignore a config value"){ command_for('setup', '--clean').options.server.should == 'openshift.redhat.com' }
|
53
|
+
end
|
54
|
+
|
35
55
|
context 'when -d is passed' do
|
36
56
|
let(:arguments) { ['setup', '-d', '-l', 'test@test.foo'] }
|
37
57
|
# 'y' for the password prompt
|
38
58
|
let(:input) { ['', 'y', '', ''] }
|
39
|
-
|
40
|
-
before(:each){ @rc = MockRestClient.new }
|
59
|
+
let!(:rest_client){ MockRestClient.new }
|
41
60
|
|
42
61
|
it("succeeds"){ FakeFS{ expect { run input }.should exit_with_code 0 } }
|
43
62
|
it("the output includes debug output") do
|
@@ -49,8 +68,7 @@ describe RHC::Commands::Setup do
|
|
49
68
|
let(:arguments) { ['setup', '-l', 'test@test.foo'] }
|
50
69
|
# 'y' for the password prompt
|
51
70
|
let(:input) { ['', 'y', '', ''] }
|
52
|
-
|
53
|
-
before(:each){ @rc = MockRestClient.new }
|
71
|
+
let!(:rest_client){ MockRestClient.new }
|
54
72
|
|
55
73
|
it("succeeds"){ FakeFS{ expect { run input }.should exit_with_code 0 } }
|
56
74
|
it("sets the user name to the value given by the command line") do
|
@@ -66,7 +84,7 @@ describe RHC::Commands::Setup do
|
|
66
84
|
@wizard.stub!(:run).and_return(true)
|
67
85
|
expect { run }.should exit_with_code(0)
|
68
86
|
end
|
69
|
-
it('should output usage') { run_output.should match("
|
87
|
+
it('should output usage') { run_output.should match("Connects to an OpenShift server to get you started. Will") }
|
70
88
|
end
|
71
89
|
end
|
72
90
|
end
|
@@ -2,15 +2,16 @@ require 'spec_helper'
|
|
2
2
|
require 'rest_spec_helper'
|
3
3
|
require 'rhc/commands/snapshot'
|
4
4
|
require 'rhc/config'
|
5
|
+
require 'rhc/tar_gz'
|
5
6
|
|
6
7
|
describe RHC::Commands::Snapshot do
|
7
8
|
|
8
9
|
APP_NAME = 'mockapp'
|
9
10
|
|
11
|
+
let!(:rest_client) { MockRestClient.new }
|
10
12
|
before(:each) do
|
11
|
-
|
12
|
-
@
|
13
|
-
@app = @rc.add_domain("mockdomain").add_application APP_NAME, 'mock-1.0'
|
13
|
+
user_config
|
14
|
+
@app = rest_client.add_domain("mockdomain").add_application APP_NAME, 'mock-1.0'
|
14
15
|
@ssh_uri = URI.parse @app.ssh_url
|
15
16
|
filename = APP_NAME + '.tar.gz'
|
16
17
|
FileUtils.cp(File.expand_path('../../assets/targz_sample.tar.gz', __FILE__), filename)
|
@@ -4,57 +4,41 @@ require 'rhc/config'
|
|
4
4
|
|
5
5
|
|
6
6
|
describe RHC::Commands::Sshkey do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
let!(:rest_client){ MockRestClient.new }
|
8
|
+
before{ user_config }
|
9
|
+
|
11
10
|
describe 'list' do
|
12
|
-
|
11
|
+
|
13
12
|
context "when run with list command" do
|
14
|
-
|
15
13
|
let(:arguments) { %w[sshkey list --noprompt --config test.conf -l test@test.foo -p password --trace] }
|
16
14
|
|
17
|
-
before(:each) do
|
18
|
-
@rc = MockRestClient.new
|
19
|
-
end
|
20
|
-
|
21
15
|
it { expect { run }.should exit_with_code(0) }
|
22
|
-
it { run_output.should match(
|
16
|
+
it { run_output.should match(/mockkey1 \(type: ssh-rsa\)/) }
|
23
17
|
end
|
24
18
|
end
|
25
|
-
|
19
|
+
|
26
20
|
describe 'show' do
|
27
|
-
|
28
21
|
context "when run with show command" do
|
29
|
-
|
30
22
|
let(:arguments) { %w[sshkey show mockkey1 --noprompt --config test.conf -l test@test.foo -p password --trace] }
|
31
23
|
|
32
|
-
before(:each) do
|
33
|
-
@rc = MockRestClient.new
|
34
|
-
end
|
35
|
-
|
36
24
|
it { expect { run }.should exit_with_code(0) }
|
37
|
-
it { run_output.should match(
|
25
|
+
it { run_output.should match(/mockkey1 \(type: ssh-rsa\)/) }
|
38
26
|
end
|
39
27
|
end
|
40
|
-
|
28
|
+
|
41
29
|
describe "add" do
|
42
30
|
context "when adding a valid key" do
|
43
31
|
let(:arguments) { %w[sshkey add --noprompt --config test.conf -l test@test.foo -p password foobar id_rsa.pub] }
|
44
|
-
|
45
|
-
before :each do
|
46
|
-
@rc = MockRestClient.new
|
47
|
-
end
|
48
|
-
|
32
|
+
|
49
33
|
it 'adds the key' do
|
50
34
|
FakeFS do
|
51
|
-
keys =
|
35
|
+
keys = rest_client.sshkeys
|
52
36
|
num_keys = keys.length
|
53
37
|
File.open('id_rsa.pub', 'w') do |f|
|
54
38
|
f << 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnCOqK7/mmvZ9AtCAerxjAasJ1rSpfuWT4vNm1+O/Fh0Di3chTWjY9a0M2hEnqkqnVG589L9CqCUeT0kdc3Vgw3JEcacSUr1z7tLr9kO+p/D5lSdQYzDGGRFOZ0H6lc/y8iNxWV1VO/sJvKx6cr5zvKIn8Q6GvhVNOxlai0IOb9FJxLGK95GLpZ+elzh8Tc9giy7KfwheAwhV2JoF9uRltE5JP/CNs7w/E29i1Z+jlueuu8RVotLmhSVNJm91Ey7OCtoI1iBE0Wv/SucFe32Qi08RWTM/MaGGz93KQNOVRGjNkosJjPmP1qU6WGBfliDkJAZXB0b6sEcnx1fbVikwZ'
|
55
39
|
end
|
56
40
|
expect { run }.should exit_with_code(0)
|
57
|
-
|
41
|
+
rest_client.sshkeys.length.should == num_keys + 1
|
58
42
|
end
|
59
43
|
end
|
60
44
|
end
|
@@ -62,20 +46,16 @@ describe RHC::Commands::Sshkey do
|
|
62
46
|
context "when adding an invalid key" do
|
63
47
|
let(:arguments) { %w[sshkey add --noprompt --config test.conf -l test@test.foo -p password foobar id_rsa.pub] }
|
64
48
|
|
65
|
-
before :each do
|
66
|
-
@rc = MockRestClient.new
|
67
|
-
end
|
68
|
-
|
69
49
|
it "fails to add the key" do
|
70
50
|
FakeFS do
|
71
|
-
keys =
|
51
|
+
keys = rest_client.sshkeys
|
72
52
|
num_keys = keys.length
|
73
53
|
File.open('id_rsa.pub', 'w') do |f|
|
74
54
|
f << 'ssh-rsa AADAQABAAABAQCnCOqK7/mmvZ9AtCAerxjAasJ1rSpfuWT4vNm1+O/Fh0Di3chTWjY9a0M2hEnqkqnVG589L9CqCUeT0kdc3Vgw3JEcacSUr1z7tLr9kO+p/D5lSdQYzDGGRFOZ0H6lc/y8iNxWV1VO/sJvKx6cr5zvKIn8Q6GvhVNOxlai0IOb9FJxLGK95GLpZ+elzh8Tc9giy7KfwheAwhV2JoF9uRltE5JP/CNs7w/E29i1Z+jlueuu8RVotLmhSVNJm91Ey7OCtoI1iBE0Wv/SucFe32Qi08RWTM/MaGGz93KQNOVRGjNkosJjPmP1qU6WGBfliDkJAZXB0b6sEcnx1fbVikwZ'
|
75
55
|
end
|
76
56
|
expect { run }.should exit_with_code(128)
|
77
|
-
expect { run_output.should match(
|
78
|
-
|
57
|
+
expect { run_output.should match(/Name:.* mockkey/) }
|
58
|
+
rest_client.sshkeys.length.should == num_keys
|
79
59
|
end
|
80
60
|
end
|
81
61
|
end
|
@@ -83,20 +63,16 @@ describe RHC::Commands::Sshkey do
|
|
83
63
|
context "when adding an invalid key with --confirm" do
|
84
64
|
let(:arguments) { %w[sshkey add --noprompt --confirm --config test.conf -l test@test.foo -p password foobar id_rsa.pub] }
|
85
65
|
|
86
|
-
before :each do
|
87
|
-
@rc = MockRestClient.new
|
88
|
-
end
|
89
|
-
|
90
66
|
it "warns and then adds the key" do
|
91
67
|
FakeFS do
|
92
|
-
keys =
|
68
|
+
keys = rest_client.sshkeys
|
93
69
|
num_keys = keys.length
|
94
70
|
File.open('id_rsa.pub', 'w') do |f|
|
95
71
|
f << 'ssh-rsa AADAQABAAABAQCnCOqK7/mmvZ9AtCAerxjAasJ1rSpfuWT4vNm1+O/Fh0Di3chTWjY9a0M2hEnqkqnVG589L9CqCUeT0kdc3Vgw3JEcacSUr1z7tLr9kO+p/D5lSdQYzDGGRFOZ0H6lc/y8iNxWV1VO/sJvKx6cr5zvKIn8Q6GvhVNOxlai0IOb9FJxLGK95GLpZ+elzh8Tc9giy7KfwheAwhV2JoF9uRltE5JP/CNs7w/E29i1Z+jlueuu8RVotLmhSVNJm91Ey7OCtoI1iBE0Wv/SucFe32Qi08RWTM/MaGGz93KQNOVRGjNkosJjPmP1qU6WGBfliDkJAZXB0b6sEcnx1fbVikwZ'
|
96
72
|
end
|
97
73
|
expect { run }.should exit_with_code(0)
|
98
74
|
expect { run_output.should match("key you are uploading is not recognized") }
|
99
|
-
|
75
|
+
rest_client.sshkeys.length.should == num_keys + 1
|
100
76
|
end
|
101
77
|
end
|
102
78
|
end
|
@@ -126,38 +102,30 @@ describe RHC::Commands::Sshkey do
|
|
126
102
|
File.should_receive(:open).and_raise(Errno::EACCES)
|
127
103
|
expect { run }.should exit_with_code(128)
|
128
104
|
end
|
129
|
-
|
105
|
+
|
130
106
|
end
|
131
107
|
end
|
132
|
-
|
108
|
+
|
133
109
|
describe "remove" do
|
134
110
|
context "when removing an existing key" do
|
135
111
|
let (:arguments) { %w[sshkey remove --noprompt --config test.conf -l test@test.foo -p password mockkey2] }
|
136
|
-
|
137
|
-
before :each do
|
138
|
-
@rc = MockRestClient.new
|
139
|
-
end
|
140
|
-
|
112
|
+
|
141
113
|
it 'deletes the key' do
|
142
|
-
keys =
|
114
|
+
keys = rest_client.sshkeys
|
143
115
|
num_keys = keys.length
|
144
116
|
expect {run}.should exit_with_code(0)
|
145
|
-
|
117
|
+
rest_client.sshkeys.length.should == num_keys - 1
|
146
118
|
end
|
147
119
|
end
|
148
120
|
|
149
121
|
context "when removing a nonexistent key" do
|
150
122
|
let (:arguments) { %w[sshkey remove --noprompt --config test.conf -l test@test.foo -p password no_match] }
|
151
|
-
|
152
|
-
|
153
|
-
@rc = MockRestClient.new
|
154
|
-
@keys = @rc.sshkeys
|
155
|
-
end
|
156
|
-
|
123
|
+
before{ @keys = rest_client.sshkeys }
|
124
|
+
|
157
125
|
it 'leaves keys untouched' do
|
158
126
|
num_keys = @keys.length
|
159
127
|
expect {run}.should exit_with_code(0)
|
160
|
-
|
128
|
+
rest_client.sshkeys.length.should == num_keys
|
161
129
|
end
|
162
130
|
end
|
163
131
|
end
|
@@ -2,12 +2,14 @@ require 'spec_helper'
|
|
2
2
|
require 'rest_spec_helper'
|
3
3
|
require 'rhc/commands/tail'
|
4
4
|
require 'rhc/config'
|
5
|
+
|
5
6
|
describe RHC::Commands::Tail do
|
7
|
+
let!(:rest_client) { MockRestClient.new }
|
6
8
|
before(:each) do
|
7
|
-
|
8
|
-
|
9
|
-
domain = @rc.add_domain("mock-domain-0")
|
9
|
+
user_config
|
10
|
+
domain = rest_client.add_domain("mock-domain-0")
|
10
11
|
@app = domain.add_application("mock-app-0", "ruby-1.8.7")
|
12
|
+
@app.stub(:ssh_url).and_return("ssh://user@test.domain.com")
|
11
13
|
end
|
12
14
|
|
13
15
|
describe 'help' do
|
@@ -22,13 +24,28 @@ describe RHC::Commands::Tail do
|
|
22
24
|
end
|
23
25
|
|
24
26
|
describe 'tail' do
|
25
|
-
let(:arguments) { ['tail', 'mock-app-0'
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
context 'tail succeeds and exits on Interrupt' do
|
30
|
-
before (:each) { @app.stub(:tail) { raise Interrupt.new } }
|
27
|
+
let(:arguments) { ['tail', 'mock-app-0'] }
|
28
|
+
|
29
|
+
context 'when ssh connects' do
|
30
|
+
before (:each) {Net::SSH.should_receive(:start).with('test.domain.com', 'user') }
|
31
31
|
it { expect { run }.should exit_with_code(0) }
|
32
32
|
end
|
33
|
+
|
34
|
+
context 'is run on an unreachable domain' do
|
35
|
+
before (:each) {Net::SSH.should_receive(:start).and_raise(SocketError) }
|
36
|
+
it { expect { run }.should exit_with_code(1) }
|
37
|
+
it { run_output.should =~ /The connection to test.domain.com failed: / }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'is refused' do
|
41
|
+
before (:each) {Net::SSH.should_receive(:start).and_raise(Errno::ECONNREFUSED) }
|
42
|
+
it { expect { run }.should exit_with_code(1) }
|
43
|
+
it { run_output.should =~ /The server test.domain.com refused a connection with user user/ }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'succeeds and exits on Interrupt' do
|
47
|
+
before (:each) { rest_client.stub(:find_domain) { raise Interrupt } }
|
48
|
+
it { expect { run }.should raise_error(Interrupt) }
|
49
|
+
end
|
33
50
|
end
|
34
51
|
end
|
@@ -7,11 +7,12 @@ describe RHC::Commands::Threaddump do
|
|
7
7
|
let(:domain_0_links) { mock_response_links(mock_domain_links('mock_domain_0')) }
|
8
8
|
let(:domain_1_links) { mock_response_links(mock_domain_links('mock_domain_1')) }
|
9
9
|
let(:app_0_links) { mock_response_links(mock_app_links('mock_domain_0', 'mock_app_0')) }
|
10
|
+
let!(:rest_client){ MockRestClient.new }
|
11
|
+
|
10
12
|
before(:each) do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
stub_api_request(:any, client_links['LIST_DOMAINS']['relative']).with(:headers => {'Accept-Encoding'=>'gzip, deflate'}).
|
13
|
+
user_config
|
14
|
+
rest_client.add_domain("mock_domain_0").add_application("mock_app_0", "ruby-1.8.7")
|
15
|
+
stub_api_request(:any, client_links['LIST_DOMAINS']['relative']).
|
15
16
|
to_return({ :body => {
|
16
17
|
:type => 'domains',
|
17
18
|
:data =>
|
@@ -24,7 +25,7 @@ describe RHC::Commands::Threaddump do
|
|
24
25
|
}.to_json,
|
25
26
|
:status => 200
|
26
27
|
})
|
27
|
-
stub_api_request(:any, domain_0_links['LIST_APPLICATIONS']['relative']).
|
28
|
+
stub_api_request(:any, domain_0_links['LIST_APPLICATIONS']['relative']).
|
28
29
|
to_return({ :body => {
|
29
30
|
:type => 'applications',
|
30
31
|
:data =>
|
@@ -39,7 +40,7 @@ describe RHC::Commands::Threaddump do
|
|
39
40
|
}.to_json,
|
40
41
|
:status => 200
|
41
42
|
})
|
42
|
-
stub_api_request(:
|
43
|
+
stub_api_request(:post, app_0_links['THREAD_DUMP']['relative'], false).
|
43
44
|
to_return({ :body => {
|
44
45
|
:type => 'application',
|
45
46
|
:data =>
|
@@ -69,13 +70,13 @@ describe RHC::Commands::Threaddump do
|
|
69
70
|
end
|
70
71
|
|
71
72
|
describe 'threaddump' do
|
72
|
-
let(:arguments) { ['threaddump', '
|
73
|
-
|
74
|
-
|
75
|
-
end
|
73
|
+
let(:arguments) { ['threaddump', 'mock_app_0'] }
|
74
|
+
it { expect { run }.should exit_with_code(0) }
|
75
|
+
it { run_output.should =~ /Application test thread dump complete/ }
|
76
76
|
end
|
77
|
+
|
77
78
|
describe 'threaddump no args' do
|
78
|
-
let(:arguments) { ['threaddump'
|
79
|
+
let(:arguments) { ['threaddump'] }
|
79
80
|
context 'args not supplied' do
|
80
81
|
it { expect { run }.should exit_with_code(1) }
|
81
82
|
end
|
data/spec/rhc/config_spec.rb
CHANGED
@@ -3,10 +3,12 @@ require 'rhc/config'
|
|
3
3
|
require 'net/http'
|
4
4
|
|
5
5
|
describe RHC::Config do
|
6
|
+
subject{ RHC::Config }
|
6
7
|
before(:all) do
|
7
8
|
ENV['LIBRA_SERVER'] = nil
|
8
9
|
ENV['http_proxy'] = nil
|
9
10
|
mock_terminal
|
11
|
+
RHC::Config.stub(:home_dir).and_return('/home/mock_user')
|
10
12
|
FakeFS.activate!
|
11
13
|
FakeFS::FileSystem.clear
|
12
14
|
end
|
@@ -16,195 +18,240 @@ describe RHC::Config do
|
|
16
18
|
end
|
17
19
|
|
18
20
|
describe "class" do
|
19
|
-
|
20
|
-
it("should
|
21
|
-
it("should invoke a method on default") { RHC::Config.username.should be RHC::Config.default.username }
|
21
|
+
it("should raise when foo is invoked") { expect{ subject.method_missing(:foo) }.to raise_error(NoMethodError) }
|
22
|
+
it("should invoke a method on default") { subject.username.should be subject.default.username }
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
let(:values){ {} }
|
26
|
+
|
27
|
+
describe "#use_config" do
|
28
|
+
subject{ RHC::Config.new.tap{ |c| c.stub(:load_config_files) } }
|
29
|
+
|
30
|
+
context "when an exception is raised" do
|
31
|
+
before{ subject.should_receive(:set_opts_config).with(File.expand_path('foo')).and_raise(Errno::EISDIR.new('foo')) }
|
32
|
+
it("should wrap the error"){ expect{ subject.use_config('foo') }.to raise_error(ArgumentError, /Unable to read configuration file.*foo/) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#to_options" do
|
37
|
+
subject do
|
38
|
+
RHC::Config.new.tap do |c|
|
39
|
+
c.stub(:home_dir).and_return('/home/mock_user')
|
40
|
+
c.stub(:load_config_files)
|
41
|
+
c.instance_variable_set(:@opts, values)
|
42
|
+
c.instance_variable_set(:@defaults, nil)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with an non true value for insecure" do
|
47
|
+
let(:values){ {'insecure' => 'untruth'} }
|
48
|
+
its(:to_options){ should == {:insecure => 'untruth'} }
|
27
49
|
end
|
28
50
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
RHC::Config.has_opts_config?.should be_false
|
51
|
+
context "with an invalid timeout" do
|
52
|
+
let(:values){ {'timeout' => 'a'} }
|
53
|
+
its(:to_options){ should == {:timeout => 'a'} }
|
33
54
|
end
|
34
55
|
|
56
|
+
context "with standard values" do
|
57
|
+
let(:values) do
|
58
|
+
{
|
59
|
+
'insecure' => 'true',
|
60
|
+
'default_rhlogin' => 'user',
|
61
|
+
'libra_server' => 'test.com',
|
62
|
+
'password' => 'pass',
|
63
|
+
'ssl_client_cert_file' => 'file1',
|
64
|
+
'ssl_ca_file' => 'file2',
|
65
|
+
'timeout' => '1',
|
66
|
+
}
|
67
|
+
end
|
68
|
+
its(:to_options){ should == {:insecure => 'true', :timeout => '1', :ssl_ca_file => 'file2', :ssl_client_cert_file => 'file1', :rhlogin => 'user', :password => 'pass', :server => 'test.com'} }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "Config default values with no files" do
|
73
|
+
before{ subject.initialize }
|
74
|
+
|
75
|
+
its(:has_global_config?){ should be_false }
|
76
|
+
its(:has_local_config?){ should be_false }
|
77
|
+
its(:has_opts_config?){ should be_false }
|
78
|
+
|
35
79
|
it "should return openshift.redhat.com for the server" do
|
36
|
-
|
37
|
-
RHC::Config.default_rhlogin.should be_nil
|
38
|
-
RHC::Config.config_user("default@redhat.com")
|
39
|
-
RHC::Config.default_rhlogin.should == "default@redhat.com"
|
80
|
+
subject['libra_server'].should == "openshift.redhat.com"
|
40
81
|
end
|
41
82
|
end
|
42
83
|
|
43
84
|
context "Config values with /etc/openshift/express.conf" do
|
44
85
|
it "should have only a global config" do
|
45
86
|
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com", "global@redhat.com")
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
87
|
+
subject.initialize
|
88
|
+
subject.has_global_config?.should be_true
|
89
|
+
subject.has_local_config?.should be_false
|
90
|
+
subject.has_opts_config?.should be_false
|
50
91
|
end
|
51
92
|
|
52
93
|
it "should get values from the global config" do
|
53
94
|
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
54
95
|
"global@redhat.com",
|
55
96
|
{"random_value" => 12})
|
56
|
-
|
97
|
+
subject.initialize
|
57
98
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
99
|
+
subject['libra_server'].should == "global.openshift.redhat.com"
|
100
|
+
subject.default_rhlogin.should == "global@redhat.com"
|
101
|
+
subject['random_value'].should == "12"
|
102
|
+
subject['non_value'].should be_nil
|
62
103
|
|
63
104
|
end
|
64
105
|
|
65
106
|
it "should have libra_server fallback to the default if not set in config" do
|
66
107
|
ConfigHelper.write_out_config(ConfigHelper.global_config_path, nil,
|
67
108
|
"global@redhat.com")
|
68
|
-
|
109
|
+
subject.initialize
|
69
110
|
|
70
|
-
|
71
|
-
|
111
|
+
subject['libra_server'].should == "openshift.redhat.com"
|
112
|
+
subject.default_rhlogin.should == "global@redhat.com"
|
72
113
|
end
|
73
114
|
end
|
74
115
|
|
75
|
-
context "
|
76
|
-
it "should have global and local config" do
|
77
|
-
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
78
|
-
"global@redhat.com")
|
79
|
-
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
80
|
-
"local.openshift.redhat.com","local@redhat.com")
|
81
|
-
RHC::Config.initialize
|
82
|
-
RHC::Config.home_dir = ConfigHelper.home_dir
|
83
|
-
|
84
|
-
RHC::Config.home_conf_path.should == File.join(ConfigHelper.home_dir, '.openshift')
|
85
|
-
RHC::Config.local_config_path.should == File.join(ConfigHelper.home_dir, '.openshift', 'express.conf')
|
86
|
-
RHC::Config.has_global_config?.should be_true
|
87
|
-
RHC::Config.has_local_config?.should be_true
|
88
|
-
RHC::Config.has_opts_config?.should be_false
|
89
|
-
end
|
116
|
+
context "With a mock home dir" do
|
90
117
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
{"random_value" => 11})
|
99
|
-
RHC::Config.initialize
|
100
|
-
RHC::Config.home_dir = ConfigHelper.home_dir
|
101
|
-
|
102
|
-
RHC::Config['libra_server'].should == "local.openshift.redhat.com"
|
103
|
-
RHC::Config.default_rhlogin.should == "local@redhat.com"
|
104
|
-
RHC::Config['random_value'].should == "11"
|
105
|
-
RHC::Config['non_value'].should be_nil
|
118
|
+
def stub_config
|
119
|
+
config = RHC::Config.new
|
120
|
+
RHC::Config.instance_variable_set(:@default, config)
|
121
|
+
config.stub(:home_dir).and_return(ConfigHelper.home_dir)
|
122
|
+
RHC::Config.stub(:new).and_return(config)
|
123
|
+
RHC::Config.default.should == config
|
124
|
+
config.read_config_files
|
106
125
|
end
|
107
126
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
127
|
+
context "Config values with ~/.openshift/express.conf" do
|
128
|
+
it "should have global and local config" do
|
129
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
130
|
+
"global@redhat.com")
|
131
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
132
|
+
"local.openshift.redhat.com","local@redhat.com")
|
133
|
+
stub_config
|
134
|
+
|
135
|
+
subject.home_conf_path.should == File.join(ConfigHelper.home_dir, '.openshift')
|
136
|
+
subject.local_config_path.should == File.join(ConfigHelper.home_dir, '.openshift', 'express.conf')
|
137
|
+
subject.has_global_config?.should be_true
|
138
|
+
subject.has_local_config?.should be_true
|
139
|
+
subject.has_opts_config?.should be_false
|
140
|
+
end
|
122
141
|
|
123
|
-
|
142
|
+
it "should get values from local config" do
|
143
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
144
|
+
"global@redhat.com",
|
145
|
+
{"random_value" => "12"})
|
146
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
147
|
+
"local.openshift.redhat.com",
|
148
|
+
"local@redhat.com",
|
149
|
+
{"random_value" => 11})
|
150
|
+
stub_config
|
151
|
+
|
152
|
+
subject['libra_server'].should == "local.openshift.redhat.com"
|
153
|
+
subject.default_rhlogin.should == "local@redhat.com"
|
154
|
+
subject['random_value'].should == "11"
|
155
|
+
subject['non_value'].should be_nil
|
156
|
+
end
|
124
157
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
RHC::Config['libra_server'].should == "env.openshift.redhat.com"
|
139
|
-
RHC::Config.default_rhlogin.should == "local@redhat.com"
|
140
|
-
RHC::Config['random_value'].should == "11"
|
141
|
-
RHC::Config['non_value'].should be_nil
|
158
|
+
it "should fallback to the default or global if not set in config" do
|
159
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, nil,
|
160
|
+
"global@redhat.com")
|
161
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
162
|
+
nil,
|
163
|
+
nil,
|
164
|
+
{"random_value" => 11})
|
165
|
+
stub_config
|
166
|
+
|
167
|
+
subject['libra_server'].should == "openshift.redhat.com"
|
168
|
+
subject.default_rhlogin.should == "global@redhat.com"
|
169
|
+
subject['random_value'].should == "11"
|
170
|
+
end
|
142
171
|
end
|
143
|
-
end
|
144
172
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
173
|
+
context "Config values with LIBRA_SERVER ENV set" do
|
174
|
+
it "should get values from local config" do
|
175
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
176
|
+
"global@redhat.com",
|
177
|
+
{"random_value" => "12"})
|
178
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
179
|
+
"local.openshift.redhat.com",
|
180
|
+
"local@redhat.com",
|
181
|
+
{"random_value" => 11})
|
182
|
+
ENV['LIBRA_SERVER'] = "env.openshift.redhat.com"
|
183
|
+
|
184
|
+
stub_config
|
185
|
+
subject.set_local_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'))
|
186
|
+
|
187
|
+
subject['libra_server'].should == "env.openshift.redhat.com"
|
188
|
+
subject.default_rhlogin.should == "local@redhat.com"
|
189
|
+
subject['random_value'].should == "11"
|
190
|
+
subject['non_value'].should be_nil
|
191
|
+
end
|
162
192
|
end
|
163
193
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
RHC::Config['libra_server'].should == "opts.openshift.redhat.com"
|
182
|
-
RHC::Config.default_rhlogin.should == "opts@redhat.com"
|
183
|
-
RHC::Config['random_value'].should == "10"
|
184
|
-
RHC::Config['non_value'].should be_nil
|
185
|
-
end
|
194
|
+
context "Config values with options set" do
|
195
|
+
it "should have global and local config" do
|
196
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
197
|
+
"global@redhat.com")
|
198
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
199
|
+
"local.openshift.redhat.com","local@redhat.com")
|
200
|
+
ConfigHelper.write_out_config(ConfigHelper.opts_config_path,
|
201
|
+
"opts.openshift.redhat.com",
|
202
|
+
"opts@redhat.com")
|
203
|
+
stub_config
|
204
|
+
subject.check_cpath({"config" => ConfigHelper.opts_config_path,
|
205
|
+
"random_val" => "ok"})
|
206
|
+
|
207
|
+
subject.has_global_config?.should be_true
|
208
|
+
subject.has_local_config?.should be_true
|
209
|
+
subject.has_opts_config?.should be_true
|
210
|
+
end
|
186
211
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
212
|
+
it "should get values from local config" do
|
213
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, "global.openshift.redhat.com",
|
214
|
+
"global@redhat.com",
|
215
|
+
{"random_value" => "12"})
|
216
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
217
|
+
"local.openshift.redhat.com",
|
218
|
+
"local@redhat.com",
|
219
|
+
{"random_value" => 11})
|
220
|
+
ConfigHelper.write_out_config(ConfigHelper.opts_config_path,
|
221
|
+
"opts.openshift.redhat.com",
|
222
|
+
"opts@redhat.com",
|
223
|
+
{"random_value" => 10})
|
224
|
+
stub_config
|
225
|
+
subject.check_cpath({"config" => ConfigHelper.opts_config_path,
|
226
|
+
"random_val" => "ok"})
|
227
|
+
|
228
|
+
subject['libra_server'].should == "opts.openshift.redhat.com"
|
229
|
+
subject.default_rhlogin.should == "opts@redhat.com"
|
230
|
+
subject['random_value'].should == "10"
|
231
|
+
subject['non_value'].should be_nil
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should fallback to the default or global or local if not set in config" do
|
235
|
+
ConfigHelper.write_out_config(ConfigHelper.global_config_path, nil,
|
236
|
+
"global@redhat.com")
|
237
|
+
ConfigHelper.write_out_config(File.join(ConfigHelper.home_dir,'.openshift', 'express.conf'),
|
238
|
+
nil,
|
239
|
+
nil,
|
240
|
+
{"random_value" => 11,
|
241
|
+
"local_value" => "local"})
|
242
|
+
ConfigHelper.write_out_config(ConfigHelper.opts_config_path,
|
243
|
+
nil,
|
244
|
+
nil,
|
245
|
+
{"random_value" => 10})
|
246
|
+
stub_config
|
247
|
+
subject.check_cpath({"config" => ConfigHelper.opts_config_path,
|
248
|
+
"random_val" => "ok"})
|
249
|
+
|
250
|
+
subject['libra_server'].should == "openshift.redhat.com"
|
251
|
+
subject.default_rhlogin.should == "global@redhat.com"
|
252
|
+
subject['random_value'].should == "10"
|
253
|
+
subject['local_value'].should == "local"
|
254
|
+
end
|
208
255
|
end
|
209
256
|
end
|
210
257
|
|
@@ -222,7 +269,7 @@ describe RHC::Config do
|
|
222
269
|
nil,
|
223
270
|
nil,
|
224
271
|
{"debug" => "true"})
|
225
|
-
|
272
|
+
subject.initialize
|
226
273
|
ConfigHelper.check_legacy_debug({}).should == "true"
|
227
274
|
end
|
228
275
|
|
@@ -231,7 +278,7 @@ describe RHC::Config do
|
|
231
278
|
nil,
|
232
279
|
nil,
|
233
280
|
{"debug" => "false"})
|
234
|
-
|
281
|
+
subject.initialize
|
235
282
|
ConfigHelper.check_legacy_debug({}).should be_false
|
236
283
|
end
|
237
284
|
|
@@ -240,7 +287,7 @@ describe RHC::Config do
|
|
240
287
|
nil,
|
241
288
|
nil,
|
242
289
|
{"debug" => "true"})
|
243
|
-
|
290
|
+
subject.initialize
|
244
291
|
ConfigHelper.check_legacy_debug({"debug" => false}).should be_true
|
245
292
|
end
|
246
293
|
|
@@ -249,21 +296,21 @@ describe RHC::Config do
|
|
249
296
|
nil,
|
250
297
|
nil,
|
251
298
|
{"debug" => "false"})
|
252
|
-
|
299
|
+
subject.initialize
|
253
300
|
ConfigHelper.check_legacy_debug({"debug" => true}).should be_true
|
254
301
|
end
|
255
302
|
end
|
256
303
|
|
257
304
|
context "Proxy ENV variable parsing" do
|
258
305
|
before do
|
259
|
-
|
306
|
+
subject.initialize
|
260
307
|
['http_proxy','HTTP_PROXY'].each do |var|
|
261
308
|
ENV[var] = nil
|
262
309
|
end
|
263
310
|
end
|
264
311
|
|
265
312
|
it "should return a direct http connection" do
|
266
|
-
|
313
|
+
subject.using_proxy?.should_not == true
|
267
314
|
end
|
268
315
|
|
269
316
|
['http_proxy','HTTP_PROXY'].each do |var|
|
@@ -272,12 +319,12 @@ describe RHC::Config do
|
|
272
319
|
# returns a generic class so we check to make sure it is not a
|
273
320
|
# Net::HTTP class and rely on simplecov to make sure the proxy
|
274
321
|
# code path was run
|
275
|
-
|
322
|
+
subject.using_proxy?.should == true
|
276
323
|
end
|
277
324
|
end
|
278
325
|
|
279
326
|
context "it should have the correct values" do
|
280
|
-
let(:vars){
|
327
|
+
let(:vars){ subject.proxy_vars }
|
281
328
|
before do
|
282
329
|
ENV['http_proxy'] = "my_user:my_pass@fakeproxy.foo:8080"
|
283
330
|
end
|
@@ -300,20 +347,20 @@ describe RHC::Config do
|
|
300
347
|
ConfigHelper.write_out_config(ConfigHelper.global_config_path,
|
301
348
|
"global.openshift.redhat.com",
|
302
349
|
"global@redhat.com")
|
303
|
-
|
350
|
+
subject.initialize
|
304
351
|
RHC::Vendor::ParseConfig.stub(:new) { raise Errno::EACCES.new("Fake can't read file") }
|
305
|
-
|
352
|
+
subject.stub(:exit) { |code| code }
|
306
353
|
|
307
|
-
expect {
|
354
|
+
expect { subject.check_cpath({"config" => "fake.conf"}) }.to raise_error(Errno::EACCES)
|
308
355
|
|
309
356
|
# write out config file so it exists but is not readable
|
310
357
|
ConfigHelper.write_out_config("fake.conf",
|
311
358
|
"global.openshift.redhat.com",
|
312
359
|
"global@redhat.com")
|
313
360
|
|
314
|
-
expect {
|
315
|
-
expect {
|
316
|
-
expect {
|
361
|
+
expect { subject.read_config_files }.to raise_error(Errno::EACCES)
|
362
|
+
expect { subject.set_local_config("fake.conf") }.to raise_error(Errno::EACCES)
|
363
|
+
expect { subject.set_opts_config("fake.conf") }.to raise_error(Errno::EACCES)
|
317
364
|
end
|
318
365
|
end
|
319
366
|
end
|
@@ -338,7 +385,7 @@ class ConfigHelper
|
|
338
385
|
def self.check_legacy_debug(opts)
|
339
386
|
# this simulates how the old rhc code checked for debug
|
340
387
|
# in the future this should all be filtered through the Config module
|
341
|
-
# and an app should just have to use
|
388
|
+
# and an app should just have to use subject.debug?
|
342
389
|
debug = RHC::Config['debug'] == 'false' ? nil : RHC::Config['debug']
|
343
390
|
debug = true if opts.has_key? 'debug'
|
344
391
|
debug
|