cheffish 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +201 -201
  3. data/README.md +120 -117
  4. data/Rakefile +23 -23
  5. data/lib/chef/provider/chef_acl.rb +439 -434
  6. data/lib/chef/provider/chef_client.rb +53 -48
  7. data/lib/chef/provider/chef_container.rb +55 -50
  8. data/lib/chef/provider/chef_data_bag.rb +55 -50
  9. data/lib/chef/provider/chef_data_bag_item.rb +278 -273
  10. data/lib/chef/provider/chef_environment.rb +83 -78
  11. data/lib/chef/provider/chef_group.rb +83 -78
  12. data/lib/chef/provider/chef_mirror.rb +169 -164
  13. data/lib/chef/provider/chef_node.rb +87 -82
  14. data/lib/chef/provider/chef_organization.rb +155 -150
  15. data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -41
  16. data/lib/chef/provider/chef_role.rb +84 -79
  17. data/lib/chef/provider/chef_user.rb +59 -54
  18. data/lib/chef/provider/private_key.rb +225 -220
  19. data/lib/chef/provider/public_key.rb +88 -82
  20. data/lib/chef/resource/chef_acl.rb +69 -65
  21. data/lib/chef/resource/chef_client.rb +48 -44
  22. data/lib/chef/resource/chef_container.rb +22 -18
  23. data/lib/chef/resource/chef_data_bag.rb +22 -18
  24. data/lib/chef/resource/chef_data_bag_item.rb +121 -114
  25. data/lib/chef/resource/chef_environment.rb +77 -71
  26. data/lib/chef/resource/chef_group.rb +53 -49
  27. data/lib/chef/resource/chef_mirror.rb +52 -48
  28. data/lib/chef/resource/chef_node.rb +22 -18
  29. data/lib/chef/resource/chef_organization.rb +69 -64
  30. data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -31
  31. data/lib/chef/resource/chef_role.rb +110 -104
  32. data/lib/chef/resource/chef_user.rb +56 -52
  33. data/lib/chef/resource/private_key.rb +48 -44
  34. data/lib/chef/resource/public_key.rb +25 -21
  35. data/lib/cheffish.rb +235 -233
  36. data/lib/cheffish/actor_provider_base.rb +131 -131
  37. data/lib/cheffish/basic_chef_client.rb +184 -184
  38. data/lib/cheffish/chef_provider_base.rb +246 -246
  39. data/lib/cheffish/chef_run.rb +162 -155
  40. data/lib/cheffish/chef_run_data.rb +19 -19
  41. data/lib/cheffish/chef_run_listener.rb +30 -30
  42. data/lib/cheffish/key_formatter.rb +113 -113
  43. data/lib/cheffish/merged_config.rb +94 -94
  44. data/lib/cheffish/recipe_dsl.rb +157 -157
  45. data/lib/cheffish/rspec.rb +8 -8
  46. data/lib/cheffish/rspec/chef_run_support.rb +83 -83
  47. data/lib/cheffish/rspec/matchers.rb +4 -4
  48. data/lib/cheffish/rspec/matchers/be_idempotent.rb +16 -16
  49. data/lib/cheffish/rspec/matchers/emit_no_warnings_or_errors.rb +15 -15
  50. data/lib/cheffish/rspec/matchers/have_updated.rb +37 -37
  51. data/lib/cheffish/rspec/matchers/partially_match.rb +63 -63
  52. data/lib/cheffish/rspec/recipe_run_wrapper.rb +59 -47
  53. data/lib/cheffish/rspec/repository_support.rb +108 -108
  54. data/lib/cheffish/server_api.rb +52 -52
  55. data/lib/cheffish/version.rb +3 -3
  56. data/lib/cheffish/with_pattern.rb +21 -21
  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 -0
  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 -0
  76. metadata +8 -5
