cheffish 15.0.0 → 15.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/Rakefile +1 -1
  4. data/lib/chef/resource/chef_acl.rb +13 -10
  5. data/lib/chef/resource/chef_client.rb +2 -2
  6. data/lib/chef/resource/chef_container.rb +2 -2
  7. data/lib/chef/resource/chef_data_bag.rb +2 -2
  8. data/lib/chef/resource/chef_data_bag_item.rb +11 -10
  9. data/lib/chef/resource/chef_environment.rb +1 -1
  10. data/lib/chef/resource/chef_group.rb +1 -1
  11. data/lib/chef/resource/chef_mirror.rb +6 -5
  12. data/lib/chef/resource/chef_node.rb +1 -1
  13. data/lib/chef/resource/chef_organization.rb +2 -2
  14. data/lib/chef/resource/chef_resolved_cookbooks.rb +5 -3
  15. data/lib/chef/resource/chef_role.rb +5 -1
  16. data/lib/chef/resource/chef_user.rb +2 -2
  17. data/lib/chef/resource/private_key.rb +10 -10
  18. data/lib/chef/resource/public_key.rb +4 -3
  19. data/lib/cheffish.rb +1 -0
  20. data/lib/cheffish/base_resource.rb +13 -11
  21. data/lib/cheffish/basic_chef_client.rb +2 -2
  22. data/lib/cheffish/chef_actor_base.rb +2 -1
  23. data/lib/cheffish/chef_run.rb +5 -6
  24. data/lib/cheffish/chef_run_listener.rb +1 -3
  25. data/lib/cheffish/key_formatter.rb +1 -9
  26. data/lib/cheffish/merged_config.rb +2 -2
  27. data/lib/cheffish/node_properties.rb +7 -3
  28. data/lib/cheffish/recipe_dsl.rb +2 -2
  29. data/lib/cheffish/rspec/chef_run_support.rb +1 -1
  30. data/lib/cheffish/rspec/matchers/have_updated.rb +5 -5
  31. data/lib/cheffish/rspec/recipe_run_wrapper.rb +1 -1
  32. data/lib/cheffish/rspec/repository_support.rb +1 -0
  33. data/lib/cheffish/version.rb +1 -1
  34. data/spec/functional/fingerprint_spec.rb +8 -6
  35. data/spec/integration/chef_acl_spec.rb +27 -19
  36. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c170468185dfd63613f85a49fb0c2e02009aea96cf53ccb14d51ee31174503a4
4
- data.tar.gz: 3e474109c5568ed8a87479dbd8c8823423ea0b860ecba60e840270ed59cf1a76
3
+ metadata.gz: 547830e01071a34cc583bbf5217ae5f55270c014c393e9a69301023a88717279
4
+ data.tar.gz: a29005438abb411a4b59bc7b1cf1782e36219e2bd951ec49c64273f9a7de6144
5
5
  SHA512:
6
- metadata.gz: 69f0908686428159cbdd1947d955f226c5a0b740942f6bac36ee36ff9b30a4dc1e7b2e80f2e11aaa9c84ac3f99a8c4a8165d1005eb054df68b046b608bb111b5
7
- data.tar.gz: 3556f24741959b36aa5fc4df41e8ad195e9d6a1dd162ddf418686a7208bb881cef4b61b3e0c3c696094f02c3b2cf448072bc07cd902fb448a8398ef04d376d48
6
+ metadata.gz: 6db5d7117bb249b37d894d3b3e776f7d3b5e8c87cb2895e156fbe4393031dbfdfdcff8a9133b4bb7e578f85440905a5acbd30426e7a8d81171ac3fd44f583936
7
+ data.tar.gz: 2216df827dc0635fdf0e3a340a80dbf267c8c51f58d7bde7c2a7deb28f0b3eeb24975bc88e3c44809c12189c05751a8624285d90a7472ace2bbb6b69dd99542d
data/Gemfile CHANGED
@@ -14,8 +14,8 @@ if ENV["GEMFILE_MOD"]
14
14
  instance_eval(ENV["GEMFILE_MOD"])
15
15
  else
16
16
  group :development do
17
- gem "chef", "~> 14"
18
- gem "ohai", "~> 14"
17
+ gem "chef", "~> 15"
18
+ gem "ohai", "~> 15"
19
19
  end
20
20
  end
21
21
 
data/Rakefile CHANGED
@@ -39,4 +39,4 @@ task :console do
39
39
  IRB.start
40
40
  end
41
41
 
42
- task default: [:style, :spec]
42
+ task default: %i{style spec}
@@ -7,7 +7,7 @@ require "uri"
7
7
  class Chef
8
8
  class Resource
9
9
  class ChefAcl < Cheffish::BaseResource
10
- resource_name :chef_acl
10
+ provides :chef_acl
11
11
 
12
12
  # Path of the thing being secured, e.g. nodes, nodes/*, nodes/mynode,
13
13
  # */*, **, roles/base, data/secrets, cookbooks/apache2, /users/*,
@@ -99,6 +99,7 @@ class Chef
99
99
  # NOTE: if superusers exist, this should turn into a warning.
100
100
  raise "chef_acl attempted to remove all actors from GRANT! I'm sorry Dave, I can't let you remove access to an object with no hope of recovery."
101
101
  end
102
+
102
103
  modify[differences] ||= {}
103
104
  modify[differences][permission] = desired_json
104
105
  end
@@ -107,7 +108,7 @@ class Chef
107
108
  if modify.size > 0
108
109
  changed = true
109
110
  description = [ "update acl #{path} at #{rest_url(path)}" ] + modify.flat_map do |diffs, permissions|
110
- diffs.map { |diff| " #{permissions.keys.join(', ')}:#{diff}" }
111
+ diffs.map { |diff| " #{permissions.keys.join(", ")}:#{diff}" }
111
112
  end
112
113
  converge_by description do
113
114
  modify.values.each do |permissions|
@@ -127,11 +128,13 @@ class Chef
127
128
  children, _error = list(path, "*")
128
129
  Chef::ChefFS::Parallelizer.parallel_do(children) do |child|
129
130
  next if child.split("/")[-1] == "containers"
131
+
130
132
  create_acl(child)
131
133
  end
132
134
  # containers mess up our descent, so we do them last
133
135
  Chef::ChefFS::Parallelizer.parallel_do(children) do |child|
134
136
  next if child.split("/")[-1] != "containers"
137
+
135
138
  create_acl(child)
136
139
  end
137
140
 
@@ -141,7 +144,7 @@ class Chef
141
144
  # Get the current ACL for the given path
