chef 11.0.0 → 11.2.0.rc.1
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/distro/common/html/chef-client.8.html +3 -3
- data/distro/common/html/chef-expander.8.html +3 -3
- data/distro/common/html/chef-expanderctl.8.html +3 -3
- data/distro/common/html/chef-server-webui.8.html +3 -3
- data/distro/common/html/chef-server.8.html +3 -3
- data/distro/common/html/chef-shell.1.html +7 -7
- data/distro/common/html/chef-solo.8.html +3 -3
- data/distro/common/html/chef-solr.8.html +3 -3
- data/distro/common/html/knife-bootstrap.1.html +3 -3
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +3 -3
- data/distro/common/html/knife-cookbook-site.1.html +6 -6
- data/distro/common/html/knife-cookbook.1.html +7 -7
- data/distro/common/html/knife-data-bag.1.html +3 -3
- data/distro/common/html/knife-environment.1.html +3 -3
- data/distro/common/html/knife-exec.1.html +4 -4
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +6 -6
- data/distro/common/html/knife-search.1.html +5 -5
- data/distro/common/html/knife-ssh.1.html +3 -3
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +3 -3
- data/distro/common/html/knife.1.html +11 -11
- data/distro/common/man/man1/chef-shell.1 +1 -1
- data/distro/common/man/man1/knife-bootstrap.1 +1 -1
- data/distro/common/man/man1/knife-client.1 +1 -1
- data/distro/common/man/man1/knife-configure.1 +1 -1
- data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
- data/distro/common/man/man1/knife-cookbook.1 +1 -1
- data/distro/common/man/man1/knife-data-bag.1 +1 -1
- data/distro/common/man/man1/knife-environment.1 +1 -1
- data/distro/common/man/man1/knife-exec.1 +1 -1
- data/distro/common/man/man1/knife-index.1 +1 -1
- data/distro/common/man/man1/knife-node.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +1 -1
- data/distro/common/man/man1/knife-search.1 +1 -1
- data/distro/common/man/man1/knife-ssh.1 +1 -1
- data/distro/common/man/man1/knife-status.1 +1 -1
- data/distro/common/man/man1/knife-tag.1 +1 -1
- data/distro/common/man/man1/knife.1 +1 -1
- data/distro/common/man/man8/chef-client.8 +1 -1
- data/distro/common/man/man8/chef-expander.8 +1 -1
- data/distro/common/man/man8/chef-expanderctl.8 +1 -1
- data/distro/common/man/man8/chef-server-webui.8 +1 -1
- data/distro/common/man/man8/chef-server.8 +1 -1
- data/distro/common/man/man8/chef-solo.8 +1 -1
- data/distro/common/man/man8/chef-solr.8 +1 -1
- data/lib/chef/knife/configure.rb +16 -13
- data/lib/chef/knife/user_create.rb +93 -0
- data/lib/chef/knife/user_delete.rb +46 -0
- data/lib/chef/knife/user_edit.rb +53 -0
- data/lib/chef/knife/user_list.rb +42 -0
- data/lib/chef/knife/user_reregister.rb +59 -0
- data/lib/chef/knife/user_show.rb +52 -0
- data/lib/chef/user.rb +182 -0
- data/lib/chef/version.rb +1 -1
- data/spec/unit/knife/configure_spec.rb +23 -26
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/user_spec.rb +255 -0
- metadata +1246 -1227
data/lib/chef/version.rb
CHANGED
@@ -41,7 +41,7 @@ describe Chef::Knife::Configure do
|
|
41
41
|
@knife.config[:initial] = true
|
42
42
|
Etc.stub!(:getlogin).and_return("a-new-user")
|
43
43
|
@knife.ask_user_for_config
|
44
|
-
@out.string.should match(Regexp.escape("Please enter a
|
44
|
+
@out.string.should match(Regexp.escape("Please enter a name for the new user: [a-new-user]"))
|
45
45
|
@knife.new_client_name.should == Etc.getlogin
|
46
46
|
end
|
47
47
|
|
@@ -50,7 +50,7 @@ describe Chef::Knife::Configure do
|
|
50
50
|
@knife.config[:node_name] = 'testnode'
|
51
51
|
Etc.stub!(:getlogin).and_return("a-new-user")
|
52
52
|
@knife.ask_user_for_config
|
53
|
-
@out.string.should_not match(Regexp.escape("Please enter a
|
53
|
+
@out.string.should_not match(Regexp.escape("Please enter a name for the new user"))
|
54
54
|
@knife.new_client_name.should == 'testnode'
|
55
55
|
end
|
56
56
|
|
@@ -64,32 +64,32 @@ describe Chef::Knife::Configure do
|
|
64
64
|
it "asks the user for the existing admin client's name if -i is specified" do
|
65
65
|
@knife.config[:initial] = true
|
66
66
|
@knife.ask_user_for_config
|
67
|
-
@out.string.should match(Regexp.escape("Please enter the existing admin
|
68
|
-
@knife.admin_client_name.should == '
|
67
|
+
@out.string.should match(Regexp.escape("Please enter the existing admin name: [admin]"))
|
68
|
+
@knife.admin_client_name.should == 'admin'
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should not ask the user for the existing admin client's name if -i and --admin-client_name are specified" do
|
72
72
|
@knife.config[:initial] = true
|
73
73
|
@knife.config[:admin_client_name] = 'my-webui'
|
74
74
|
@knife.ask_user_for_config
|
75
|
-
@out.string.should_not match(Regexp.escape("Please enter the existing admin
|
75
|
+
@out.string.should_not match(Regexp.escape("Please enter the existing admin:"))
|
76
76
|
@knife.admin_client_name.should == 'my-webui'
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should not ask the user for the existing admin client's name if -i is not specified" do
|
80
80
|
@knife.ask_user_for_config
|
81
|
-
@out.string.should_not match(Regexp.escape("Please enter the existing admin
|
82
|
-
@knife.admin_client_name.should_not == '
|
81
|
+
@out.string.should_not match(Regexp.escape("Please enter the existing admin: [admin]"))
|
82
|
+
@knife.admin_client_name.should_not == 'admin'
|
83
83
|
end
|
84
84
|
|
85
85
|
it "asks the user for the location of the existing admin key if -i is specified" do
|
86
86
|
@knife.config[:initial] = true
|
87
87
|
@knife.ask_user_for_config
|
88
|
-
@out.string.should match(Regexp.escape("Please enter the location of the existing admin
|
88
|
+
@out.string.should match(Regexp.escape("Please enter the location of the existing admin's private key: [/etc/chef/admin.pem]"))
|
89
89
|
if windows?
|
90
|
-
@knife.admin_client_key.should == 'C:/etc/chef/
|
90
|
+
@knife.admin_client_key.should == 'C:/etc/chef/admin.pem'
|
91
91
|
else
|
92
|
-
@knife.admin_client_key.should == '/etc/chef/
|
92
|
+
@knife.admin_client_key.should == '/etc/chef/admin.pem'
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
@@ -111,7 +111,7 @@ describe Chef::Knife::Configure do
|
|
111
111
|
if windows?
|
112
112
|
@knife.admin_client_key.should_not == 'C:/etc//chef/webui.pem'
|
113
113
|
else
|
114
|
-
@knife.admin_client_key.should_not == '/etc/chef/webui.pem'
|
114
|
+
@knife.admin_client_key.should_not == '/etc/chef/webui.pem'
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
@@ -140,7 +140,7 @@ describe Chef::Knife::Configure do
|
|
140
140
|
if windows?
|
141
141
|
@knife.validation_key.should == 'C:/etc/chef/validation.pem'
|
142
142
|
else
|
143
|
-
@knife.validation_key.should == '/etc/chef/validation.pem'
|
143
|
+
@knife.validation_key.should == '/etc/chef/validation.pem'
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -208,28 +208,25 @@ describe Chef::Knife::Configure do
|
|
208
208
|
File.should_receive(:expand_path).with("/home/you/.chef/knife.rb").and_return("/home/you/.chef/knife.rb")
|
209
209
|
File.should_receive(:expand_path).with("/home/you/.chef/a-new-user.pem").and_return("/home/you/.chef/a-new-user.pem")
|
210
210
|
File.should_receive(:expand_path).with("/etc/chef/validation.pem").and_return("/etc/chef/validation.pem")
|
211
|
-
File.should_receive(:expand_path).with("/etc/chef/
|
211
|
+
File.should_receive(:expand_path).with("/etc/chef/admin.pem").and_return("/etc/chef/admin.pem")
|
212
212
|
Chef::Config[:node_name] = "webmonkey.example.com"
|
213
213
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
client_command = mock("knife client create command", :config => client_command_config)
|
218
|
-
client_command.should_receive(:name_args=).with(["a-new-user"])
|
219
|
-
client_command.stub!(:name_args).and_return(["a-new-user"])
|
220
|
-
client_command.should_receive(:run)
|
214
|
+
user_command = Chef::Knife::UserCreate.new
|
215
|
+
user_command.should_receive(:run)
|
221
216
|
|
222
217
|
Etc.stub!(:getlogin).and_return("a-new-user")
|
223
218
|
|
224
|
-
Chef::Knife::
|
219
|
+
Chef::Knife::UserCreate.stub!(:new).and_return(user_command)
|
225
220
|
FileUtils.should_receive(:mkdir_p).with("/home/you/.chef")
|
226
221
|
::File.should_receive(:open).with("/home/you/.chef/knife.rb", "w")
|
227
222
|
@knife.config[:initial] = true
|
223
|
+
@knife.config[:user_password] = "blah"
|
228
224
|
@knife.run
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
225
|
+
user_command.name_args.should == Array("a-new-user")
|
226
|
+
user_command.config[:user_password].should == "blah"
|
227
|
+
user_command.config[:admin].should be_true
|
228
|
+
user_command.config[:file].should == "/home/you/.chef/a-new-user.pem"
|
229
|
+
user_command.config[:yes].should be_true
|
230
|
+
user_command.config[:disable_editing].should be_true
|
234
231
|
end
|
235
232
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (<steve@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
Chef::Knife::UserCreate.load_deps
|
22
|
+
|
23
|
+
describe Chef::Knife::UserCreate do
|
24
|
+
before(:each) do
|
25
|
+
@knife = Chef::Knife::UserCreate.new
|
26
|
+
@knife.name_args = [ 'a_user' ]
|
27
|
+
@knife.config[:user_password] = "foobar"
|
28
|
+
@user = Chef::User.new
|
29
|
+
@user.name "a_user"
|
30
|
+
@user_with_private_key = Chef::User.new
|
31
|
+
@user_with_private_key.name "a_user"
|
32
|
+
@user_with_private_key.private_key 'private_key'
|
33
|
+
@user.stub!(:create).and_return(@user_with_private_key)
|
34
|
+
Chef::User.stub!(:new).and_return(@user)
|
35
|
+
Chef::User.stub!(:from_hash).and_return(@user)
|
36
|
+
@knife.stub!(:edit_data).and_return(@user.to_hash)
|
37
|
+
@stdout = StringIO.new
|
38
|
+
@stderr = StringIO.new
|
39
|
+
@knife.ui.stub!(:stdout).and_return(@stdout)
|
40
|
+
@knife.ui.stub!(:stderr).and_return(@stderr)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "creates a new user" do
|
44
|
+
Chef::User.should_receive(:new).and_return(@user)
|
45
|
+
@user.should_receive(:create)
|
46
|
+
@knife.run
|
47
|
+
@stdout.string.should match /created user.+a_user/i
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets the password" do
|
51
|
+
@knife.config[:user_password] = "a_password"
|
52
|
+
@user.should_receive(:password).with("a_password")
|
53
|
+
@knife.run
|
54
|
+
end
|
55
|
+
|
56
|
+
it "exits with an error if password is blank" do
|
57
|
+
@knife.config[:user_password] = ''
|
58
|
+
lambda { @knife.run }.should raise_error SystemExit
|
59
|
+
@stderr.string.should match /You must specify a non-blank password/
|
60
|
+
end
|
61
|
+
|
62
|
+
it "sets the user name" do
|
63
|
+
@user.should_receive(:name).with("a_user")
|
64
|
+
@knife.run
|
65
|
+
end
|
66
|
+
|
67
|
+
it "sets the public key if given" do
|
68
|
+
@knife.config[:user_key] = "/a/filename"
|
69
|
+
File.stub(:read).with("/a/filename").and_return("a_key")
|
70
|
+
@user.should_receive(:public_key).with("a_key")
|
71
|
+
@knife.run
|
72
|
+
end
|
73
|
+
|
74
|
+
it "allows you to edit the data" do
|
75
|
+
@knife.should_receive(:edit_data).with(@user)
|
76
|
+
@knife.run
|
77
|
+
end
|
78
|
+
|
79
|
+
it "writes the private key to a file when --file is specified" do
|
80
|
+
@knife.config[:file] = "/tmp/a_file"
|
81
|
+
filehandle = mock("filehandle")
|
82
|
+
filehandle.should_receive(:print).with('private_key')
|
83
|
+
File.should_receive(:open).with("/tmp/a_file", "w").and_yield(filehandle)
|
84
|
+
@knife.run
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (<steve@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Knife::UserDelete do
|
22
|
+
before(:each) do
|
23
|
+
Chef::Knife::UserDelete.load_deps
|
24
|
+
@knife = Chef::Knife::UserDelete.new
|
25
|
+
@knife.name_args = [ 'my_user' ]
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'deletes the user' do
|
29
|
+
@knife.should_receive(:delete_object).with(Chef::User, 'my_user')
|
30
|
+
@knife.run
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'prints usage and exits when a user name is not provided' do
|
34
|
+
@knife.name_args = []
|
35
|
+
@knife.should_receive(:show_usage)
|
36
|
+
@knife.ui.should_receive(:fatal)
|
37
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (<steve@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Knife::UserEdit do
|
22
|
+
before(:each) do
|
23
|
+
Chef::Knife::UserEdit.load_deps
|
24
|
+
@knife = Chef::Knife::UserEdit.new
|
25
|
+
@knife.name_args = [ 'my_user' ]
|
26
|
+
@knife.config[:disable_editing] = true
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'loads and edits the user' do
|
30
|
+
data = { :name => "my_user" }
|
31
|
+
Chef::User.stub(:load).with("my_user").and_return(data)
|
32
|
+
@knife.should_receive(:edit_data).with(data).and_return(data)
|
33
|
+
@knife.run
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'prints usage and exits when a user name is not provided' do
|
37
|
+
@knife.name_args = []
|
38
|
+
@knife.should_receive(:show_usage)
|
39
|
+
@knife.ui.should_receive(:fatal)
|
40
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Knife::UserList do
|
22
|
+
before(:each) do
|
23
|
+
Chef::Knife::UserList.load_deps
|
24
|
+
@knife = Chef::Knife::UserList.new
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'lists the users' do
|
28
|
+
Chef::User.should_receive(:list)
|
29
|
+
@knife.should_receive(:format_list_for_display)
|
30
|
+
@knife.run
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (<steve@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Knife::UserReregister do
|
22
|
+
before(:each) do
|
23
|
+
Chef::Knife::UserReregister.load_deps
|
24
|
+
@knife = Chef::Knife::UserReregister.new
|
25
|
+
@knife.name_args = [ 'a_user' ]
|
26
|
+
@user_mock = mock('user_mock', :private_key => "private_key")
|
27
|
+
Chef::User.stub!(:load).and_return(@user_mock)
|
28
|
+
@stdout = StringIO.new
|
29
|
+
@knife.ui.stub!(:stdout).and_return(@stdout)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'prints usage and exits when a user name is not provided' do
|
33
|
+
@knife.name_args = []
|
34
|
+
@knife.should_receive(:show_usage)
|
35
|
+
@knife.ui.should_receive(:fatal)
|
36
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'reregisters the user and prints the key' do
|
40
|
+
@user_mock.should_receive(:reregister).and_return(@user_mock)
|
41
|
+
@knife.run
|
42
|
+
@stdout.string.should match( /private_key/ )
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'writes the private key to a file when --file is specified' do
|
46
|
+
@user_mock.should_receive(:reregister).and_return(@user_mock)
|
47
|
+
@knife.config[:file] = '/tmp/a_file'
|
48
|
+
filehandle = StringIO.new
|
49
|
+
File.should_receive(:open).with('/tmp/a_file', 'w').and_yield(filehandle)
|
50
|
+
@knife.run
|
51
|
+
filehandle.string.should == "private_key"
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (<steve@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Knife::UserShow do
|
22
|
+
before(:each) do
|
23
|
+
Chef::Knife::UserShow.load_deps
|
24
|
+
@knife = Chef::Knife::UserShow.new
|
25
|
+
@knife.name_args = [ 'my_user' ]
|
26
|
+
@user_mock = mock('user_mock')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'loads and displays the user' do
|
30
|
+
Chef::User.should_receive(:load).with('my_user').and_return(@user_mock)
|
31
|
+
@knife.should_receive(:format_for_display).with(@user_mock)
|
32
|
+
@knife.run
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'prints usage and exits when a user name is not provided' do
|
36
|
+
@knife.name_args = []
|
37
|
+
@knife.should_receive(:show_usage)
|
38
|
+
@knife.ui.should_receive(:fatal)
|
39
|
+
lambda { @knife.run }.should raise_error(SystemExit)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Steven Danna (steve@opscode.com)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
require 'chef/user'
|
22
|
+
require 'tempfile'
|
23
|
+
|
24
|
+
describe Chef::User do
|
25
|
+
before(:each) do
|
26
|
+
@user = Chef::User.new
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "initialize" do
|
30
|
+
it "should be a Chef::User" do
|
31
|
+
@user.should be_a_kind_of(Chef::User)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "name" do
|
36
|
+
it "should let you set the name to a string" do
|
37
|
+
@user.name("ops_master").should == "ops_master"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return the current name" do
|
41
|
+
@user.name "ops_master"
|
42
|
+
@user.name.should == "ops_master"
|
43
|
+
end
|
44
|
+
|
45
|
+
# It is not feasible to check all invalid characters. Here are a few
|
46
|
+
# that we probably care about.
|
47
|
+
it "should not accept invalid characters" do
|
48
|
+
# capital letters
|
49
|
+
lambda { @user.name "Bar" }.should raise_error(ArgumentError)
|
50
|
+
# slashes
|
51
|
+
lambda { @user.name "foo/bar" }.should raise_error(ArgumentError)
|
52
|
+
# ?
|
53
|
+
lambda { @user.name "foo?" }.should raise_error(ArgumentError)
|
54
|
+
# &
|
55
|
+
lambda { @user.name "foo&" }.should raise_error(ArgumentError)
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
it "should not accept spaces" do
|
60
|
+
lambda { @user.name "ops master" }.should raise_error(ArgumentError)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should throw an ArgumentError if you feed it anything but a string" do
|
64
|
+
lambda { @user.name Hash.new }.should raise_error(ArgumentError)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "admin" do
|
69
|
+
it "should let you set the admin bit" do
|
70
|
+
@user.admin(true).should == true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return the current admin value" do
|
74
|
+
@user.admin true
|
75
|
+
@user.admin.should == true
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should default to false" do
|
79
|
+
@user.admin.should == false
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should throw an ArgumentError if you feed it anything but true or false" do
|
83
|
+
lambda { @user.name Hash.new }.should raise_error(ArgumentError)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "public_key" do
|
88
|
+
it "should let you set the public key" do
|
89
|
+
@user.public_key("super public").should == "super public"
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return the current public key" do
|
93
|
+
@user.public_key("super public")
|
94
|
+
@user.public_key.should == "super public"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should throw an ArgumentError if you feed it something lame" do
|
98
|
+
lambda { @user.public_key Hash.new }.should raise_error(ArgumentError)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "private_key" do
|
103
|
+
it "should let you set the private key" do
|
104
|
+
@user.private_key("super private").should == "super private"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should return the private key" do
|
108
|
+
@user.private_key("super private")
|
109
|
+
@user.private_key.should == "super private"
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should throw an ArgumentError if you feed it something lame" do
|
113
|
+
lambda { @user.private_key Hash.new }.should raise_error(ArgumentError)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "when serializing to JSON" do
|
118
|
+
before(:each) do
|
119
|
+
@user.name("black")
|
120
|
+
@user.public_key("crowes")
|
121
|
+
@json = @user.to_json
|
122
|
+
end
|
123
|
+
|
124
|
+
it "serializes as a JSON object" do
|
125
|
+
@json.should match(/^\{.+\}$/)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "includes the name value" do
|
129
|
+
@json.should include(%q{"name":"black"})
|
130
|
+
end
|
131
|
+
|
132
|
+
it "includes the public key value" do
|
133
|
+
@json.should include(%{"public_key":"crowes"})
|
134
|
+
end
|
135
|
+
|
136
|
+
it "includes the 'admin' flag" do
|
137
|
+
@json.should include(%q{"admin":false})
|
138
|
+
end
|
139
|
+
|
140
|
+
it "includes the private key when present" do
|
141
|
+
@user.private_key("monkeypants")
|
142
|
+
@user.to_json.should include(%q{"private_key":"monkeypants"})
|
143
|
+
end
|
144
|
+
|
145
|
+
it "does not include the private key if not present" do
|
146
|
+
@json.should_not include("private_key")
|
147
|
+
end
|
148
|
+
|
149
|
+
it "includes the password if present" do
|
150
|
+
@user.password "password"
|
151
|
+
@user.to_json.should include(%q{"password":"password"})
|
152
|
+
end
|
153
|
+
|
154
|
+
it "does not include the password if not present" do
|
155
|
+
@json.should_not include("password")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe "when deserializing from JSON" do
|
160
|
+
before(:each) do
|
161
|
+
user = { "name" => "mr_spinks",
|
162
|
+
"public_key" => "turtles",
|
163
|
+
"private_key" => "pandas",
|
164
|
+
"password" => "password",
|
165
|
+
"admin" => true }
|
166
|
+
@user = Chef::User.from_json(user.to_json)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should deserialize to a Chef::User object" do
|
170
|
+
@user.should be_a_kind_of(Chef::User)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "preserves the name" do
|
174
|
+
@user.name.should == "mr_spinks"
|
175
|
+
end
|
176
|
+
|
177
|
+
it "preserves the public key" do
|
178
|
+
@user.public_key.should == "turtles"
|
179
|
+
end
|
180
|
+
|
181
|
+
it "preserves the admin status" do
|
182
|
+
@user.admin.should be_true
|
183
|
+
end
|
184
|
+
|
185
|
+
it "includes the private key if present" do
|
186
|
+
@user.private_key.should == "pandas"
|
187
|
+
end
|
188
|
+
|
189
|
+
it "includes the password if present" do
|
190
|
+
@user.password.should == "password"
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "API Interactions" do
|
196
|
+
before (:each) do
|
197
|
+
@user = Chef::User.new
|
198
|
+
@user.name "foobar"
|
199
|
+
@http_client = mock("Chef::REST mock")
|
200
|
+
Chef::REST.stub!(:new).and_return(@http_client)
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "list" do
|
204
|
+
before(:each) do
|
205
|
+
Chef::Config[:chef_server_url] = "http://www.example.com"
|
206
|
+
@osc_response = { "admin" => "http://www.example.com/users/admin"}
|
207
|
+
@ohc_response = [ { "user" => { "username" => "admin" }} ]
|
208
|
+
end
|
209
|
+
|
210
|
+
it "lists all clients on an OSC server" do
|
211
|
+
@http_client.stub!(:get_rest).with("users").and_return(@osc_response)
|
212
|
+
Chef::User.list.should == @osc_response
|
213
|
+
end
|
214
|
+
|
215
|
+
it "lists all clients on an OHC/OPC server" do
|
216
|
+
@http_client.stub!(:get_rest).with("users").and_return(@ohc_response)
|
217
|
+
# We expect that Chef::User.list will give a consistent response
|
218
|
+
# so OHC API responses should be transformed to OSC-style output.
|
219
|
+
Chef::User.list.should == @osc_response
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe "create" do
|
224
|
+
it "creates a new user via the API" do
|
225
|
+
@user.password "password"
|
226
|
+
@http_client.should_receive(:post_rest).with("users", {:name => "foobar", :admin => false, :password => "password"}).and_return({})
|
227
|
+
@user.create
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "read" do
|
232
|
+
it "loads a named user from the API" do
|
233
|
+
@http_client.should_receive(:get_rest).with("users/foobar").and_return({"name" => "foobar", "admin" => true, "public_key" => "pubkey"})
|
234
|
+
user = Chef::User.load("foobar")
|
235
|
+
user.name.should == "foobar"
|
236
|
+
user.admin.should == true
|
237
|
+
user.public_key.should == "pubkey"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
describe "update" do
|
242
|
+
it "updates an existing user on via the API" do
|
243
|
+
@http_client.should_receive(:put_rest).with("users/foobar", {:name => "foobar", :admin => false}).and_return({})
|
244
|
+
@user.update
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
describe "destroy" do
|
249
|
+
it "deletes the specified user via the API" do
|
250
|
+
@http_client.should_receive(:delete_rest).with("users/foobar")
|
251
|
+
@user.destroy
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|