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.
- 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
|