@@ -1,114 +1,121 @@
1
- require 'cheffish'
2
- require 'chef/config'
3
- require 'chef/resource/lwrp_base'
4
-
5
- class Chef::Resource::ChefDataBagItem < Chef::Resource::LWRPBase
6
- self.resource_name = 'chef_data_bag_item'
7
-
8
- actions :create, :delete, :nothing
9
- default_action :create
10
-
11
- def initialize(*args)
12
- super
13
- name @name
14
- if !data_bag
15
- data_bag run_context.cheffish.current_data_bag
16
- end
17
- if run_context.cheffish.current_data_bag_item_encryption
18
- @encrypt = true if run_context.cheffish.current_data_bag_item_encryption[:encrypt_all]
19
- @secret = run_context.cheffish.current_data_bag_item_encryption[:secret]
20
- @secret_path = run_context.cheffish.current_data_bag_item_encryption[:secret_path] || run_context.config[:encrypted_data_bag_secret]
21
- @encryption_cipher = run_context.cheffish.current_data_bag_item_encryption[:encryption_cipher]
22
- @encryption_version = run_context.cheffish.current_data_bag_item_encryption[:encryption_version] || run_context.config[:data_bag_encrypt_version]
23
- @old_secret = run_context.cheffish.current_data_bag_item_encryption[:old_secret]
24
- @old_secret_path = run_context.cheffish.current_data_bag_item_encryption[:old_secret_path]
25
- end
26
- chef_server run_context.cheffish.current_chef_server
27
- end
28
-
29
- def name(*args)
30
- result = super(*args)
31
- if args.size == 1
32
- parts = name.split('/')
33
- if parts.size == 1
34
- @id = parts[0]
35
- elsif parts.size == 2
36
- @data_bag = parts[0]
37
- @id = parts[1]
38
- else
39
- raise "Name #{args[0].inspect} must be a string with 1 or 2 parts, either 'id' or 'data_bag/id"
40
- end
41
- end
42
- result
43
- end
44
-
45
- NOT_PASSED = Object.new
46
- def id(value = NOT_PASSED)
47
- if value == NOT_PASSED
48
- @id
49
- else
50
- @id = value
51
- name data_bag ? "#{data_bag}/#{id}" : id
52
- end
53
- end
54
- def data_bag(value = NOT_PASSED)
55
- if value == NOT_PASSED
56
- @data_bag
57
- else
58
- @data_bag = value
59
- name data_bag ? "#{data_bag}/#{id}" : id
60
- end
61
- end
62
- attribute :raw_data, :kind_of => Hash
63
-
64
- # If secret or secret_path are set, encrypt is assumed true. encrypt exists mainly for with_secret and with_secret_path
65
- attribute :encrypt, :kind_of => [TrueClass, FalseClass]
66
- #attribute :secret, :kind_of => String
67
- def secret(new_secret = nil)
68
- if !new_secret
69
- @secret
70
- else
71
- @secret = new_secret
72
- @encrypt = true if @encrypt.nil?
73
- end
74
- end
75
- #attribute :secret_path, :kind_of => String
76
- def secret_path(new_secret_path = nil)
77
- if !new_secret_path
78
- @secret_path
79
- else
80
- @secret_path = new_secret_path
81
- @encrypt = true if @encrypt.nil?
82
- end
83
- end
84
- attribute :encryption_version, :kind_of => Integer
85
-
86
- # Old secret (or secrets) to read the old data bag when we are changing keys and re-encrypting data
87
- attribute :old_secret, :kind_of => [String, Array]
88
- attribute :old_secret_path, :kind_of => [String, Array]
89
-
90
- # Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
91
- # reset to their defaults)
92
- attribute :complete, :kind_of => [TrueClass, FalseClass]
93
-
94
- attribute :raw_json, :kind_of => Hash
95
- attribute :chef_server, :kind_of => Hash
96
-
97
- # value 'ip_address', '127.0.0.1'
98
- # value [ 'pushy', 'port' ], '9000'
99
- # value 'ip_addresses' do |existing_value|
100
- # (existing_value || []) + [ '127.0.0.1' ]
101
- # end
102
- # value 'ip_address', :delete
103
- attr_reader :raw_data_modifiers
104
- def value(raw_data_path, value=NOT_PASSED, &block)
105
- @raw_data_modifiers ||= []
106
- if value != NOT_PASSED
107
- @raw_data_modifiers << [ raw_data_path, value ]
108
- elsif block
109
- @raw_data_modifiers << [ raw_data_path, block ]
110
- else
111
- raise "value requires either a value or a block"
112
- end
113
- end
114
- 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
@@ -1,71 +1,77 @@
1
- require 'cheffish'
2
- require 'chef/resource/lwrp_base'
3
- require 'chef/environment'
4
-
5
- class Chef::Resource::ChefEnvironment < Chef::Resource::LWRPBase
6
- self.resource_name = 'chef_environment'
7
-
8
- actions :create, :delete, :nothing
9
- default_action :create
10
-
11
- def initialize(*args)
12
- super
13
- chef_server run_context.cheffish.current_chef_server
14
- end
15
-
16
- attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
17
- attribute :description, :kind_of => String
18
- attribute :cookbook_versions, :kind_of => Hash, :callbacks => {
19
- "should have valid cookbook versions" => lambda { |value| Chef::Environment.validate_cookbook_versions(value) }
20
- }
21
- attribute :default_attributes, :kind_of => Hash
22
- attribute :override_attributes, :kind_of => Hash
23
-
24
- # Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
25
- # reset to their defaults)
26
- attribute :complete, :kind_of => [TrueClass, FalseClass]
27
-
28
- attribute :raw_json, :kind_of => Hash
29
- attribute :chef_server, :kind_of => Hash
30
-
31
- NOT_PASSED=Object.new
32
-
33
- # default 'ip_address', '127.0.0.1'
34
- # default [ 'pushy', 'port' ], '9000'
35
- # default 'ip_addresses' do |existing_value|
36
- # (existing_value || []) + [ '127.0.0.1' ]
37
- # end
38
- # default 'ip_address', :delete
39
- attr_reader :default_attribute_modifiers
40
- def default(attribute_path, value=NOT_PASSED, &block)
41
- @default_attribute_modifiers ||= []
42
- if value != NOT_PASSED
43
- @default_attribute_modifiers << [ attribute_path, value ]
44
- elsif block
45
- @default_attribute_modifiers << [ attribute_path, block ]
46
- else
47
- raise "default requires either a value or a block"
48
- end
49
- end
50
-
51
- # override 'ip_address', '127.0.0.1'
52
- # override [ 'pushy', 'port' ], '9000'
53
- # override 'ip_addresses' do |existing_value|
54
- # (existing_value || []) + [ '127.0.0.1' ]
55
- # end
56
- # override 'ip_address', :delete
57
- attr_reader :override_attribute_modifiers
58
- def override(attribute_path, value=NOT_PASSED, &block)
59
- @override_attribute_modifiers ||= []
60
- if value != NOT_PASSED
61
- @override_attribute_modifiers << [ attribute_path, value ]
62
- elsif block
63
- @override_attribute_modifiers << [ attribute_path, block ]
64
- else
65
- raise "override requires either a value or a block"
66
- end
67
- end
68
-
69
- alias :attributes :default_attributes
70
- alias :attribute :default
71
- end
1
+ require 'cheffish'
2
+ require 'chef/resource/lwrp_base'
3
+ require 'chef/environment'
4
+
5
+ class Chef
6
+ class Resource
7
+ class ChefEnvironment < Chef::Resource::LWRPBase
8
+ self.resource_name = 'chef_environment'
9
+
10
+ actions :create, :delete, :nothing
11
+ default_action :create
12
+
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 :description, :kind_of => String
20
+ attribute :cookbook_versions, :kind_of => Hash, :callbacks => {
21
+ "should have valid cookbook versions" => lambda { |value| Chef::Environment.validate_cookbook_versions(value) }
22
+ }
23
+ attribute :default_attributes, :kind_of => Hash
24
+ attribute :override_attributes, :kind_of => Hash
25
+
26
+ # Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
27
+ # reset to their defaults)
28
+ attribute :complete, :kind_of => [TrueClass, FalseClass]
29
+
30
+ attribute :raw_json, :kind_of => Hash
31
+ attribute :chef_server, :kind_of => Hash
32
+
33
+ # `NOT_PASSED` is defined in chef-12.5.0, this guard will ensure we
34
+ # don't redefine it if it's already there
35
+ NOT_PASSED=Object.new unless defined?(NOT_PASSED)
36
+
37
+ # default 'ip_address', '127.0.0.1'
38
+ # default [ 'pushy', 'port' ], '9000'
39
+ # default 'ip_addresses' do |existing_value|
40
+ # (existing_value || []) + [ '127.0.0.1' ]
41
+ # end
42
+ # default 'ip_address', :delete
43
+ attr_reader :default_attribute_modifiers
44
+ def default(attribute_path, value=NOT_PASSED, &block)
45
+ @default_attribute_modifiers ||= []
46
+ if value != NOT_PASSED
47
+ @default_attribute_modifiers << [ attribute_path, value ]
48
+ elsif block
49
+ @default_attribute_modifiers << [ attribute_path, block ]
50
+ else
51
+ raise "default requires either a value or a block"
52
+ end
53
+ end
54
+
55
+ # override 'ip_address', '127.0.0.1'
56
+ # override [ 'pushy', 'port' ], '9000'
57
+ # override 'ip_addresses' do |existing_value|
58
+ # (existing_value || []) + [ '127.0.0.1' ]
59
+ # end
60
+ # override 'ip_address', :delete
61
+ attr_reader :override_attribute_modifiers
62
+ def override(attribute_path, value=NOT_PASSED, &block)
63
+ @override_attribute_modifiers ||= []
64
+ if value != NOT_PASSED
65
+ @override_attribute_modifiers << [ attribute_path, value ]
66
+ elsif block
67
+ @override_attribute_modifiers << [ attribute_path, block ]
68
+ else
69
+ raise "override requires either a value or a block"
70
+ end
71
+ end
72
+
73
+ alias :attributes :default_attributes
74
+ alias :attribute :default
75
+ end
76
+ end
77
+ end
@@ -1,49 +1,53 @@
1
- require 'cheffish'
2
- require 'chef/resource/lwrp_base'
3
- require 'chef/run_list/run_list_item'
4
-
5
- class Chef::Resource::ChefGroup < Chef::Resource::LWRPBase
6
- self.resource_name = 'chef_group'
7
-
8
- actions :create, :delete, :nothing
9
- default_action :create
10
-
11
- # Grab environment from with_environment
12
- def initialize(*args)
13
- super
14
- chef_server run_context.cheffish.current_chef_server
15
- @users = []
16
- @clients = []
17
- @groups = []
18
- @remove_users = []
19
- @remove_clients = []
20
- @remove_groups = []
21
- end
22
-
23
- attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
24
- def users(*users)
25
- users.size == 0 ? @users : (@users |= users.flatten)
26
- end
27
- def clients(*clients)
28
- clients.size == 0 ? @clients : (@clients |= clients.flatten)
29
- end
30
- def groups(*groups)
31
- groups.size == 0 ? @groups : (@groups |= groups.flatten)
32
- end
33
- def remove_users(*remove_users)
34
- remove_users.size == 0 ? @remove_users : (@remove_users |= remove_users.flatten)
35
- end
36
- def remove_clients(*remove_clients)
37
- remove_clients.size == 0 ? @remove_clients : (@remove_clients |= remove_clients.flatten)
38
- end
39
- def remove_groups(*remove_groups)
40
- remove_groups.size == 0 ? @remove_groups : (@remove_groups |= remove_groups.flatten)
41
- end
42
-
43
- # Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
44
- # reset to their defaults)
45
- attribute :complete, :kind_of => [TrueClass, FalseClass]
46
-
47
- attribute :raw_json, :kind_of => Hash
48
- attribute :chef_server, :kind_of => Hash
49
- end
1
+ require 'cheffish'
2
+ require 'chef/resource/lwrp_base'
3
+ require 'chef/run_list/run_list_item'
4
+
5
+ class Chef
6
+ class Resource
7
+ class ChefGroup < Chef::Resource::LWRPBase
8
+ self.resource_name = 'chef_group'
9
+
10
+ actions :create, :delete, :nothing
11
+ default_action :create
12
+
13
+ # Grab environment from with_environment
14
+ def initialize(*args)
15
+ super
16
+ chef_server run_context.cheffish.current_chef_server
17
+ @users = []
18
+ @clients = []
19
+ @groups = []
20
+ @remove_users = []
21
+ @remove_clients = []
22
+ @remove_groups = []
23
+ end
24
+
25
+ attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
26
+ def users(*users)
27
+ users.size == 0 ? @users : (@users |= users.flatten)
28
+ end
29
+ def clients(*clients)
30
+ clients.size == 0 ? @clients : (@clients |= clients.flatten)
31
+ end
32
+ def groups(*groups)
33
+ groups.size == 0 ? @groups : (@groups |= groups.flatten)
34
+ end
35
+ def remove_users(*remove_users)
36
+ remove_users.size == 0 ? @remove_users : (@remove_users |= remove_users.flatten)
37
+ end
38
+ def remove_clients(*remove_clients)
39
+ remove_clients.size == 0 ? @remove_clients : (@remove_clients |= remove_clients.flatten)
40
+ end
41
+ def remove_groups(*remove_groups)
42
+ remove_groups.size == 0 ? @remove_groups : (@remove_groups |= remove_groups.flatten)
43
+ end
44
+
45
+ # Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
46
+ # reset to their defaults)
47
+ attribute :complete, :kind_of => [TrueClass, FalseClass]
48
+
49
+ attribute :raw_json, :kind_of => Hash
50
+ attribute :chef_server, :kind_of => Hash
51
+ end
52
+ end
53
+ end