cheffish 1.3.1 → 1.4.0
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.
- checksums.yaml +4 -4
- data/LICENSE +201 -201
- data/README.md +120 -117
- data/Rakefile +23 -23
- data/lib/chef/provider/chef_acl.rb +439 -434
- data/lib/chef/provider/chef_client.rb +53 -48
- data/lib/chef/provider/chef_container.rb +55 -50
- data/lib/chef/provider/chef_data_bag.rb +55 -50
- data/lib/chef/provider/chef_data_bag_item.rb +278 -273
- data/lib/chef/provider/chef_environment.rb +83 -78
- data/lib/chef/provider/chef_group.rb +83 -78
- data/lib/chef/provider/chef_mirror.rb +169 -164
- data/lib/chef/provider/chef_node.rb +87 -82
- data/lib/chef/provider/chef_organization.rb +155 -150
- data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -41
- data/lib/chef/provider/chef_role.rb +84 -79
- data/lib/chef/provider/chef_user.rb +59 -54
- data/lib/chef/provider/private_key.rb +225 -220
- data/lib/chef/provider/public_key.rb +88 -82
- data/lib/chef/resource/chef_acl.rb +69 -65
- data/lib/chef/resource/chef_client.rb +48 -44
- data/lib/chef/resource/chef_container.rb +22 -18
- data/lib/chef/resource/chef_data_bag.rb +22 -18
- data/lib/chef/resource/chef_data_bag_item.rb +121 -114
- data/lib/chef/resource/chef_environment.rb +77 -71
- data/lib/chef/resource/chef_group.rb +53 -49
- data/lib/chef/resource/chef_mirror.rb +52 -48
- data/lib/chef/resource/chef_node.rb +22 -18
- data/lib/chef/resource/chef_organization.rb +69 -64
- data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -31
- data/lib/chef/resource/chef_role.rb +110 -104
- data/lib/chef/resource/chef_user.rb +56 -52
- data/lib/chef/resource/private_key.rb +48 -44
- data/lib/chef/resource/public_key.rb +25 -21
- data/lib/cheffish.rb +235 -233
- data/lib/cheffish/actor_provider_base.rb +131 -131
- data/lib/cheffish/basic_chef_client.rb +184 -184
- data/lib/cheffish/chef_provider_base.rb +246 -246
- data/lib/cheffish/chef_run.rb +162 -155
- data/lib/cheffish/chef_run_data.rb +19 -19
- data/lib/cheffish/chef_run_listener.rb +30 -30
- data/lib/cheffish/key_formatter.rb +113 -113
- data/lib/cheffish/merged_config.rb +94 -94
- data/lib/cheffish/recipe_dsl.rb +157 -157
- data/lib/cheffish/rspec.rb +8 -8
- data/lib/cheffish/rspec/chef_run_support.rb +83 -83
- data/lib/cheffish/rspec/matchers.rb +4 -4
- data/lib/cheffish/rspec/matchers/be_idempotent.rb +16 -16
- data/lib/cheffish/rspec/matchers/emit_no_warnings_or_errors.rb +15 -15
- data/lib/cheffish/rspec/matchers/have_updated.rb +37 -37
- data/lib/cheffish/rspec/matchers/partially_match.rb +63 -63
- data/lib/cheffish/rspec/recipe_run_wrapper.rb +59 -47
- data/lib/cheffish/rspec/repository_support.rb +108 -108
- data/lib/cheffish/server_api.rb +52 -52
- data/lib/cheffish/version.rb +3 -3
- data/lib/cheffish/with_pattern.rb +21 -21
- data/spec/functional/fingerprint_spec.rb +64 -64
- data/spec/functional/merged_config_spec.rb +19 -19
- data/spec/functional/server_api_spec.rb +13 -13
- data/spec/integration/chef_acl_spec.rb +879 -879
- data/spec/integration/chef_client_spec.rb +105 -105
- data/spec/integration/chef_container_spec.rb +33 -33
- data/spec/integration/chef_group_spec.rb +309 -309
- data/spec/integration/chef_mirror_spec.rb +491 -491
- data/spec/integration/chef_node_spec.rb +786 -786
- data/spec/integration/chef_organization_spec.rb +226 -226
- data/spec/integration/chef_role_spec.rb +78 -0
- data/spec/integration/chef_user_spec.rb +85 -85
- data/spec/integration/private_key_spec.rb +399 -399
- data/spec/integration/recipe_dsl_spec.rb +28 -28
- data/spec/integration/rspec/converge_spec.rb +183 -183
- data/spec/support/key_support.rb +29 -29
- data/spec/support/spec_support.rb +15 -15
- data/spec/unit/get_private_key_spec.rb +131 -131
- data/spec/unit/recipe_run_wrapper_spec.rb +37 -0
- metadata +8 -5
@@ -1,105 +1,105 @@
|
|
1
|
-
require 'support/spec_support'
|
2
|
-
require 'cheffish/rspec/chef_run_support'
|
3
|
-
require 'support/key_support'
|
4
|
-
require 'chef/resource/chef_client'
|
5
|
-
require 'chef/provider/chef_client'
|
6
|
-
|
7
|
-
repo_path = Dir.mktmpdir('chef_repo')
|
8
|
-
|
9
|
-
describe Chef::Resource::ChefClient do
|
10
|
-
extend Cheffish::RSpec::ChefRunSupport
|
11
|
-
|
12
|
-
when_the_chef_12_server 'is in multi-org mode' do
|
13
|
-
organization 'foo'
|
14
|
-
|
15
|
-
before :each do
|
16
|
-
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'and is empty' do
|
20
|
-
context 'and we have a private key with a path' do
|
21
|
-
with_converge do
|
22
|
-
private_key "#{repo_path}/blah.pem"
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'and we run a recipe that creates client "blah"' do
|
26
|
-
it 'the client gets created' do
|
27
|
-
expect_recipe {
|
28
|
-
chef_client 'blah' do
|
29
|
-
source_key_path "#{repo_path}/blah.pem"
|
30
|
-
end
|
31
|
-
}.to have_updated 'chef_client[blah]', :create
|
32
|
-
client = get('clients/blah')
|
33
|
-
expect(client['name']).to eq('blah')
|
34
|
-
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
35
|
-
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'and we run a recipe that creates client "blah" with output_key_path' do
|
40
|
-
with_converge do
|
41
|
-
chef_client 'blah' do
|
42
|
-
source_key_path "#{repo_path}/blah.pem"
|
43
|
-
output_key_path "#{repo_path}/blah.pub"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'the output public key gets created' do
|
48
|
-
expect(IO.read("#{repo_path}/blah.pub")).to start_with('ssh-rsa ')
|
49
|
-
expect("#{repo_path}/blah.pub").to be_public_key_for("#{repo_path}/blah.pem")
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context "and a private_key 'blah' resource" do
|
55
|
-
before :each do
|
56
|
-
Chef::Config.private_key_paths = [ repo_path ]
|
57
|
-
end
|
58
|
-
|
59
|
-
with_converge do
|
60
|
-
private_key 'blah'
|
61
|
-
end
|
62
|
-
|
63
|
-
context "and a chef_client 'foobar' resource with source_key_path 'blah'" do
|
64
|
-
it 'the client is accessible via the given private key' do
|
65
|
-
expect_recipe {
|
66
|
-
chef_client 'foobar' do
|
67
|
-
source_key_path 'blah'
|
68
|
-
end
|
69
|
-
}.to have_updated 'chef_client[foobar]', :create
|
70
|
-
client = get('clients/foobar')
|
71
|
-
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
72
|
-
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
73
|
-
|
74
|
-
private_key = Cheffish::KeyFormatter.decode(Cheffish.get_private_key('blah'))
|
75
|
-
expect(key).to be_public_key_for(private_key)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
when_the_chef_server 'is in OSC mode' do
|
83
|
-
context 'and is empty' do
|
84
|
-
context 'and we have a private key with a path' do
|
85
|
-
with_converge do
|
86
|
-
private_key "#{repo_path}/blah.pem"
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'and we run a recipe that creates client "blah"' do
|
90
|
-
it 'the client gets created' do
|
91
|
-
expect_recipe {
|
92
|
-
chef_client 'blah' do
|
93
|
-
source_key_path "#{repo_path}/blah.pem"
|
94
|
-
end
|
95
|
-
}.to have_updated 'chef_client[blah]', :create
|
96
|
-
client = get('clients/blah')
|
97
|
-
expect(client['name']).to eq('blah')
|
98
|
-
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
99
|
-
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
1
|
+
require 'support/spec_support'
|
2
|
+
require 'cheffish/rspec/chef_run_support'
|
3
|
+
require 'support/key_support'
|
4
|
+
require 'chef/resource/chef_client'
|
5
|
+
require 'chef/provider/chef_client'
|
6
|
+
|
7
|
+
repo_path = Dir.mktmpdir('chef_repo')
|
8
|
+
|
9
|
+
describe Chef::Resource::ChefClient do
|
10
|
+
extend Cheffish::RSpec::ChefRunSupport
|
11
|
+
|
12
|
+
when_the_chef_12_server 'is in multi-org mode' do
|
13
|
+
organization 'foo'
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'and is empty' do
|
20
|
+
context 'and we have a private key with a path' do
|
21
|
+
with_converge do
|
22
|
+
private_key "#{repo_path}/blah.pem"
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'and we run a recipe that creates client "blah"' do
|
26
|
+
it 'the client gets created' do
|
27
|
+
expect_recipe {
|
28
|
+
chef_client 'blah' do
|
29
|
+
source_key_path "#{repo_path}/blah.pem"
|
30
|
+
end
|
31
|
+
}.to have_updated 'chef_client[blah]', :create
|
32
|
+
client = get('clients/blah')
|
33
|
+
expect(client['name']).to eq('blah')
|
34
|
+
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
35
|
+
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'and we run a recipe that creates client "blah" with output_key_path' do
|
40
|
+
with_converge do
|
41
|
+
chef_client 'blah' do
|
42
|
+
source_key_path "#{repo_path}/blah.pem"
|
43
|
+
output_key_path "#{repo_path}/blah.pub"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'the output public key gets created' do
|
48
|
+
expect(IO.read("#{repo_path}/blah.pub")).to start_with('ssh-rsa ')
|
49
|
+
expect("#{repo_path}/blah.pub").to be_public_key_for("#{repo_path}/blah.pem")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "and a private_key 'blah' resource" do
|
55
|
+
before :each do
|
56
|
+
Chef::Config.private_key_paths = [ repo_path ]
|
57
|
+
end
|
58
|
+
|
59
|
+
with_converge do
|
60
|
+
private_key 'blah'
|
61
|
+
end
|
62
|
+
|
63
|
+
context "and a chef_client 'foobar' resource with source_key_path 'blah'" do
|
64
|
+
it 'the client is accessible via the given private key' do
|
65
|
+
expect_recipe {
|
66
|
+
chef_client 'foobar' do
|
67
|
+
source_key_path 'blah'
|
68
|
+
end
|
69
|
+
}.to have_updated 'chef_client[foobar]', :create
|
70
|
+
client = get('clients/foobar')
|
71
|
+
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
72
|
+
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
73
|
+
|
74
|
+
private_key = Cheffish::KeyFormatter.decode(Cheffish.get_private_key('blah'))
|
75
|
+
expect(key).to be_public_key_for(private_key)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
when_the_chef_server 'is in OSC mode' do
|
83
|
+
context 'and is empty' do
|
84
|
+
context 'and we have a private key with a path' do
|
85
|
+
with_converge do
|
86
|
+
private_key "#{repo_path}/blah.pem"
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'and we run a recipe that creates client "blah"' do
|
90
|
+
it 'the client gets created' do
|
91
|
+
expect_recipe {
|
92
|
+
chef_client 'blah' do
|
93
|
+
source_key_path "#{repo_path}/blah.pem"
|
94
|
+
end
|
95
|
+
}.to have_updated 'chef_client[blah]', :create
|
96
|
+
client = get('clients/blah')
|
97
|
+
expect(client['name']).to eq('blah')
|
98
|
+
key, format = Cheffish::KeyFormatter.decode(client['public_key'])
|
99
|
+
expect(key).to be_public_key_for("#{repo_path}/blah.pem")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -1,33 +1,33 @@
|
|
1
|
-
require 'support/spec_support'
|
2
|
-
require 'cheffish/rspec/chef_run_support'
|
3
|
-
require 'chef/resource/chef_container'
|
4
|
-
require 'chef/provider/chef_container'
|
5
|
-
|
6
|
-
describe Chef::Resource::ChefContainer do
|
7
|
-
extend Cheffish::RSpec::ChefRunSupport
|
8
|
-
|
9
|
-
when_the_chef_12_server 'is in multi-org mode' do
|
10
|
-
organization 'foo'
|
11
|
-
|
12
|
-
before :each do
|
13
|
-
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'Converging chef_container "x" creates the container' do
|
17
|
-
expect_recipe {
|
18
|
-
chef_container 'x'
|
19
|
-
}.to have_updated('chef_container[x]', :create)
|
20
|
-
expect { get('containers/x') }.not_to raise_error
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'and already has a container named x' do
|
24
|
-
container 'x', {}
|
25
|
-
|
26
|
-
it 'Converging chef_container "x" changes nothing' do
|
27
|
-
expect_recipe {
|
28
|
-
chef_container 'x'
|
29
|
-
}.not_to have_updated('chef_container[x]', :create)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
1
|
+
require 'support/spec_support'
|
2
|
+
require 'cheffish/rspec/chef_run_support'
|
3
|
+
require 'chef/resource/chef_container'
|
4
|
+
require 'chef/provider/chef_container'
|
5
|
+
|
6
|
+
describe Chef::Resource::ChefContainer do
|
7
|
+
extend Cheffish::RSpec::ChefRunSupport
|
8
|
+
|
9
|
+
when_the_chef_12_server 'is in multi-org mode' do
|
10
|
+
organization 'foo'
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'Converging chef_container "x" creates the container' do
|
17
|
+
expect_recipe {
|
18
|
+
chef_container 'x'
|
19
|
+
}.to have_updated('chef_container[x]', :create)
|
20
|
+
expect { get('containers/x') }.not_to raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'and already has a container named x' do
|
24
|
+
container 'x', {}
|
25
|
+
|
26
|
+
it 'Converging chef_container "x" changes nothing' do
|
27
|
+
expect_recipe {
|
28
|
+
chef_container 'x'
|
29
|
+
}.not_to have_updated('chef_container[x]', :create)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,309 +1,309 @@
|
|
1
|
-
require 'support/spec_support'
|
2
|
-
require 'cheffish/rspec/chef_run_support'
|
3
|
-
require 'chef/resource/chef_group'
|
4
|
-
require 'chef/provider/chef_group'
|
5
|
-
|
6
|
-
describe Chef::Resource::ChefGroup do
|
7
|
-
extend Cheffish::RSpec::ChefRunSupport
|
8
|
-
|
9
|
-
when_the_chef_12_server 'is in multi-org mode' do
|
10
|
-
organization 'foo'
|
11
|
-
|
12
|
-
before :each do
|
13
|
-
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'and is empty' do
|
17
|
-
group 'g', {}
|
18
|
-
user 'u', {}
|
19
|
-
client 'c', {}
|
20
|
-
|
21
|
-
it 'Converging chef_group "x" creates the group with no members' do
|
22
|
-
expect_recipe {
|
23
|
-
chef_group 'x'
|
24
|
-
}.to have_updated('chef_group[x]', :create)
|
25
|
-
expect(get('groups/x')).to eq({
|
26
|
-
'name' => 'x',
|
27
|
-
'groupname' => 'x',
|
28
|
-
'orgname' => 'foo',
|
29
|
-
'actors' => [],
|
30
|
-
'groups' => [],
|
31
|
-
'users' => [],
|
32
|
-
'clients' => []
|
33
|
-
})
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'chef_group "x" action :delete does nothing' do
|
37
|
-
expect_recipe {
|
38
|
-
chef_group 'x' do
|
39
|
-
action :delete
|
40
|
-
end
|
41
|
-
}.to not_have_updated('chef_group[x]', :delete).and not_have_updated('chef_group[x]', :create)
|
42
|
-
expect { get('groups/x') }.to raise_error(Net::HTTPServerException)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'Converging chef_group "x" creates the group with the given members' do
|
46
|
-
expect_recipe {
|
47
|
-
chef_group 'x' do
|
48
|
-
groups 'g'
|
49
|
-
users 'u'
|
50
|
-
clients 'c'
|
51
|
-
end
|
52
|
-
}.to have_updated('chef_group[x]', :create)
|
53
|
-
expect(get('groups/x')).to eq({
|
54
|
-
'name' => 'x',
|
55
|
-
'groupname' => 'x',
|
56
|
-
'orgname' => 'foo',
|
57
|
-
'actors' => %w(c u),
|
58
|
-
'groups' => %w(g),
|
59
|
-
'users' => %w(u),
|
60
|
-
'clients' => %w(c)
|
61
|
-
})
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'and has a group named x' do
|
66
|
-
group 'g', {}
|
67
|
-
group 'g2', {}
|
68
|
-
group 'g3', {}
|
69
|
-
group 'g4', {}
|
70
|
-
user 'u', {}
|
71
|
-
user 'u2', {}
|
72
|
-
user 'u3', {}
|
73
|
-
user 'u4', {}
|
74
|
-
client 'c', {}
|
75
|
-
client 'c2', {}
|
76
|
-
client 'c3', {}
|
77
|
-
client 'c4', {}
|
78
|
-
|
79
|
-
group 'x', {
|
80
|
-
'users' => %w(u u2),
|
81
|
-
'clients' => %w(c c2),
|
82
|
-
'groups' => %w(g g2)
|
83
|
-
}
|
84
|
-
|
85
|
-
it 'Converging chef_group "x" changes nothing' do
|
86
|
-
expect_recipe {
|
87
|
-
chef_group 'x'
|
88
|
-
}.not_to have_updated('chef_group[x]', :create)
|
89
|
-
expect(get('groups/x')).to eq({
|
90
|
-
'name' => 'x',
|
91
|
-
'groupname' => 'x',
|
92
|
-
'orgname' => 'foo',
|
93
|
-
'actors' => %w(c c2 u u2),
|
94
|
-
'groups' => %w(g g2),
|
95
|
-
'users' => %w(u u2),
|
96
|
-
'clients' => %w(c c2)
|
97
|
-
})
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'chef_group "x" action :delete deletes the group' do
|
101
|
-
expect_recipe {
|
102
|
-
chef_group 'x' do
|
103
|
-
action :delete
|
104
|
-
end
|
105
|
-
}.to have_updated('chef_group[x]', :delete)
|
106
|
-
expect { get('groups/x') }.to raise_error(Net::HTTPServerException)
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'Converging chef_group "x" with existing users changes nothing' do
|
110
|
-
expect_recipe {
|
111
|
-
chef_group 'x' do
|
112
|
-
users 'u'
|
113
|
-
clients 'c'
|
114
|
-
groups 'g'
|
115
|
-
end
|
116
|
-
}.not_to have_updated('chef_group[x]', :create)
|
117
|
-
expect(get('groups/x')).to eq({
|
118
|
-
'name' => 'x',
|
119
|
-
'groupname' => 'x',
|
120
|
-
'orgname' => 'foo',
|
121
|
-
'actors' => %w(c c2 u u2),
|
122
|
-
'groups' => %w(g g2),
|
123
|
-
'users' => %w(u u2),
|
124
|
-
'clients' => %w(c c2)
|
125
|
-
})
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'Converging chef_group "x" adds new users' do
|
129
|
-
expect_recipe {
|
130
|
-
chef_group 'x' do
|
131
|
-
users 'u3'
|
132
|
-
clients 'c3'
|
133
|
-
groups 'g3'
|
134
|
-
end
|
135
|
-
}.to have_updated('chef_group[x]', :create)
|
136
|
-
expect(get('groups/x')).to eq({
|
137
|
-
'name' => 'x',
|
138
|
-
'groupname' => 'x',
|
139
|
-
'orgname' => 'foo',
|
140
|
-
'actors' => %w(c c2 c3 u u2 u3),
|
141
|
-
'groups' => %w(g g2 g3),
|
142
|
-
'users' => %w(u u2 u3),
|
143
|
-
'clients' => %w(c c2 c3)
|
144
|
-
})
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'Converging chef_group "x" with multiple users adds new users' do
|
148
|
-
expect_recipe {
|
149
|
-
chef_group 'x' do
|
150
|
-
users 'u3', 'u4'
|
151
|
-
clients 'c3', 'c4'
|
152
|
-
groups 'g3', 'g4'
|
153
|
-
end
|
154
|
-
}.to have_updated('chef_group[x]', :create)
|
155
|
-
expect(get('groups/x')).to eq({
|
156
|
-
'name' => 'x',
|
157
|
-
'groupname' => 'x',
|
158
|
-
'orgname' => 'foo',
|
159
|
-
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
160
|
-
'groups' => %w(g g2 g3 g4),
|
161
|
-
'users' => %w(u u2 u3 u4),
|
162
|
-
'clients' => %w(c c2 c3 c4)
|
163
|
-
})
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'Converging chef_group "x" with multiple users in an array adds new users' do
|
167
|
-
expect_recipe {
|
168
|
-
chef_group 'x' do
|
169
|
-
users [ 'u3', 'u4' ]
|
170
|
-
clients [ 'c3', 'c4' ]
|
171
|
-
groups [ 'g3', 'g4' ]
|
172
|
-
end
|
173
|
-
}.to have_updated('chef_group[x]', :create)
|
174
|
-
expect(get('groups/x')).to eq({
|
175
|
-
'name' => 'x',
|
176
|
-
'groupname' => 'x',
|
177
|
-
'orgname' => 'foo',
|
178
|
-
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
179
|
-
'groups' => %w(g g2 g3 g4),
|
180
|
-
'users' => %w(u u2 u3 u4),
|
181
|
-
'clients' => %w(c c2 c3 c4)
|
182
|
-
})
|
183
|
-
end
|
184
|
-
|
185
|
-
it 'Converging chef_group "x" with multiple users declarations adds new users' do
|
186
|
-
expect_recipe {
|
187
|
-
chef_group 'x' do
|
188
|
-
users 'u3'
|
189
|
-
users 'u4'
|
190
|
-
clients 'c3'
|
191
|
-
clients 'c4'
|
192
|
-
groups 'g3'
|
193
|
-
groups 'g4'
|
194
|
-
end
|
195
|
-
}.to have_updated('chef_group[x]', :create)
|
196
|
-
expect(get('groups/x')).to eq({
|
197
|
-
'name' => 'x',
|
198
|
-
'groupname' => 'x',
|
199
|
-
'orgname' => 'foo',
|
200
|
-
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
201
|
-
'groups' => %w(g g2 g3 g4),
|
202
|
-
'users' => %w(u u2 u3 u4),
|
203
|
-
'clients' => %w(c c2 c3 c4)
|
204
|
-
})
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'Converging chef_group "x" removes desired users' do
|
208
|
-
expect_recipe {
|
209
|
-
chef_group 'x' do
|
210
|
-
remove_users 'u2'
|
211
|
-
remove_clients 'c2'
|
212
|
-
remove_groups 'g2'
|
213
|
-
end
|
214
|
-
}.to have_updated('chef_group[x]', :create)
|
215
|
-
expect(get('groups/x')).to eq({
|
216
|
-
'name' => 'x',
|
217
|
-
'groupname' => 'x',
|
218
|
-
'orgname' => 'foo',
|
219
|
-
'actors' => %w(c u),
|
220
|
-
'groups' => %w(g),
|
221
|
-
'users' => %w(u),
|
222
|
-
'clients' => %w(c)
|
223
|
-
})
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'Converging chef_group "x" with multiple users removes desired users' do
|
227
|
-
expect_recipe {
|
228
|
-
chef_group 'x' do
|
229
|
-
remove_users 'u', 'u2'
|
230
|
-
remove_clients 'c', 'c2'
|
231
|
-
remove_groups 'g', 'g2'
|
232
|
-
end
|
233
|
-
}.to have_updated('chef_group[x]', :create)
|
234
|
-
expect(get('groups/x')).to eq({
|
235
|
-
'name' => 'x',
|
236
|
-
'groupname' => 'x',
|
237
|
-
'orgname' => 'foo',
|
238
|
-
'actors' => [],
|
239
|
-
'groups' => [],
|
240
|
-
'users' => [],
|
241
|
-
'clients' => []
|
242
|
-
})
|
243
|
-
end
|
244
|
-
|
245
|
-
it 'Converging chef_group "x" with multiple users in an array removes desired users' do
|
246
|
-
expect_recipe {
|
247
|
-
chef_group 'x' do
|
248
|
-
remove_users [ 'u', 'u2' ]
|
249
|
-
remove_clients [ 'c', 'c2' ]
|
250
|
-
remove_groups [ 'g', 'g2' ]
|
251
|
-
end
|
252
|
-
}.to have_updated('chef_group[x]', :create)
|
253
|
-
expect(get('groups/x')).to eq({
|
254
|
-
'name' => 'x',
|
255
|
-
'groupname' => 'x',
|
256
|
-
'orgname' => 'foo',
|
257
|
-
'actors' => [],
|
258
|
-
'groups' => [],
|
259
|
-
'users' => [],
|
260
|
-
'clients' => []
|
261
|
-
})
|
262
|
-
end
|
263
|
-
|
264
|
-
it 'Converging chef_group "x" with multiple remove_ declarations removes desired users' do
|
265
|
-
expect_recipe {
|
266
|
-
chef_group 'x' do
|
267
|
-
remove_users 'u'
|
268
|
-
remove_users 'u2'
|
269
|
-
remove_clients 'c'
|
270
|
-
remove_clients 'c2'
|
271
|
-
remove_groups 'g'
|
272
|
-
remove_groups 'g2'
|
273
|
-
end
|
274
|
-
}.to have_updated('chef_group[x]', :create)
|
275
|
-
expect(get('groups/x')).to eq({
|
276
|
-
'name' => 'x',
|
277
|
-
'groupname' => 'x',
|
278
|
-
'orgname' => 'foo',
|
279
|
-
'actors' => [],
|
280
|
-
'groups' => [],
|
281
|
-
'users' => [],
|
282
|
-
'clients' => []
|
283
|
-
})
|
284
|
-
end
|
285
|
-
|
286
|
-
it 'Converging chef_group "x" adds and removes desired users' do
|
287
|
-
expect_recipe {
|
288
|
-
chef_group 'x' do
|
289
|
-
users 'u3'
|
290
|
-
clients 'c3'
|
291
|
-
groups 'g3'
|
292
|
-
remove_users 'u'
|
293
|
-
remove_clients 'c'
|
294
|
-
remove_groups 'g'
|
295
|
-
end
|
296
|
-
}.to have_updated('chef_group[x]', :create)
|
297
|
-
expect(get('groups/x')).to eq({
|
298
|
-
'name' => 'x',
|
299
|
-
'groupname' => 'x',
|
300
|
-
'orgname' => 'foo',
|
301
|
-
'actors' => %w(c2 c3 u2 u3),
|
302
|
-
'groups' => %w(g2 g3),
|
303
|
-
'users' => %w(u2 u3),
|
304
|
-
'clients' => %w(c2 c3)
|
305
|
-
})
|
306
|
-
end
|
307
|
-
end
|
308
|
-
end
|
309
|
-
end
|
1
|
+
require 'support/spec_support'
|
2
|
+
require 'cheffish/rspec/chef_run_support'
|
3
|
+
require 'chef/resource/chef_group'
|
4
|
+
require 'chef/provider/chef_group'
|
5
|
+
|
6
|
+
describe Chef::Resource::ChefGroup do
|
7
|
+
extend Cheffish::RSpec::ChefRunSupport
|
8
|
+
|
9
|
+
when_the_chef_12_server 'is in multi-org mode' do
|
10
|
+
organization 'foo'
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, '/organizations/foo').to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'and is empty' do
|
17
|
+
group 'g', {}
|
18
|
+
user 'u', {}
|
19
|
+
client 'c', {}
|
20
|
+
|
21
|
+
it 'Converging chef_group "x" creates the group with no members' do
|
22
|
+
expect_recipe {
|
23
|
+
chef_group 'x'
|
24
|
+
}.to have_updated('chef_group[x]', :create)
|
25
|
+
expect(get('groups/x')).to eq({
|
26
|
+
'name' => 'x',
|
27
|
+
'groupname' => 'x',
|
28
|
+
'orgname' => 'foo',
|
29
|
+
'actors' => [],
|
30
|
+
'groups' => [],
|
31
|
+
'users' => [],
|
32
|
+
'clients' => []
|
33
|
+
})
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'chef_group "x" action :delete does nothing' do
|
37
|
+
expect_recipe {
|
38
|
+
chef_group 'x' do
|
39
|
+
action :delete
|
40
|
+
end
|
41
|
+
}.to not_have_updated('chef_group[x]', :delete).and not_have_updated('chef_group[x]', :create)
|
42
|
+
expect { get('groups/x') }.to raise_error(Net::HTTPServerException)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'Converging chef_group "x" creates the group with the given members' do
|
46
|
+
expect_recipe {
|
47
|
+
chef_group 'x' do
|
48
|
+
groups 'g'
|
49
|
+
users 'u'
|
50
|
+
clients 'c'
|
51
|
+
end
|
52
|
+
}.to have_updated('chef_group[x]', :create)
|
53
|
+
expect(get('groups/x')).to eq({
|
54
|
+
'name' => 'x',
|
55
|
+
'groupname' => 'x',
|
56
|
+
'orgname' => 'foo',
|
57
|
+
'actors' => %w(c u),
|
58
|
+
'groups' => %w(g),
|
59
|
+
'users' => %w(u),
|
60
|
+
'clients' => %w(c)
|
61
|
+
})
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'and has a group named x' do
|
66
|
+
group 'g', {}
|
67
|
+
group 'g2', {}
|
68
|
+
group 'g3', {}
|
69
|
+
group 'g4', {}
|
70
|
+
user 'u', {}
|
71
|
+
user 'u2', {}
|
72
|
+
user 'u3', {}
|
73
|
+
user 'u4', {}
|
74
|
+
client 'c', {}
|
75
|
+
client 'c2', {}
|
76
|
+
client 'c3', {}
|
77
|
+
client 'c4', {}
|
78
|
+
|
79
|
+
group 'x', {
|
80
|
+
'users' => %w(u u2),
|
81
|
+
'clients' => %w(c c2),
|
82
|
+
'groups' => %w(g g2)
|
83
|
+
}
|
84
|
+
|
85
|
+
it 'Converging chef_group "x" changes nothing' do
|
86
|
+
expect_recipe {
|
87
|
+
chef_group 'x'
|
88
|
+
}.not_to have_updated('chef_group[x]', :create)
|
89
|
+
expect(get('groups/x')).to eq({
|
90
|
+
'name' => 'x',
|
91
|
+
'groupname' => 'x',
|
92
|
+
'orgname' => 'foo',
|
93
|
+
'actors' => %w(c c2 u u2),
|
94
|
+
'groups' => %w(g g2),
|
95
|
+
'users' => %w(u u2),
|
96
|
+
'clients' => %w(c c2)
|
97
|
+
})
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'chef_group "x" action :delete deletes the group' do
|
101
|
+
expect_recipe {
|
102
|
+
chef_group 'x' do
|
103
|
+
action :delete
|
104
|
+
end
|
105
|
+
}.to have_updated('chef_group[x]', :delete)
|
106
|
+
expect { get('groups/x') }.to raise_error(Net::HTTPServerException)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'Converging chef_group "x" with existing users changes nothing' do
|
110
|
+
expect_recipe {
|
111
|
+
chef_group 'x' do
|
112
|
+
users 'u'
|
113
|
+
clients 'c'
|
114
|
+
groups 'g'
|
115
|
+
end
|
116
|
+
}.not_to have_updated('chef_group[x]', :create)
|
117
|
+
expect(get('groups/x')).to eq({
|
118
|
+
'name' => 'x',
|
119
|
+
'groupname' => 'x',
|
120
|
+
'orgname' => 'foo',
|
121
|
+
'actors' => %w(c c2 u u2),
|
122
|
+
'groups' => %w(g g2),
|
123
|
+
'users' => %w(u u2),
|
124
|
+
'clients' => %w(c c2)
|
125
|
+
})
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'Converging chef_group "x" adds new users' do
|
129
|
+
expect_recipe {
|
130
|
+
chef_group 'x' do
|
131
|
+
users 'u3'
|
132
|
+
clients 'c3'
|
133
|
+
groups 'g3'
|
134
|
+
end
|
135
|
+
}.to have_updated('chef_group[x]', :create)
|
136
|
+
expect(get('groups/x')).to eq({
|
137
|
+
'name' => 'x',
|
138
|
+
'groupname' => 'x',
|
139
|
+
'orgname' => 'foo',
|
140
|
+
'actors' => %w(c c2 c3 u u2 u3),
|
141
|
+
'groups' => %w(g g2 g3),
|
142
|
+
'users' => %w(u u2 u3),
|
143
|
+
'clients' => %w(c c2 c3)
|
144
|
+
})
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'Converging chef_group "x" with multiple users adds new users' do
|
148
|
+
expect_recipe {
|
149
|
+
chef_group 'x' do
|
150
|
+
users 'u3', 'u4'
|
151
|
+
clients 'c3', 'c4'
|
152
|
+
groups 'g3', 'g4'
|
153
|
+
end
|
154
|
+
}.to have_updated('chef_group[x]', :create)
|
155
|
+
expect(get('groups/x')).to eq({
|
156
|
+
'name' => 'x',
|
157
|
+
'groupname' => 'x',
|
158
|
+
'orgname' => 'foo',
|
159
|
+
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
160
|
+
'groups' => %w(g g2 g3 g4),
|
161
|
+
'users' => %w(u u2 u3 u4),
|
162
|
+
'clients' => %w(c c2 c3 c4)
|
163
|
+
})
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'Converging chef_group "x" with multiple users in an array adds new users' do
|
167
|
+
expect_recipe {
|
168
|
+
chef_group 'x' do
|
169
|
+
users [ 'u3', 'u4' ]
|
170
|
+
clients [ 'c3', 'c4' ]
|
171
|
+
groups [ 'g3', 'g4' ]
|
172
|
+
end
|
173
|
+
}.to have_updated('chef_group[x]', :create)
|
174
|
+
expect(get('groups/x')).to eq({
|
175
|
+
'name' => 'x',
|
176
|
+
'groupname' => 'x',
|
177
|
+
'orgname' => 'foo',
|
178
|
+
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
179
|
+
'groups' => %w(g g2 g3 g4),
|
180
|
+
'users' => %w(u u2 u3 u4),
|
181
|
+
'clients' => %w(c c2 c3 c4)
|
182
|
+
})
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'Converging chef_group "x" with multiple users declarations adds new users' do
|
186
|
+
expect_recipe {
|
187
|
+
chef_group 'x' do
|
188
|
+
users 'u3'
|
189
|
+
users 'u4'
|
190
|
+
clients 'c3'
|
191
|
+
clients 'c4'
|
192
|
+
groups 'g3'
|
193
|
+
groups 'g4'
|
194
|
+
end
|
195
|
+
}.to have_updated('chef_group[x]', :create)
|
196
|
+
expect(get('groups/x')).to eq({
|
197
|
+
'name' => 'x',
|
198
|
+
'groupname' => 'x',
|
199
|
+
'orgname' => 'foo',
|
200
|
+
'actors' => %w(c c2 c3 c4 u u2 u3 u4),
|
201
|
+
'groups' => %w(g g2 g3 g4),
|
202
|
+
'users' => %w(u u2 u3 u4),
|
203
|
+
'clients' => %w(c c2 c3 c4)
|
204
|
+
})
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'Converging chef_group "x" removes desired users' do
|
208
|
+
expect_recipe {
|
209
|
+
chef_group 'x' do
|
210
|
+
remove_users 'u2'
|
211
|
+
remove_clients 'c2'
|
212
|
+
remove_groups 'g2'
|
213
|
+
end
|
214
|
+
}.to have_updated('chef_group[x]', :create)
|
215
|
+
expect(get('groups/x')).to eq({
|
216
|
+
'name' => 'x',
|
217
|
+
'groupname' => 'x',
|
218
|
+
'orgname' => 'foo',
|
219
|
+
'actors' => %w(c u),
|
220
|
+
'groups' => %w(g),
|
221
|
+
'users' => %w(u),
|
222
|
+
'clients' => %w(c)
|
223
|
+
})
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'Converging chef_group "x" with multiple users removes desired users' do
|
227
|
+
expect_recipe {
|
228
|
+
chef_group 'x' do
|
229
|
+
remove_users 'u', 'u2'
|
230
|
+
remove_clients 'c', 'c2'
|
231
|
+
remove_groups 'g', 'g2'
|
232
|
+
end
|
233
|
+
}.to have_updated('chef_group[x]', :create)
|
234
|
+
expect(get('groups/x')).to eq({
|
235
|
+
'name' => 'x',
|
236
|
+
'groupname' => 'x',
|
237
|
+
'orgname' => 'foo',
|
238
|
+
'actors' => [],
|
239
|
+
'groups' => [],
|
240
|
+
'users' => [],
|
241
|
+
'clients' => []
|
242
|
+
})
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'Converging chef_group "x" with multiple users in an array removes desired users' do
|
246
|
+
expect_recipe {
|
247
|
+
chef_group 'x' do
|
248
|
+
remove_users [ 'u', 'u2' ]
|
249
|
+
remove_clients [ 'c', 'c2' ]
|
250
|
+
remove_groups [ 'g', 'g2' ]
|
251
|
+
end
|
252
|
+
}.to have_updated('chef_group[x]', :create)
|
253
|
+
expect(get('groups/x')).to eq({
|
254
|
+
'name' => 'x',
|
255
|
+
'groupname' => 'x',
|
256
|
+
'orgname' => 'foo',
|
257
|
+
'actors' => [],
|
258
|
+
'groups' => [],
|
259
|
+
'users' => [],
|
260
|
+
'clients' => []
|
261
|
+
})
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'Converging chef_group "x" with multiple remove_ declarations removes desired users' do
|
265
|
+
expect_recipe {
|
266
|
+
chef_group 'x' do
|
267
|
+
remove_users 'u'
|
268
|
+
remove_users 'u2'
|
269
|
+
remove_clients 'c'
|
270
|
+
remove_clients 'c2'
|
271
|
+
remove_groups 'g'
|
272
|
+
remove_groups 'g2'
|
273
|
+
end
|
274
|
+
}.to have_updated('chef_group[x]', :create)
|
275
|
+
expect(get('groups/x')).to eq({
|
276
|
+
'name' => 'x',
|
277
|
+
'groupname' => 'x',
|
278
|
+
'orgname' => 'foo',
|
279
|
+
'actors' => [],
|
280
|
+
'groups' => [],
|
281
|
+
'users' => [],
|
282
|
+
'clients' => []
|
283
|
+
})
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'Converging chef_group "x" adds and removes desired users' do
|
287
|
+
expect_recipe {
|
288
|
+
chef_group 'x' do
|
289
|
+
users 'u3'
|
290
|
+
clients 'c3'
|
291
|
+
groups 'g3'
|
292
|
+
remove_users 'u'
|
293
|
+
remove_clients 'c'
|
294
|
+
remove_groups 'g'
|
295
|
+
end
|
296
|
+
}.to have_updated('chef_group[x]', :create)
|
297
|
+
expect(get('groups/x')).to eq({
|
298
|
+
'name' => 'x',
|
299
|
+
'groupname' => 'x',
|
300
|
+
'orgname' => 'foo',
|
301
|
+
'actors' => %w(c2 c3 u2 u3),
|
302
|
+
'groups' => %w(g2 g3),
|
303
|
+
'users' => %w(u2 u3),
|
304
|
+
'clients' => %w(c2 c3)
|
305
|
+
})
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|