cheffish 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
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