142
145
  def current_acl(acl_path)
143
146
  @current_acls ||= {}
144
- if !@current_acls.key?(acl_path)
147
+ unless @current_acls.key?(acl_path)
145
148
  @current_acls[acl_path] = begin
146
149
  rest.get(rest_url(acl_path))
147
150
  rescue Net::HTTPServerException => e
@@ -252,8 +255,7 @@ class Chef
252
255
  end
253
256
  end
254
257
 
255
- def load_current_resource
256
- end
258
+ def load_current_resource; end
257
259
 
258
260
  #
259
261
  # Matches chef_acl paths like nodes, nodes/*.
@@ -270,7 +272,7 @@ class Chef
270
272
  def match_paths(path)
271
273
  # Turn multiple slashes into one
272
274
  # nodes//x -> nodes/x
273
- path = path.gsub(/[\/]+/, "/")
275
+ path = path.gsub(%r{[/]+}, "/")
274
276
  # If it's absolute, start the matching with /. If it's relative, start with '' (relative root).
275
277
  if path[0] == "/"
276
278
  matches = [ "/" ]
@@ -305,6 +307,7 @@ class Chef
305
307
  if parts[0..index - 1].all? { |p| p != "*" }
306
308
  raise error
307
309
  end
310
+
308
311
  []
309
312
  else
310
313
  found
@@ -421,21 +424,21 @@ class Chef
421
424
  when 1
422
425
  # /organizations/*, /users/*, roles/*, nodes/*, etc.
423
426
  results, error = rest_list(path)
424
- if !error
427
+ unless error
425
428
  results = results.map { |result| ::File.join(path, result) }
426
429
  end
427
430
 
428
431
  when 2
429
432
  # /organizations/NAME/*
430
433
  results, error = rest_list(::File.join(path, "containers"))
431
- if !error
434
+ unless error
432
435
  results = results.map { |result| ::File.join(path, result) }
433
436
  end
434
437
 
435
438
  when 3
436
439
  # /organizations/NAME/TYPE/*
437
440
  results, error = rest_list(path)
438
- if !error
441
+ unless error
439
442
  results = results.map { |result| ::File.join(path, result) }
440
443
  end
441
444
  end
@@ -466,7 +469,7 @@ class Chef
466
469
  end
467
470
 
468
471
  def rest_list(path)
469
- # All our rest lists are hashes where the keys are the names
472
+ # All our rest lists are hashes where the keys are the names
470
473
  [ rest.get(rest_url(path)).keys, nil ]
471
474
  rescue Net::HTTPServerException => e
472
475
  if e.response.code == "405" || e.response.code == "404"
@@ -4,7 +4,7 @@ require_relative "../../cheffish/chef_actor_base"
4
4
  class Chef
5
5
  class Resource
6
6
  class ChefClient < Cheffish::ChefActorBase
7
- resource_name :chef_client
7
+ provides :chef_client
8
8
 
9
9
  # Client attributes
10
10
  property :chef_client_name, Cheffish::NAME_REGEX, name_property: true
@@ -18,7 +18,7 @@ class Chef
18
18
 
19
19
  # Output public key (if so desired)
20
20
  property :output_key_path, String
21
- property :output_key_format, Symbol, default: :openssh, equal_to: [ :pem, :der, :openssh ]
21
+ property :output_key_format, Symbol, default: :openssh, equal_to: %i{pem der openssh}
22
22
 
23
23
  # Proc that runs just before the resource executes. Called with (resource)
24
24
  def before(&block)
@@ -5,12 +5,12 @@ require "chef/chef_fs/data_handler/container_data_handler"
5
5
  class Chef
6
6
  class Resource
7
7
  class ChefContainer < Cheffish::BaseResource
8
- resource_name :chef_container
8
+ provides :chef_container
9
9
 
10
10
  property :chef_container_name, Cheffish::NAME_REGEX, name_property: true
11
11
 
12
12
  action :create do
13
- if !@current_exists
13
+ unless @current_exists
14
14
  converge_by "create container #{new_resource.chef_container_name} at #{rest.url}" do
15
15
  rest.post("containers", normalize_for_post(new_json))
16
16
  end
@@ -4,12 +4,12 @@ require_relative "../../cheffish/base_resource"
4
4
  class Chef
5
5
  class Resource
6
6
  class ChefDataBag < Cheffish::BaseResource
7
- resource_name :chef_data_bag
7
+ provides :chef_data_bag
8
8
 
9
9
  property :data_bag_name, Cheffish::NAME_REGEX, name_property: true
10
10
 
11
11
  action :create do
12
- if !current_resource_exists?
12
+ unless current_resource_exists?
13
13
  converge_by "create data bag #{new_resource.data_bag_name} at #{rest.url}" do
14
14
  rest.post("data", { "name" => new_resource.data_bag_name })
15
15
  end
@@ -7,7 +7,7 @@ require "chef/encrypted_data_bag_item"
7
7
  class Chef
8
8
  class Resource
9
9
  class ChefDataBagItem < Cheffish::BaseResource
10
- resource_name :chef_data_bag_item
10
+ provides :chef_data_bag_item
11
11
 
12
12
  def initialize(*args)
13
13
  super
@@ -137,7 +137,7 @@ class Chef
137
137
 
138
138
  # If the current secret doesn't work, look through the specified old secrets
139
139
 
140
- if !current_resource.secret
140
+ unless current_resource.secret
141
141
  old_secrets = []
142
142
  if new_resource.old_secret
143
143
  old_secrets += Array(new_resource.old_secret)
@@ -148,17 +148,17 @@ class Chef
148
148
  end
149
149
  end
150
150
  old_secrets.each do |secret|
151
- begin
152
- Chef::EncryptedDataBagItem::Decryptor.for(first_real_value, secret).for_decrypted_item
153
- current_resource.secret secret
154
- rescue Chef::EncryptedDataBagItem::DecryptionFailure
155
- decrypt_error = $!
156
- end
151
+
152
+ Chef::EncryptedDataBagItem::Decryptor.for(first_real_value, secret).for_decrypted_item
153
+ current_resource.secret secret
154
+ rescue Chef::EncryptedDataBagItem::DecryptionFailure
155
+ decrypt_error = $!
156
+
157
157
  end
158
158
 
159
159
  # If we couldn't figure out the secret, emit a warning (this isn't a fatal flaw unless we
160
160
  # need to reuse one of the values from the data bag)
161
- if !current_resource.secret
161
+ unless current_resource.secret
162
162
  if decrypt_error
163
163
  Chef::Log.warn "Existing data bag is encrypted, but could not decrypt: #{decrypt_error.message}."
