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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +201 -201
  3. data/README.md +120 -120
  4. data/Rakefile +23 -23
  5. data/lib/chef/provider/chef_acl.rb +439 -439
  6. data/lib/chef/provider/chef_client.rb +53 -53
  7. data/lib/chef/provider/chef_container.rb +55 -55
  8. data/lib/chef/provider/chef_data_bag.rb +55 -55
  9. data/lib/chef/provider/chef_data_bag_item.rb +278 -278
  10. data/lib/chef/provider/chef_environment.rb +83 -83
  11. data/lib/chef/provider/chef_group.rb +83 -83
  12. data/lib/chef/provider/chef_mirror.rb +169 -169
  13. data/lib/chef/provider/chef_node.rb +87 -87
  14. data/lib/chef/provider/chef_organization.rb +155 -155
  15. data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -46
  16. data/lib/chef/provider/chef_role.rb +84 -84
  17. data/lib/chef/provider/chef_user.rb +59 -59
  18. data/lib/chef/provider/private_key.rb +225 -225
  19. data/lib/chef/provider/public_key.rb +88 -88
  20. data/lib/chef/resource/chef_acl.rb +69 -69
  21. data/lib/chef/resource/chef_client.rb +48 -48
  22. data/lib/chef/resource/chef_container.rb +22 -22
  23. data/lib/chef/resource/chef_data_bag.rb +22 -22
  24. data/lib/chef/resource/chef_data_bag_item.rb +121 -121
  25. data/lib/chef/resource/chef_environment.rb +77 -77
  26. data/lib/chef/resource/chef_group.rb +53 -53
  27. data/lib/chef/resource/chef_mirror.rb +52 -52
  28. data/lib/chef/resource/chef_node.rb +22 -22
  29. data/lib/chef/resource/chef_organization.rb +69 -69
  30. data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -35
  31. data/lib/chef/resource/chef_role.rb +110 -110
  32. data/lib/chef/resource/chef_user.rb +56 -56
  33. data/lib/chef/resource/private_key.rb +48 -48
  34. data/lib/chef/resource/public_key.rb +25 -25
  35. data/lib/cheffish/actor_provider_base.rb +131 -131
  36. data/lib/cheffish/basic_chef_client.rb +184 -184
  37. data/lib/cheffish/chef_provider_base.rb +246 -246
  38. data/lib/cheffish/chef_run.rb +162 -162
  39. data/lib/cheffish/chef_run_data.rb +19 -19
  40. data/lib/cheffish/chef_run_listener.rb +30 -30
  41. data/lib/cheffish/key_formatter.rb +113 -113
  42. data/lib/cheffish/merged_config.rb +94 -94
  43. data/lib/cheffish/recipe_dsl.rb +157 -157
  44. data/lib/cheffish/rspec/chef_run_support.rb +83 -83
  45. data/lib/cheffish/rspec/matchers/be_idempotent.rb +16 -16
  46. data/lib/cheffish/rspec/matchers/emit_no_warnings_or_errors.rb +15 -15
  47. data/lib/cheffish/rspec/matchers/have_updated.rb +37 -37
  48. data/lib/cheffish/rspec/matchers/partially_match.rb +63 -63
  49. data/lib/cheffish/rspec/matchers.rb +4 -4
  50. data/lib/cheffish/rspec/recipe_run_wrapper.rb +78 -59
  51. data/lib/cheffish/rspec/repository_support.rb +108 -108
  52. data/lib/cheffish/rspec.rb +8 -8
  53. data/lib/cheffish/server_api.rb +52 -52
  54. data/lib/cheffish/version.rb +3 -3
  55. data/lib/cheffish/with_pattern.rb +21 -21
  56. data/lib/cheffish.rb +235 -235
  57. data/spec/functional/fingerprint_spec.rb +64 -64
  58. data/spec/functional/merged_config_spec.rb +19 -19
  59. data/spec/functional/server_api_spec.rb +13 -13
  60. data/spec/integration/chef_acl_spec.rb +879 -879
  61. data/spec/integration/chef_client_spec.rb +105 -105
  62. data/spec/integration/chef_container_spec.rb +33 -33
  63. data/spec/integration/chef_group_spec.rb +309 -309
  64. data/spec/integration/chef_mirror_spec.rb +491 -491
  65. data/spec/integration/chef_node_spec.rb +786 -786
  66. data/spec/integration/chef_organization_spec.rb +226 -226
  67. data/spec/integration/chef_role_spec.rb +78 -78
  68. data/spec/integration/chef_user_spec.rb +85 -85
  69. data/spec/integration/private_key_spec.rb +399 -399
  70. data/spec/integration/recipe_dsl_spec.rb +28 -28
  71. data/spec/integration/rspec/converge_spec.rb +183 -183
  72. data/spec/support/key_support.rb +29 -29
  73. data/spec/support/spec_support.rb +15 -15
  74. data/spec/unit/get_private_key_spec.rb +131 -131
  75. data/spec/unit/recipe_run_wrapper_spec.rb +37 -37
  76. 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