cheffish 1.4.1 → 1.4.2
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 -120
- data/Rakefile +23 -23
- data/lib/chef/provider/chef_acl.rb +439 -439
- data/lib/chef/provider/chef_client.rb +53 -53
- data/lib/chef/provider/chef_container.rb +55 -55
- data/lib/chef/provider/chef_data_bag.rb +55 -55
- data/lib/chef/provider/chef_data_bag_item.rb +278 -278
- data/lib/chef/provider/chef_environment.rb +83 -83
- data/lib/chef/provider/chef_group.rb +83 -83
- data/lib/chef/provider/chef_mirror.rb +169 -169
- data/lib/chef/provider/chef_node.rb +87 -87
- data/lib/chef/provider/chef_organization.rb +155 -155
- data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -46
- data/lib/chef/provider/chef_role.rb +84 -84
- data/lib/chef/provider/chef_user.rb +59 -59
- data/lib/chef/provider/private_key.rb +225 -225
- data/lib/chef/provider/public_key.rb +88 -88
- data/lib/chef/resource/chef_acl.rb +69 -69
- data/lib/chef/resource/chef_client.rb +48 -48
- data/lib/chef/resource/chef_container.rb +22 -22
- data/lib/chef/resource/chef_data_bag.rb +22 -22
- data/lib/chef/resource/chef_data_bag_item.rb +121 -121
- data/lib/chef/resource/chef_environment.rb +77 -77
- data/lib/chef/resource/chef_group.rb +53 -53
- data/lib/chef/resource/chef_mirror.rb +52 -52
- data/lib/chef/resource/chef_node.rb +22 -22
- data/lib/chef/resource/chef_organization.rb +69 -69
- data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -35
- data/lib/chef/resource/chef_role.rb +110 -110
- data/lib/chef/resource/chef_user.rb +56 -56
- data/lib/chef/resource/private_key.rb +48 -48
- data/lib/chef/resource/public_key.rb +25 -25
- 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 -162
- 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/chef_run_support.rb +83 -83
- 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/matchers.rb +4 -4
- data/lib/cheffish/rspec/recipe_run_wrapper.rb +78 -59
- data/lib/cheffish/rspec/repository_support.rb +108 -108
- data/lib/cheffish/rspec.rb +8 -8
- data/lib/cheffish/server_api.rb +52 -52
- data/lib/cheffish/version.rb +3 -3
- data/lib/cheffish/with_pattern.rb +21 -21
- data/lib/cheffish.rb +235 -235
- 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 -78
- 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 -37
- metadata +3 -2
@@ -1,69 +1,69 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
class Resource
|
6
|
-
class ChefAcl < Chef::Resource::LWRPBase
|
7
|
-
self.resource_name = 'chef_acl'
|
8
|
-
|
9
|
-
actions :create, :nothing
|
10
|
-
default_action :create
|
11
|
-
|
12
|
-
def initialize(*args)
|
13
|
-
super
|
14
|
-
chef_server run_context.cheffish.current_chef_server
|
15
|
-
end
|
16
|
-
|
17
|
-
# Path of the thing being secured, e.g. nodes, nodes/*, nodes/mynode,
|
18
|
-
# */*, **, roles/base, data/secrets, cookbooks/apache2, /users/*,
|
19
|
-
# /organizations/foo/nodes/x
|
20
|
-
attribute :path, :kind_of => String, :name_attribute => true
|
21
|
-
|
22
|
-
# Whether to change things recursively. true means it will descend all children
|
23
|
-
# and make the same modifications to them. :on_change will only descend if
|
24
|
-
# the parent has changed. :on_change is the default.
|
25
|
-
attribute :recursive, :equal_to => [ true, false, :on_change ], :default => :on_change
|
26
|
-
|
27
|
-
# Specifies that this is a complete specification for the acl (i.e. rights
|
28
|
-
# you don't specify will be reset to their defaults)
|
29
|
-
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
30
|
-
|
31
|
-
attribute :raw_json, :kind_of => Hash
|
32
|
-
attribute :chef_server, :kind_of => Hash
|
33
|
-
|
34
|
-
# rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
35
|
-
# rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
36
|
-
# rights :all, :users => 'jkeiser'
|
37
|
-
def rights(*values)
|
38
|
-
if values.size == 0
|
39
|
-
@rights
|
40
|
-
else
|
41
|
-
args = values.pop
|
42
|
-
args[:permissions] ||= []
|
43
|
-
values.each do |value|
|
44
|
-
args[:permissions] |= Array(value)
|
45
|
-
end
|
46
|
-
@rights ||= []
|
47
|
-
@rights << args
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# remove_rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
52
|
-
# remove_rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
53
|
-
# remove_rights :all, :users => [ 'jkeiser', 'adam' ]
|
54
|
-
def remove_rights(*values)
|
55
|
-
if values.size == 0
|
56
|
-
@remove_rights
|
57
|
-
else
|
58
|
-
args = values.pop
|
59
|
-
args[:permissions] ||= []
|
60
|
-
values.each do |value|
|
61
|
-
args[:permissions] |= Array(value)
|
62
|
-
end
|
63
|
-
@remove_rights ||= []
|
64
|
-
@remove_rights << args
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefAcl < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_acl'
|
8
|
+
|
9
|
+
actions :create, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
# Path of the thing being secured, e.g. nodes, nodes/*, nodes/mynode,
|
18
|
+
# */*, **, roles/base, data/secrets, cookbooks/apache2, /users/*,
|
19
|
+
# /organizations/foo/nodes/x
|
20
|
+
attribute :path, :kind_of => String, :name_attribute => true
|
21
|
+
|
22
|
+
# Whether to change things recursively. true means it will descend all children
|
23
|
+
# and make the same modifications to them. :on_change will only descend if
|
24
|
+
# the parent has changed. :on_change is the default.
|
25
|
+
attribute :recursive, :equal_to => [ true, false, :on_change ], :default => :on_change
|
26
|
+
|
27
|
+
# Specifies that this is a complete specification for the acl (i.e. rights
|
28
|
+
# you don't specify will be reset to their defaults)
|
29
|
+
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
30
|
+
|
31
|
+
attribute :raw_json, :kind_of => Hash
|
32
|
+
attribute :chef_server, :kind_of => Hash
|
33
|
+
|
34
|
+
# rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
35
|
+
# rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
36
|
+
# rights :all, :users => 'jkeiser'
|
37
|
+
def rights(*values)
|
38
|
+
if values.size == 0
|
39
|
+
@rights
|
40
|
+
else
|
41
|
+
args = values.pop
|
42
|
+
args[:permissions] ||= []
|
43
|
+
values.each do |value|
|
44
|
+
args[:permissions] |= Array(value)
|
45
|
+
end
|
46
|
+
@rights ||= []
|
47
|
+
@rights << args
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# remove_rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
52
|
+
# remove_rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
53
|
+
# remove_rights :all, :users => [ 'jkeiser', 'adam' ]
|
54
|
+
def remove_rights(*values)
|
55
|
+
if values.size == 0
|
56
|
+
@remove_rights
|
57
|
+
else
|
58
|
+
args = values.pop
|
59
|
+
args[:permissions] ||= []
|
60
|
+
values.each do |value|
|
61
|
+
args[:permissions] |= Array(value)
|
62
|
+
end
|
63
|
+
@remove_rights ||= []
|
64
|
+
@remove_rights << args
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,48 +1,48 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
class Resource
|
6
|
-
class ChefClient < Chef::Resource::LWRPBase
|
7
|
-
self.resource_name = 'chef_client'
|
8
|
-
|
9
|
-
actions :create, :delete, :regenerate_keys, :nothing
|
10
|
-
default_action :create
|
11
|
-
|
12
|
-
def initialize(*args)
|
13
|
-
super
|
14
|
-
chef_server run_context.cheffish.current_chef_server
|
15
|
-
end
|
16
|
-
|
17
|
-
# Client attributes
|
18
|
-
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
-
attribute :admin, :kind_of => [TrueClass, FalseClass]
|
20
|
-
attribute :validator, :kind_of => [TrueClass, FalseClass]
|
21
|
-
|
22
|
-
# Input key
|
23
|
-
attribute :source_key # String or OpenSSL::PKey::*
|
24
|
-
attribute :source_key_path, :kind_of => String
|
25
|
-
attribute :source_key_pass_phrase
|
26
|
-
|
27
|
-
# Output public key (if so desired)
|
28
|
-
attribute :output_key_path, :kind_of => String
|
29
|
-
attribute :output_key_format, :kind_of => Symbol, :default => :openssh, :equal_to => [ :pem, :der, :openssh ]
|
30
|
-
|
31
|
-
# If this is set, client is not patchy
|
32
|
-
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
33
|
-
|
34
|
-
attribute :raw_json, :kind_of => Hash
|
35
|
-
attribute :chef_server, :kind_of => Hash
|
36
|
-
|
37
|
-
# Proc that runs just before the resource executes. Called with (resource)
|
38
|
-
def before(&block)
|
39
|
-
block ? @before = block : @before
|
40
|
-
end
|
41
|
-
|
42
|
-
# Proc that runs after the resource completes. Called with (resource, json, private_key, public_key)
|
43
|
-
def after(&block)
|
44
|
-
block ? @after = block : @after
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefClient < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_client'
|
8
|
+
|
9
|
+
actions :create, :delete, :regenerate_keys, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
# Client attributes
|
18
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
+
attribute :admin, :kind_of => [TrueClass, FalseClass]
|
20
|
+
attribute :validator, :kind_of => [TrueClass, FalseClass]
|
21
|
+
|
22
|
+
# Input key
|
23
|
+
attribute :source_key # String or OpenSSL::PKey::*
|
24
|
+
attribute :source_key_path, :kind_of => String
|
25
|
+
attribute :source_key_pass_phrase
|
26
|
+
|
27
|
+
# Output public key (if so desired)
|
28
|
+
attribute :output_key_path, :kind_of => String
|
29
|
+
attribute :output_key_format, :kind_of => Symbol, :default => :openssh, :equal_to => [ :pem, :der, :openssh ]
|
30
|
+
|
31
|
+
# If this is set, client is not patchy
|
32
|
+
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
33
|
+
|
34
|
+
attribute :raw_json, :kind_of => Hash
|
35
|
+
attribute :chef_server, :kind_of => Hash
|
36
|
+
|
37
|
+
# Proc that runs just before the resource executes. Called with (resource)
|
38
|
+
def before(&block)
|
39
|
+
block ? @before = block : @before
|
40
|
+
end
|
41
|
+
|
42
|
+
# Proc that runs after the resource completes. Called with (resource, json, private_key, public_key)
|
43
|
+
def after(&block)
|
44
|
+
block ? @after = block : @after
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
class Resource
|
6
|
-
class ChefContainer < Chef::Resource::LWRPBase
|
7
|
-
self.resource_name = 'chef_container'
|
8
|
-
|
9
|
-
actions :create, :delete, :nothing
|
10
|
-
default_action :create
|
11
|
-
|
12
|
-
# Grab environment from with_environment
|
13
|
-
def initialize(*args)
|
14
|
-
super
|
15
|
-
chef_server run_context.cheffish.current_chef_server
|
16
|
-
end
|
17
|
-
|
18
|
-
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
-
attribute :chef_server, :kind_of => Hash
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefContainer < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_container'
|
8
|
+
|
9
|
+
actions :create, :delete, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
# Grab environment from with_environment
|
13
|
+
def initialize(*args)
|
14
|
+
super
|
15
|
+
chef_server run_context.cheffish.current_chef_server
|
16
|
+
end
|
17
|
+
|
18
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
+
attribute :chef_server, :kind_of => Hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
class Resource
|
6
|
-
class ChefDataBag < Chef::Resource::LWRPBase
|
7
|
-
self.resource_name = 'chef_data_bag'
|
8
|
-
|
9
|
-
actions :create, :delete, :nothing
|
10
|
-
default_action :create
|
11
|
-
|
12
|
-
def initialize(*args)
|
13
|
-
super
|
14
|
-
chef_server run_context.cheffish.current_chef_server
|
15
|
-
end
|
16
|
-
|
17
|
-
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
18
|
-
|
19
|
-
attribute :chef_server, :kind_of => Hash
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefDataBag < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_data_bag'
|
8
|
+
|
9
|
+
actions :create, :delete, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
18
|
+
|
19
|
+
attribute :chef_server, :kind_of => Hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,121 +1,121 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/config'
|
3
|
-
require 'chef/resource/lwrp_base'
|
4
|
-
|
5
|
-
class Chef
|
6
|
-
class Resource
|
7
|
-
class ChefDataBagItem < Chef::Resource::LWRPBase
|
8
|
-
self.resource_name = 'chef_data_bag_item'
|
9
|
-
|
10
|
-
actions :create, :delete, :nothing
|
11
|
-
default_action :create
|
12
|
-
|
13
|
-
def initialize(*args)
|
14
|
-
super
|
15
|
-
name @name
|
16
|
-
if !data_bag
|
17
|
-
data_bag run_context.cheffish.current_data_bag
|
18
|
-
end
|
19
|
-
if run_context.cheffish.current_data_bag_item_encryption
|
20
|
-
@encrypt = true if run_context.cheffish.current_data_bag_item_encryption[:encrypt_all]
|
21
|
-
@secret = run_context.cheffish.current_data_bag_item_encryption[:secret]
|
22
|
-
@secret_path = run_context.cheffish.current_data_bag_item_encryption[:secret_path] || run_context.config[:encrypted_data_bag_secret]
|
23
|
-
@encryption_cipher = run_context.cheffish.current_data_bag_item_encryption[:encryption_cipher]
|
24
|
-
@encryption_version = run_context.cheffish.current_data_bag_item_encryption[:encryption_version] || run_context.config[:data_bag_encrypt_version]
|
25
|
-
@old_secret = run_context.cheffish.current_data_bag_item_encryption[:old_secret]
|
26
|
-
@old_secret_path = run_context.cheffish.current_data_bag_item_encryption[:old_secret_path]
|
27
|
-
end
|
28
|
-
chef_server run_context.cheffish.current_chef_server
|
29
|
-
end
|
30
|
-
|
31
|
-
def name(*args)
|
32
|
-
result = super(*args)
|
33
|
-
if args.size == 1
|
34
|
-
parts = name.split('/')
|
35
|
-
if parts.size == 1
|
36
|
-
@id = parts[0]
|
37
|
-
elsif parts.size == 2
|
38
|
-
@data_bag = parts[0]
|
39
|
-
@id = parts[1]
|
40
|
-
else
|
41
|
-
raise "Name #{args[0].inspect} must be a string with 1 or 2 parts, either 'id' or 'data_bag/id"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
result
|
45
|
-
end
|
46
|
-
|
47
|
-
# `NOT_PASSED` is defined in chef-12.5.0, this guard will ensure we
|
48
|
-
# don't redefine it if it's already there
|
49
|
-
NOT_PASSED = Object.new unless defined?(NOT_PASSED)
|
50
|
-
|
51
|
-
def id(value = NOT_PASSED)
|
52
|
-
if value == NOT_PASSED
|
53
|
-
@id
|
54
|
-
else
|
55
|
-
@id = value
|
56
|
-
name data_bag ? "#{data_bag}/#{id}" : id
|
57
|
-
end
|
58
|
-
end
|
59
|
-
def data_bag(value = NOT_PASSED)
|
60
|
-
if value == NOT_PASSED
|
61
|
-
@data_bag
|
62
|
-
else
|
63
|
-
@data_bag = value
|
64
|
-
name data_bag ? "#{data_bag}/#{id}" : id
|
65
|
-
end
|
66
|
-
end
|
67
|
-
attribute :raw_data, :kind_of => Hash
|
68
|
-
|
69
|
-
# If secret or secret_path are set, encrypt is assumed true. encrypt exists mainly for with_secret and with_secret_path
|
70
|
-
attribute :encrypt, :kind_of => [TrueClass, FalseClass]
|
71
|
-
#attribute :secret, :kind_of => String
|
72
|
-
def secret(new_secret = nil)
|
73
|
-
if !new_secret
|
74
|
-
@secret
|
75
|
-
else
|
76
|
-
@secret = new_secret
|
77
|
-
@encrypt = true if @encrypt.nil?
|
78
|
-
end
|
79
|
-
end
|
80
|
-
#attribute :secret_path, :kind_of => String
|
81
|
-
def secret_path(new_secret_path = nil)
|
82
|
-
if !new_secret_path
|
83
|
-
@secret_path
|
84
|
-
else
|
85
|
-
@secret_path = new_secret_path
|
86
|
-
@encrypt = true if @encrypt.nil?
|
87
|
-
end
|
88
|
-
end
|
89
|
-
attribute :encryption_version, :kind_of => Integer
|
90
|
-
|
91
|
-
# Old secret (or secrets) to read the old data bag when we are changing keys and re-encrypting data
|
92
|
-
attribute :old_secret, :kind_of => [String, Array]
|
93
|
-
attribute :old_secret_path, :kind_of => [String, Array]
|
94
|
-
|
95
|
-
# Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
|
96
|
-
# reset to their defaults)
|
97
|
-
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
98
|
-
|
99
|
-
attribute :raw_json, :kind_of => Hash
|
100
|
-
attribute :chef_server, :kind_of => Hash
|
101
|
-
|
102
|
-
# value 'ip_address', '127.0.0.1'
|
103
|
-
# value [ 'pushy', 'port' ], '9000'
|
104
|
-
# value 'ip_addresses' do |existing_value|
|
105
|
-
# (existing_value || []) + [ '127.0.0.1' ]
|
106
|
-
# end
|
107
|
-
# value 'ip_address', :delete
|
108
|
-
attr_reader :raw_data_modifiers
|
109
|
-
def value(raw_data_path, value=NOT_PASSED, &block)
|
110
|
-
@raw_data_modifiers ||= []
|
111
|
-
if value != NOT_PASSED
|
112
|
-
@raw_data_modifiers << [ raw_data_path, value ]
|
113
|
-
elsif block
|
114
|
-
@raw_data_modifiers << [ raw_data_path, block ]
|
115
|
-
else
|
116
|
-
raise "value requires either a value or a block"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/config'
|
3
|
+
require 'chef/resource/lwrp_base'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Resource
|
7
|
+
class ChefDataBagItem < Chef::Resource::LWRPBase
|
8
|
+
self.resource_name = 'chef_data_bag_item'
|
9
|
+
|
10
|
+
actions :create, :delete, :nothing
|
11
|
+
default_action :create
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
super
|
15
|
+
name @name
|
16
|
+
if !data_bag
|
17
|
+
data_bag run_context.cheffish.current_data_bag
|
18
|
+
end
|
19
|
+
if run_context.cheffish.current_data_bag_item_encryption
|
20
|
+
@encrypt = true if run_context.cheffish.current_data_bag_item_encryption[:encrypt_all]
|
21
|
+
@secret = run_context.cheffish.current_data_bag_item_encryption[:secret]
|
22
|
+
@secret_path = run_context.cheffish.current_data_bag_item_encryption[:secret_path] || run_context.config[:encrypted_data_bag_secret]
|
23
|
+
@encryption_cipher = run_context.cheffish.current_data_bag_item_encryption[:encryption_cipher]
|
24
|
+
@encryption_version = run_context.cheffish.current_data_bag_item_encryption[:encryption_version] || run_context.config[:data_bag_encrypt_version]
|
25
|
+
@old_secret = run_context.cheffish.current_data_bag_item_encryption[:old_secret]
|
26
|
+
@old_secret_path = run_context.cheffish.current_data_bag_item_encryption[:old_secret_path]
|
27
|
+
end
|
28
|
+
chef_server run_context.cheffish.current_chef_server
|
29
|
+
end
|
30
|
+
|
31
|
+
def name(*args)
|
32
|
+
result = super(*args)
|
33
|
+
if args.size == 1
|
34
|
+
parts = name.split('/')
|
35
|
+
if parts.size == 1
|
36
|
+
@id = parts[0]
|
37
|
+
elsif parts.size == 2
|
38
|
+
@data_bag = parts[0]
|
39
|
+
@id = parts[1]
|
40
|
+
else
|
41
|
+
raise "Name #{args[0].inspect} must be a string with 1 or 2 parts, either 'id' or 'data_bag/id"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
result
|
45
|
+
end
|
46
|
+
|
47
|
+
# `NOT_PASSED` is defined in chef-12.5.0, this guard will ensure we
|
48
|
+
# don't redefine it if it's already there
|
49
|
+
NOT_PASSED = Object.new unless defined?(NOT_PASSED)
|
50
|
+
|
51
|
+
def id(value = NOT_PASSED)
|
52
|
+
if value == NOT_PASSED
|
53
|
+
@id
|
54
|
+
else
|
55
|
+
@id = value
|
56
|
+
name data_bag ? "#{data_bag}/#{id}" : id
|
57
|
+
end
|
58
|
+
end
|
59
|
+
def data_bag(value = NOT_PASSED)
|
60
|
+
if value == NOT_PASSED
|
61
|
+
@data_bag
|
62
|
+
else
|
63
|
+
@data_bag = value
|
64
|
+
name data_bag ? "#{data_bag}/#{id}" : id
|
65
|
+
end
|
66
|
+
end
|
67
|
+
attribute :raw_data, :kind_of => Hash
|
68
|
+
|
69
|
+
# If secret or secret_path are set, encrypt is assumed true. encrypt exists mainly for with_secret and with_secret_path
|
70
|
+
attribute :encrypt, :kind_of => [TrueClass, FalseClass]
|
71
|
+
#attribute :secret, :kind_of => String
|
72
|
+
def secret(new_secret = nil)
|
73
|
+
if !new_secret
|
74
|
+
@secret
|
75
|
+
else
|
76
|
+
@secret = new_secret
|
77
|
+
@encrypt = true if @encrypt.nil?
|
78
|
+
end
|
79
|
+
end
|
80
|
+
#attribute :secret_path, :kind_of => String
|
81
|
+
def secret_path(new_secret_path = nil)
|
82
|
+
if !new_secret_path
|
83
|
+
@secret_path
|
84
|
+
else
|
85
|
+
@secret_path = new_secret_path
|
86
|
+
@encrypt = true if @encrypt.nil?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
attribute :encryption_version, :kind_of => Integer
|
90
|
+
|
91
|
+
# Old secret (or secrets) to read the old data bag when we are changing keys and re-encrypting data
|
92
|
+
attribute :old_secret, :kind_of => [String, Array]
|
93
|
+
attribute :old_secret_path, :kind_of => [String, Array]
|
94
|
+
|
95
|
+
# Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
|
96
|
+
# reset to their defaults)
|
97
|
+
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
98
|
+
|
99
|
+
attribute :raw_json, :kind_of => Hash
|
100
|
+
attribute :chef_server, :kind_of => Hash
|
101
|
+
|
102
|
+
# value 'ip_address', '127.0.0.1'
|
103
|
+
# value [ 'pushy', 'port' ], '9000'
|
104
|
+
# value 'ip_addresses' do |existing_value|
|
105
|
+
# (existing_value || []) + [ '127.0.0.1' ]
|
106
|
+
# end
|
107
|
+
# value 'ip_address', :delete
|
108
|
+
attr_reader :raw_data_modifiers
|
109
|
+
def value(raw_data_path, value=NOT_PASSED, &block)
|
110
|
+
@raw_data_modifiers ||= []
|
111
|
+
if value != NOT_PASSED
|
112
|
+
@raw_data_modifiers << [ raw_data_path, value ]
|
113
|
+
elsif block
|
114
|
+
@raw_data_modifiers << [ raw_data_path, block ]
|
115
|
+
else
|
116
|
+
raise "value requires either a value or a block"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|