164
164
  else
@@ -280,9 +280,10 @@ class Chef
280
280
  elsif current_resource.encrypt
281
281
  # Encryption is different and we can't read the old values. Only allow the change
282
282
  # if we're overwriting the data bag item
283
- if !new_resource.complete
283
+ unless new_resource.complete
284
284
  raise "Cannot encrypt #{new_resource.name} due to failure to decrypt existing resource. Set 'complete true' to overwrite or add the old secret as old_secret / old_secret_path."
285
285
  end
286
+
286
287
  _differences = [ "overwrite data bag item (cannot decrypt old data bag item)"]
287
288
  differences = (new_resource.raw_data.keys & current_resource.raw_data.keys).map { |key| "overwrite #{key}" }
288
289
  differences += (new_resource.raw_data.keys - current_resource.raw_data.keys).map { |key| "add #{key}" }
@@ -6,7 +6,7 @@ require "chef/chef_fs/data_handler/environment_data_handler"
6
6
  class Chef
7
7
  class Resource
8
8
  class ChefEnvironment < Cheffish::BaseResource
9
- resource_name :chef_environment
9
+ provides :chef_environment
10
10
 
11
11
  property :environment_name, Cheffish::NAME_REGEX, name_property: true
12
12
  property :description, String
@@ -6,7 +6,7 @@ require "chef/chef_fs/data_handler/group_data_handler"
6
6
  class Chef
7
7
  class Resource
8
8
  class ChefGroup < Cheffish::BaseResource
9
- resource_name :chef_group
9
+ provides :chef_group
10
10
 
11
11
  property :group_name, Cheffish::NAME_REGEX, name_property: true
12
12
  property :users, ArrayType
@@ -9,7 +9,7 @@ require "chef/chef_fs/file_system/repository/chef_repository_file_system_root_di
9
9
  class Chef
10
10
  class Resource
11
11
  class ChefMirror < Cheffish::BaseResource
12
- resource_name :chef_mirror
12
+ provides :chef_mirror
13
13
 
14
14
  # Path of the data to mirror, e.g. nodes, nodes/*, nodes/mynode,
15
15
  # */*, **, roles/base, data/secrets, cookbooks/apache2, etc.
@@ -95,6 +95,7 @@ class Chef
95
95
  if new_resource.concurrency <= 0
96
96
  raise "chef_mirror.concurrency must be above 0! Was set to #{new_resource.concurrency}"
97
97
  end
98
+
98
99
  # Honor concurrency
99
100
  Chef::ChefFS::Parallelizer.threads = new_resource.concurrency - 1
100
101
 
@@ -103,13 +104,14 @@ class Chef
103
104
  if new_resource.path[0] == "/"
104
105
  raise "Absolute paths in chef_mirror not yet supported."
105
106
  end
107
+
106
108
  # Copy!
107
109
  path = Chef::ChefFS::FilePattern.new("/#{new_resource.path}")
108
110
  ui = CopyListener.new(self)
109
111
  error = Chef::ChefFS::FileSystem.copy_to(path, src_root, dest_root, nil, options, ui, proc { |p| p.path })
110
112
 
111
113
  if error
112
- raise "Errors while copying:#{ui.errors.map { |e| "#{e}\n" }.join('')}"
114
+ raise "Errors while copying:#{ui.errors.map { |e| "#{e}\n" }.join("")}"
113
115
  end
114
116
  end
115
117
 
@@ -163,7 +165,7 @@ class Chef
163
165
  end
164
166
 
165
167
  def repo_mode
166
- new_resource.chef_server[:chef_server_url] =~ /\/organizations\// ? "hosted_everything" : "everything"
168
+ new_resource.chef_server[:chef_server_url] =~ %r{/organizations/} ? "hosted_everything" : "everything"
167
169
  end
168
170
 
169
171
  def options
@@ -179,8 +181,7 @@ class Chef
179
181
  result
180
182
  end
181
183
 
182
- def load_current_resource
183
- end
184
+ def load_current_resource; end
184
185
 
185
186
  class CopyListener
186
187
  def initialize(mirror)
@@ -6,7 +6,7 @@ require_relative "../../cheffish/node_properties"
6
6
  class Chef
7
7
  class Resource
8
8
  class ChefNode < Cheffish::BaseResource
9
- resource_name :chef_node
9
+ provides :chef_node
10
10
 
11
11
  include Cheffish::NodeProperties
12
12
 
@@ -6,7 +6,7 @@ require "chef/chef_fs/data_handler/data_handler_base"
6
6
  class Chef
7
7
  class Resource
8
8
  class ChefOrganization < Cheffish::BaseResource
9
- resource_name :chef_organization
9
+ provides :chef_organization
10
10
 
11
11
  property :organization_name, Cheffish::NAME_REGEX, name_property: true
12
12
  property :full_name, String
@@ -68,7 +68,7 @@ class Chef
68
68
  end
69
69
  end
70
70
  new_resource.members.each do |user|
71
- if !existing_members.include?(user)
71
+ unless existing_members.include?(user)
72
72
  converge_by "Add #{user} to organization #{new_resource.organization_name}" do
73
73
  rest.post("#{rest.root_url}/organizations/#{new_resource.organization_name}/users/", { "username" => user })
74
74
  end
@@ -4,7 +4,7 @@ require "chef_zero"
4
4
  class Chef
5
5
  class Resource
6
6
  class ChefResolvedCookbooks < Cheffish::BaseResource
7
- resource_name :chef_resolved_cookbooks
7
+ provides :chef_resolved_cookbooks
8
8
 
9
9
  def initialize(*args)
10
10
  super
@@ -43,7 +43,8 @@ class Chef
43
43
  new_resource.berksfile.upload(
44
44
  server_url: new_resource.chef_server[:chef_server_url],
45
45
  client_name: new_resource.chef_server[:options][:client_name],
46
- client_key: new_resource.chef_server[:options][:signing_key_filename])
46
+ client_key: new_resource.chef_server[:options][:signing_key_filename]
47
+ )
47
48
  else
48
49
  file = Tempfile.new("privatekey")
49
50
  begin
@@ -53,7 +54,8 @@ class Chef
53
54
  new_resource.berksfile.upload(
54
55
  server_url: new_resource.chef_server[:chef_server_url],
55
56
  client_name: new_resource.chef_server[:options][:client_name] || "me",
56
- client_key: file.path)
57
+ client_key: file.path
58
+ )
57
59
 
58
60
  ensure
59
61
  file.close
@@ -6,7 +6,7 @@ require "chef/chef_fs/data_handler/role_data_handler"
6
6
  class Chef
7
7
  class Resource
8
8
  class ChefRole < Cheffish::BaseResource
9
- resource_name :chef_role
9
+ provides :chef_role
10
10
 
11
11
  property :role_name, Cheffish::NAME_REGEX, name_property: true
12
12
  property :description, String
@@ -62,6 +62,7 @@ class Chef
62
62
  if recipes.size == 0
63
63
  raise ArgumentError, "At least one recipe must be specified"
64
64
  end
65
+
65
66
  @run_list_modifiers ||= []
66
67
  @run_list_modifiers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
67
68
  end
@@ -70,6 +71,7 @@ class Chef
70
71
  if roles.size == 0
71
72
  raise ArgumentError, "At least one role must be specified"
72
73
  end
74
+
73
75
  @run_list_modifiers ||= []
74
76
  @run_list_modifiers += roles.map { |role| Chef::RunList::RunListItem.new("role[#{role}]") }
75
77
  end
@@ -78,6 +80,7 @@ class Chef
78
80
  if recipes.size == 0
79
81
  raise ArgumentError, "At least one recipe must be specified"
80
82
  end
83
+
81
84
  @run_list_removers ||= []
82
85
  @run_list_removers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
83
86
  end
@@ -86,6 +89,7 @@ class Chef
86
89
  if roles.size == 0
87
90
  raise ArgumentError, "At least one role must be specified"
88
91
  end
92
+
89
93
  @run_list_removers ||= []
90
94
  @run_list_removers += roles.map { |recipe| Chef::RunList::RunListItem.new("role[#{role}]") }
91
95
  end
@@ -4,7 +4,7 @@ require_relative "../../cheffish/chef_actor_base"
4
4
  class Chef
5
5
  class Resource
6
6
  class ChefUser < Cheffish::ChefActorBase
7
- resource_name :chef_user
7
+ provides :chef_user
8
8
 
9
9
  # Client attributes
10
10
  property :user_name, Cheffish::NAME_REGEX, name_property: true
@@ -25,7 +25,7 @@ class Chef
25
25
 
26
26
  # Output public key (if so desired)
27
27
  property :output_key_path, String
28
- property :output_key_format, [ :pem, :der, :openssh ], default: :openssh
28
+ property :output_key_format, %i{pem der openssh}, default: :openssh
29
29
 
30
30
  # Proc that runs just before the resource executes. Called with (resource)
31
31
  def before(&block)
@@ -6,18 +6,18 @@ require_relative "../../cheffish/key_formatter"
6
6
  class Chef
7
7
  class Resource
8
8
  class PrivateKey < Cheffish::BaseResource
9
- resource_name :private_key
9
+ provides :private_key
10
10
 
11
11
  allowed_actions :create, :delete, :regenerate, :nothing
12
12
  default_action :create
13
13
 
14
14
  # Path to private key. Set to :none to create the key in memory and not on disk.
15
15
  property :path, [ String, :none ], name_property: true
16
- property :format, [ :pem, :der ], default: :pem
17
- property :type, [ :rsa, :dsa ], default: :rsa # TODO support :ec
16
+ property :format, %i{pem der}, default: :pem
17
+ property :type, %i{rsa dsa}, default: :rsa # TODO support :ec
18
18
  # These specify an optional public_key you can spit out if you want.
19
19
  property :public_key_path, String
20
- property :public_key_format, [ :openssh, :pem, :der ], default: :openssh
20
+ property :public_key_format, %i{openssh pem der}, default: :openssh
21
21
  # Specify this if you want to copy another private key but give it a different format / password
22
22
  property :source_key
23
23
  property :source_key_path, String
@@ -31,7 +31,7 @@ class Chef
31
31
 
32
32
  # PEM-only
33
33
  property :pass_phrase, String
34
- property :cipher, String, equal_to: OpenSSL::Cipher.ciphers.map { |x| x.downcase }, default: "des-ede3-cbc", coerce: proc { |x| x.downcase }
34
+ property :cipher, String, equal_to: OpenSSL::Cipher.ciphers.map(&:downcase), default: "des-ede3-cbc", coerce: proc { |x| x.downcase }
35
35
 
36
36
  # Set this to regenerate the key if it does not have the desired characteristics (like size, type, etc.)
37
37
  property :regenerate_if_different, [TrueClass, FalseClass]
@@ -202,22 +202,22 @@ class Chef
202
202
  def new_key_with_path
203
203
  path = new_resource.path
204
204
  if path.is_a?(Symbol)
205
- return [ nil, path ]
205
+ [ nil, path ]
206
206
  elsif Pathname.new(path).relative?
207
207
  private_key, private_key_path = Cheffish.get_private_key_with_path(path, run_context.config)
208
208
  if private_key
209
- return [ private_key, (private_key_path || :none) ]
209
+ [ private_key, (private_key_path || :none) ]
210
210
  elsif run_context.config[:private_key_write_path]
211
211
  @should_create_directory = true
212
212
  path = ::File.join(run_context.config[:private_key_write_path], path)
213
- return [ nil, path ]
213
+ [ nil, path ]
214
214
  else
215
215
  raise "Could not find key #{path} and Chef::Config.private_key_write_path is not set."
216
216
  end
217
217
  elsif ::File.exist?(path)
218
- return [ IO.read(path), path ]
218
+ [ IO.read(path), path ]
219
219
  else
220
- return [ nil, path ]
220
+ [ nil, path ]
221
221
  end
222
222
  end
223
223
 
@@ -6,13 +6,13 @@ require_relative "../../cheffish/key_formatter"
6
6
  class Chef
7
7
  class Resource
8
8
  class PublicKey < Cheffish::BaseResource
9
- resource_name :public_key
9
+ provides :public_key
10
10
 
11
11
  allowed_actions :create, :delete, :nothing
12
12
  default_action :create
13
13
 
14
14
  property :path, String, name_property: true
15
- property :format, [ :pem, :der, :openssh ], default: :openssh
15
+ property :format, %i{pem der openssh}, default: :openssh
16
16
 
17
17
  property :source_key
18
18
  property :source_key_path, String
@@ -24,9 +24,10 @@ class Chef
24
24
  end
25
25
 
26
26
  action :create do
27
- if !new_source_key
27
+ unless new_source_key
28
28
  raise "No source key specified"
29
29
  end
30
+
30
31
  desired_output = encode_public_key(new_source_key)
31
32
  if Array(current_resource.action) == [ :delete ] || desired_output != IO.read(new_resource.path)
32
33
  converge_by "write #{new_resource.format} public key #{new_resource.path} from #{new_source_key_publicity} key #{new_resource.source_key_path}" do
data/lib/cheffish.rb CHANGED
@@ -98,6 +98,7 @@ module Cheffish
98
98
  elsif config[:private_key_paths]
99
99
  config[:private_key_paths].each do |private_key_path|
100
100
  next unless File.exist?(private_key_path)
101
+
101
102
  Dir.entries(private_key_path).sort.each do |key|
102
103
  ext = File.extname(key)
103
104
  if key == name || ext == "" || ext == ".pem"
@@ -91,7 +91,7 @@ module Cheffish
91
91
  end
92
92
 
93
93
  def json_differences_internal(old_json, new_json, print_values, name, result)
94
- if old_json.kind_of?(Hash) && new_json.kind_of?(Hash)
94
+ if old_json.is_a?(Hash) && new_json.is_a?(Hash)
95
95
  removed_keys = old_json.keys.inject({}) { |hash, key| hash[key] = true; hash }
96
96
  new_json.each_pair do |new_key, new_value|
97
97
  if old_json.key?(new_key)
@@ -101,18 +101,18 @@ module Cheffish
101
101
  end
102
102
  else
103
103
  if print_values
104
- result << " add #{name == '' ? new_key : "#{name}.#{new_key}"} = #{new_value.inspect}"
104
+ result << " add #{name == "" ? new_key : "#{name}.#{new_key}"} = #{new_value.inspect}"
105
105
  else
106
- result << " add #{name == '' ? new_key : "#{name}.#{new_key}"}"
106
+ result << " add #{name == "" ? new_key : "#{name}.#{new_key}"}"
107
107
  end
108
108
  end
109
109
  end
110
110
  removed_keys.keys.each do |removed_key|
111
- result << " remove #{name == '' ? removed_key : "#{name}.#{removed_key}"}"
111
+ result << " remove #{name == "" ? removed_key : "#{name}.#{removed_key}"}"
112
112
  end
113
113
  else
114
- old_json = old_json.to_s if old_json.kind_of?(Symbol)
115
- new_json = new_json.to_s if new_json.kind_of?(Symbol)
114
+ old_json = old_json.to_s if old_json.is_a?(Symbol)
115
+ new_json = new_json.to_s if new_json.is_a?(Symbol)
116
116
  if old_json != new_json
117
117
  if print_values
118
118
  result << " update #{name} from #{old_json.inspect} to #{new_json.inspect}"
@@ -134,8 +134,8 @@ module Cheffish
134
134
  end
135
135
 
136
136
  modifiers.each do |path, value|
137
- path = [path] if !path.kind_of?(Array)
138
- path = path.map { |path_part| path_part.to_s }
137
+ path = [path] unless path.is_a?(Array)
138
+ path = path.map(&:to_s)
139
139
  parent = 0.upto(path.size - 2).inject(json) do |hash, index|
140
140
  if hash.nil?
141
141
  nil
@@ -148,6 +148,7 @@ module Cheffish
148
148
  if !parent.nil? && !parent.is_a?(Hash)
149
149
  raise "Attempt to set #{path} to #{value} when #{path[0..-2]} is not a hash"
150
150
  end
151
+
151
152
  existing_value = parent ? parent[path[-1]] : nil
152
153
 
153
154
  if value.is_a?(Proc)
@@ -158,7 +159,7 @@ module Cheffish
158
159
  else
159
160
  # Create parent if necessary, overwriting values
160
161
  parent = path[0..-2].inject(json) do |hash, path_part|
161
- hash[path_part] = {} if !hash[path_part]
162
+ hash[path_part] = {} unless hash[path_part]
162
163
  hash[path_part]
163
164
  end
164
165
  if path.size > 0
@@ -173,6 +174,7 @@ module Cheffish
173
174
 
174
175
  def apply_run_list_modifiers(add_to_run_list, delete_from_run_list, run_list)
175
176
  return run_list if (!add_to_run_list || add_to_run_list.size == 0) && (!delete_from_run_list || !delete_from_run_list.size)
177
+
176
178
  delete_from_run_list ||= []
177
179
  add_to_run_list ||= []
178
180
 
@@ -191,7 +193,7 @@ module Cheffish
191
193
  # because found_desired will be less than add_to_run_list_index. The result will
192
194
  # be X, A, B, Y, Z.
193
195
  if found_desired >= add_to_run_list_index
194
- result += add_to_run_list[add_to_run_list_index..found_desired].map { |item| item.to_s }
196
+ result += add_to_run_list[add_to_run_list_index..found_desired].map(&:to_s)
195
197
  add_to_run_list_index = found_desired + 1
196
198
  end
197
199
  else
@@ -204,7 +206,7 @@ module Cheffish
204
206
  end
205
207
 
206
208
  # Copy any remaining desired items at the end
207
- result += add_to_run_list[add_to_run_list_index..-1].map { |item| item.to_s }
209
+ result += add_to_run_list[add_to_run_list_index..-1].map(&:to_s)
208
210
  result
209
211
  end
210
212
 
@@ -14,7 +14,7 @@ module Cheffish
14
14
  include Chef::DSL::Recipe
15
15
 
16
16
  def initialize(node = nil, events = nil, **chef_config)
17
- if !node
17
+ unless node
18
18
  node = Chef::Node.new
19
19
  node.name "basic_chef_client"
20
20
  node.automatic[:platform] = "basic_chef_client"
@@ -31,7 +31,7 @@ module Cheffish
31
31
  case events
32
32
  when Array
33
33
  events.each { |e| dispatcher.register(e) } if events
34
- when !nil
34
+ when !nil # rubocop: disable Lint/LiteralAsCondition
35
35
  dispatcher.register(events)
36
36
  end
37
37
  @run_context = Chef::RunContext.new(node, {}, dispatcher)
@@ -24,9 +24,10 @@ module Cheffish
24
24
  end
25
25
  else
26
26
  # Create the actor if it's missing
27
- if !new_public_key
27
+ unless new_public_key
28
28
  raise "You must specify a public key to create a #{actor_type}! Use the private_key resource to create a key, and pass it in with source_key_path."
29
29
  end
30
+
30
31
  description = [ "create #{actor_type} #{new_resource.name} at #{actor_path}" ] + differences
31
32
  converge_by description do
32
33
  result = rest.post((actor_path).to_s, normalize_for_post(new_json))
@@ -34,15 +34,14 @@ module Cheffish
34
34
  def client
35
35
  @client ||= begin
36
36
  chef_config = self.chef_config.dup
37
- chef_config[:log_level] ||= :debug if !chef_config.key?(:log_level)
38
- chef_config[:verbose_logging] = false if !chef_config.key?(:verbose_logging)
37
+ chef_config[:log_level] ||= :debug unless chef_config.key?(:log_level)
38
+ chef_config[:verbose_logging] = false unless chef_config.key?(:verbose_logging)
39
39
  chef_config[:stdout] = StringIOTee.new(chef_config[:stdout])
40
40
  chef_config[:stderr] = StringIOTee.new(chef_config[:stderr])
41
41
  chef_config[:log_location] = StringIOTee.new(chef_config[:log_location])
42
42
  @client = ::Cheffish::BasicChefClient.new(nil,
43
43
  [ event_sink, Chef::Formatters.new(:doc, chef_config[:stdout], chef_config[:stderr]) ],
44
- chef_config
45
- )
44
+ chef_config)
46
45
  end
47
46
  end
48
47
 
@@ -125,14 +124,14 @@ module Cheffish
125
124
  message << "--- Chef Client Output ---\n"
126
125
  message << "--- ---\n"
127
126
  message << stdout
128
- message << "\n" if !stdout.end_with?("\n")
127
+ message << "\n" unless stdout.end_with?("\n")
129
128
  end
130
129
  if stderr && !stderr.empty?
131
130
  message << "--- ---\n"
132
131
  message << "--- Chef Client Error Output ---\n"
133
132
  message << "--- ---\n"
134
133
  message << stderr
135
- message << "\n" if !stderr.end_with?("\n")
134
+ message << "\n" unless stderr.end_with?("\n")
136
135
  end
137
136
  if logs && !logs.empty?
138
137
  message << "--- ---\n"
@@ -21,9 +21,7 @@ module Cheffish
21
21
  def disconnect
22
22
  # Stop the servers
23
23
  if node.run_context
24
- node.run_context.cheffish.local_servers.each do |server|
25
- server.stop
26
- end
24
+ node.run_context.cheffish.local_servers.each(&:stop)
27
25
  end
28
26
  end
29
27
  end
@@ -55,15 +55,7 @@ module Cheffish
55
55
  hexes = Digest::MD5.hexdigest(data)
56
56
  hexes.scan(/../).join(":")
57
57
  when :pkcs8sha1fingerprint
58
- if RUBY_VERSION.to_f >= 2.0
59
- raise "PKCS8 SHA1 not supported in Ruby #{RUBY_VERSION}"
60
- end
61
- require "openssl_pkcs8"
62
- pkcs8_pem = key.to_pem_pkcs8
63
- pkcs8_base64 = pkcs8_pem.split("\n").reject { |l| l =~ /^-----/ }
64
- pkcs8_data = Base64.decode64(pkcs8_base64.join)
65
- hexes = Digest::SHA1.hexdigest(pkcs8_data)
66
- hexes.scan(/../).join(":")
58
+ raise "PKCS8 SHA1 not supported by Ruby 2.0 and later"
67
59
  else
68
60
  raise "Unrecognized key format #{format}"
69
61
  end
@@ -27,7 +27,7 @@ module Cheffish
27
27
  result_configs = []
28
28
  configs.each do |config|
29
29
  value = config[name]
30
- if !value.nil?
30
+ unless value.nil?
31
31
  if value.respond_to?(:keys)
32
32
  result_configs << value
33
33
  elsif result_configs.size > 0
@@ -63,7 +63,7 @@ module Cheffish
63
63
  alias_method :has_key?, :key?
64
64
 
65
65
  def keys
66
- configs.flat_map { |c| c.keys }.uniq
66
+ configs.flat_map(&:keys).uniq
67
67
  end
68
68
 
69
69
  def values
@@ -39,7 +39,7 @@ module Cheffish
39
39
  attribute "tags" do |existing_tags|
40
40
  existing_tags ||= []
41
41
  tags.each do |tag|
42
- if !existing_tags.include?(tag.to_s)
42
+ unless existing_tags.include?(tag.to_s)
43
43
  existing_tags << tag.to_s
44
44
  end
45
45
  end
@@ -64,8 +64,8 @@ module Cheffish
64
64
  if tags.size == 0
65
65
  attribute("tags")
66
66
  else
67
- tags = tags[0] if tags.size == 1 && tags[0].kind_of?(Array)
68
- attribute("tags", tags.map { |tag| tag.to_s })
67
+ tags = tags[0] if tags.size == 1 && tags[0].is_a?(Array)
68
+ attribute("tags", tags.map(&:to_s))
69
69
  end
70
70
  end
71
71
 
@@ -80,6 +80,7 @@ module Cheffish
80
80
  if recipes.size == 0
81
81
  raise ArgumentError, "At least one recipe must be specified"
82
82
  end
83
+
83
84
  @run_list_modifiers ||= []
84
85
  @run_list_modifiers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
85
86
  end
@@ -88,6 +89,7 @@ module Cheffish
88
89
  if roles.size == 0
89
90
  raise ArgumentError, "At least one role must be specified"
90
91
  end
92
+
91
93
  @run_list_modifiers ||= []
92
94
  @run_list_modifiers += roles.map { |role| Chef::RunList::RunListItem.new("role[#{role}]") }
93
95
  end
@@ -96,6 +98,7 @@ module Cheffish
96
98
  if recipes.size == 0
97
99
  raise ArgumentError, "At least one recipe must be specified"
98
100
  end
101
+
99
102
  @run_list_removers ||= []
100
103
  @run_list_removers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
101
104
  end
@@ -104,6 +107,7 @@ module Cheffish
104
107
  if roles.size == 0
105
108
  raise ArgumentError, "At least one role must be specified"
106
109
  end
110
+
107
111
  @run_list_removers ||= []
108
112
  @run_list_removers += roles.map { |role| Chef::RunList::RunListItem.new("role[#{role}]") }
109
113
  end
@@ -52,7 +52,7 @@ class Chef
52
52
 
53
53
  # Create the data store chef-zero will use
54
54
  options[:data_store] ||= begin
55
- if !options[:chef_repo_path]
55
+ unless options[:chef_repo_path]
56
56
  raise "chef_repo_path must be specified to with_chef_local_server"
57
57
  end
58
58
 
@@ -63,7 +63,7 @@ class Chef
63
63
  symbol_key = "#{type}_path".to_sym
64
64
 
65
65
  options[symbol_key] ||= begin
66
- if options[:chef_repo_path].kind_of?(String)
66
+ if options[:chef_repo_path].is_a?(String)
67
67
  Chef::Util::PathHelper.join(options[:chef_repo_path], "#{type}s")
68
68
  else
69
69
  options[:chef_repo_path].map { |path| Chef::Util::PathHelper.join(path, "#{type}s") }
@@ -58,7 +58,7 @@ module Cheffish
58
58
  end
59
59
 
60
60
  def recipe(str = nil, file = nil, line = nil, &recipe)
61
- if !recipe
61
+ unless recipe
62
62
  if file && line
63
63
  recipe = proc { eval(str, nil, file, line) } # rubocop:disable Security/Eval
64
64
  else
@@ -5,16 +5,16 @@ RSpec::Matchers.define :have_updated do |resource_name, *expected_actions|
5
5
  @recipe = recipe
6
6
  actual = @recipe.event_sink.events
7
7
  actual_actions = actual.select { |event, resource, action| event == :resource_updated && resource.to_s == resource_name }
8
- .map { |event, resource, action| action }
8
+ .map { |event, resource, action| action }
9
9
  expect(actual_actions).to eq(expected_actions)
10
10
  end
11
11
 
12
12
  failure_message do
13
13
  actual = @recipe.event_sink.events
14
14
  updates = actual.select { |event, resource, action| event == :resource_updated }.to_a
15
- result = "expected that the chef_run would #{expected_actions.join(',')} #{resource_name}."
15
+ result = "expected that the chef_run would #{expected_actions.join(",")} #{resource_name}."
16
16
  if updates.size > 0
17
- result << " Actual updates were #{updates.map { |event, resource, action| "#{resource} => #{action.inspect}" }.join(', ')}"
17
+ result << " Actual updates were #{updates.map { |event, resource, action| "#{resource} => #{action.inspect}" }.join(", ")}"
18
18
  else
19
19
  result << " Nothing was updated."
20
20
  end
@@ -24,9 +24,9 @@ RSpec::Matchers.define :have_updated do |resource_name, *expected_actions|
24
24
  failure_message_when_negated do
25
25
  actual = @recipe.event_sink.events
26
26
  updates = actual.select { |event, resource, action| event == :resource_updated }.to_a
27
- result = "expected that the chef_run would not #{expected_actions.join(',')} #{resource_name}."
27
+ result = "expected that the chef_run would not #{expected_actions.join(",")} #{resource_name}."
28
28
  if updates.size > 0
29
- result << " Actual updates were #{updates.map { |event, resource, action| "#{resource} => #{action.inspect}" }.join(', ')}"
29
+ result << " Actual updates were #{updates.map { |event, resource, action| "#{resource} => #{action.inspect}" }.join(", ")}"
30
30
  else
31
31
  result << " Nothing was updated."
32
32
  end
@@ -14,7 +14,7 @@ module Cheffish
14
14
  attr_reader :example
15
15
 
16
16
  def client
17
- if !@client
17
+ unless @client
18
18
  super
19
19
  example = self.example
20
20
 
@@ -12,6 +12,7 @@ module Cheffish
12
12
  ::RSpec.shared_context "with a chef repo" do
13
13
  before :each do
14
14
  raise "Can only create one directory per test" if @repository_dir
15
+
15
16
  @repository_dir = Dir.mktmpdir("chef_repo")
16
17
  Chef::Config.chef_repo_path = @repository_dir
17
18
  %w{client cookbook data_bag environment node role user}.each do |object_name|
@@ -1,3 +1,3 @@
1
1
  module Cheffish
2
- VERSION = "15.0.0".freeze
2
+ VERSION = "15.0.3".freeze
3
3
  end
@@ -39,24 +39,26 @@ describe "Cheffish fingerprint key formatter" do
39
39
 
40
40
  context "when computing key fingperprints" do
41
41
 
42
- it "computes the PKCS#8 SHA1 private key fingerprint correctly", pending: (RUBY_VERSION.to_f >= 2.0) do
43
- expect(key_to_format(sample_private_key, :pkcs8sha1fingerprint)).to eq(
44
- "88:7e:3a:bd:26:9f:b5:c5:d8:ae:52:f9:df:0b:64:a4:5c:17:0a:87")
42
+ it "raises when passing a PKCS#8 SHA1 private key fingerprint" do
43
+ expect { key_to_format(sample_private_key, :pkcs8sha1fingerprint) }.to raise_error
45
44
  end
46
45
 
47
46
  it "computes the PKCS#1 MD5 public key fingerprint correctly" do
48
47
  expect(key_to_format(sample_public_key, :pkcs1md5fingerprint)).to eq(
49
- "1f:e8:da:c1:16:c3:72:7d:90:e2:b7:64:c4:b4:55:20")
48
+ "1f:e8:da:c1:16:c3:72:7d:90:e2:b7:64:c4:b4:55:20"
49
+ )
50
50
  end
51
51
 
52
52
  it "computes the RFC4716 MD5 public key fingerprint correctly" do
53
53
  expect(key_to_format(sample_public_key, :rfc4716md5fingerprint)).to eq(
54
- "b0:13:4f:da:cf:8c:dc:a7:4a:1f:d2:3a:51:92:cf:6b")
54
+ "b0:13:4f:da:cf:8c:dc:a7:4a:1f:d2:3a:51:92:cf:6b"
55
+ )
55
56
  end
56
57
 
57
58
  it "defaults to the PKCS#1 MD5 public key fingerprint" do
58
59
  expect(key_to_format(sample_public_key, :fingerprint)).to eq(
59
- key_to_format(sample_public_key, :pkcs1md5fingerprint))
60
+ key_to_format(sample_public_key, :pkcs1md5fingerprint)
61
+ )
60
62
  end
61
63
 
62
64
  end
@@ -160,7 +160,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
160
160
  it 'Converging chef_acl "nodes/x" with rights [ :read, :create, :update, :delete, :grant ] modifies all rights' do
161
161
  expect_recipe do
162
162
  chef_acl "nodes/x" do
163
- rights [ :create, :read, :update, :delete, :grant ], users: %w{u1 u2}, clients: %w{c1}, groups: %w{g1}
163
+ rights %i{create read update delete grant}, users: %w{u1 u2}, clients: %w{c1}, groups: %w{g1}
164
164
  end
165
165
  end.to be_updated
166
166
  expect(get("nodes/x/_acl")).to partially_match(
@@ -229,11 +229,11 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
229
229
  end
230
230
  end.to be_updated
231
231
  expect(get("nodes/x/_acl")).to partially_match(
232
- "create" => { "actors" => exclude("foo") },
233
- "read" => { "actors" => exclude("foo") },
234
- "update" => { "actors" => exclude("foo") },
235
- "delete" => { "actors" => exclude("foo") },
236
- "grant" => { "actors" => exclude("foo") }
232
+ "create" => { "actors" => exclude("foo") },
233
+ "read" => { "actors" => exclude("foo") },
234
+ "update" => { "actors" => exclude("foo") },
235
+ "delete" => { "actors" => exclude("foo") },
236
+ "grant" => { "actors" => exclude("foo") }
237
237
  )
238
238
  end
239
239
  end
@@ -361,7 +361,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
361
361
  end.to be_updated
362
362
  %w{clients containers cookbooks data environments groups nodes roles}.each do |type|
363
363
  expect(get("/organizations/foo/#{type}/x/_acl")).to partially_match(
364
- "read" => { "actors" => %w{u} })
364
+ "read" => { "actors" => %w{u} }
365
+ )
365
366
  end
366
367
  end
367
368
  end
@@ -408,7 +409,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
408
409
  end.to be_updated
409
410
  %w{clients containers cookbooks data environments groups nodes roles sandboxes}.each do |type|
410
411
  expect(get("/organizations/foo/#{type}/x/_acl")).to partially_match(
411
- "read" => { "actors" => %w{u} })
412
+ "read" => { "actors" => %w{u} }
413
+ )
412
414
  end
413
415
  end
414
416
 
@@ -420,7 +422,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
420
422
  end.to be_updated
421
423
  %w{clients containers cookbooks data environments groups nodes roles}.each do |type|
422
424
  expect(get("/organizations/foo/#{type}/x/_acl")).to partially_match(
423
- "read" => { "actors" => %w{u} })
425
+ "read" => { "actors" => %w{u} }
426
+ )
424
427
  end
425
428
  end
426
429
 
@@ -447,7 +450,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
447
450
  chef_acl "/organizations/foo/cookbooks/x/1.0.0" do
448
451
  rights :read, users: %w{u}
449
452
  end
450
- end.to raise_error(/ACLs cannot be set on children of \/organizations\/foo\/cookbooks\/x/)
453
+ end.to raise_error(%r{ACLs cannot be set on children of /organizations/foo/cookbooks/x})
451
454
  end
452
455
 
453
456
  it "chef_acl '/organizations/foo/cookbooks/*/*' raises an error" do
@@ -456,7 +459,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
456
459
  chef_acl "/organizations/foo/cookbooks/*/*" do
457
460
  rights :read, users: %w{u}
458
461
  end
459
- end.to raise_error(/ACLs cannot be set on children of \/organizations\/foo\/cookbooks\/*/)
462
+ end.to raise_error(%r{ACLs cannot be set on children of /organizations/foo/cookbooks/*})
460
463
  end
461
464
 
462
465
  it 'chef_acl "/organizations/foo/data/x/y" raises an error' do
@@ -464,7 +467,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
464
467
  chef_acl "/organizations/foo/data/x/y" do
465
468
  rights :read, users: %w{u}
466
469
  end
467
- end.to raise_error(/ACLs cannot be set on children of \/organizations\/foo\/data\/x/)
470
+ end.to raise_error(%r{ACLs cannot be set on children of /organizations/foo/data/x})
468
471
  end
469
472
 
470
473
  it 'chef_acl "/organizations/foo/data/*/*" raises an error' do
@@ -473,7 +476,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
473
476
  chef_acl "/organizations/foo/data/*/*" do
474
477
  rights :read, users: %w{u}
475
478
  end
476
- end.to raise_error(/ACLs cannot be set on children of \/organizations\/foo\/data\/*/)
479
+ end.to raise_error(%r{ACLs cannot be set on children of /organizations/foo/data/*})
477
480
  end
478
481
 
479
482
  it 'chef_acl "/organizations/foo" changes the acl' do
@@ -609,7 +612,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
609
612
  end.to be_updated
610
613
  %w{clients containers cookbooks data environments groups nodes roles sandboxes}.each do |type|
611
614
  expect(get("#{type}/x/_acl")).to partially_match(
612
- "read" => { "actors" => %w{u} })
615
+ "read" => { "actors" => %w{u} }
616
+ )
613
617
  end
614
618
  end
615
619
 
@@ -621,7 +625,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
621
625
  end.to be_updated
622
626
  %w{clients containers cookbooks data environments groups nodes roles}.each do |type|
623
627
  expect(get("#{type}/x/_acl")).to partially_match(
624
- "read" => { "actors" => %w{u} })
628
+ "read" => { "actors" => %w{u} }
629
+ )
625
630
  end
626
631
  end
627
632
 
@@ -633,7 +638,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
633
638
  end.to be_updated
634
639
  %w{admins billing-admins clients users x}.each do |n|
635
640
  expect(get("groups/#{n}/_acl")).to partially_match(
636
- "read" => { "actors" => %w{u} })
641
+ "read" => { "actors" => %w{u} }
642
+ )
637
643
  end
638
644
  end
639
645
 
@@ -713,7 +719,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
713
719
  end.to be_updated
714
720
  %w{clients containers cookbooks data environments groups nodes roles sandboxes}.each do |type|
715
721
  expect(get("/organizations/foo/containers/#{type}/_acl")).to partially_match(
716
- "read" => { "actors" => %w{u} })
722
+ "read" => { "actors" => %w{u} }
723
+ )
717
724
  end
718
725
  end
719
726
 
@@ -768,7 +775,8 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
768
775
  end.to be_updated
769
776
  %w{clients containers cookbooks data environments groups nodes roles sandboxes}.each do |type|
770
777
  expect(get("containers/#{type}/_acl")).to partially_match(
771
- "read" => { "actors" => %w{u} })
778
+ "read" => { "actors" => %w{u} }
779
+ )
772
780
  end
773
781
  end
774
782
  end
@@ -820,7 +828,7 @@ if Gem::Version.new(ChefZero::VERSION) >= Gem::Version.new("3.1")
820
828
  it 'chef_acl with remove_rights [ :create, :read ], "u", "c", "g" removes all three' do
821
829
  expect_recipe do
822
830
  chef_acl "nodes/x" do
823
- remove_rights [ :create, :read ], users: %w{u}, clients: %w{c}, groups: %w{g}
831
+ remove_rights %i{create read}, users: %w{u}, clients: %w{c}, groups: %w{g}
824
832
  end
825
833
  end.to be_updated
826
834
  expect(get("nodes/x/_acl")).to partially_match(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheffish
3
3
  version: !ruby/object:Gem::Version
4
- version: 15.0.0
4
+ version: 15.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2020-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-zero