cheffish 1.5.0 → 1.6.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +10 -0
  3. data/LICENSE +201 -201
  4. data/README.md +120 -120
  5. data/Rakefile +23 -23
  6. data/cheffish.gemspec +26 -0
  7. data/lib/chef/provider/chef_acl.rb +446 -439
  8. data/lib/chef/provider/chef_client.rb +53 -53
  9. data/lib/chef/provider/chef_container.rb +55 -55
  10. data/lib/chef/provider/chef_data_bag.rb +55 -55
  11. data/lib/chef/provider/chef_data_bag_item.rb +278 -278
  12. data/lib/chef/provider/chef_environment.rb +83 -83
  13. data/lib/chef/provider/chef_group.rb +83 -83
  14. data/lib/chef/provider/chef_mirror.rb +169 -169
  15. data/lib/chef/provider/chef_node.rb +87 -87
  16. data/lib/chef/provider/chef_organization.rb +155 -155
  17. data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -46
  18. data/lib/chef/provider/chef_role.rb +84 -84
  19. data/lib/chef/provider/chef_user.rb +59 -59
  20. data/lib/chef/provider/private_key.rb +225 -225
  21. data/lib/chef/provider/public_key.rb +88 -88
  22. data/lib/chef/resource/chef_acl.rb +69 -69
  23. data/lib/chef/resource/chef_client.rb +48 -48
  24. data/lib/chef/resource/chef_container.rb +22 -22
  25. data/lib/chef/resource/chef_data_bag.rb +22 -22
  26. data/lib/chef/resource/chef_data_bag_item.rb +121 -121
  27. data/lib/chef/resource/chef_environment.rb +77 -77
  28. data/lib/chef/resource/chef_group.rb +53 -53
  29. data/lib/chef/resource/chef_mirror.rb +52 -52
  30. data/lib/chef/resource/chef_node.rb +22 -22
  31. data/lib/chef/resource/chef_organization.rb +69 -69
  32. data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -35
  33. data/lib/chef/resource/chef_role.rb +110 -110
  34. data/lib/chef/resource/chef_user.rb +56 -56
  35. data/lib/chef/resource/private_key.rb +48 -48
  36. data/lib/chef/resource/public_key.rb +25 -25
  37. data/lib/cheffish.rb +235 -235
  38. data/lib/cheffish/actor_provider_base.rb +131 -131
  39. data/lib/cheffish/basic_chef_client.rb +184 -184
  40. data/lib/cheffish/chef_provider_base.rb +246 -246
  41. data/lib/cheffish/chef_run.rb +162 -162
  42. data/lib/cheffish/chef_run_data.rb +19 -19
  43. data/lib/cheffish/chef_run_listener.rb +30 -30
  44. data/lib/cheffish/key_formatter.rb +113 -113
  45. data/lib/cheffish/merged_config.rb +98 -94
  46. data/lib/cheffish/recipe_dsl.rb +157 -157
  47. data/lib/cheffish/rspec.rb +8 -8
  48. data/lib/cheffish/rspec/chef_run_support.rb +83 -83
  49. data/lib/cheffish/rspec/matchers.rb +4 -4
  50. data/lib/cheffish/rspec/matchers/be_idempotent.rb +16 -16
  51. data/lib/cheffish/rspec/matchers/emit_no_warnings_or_errors.rb +15 -15
  52. data/lib/cheffish/rspec/matchers/have_updated.rb +37 -37
  53. data/lib/cheffish/rspec/matchers/partially_match.rb +63 -63
  54. data/lib/cheffish/rspec/recipe_run_wrapper.rb +78 -78
  55. data/lib/cheffish/rspec/repository_support.rb +108 -108
  56. data/lib/cheffish/server_api.rb +52 -52
  57. data/lib/cheffish/version.rb +3 -3
  58. data/lib/cheffish/with_pattern.rb +21 -21
  59. data/spec/functional/fingerprint_spec.rb +64 -64
  60. data/spec/functional/merged_config_spec.rb +19 -19
  61. data/spec/functional/server_api_spec.rb +13 -13
  62. data/spec/integration/chef_acl_spec.rb +892 -879
  63. data/spec/integration/chef_client_spec.rb +105 -105
  64. data/spec/integration/chef_container_spec.rb +33 -33
  65. data/spec/integration/chef_group_spec.rb +309 -309
  66. data/spec/integration/chef_mirror_spec.rb +491 -491
  67. data/spec/integration/chef_node_spec.rb +786 -786
  68. data/spec/integration/chef_organization_spec.rb +226 -226
  69. data/spec/integration/chef_role_spec.rb +78 -78
  70. data/spec/integration/chef_user_spec.rb +85 -85
  71. data/spec/integration/private_key_spec.rb +399 -399
  72. data/spec/integration/recipe_dsl_spec.rb +28 -28
  73. data/spec/integration/rspec/converge_spec.rb +183 -183
  74. data/spec/support/key_support.rb +29 -29
  75. data/spec/support/spec_support.rb +15 -15
  76. data/spec/unit/get_private_key_spec.rb +131 -131
  77. data/spec/unit/recipe_run_wrapper_spec.rb +37 -37
  78. metadata +7 -5
@@ -1,88 +1,88 @@
1
- require 'chef/provider/lwrp_base'
2
- require 'openssl'
3
- require 'cheffish/key_formatter'
4
-
5
- class Chef
6
- class Provider
7
- class PublicKey < Chef::Provider::LWRPBase
8
- provides :public_key
9
-
10
- action :create do
11
- if !new_source_key
12
- raise "No source key specified"
13
- end
14
- desired_output = encode_public_key(new_source_key)
15
- if Array(current_resource.action) == [ :delete ] || desired_output != IO.read(new_resource.path)
16
- converge_by "write #{new_resource.format} public key #{new_resource.path} from #{new_source_key_publicity} key #{new_resource.source_key_path}" do
17
- IO.write(new_resource.path, desired_output)
18
- # TODO permissions on file?
19
- end
20
- end
21
- end
22
-
23
- action :delete do
24
- if Array(current_resource.action) == [ :create ]
25
- converge_by "delete public key #{new_resource.path}" do
26
- ::File.unlink(new_resource.path)
27
- end
28
- end
29
- end
30
-
31
- def whyrun_supported?
32
- true
33
- end
34
-
35
- def encode_public_key(key)
36
- key_format = {}
37
- key_format[:format] = new_resource.format if new_resource.format
38
- Cheffish::KeyFormatter.encode(key, key_format)
39
- end
40
-
41
- attr_reader :current_public_key
42
- attr_reader :new_source_key_publicity
43
-
44
- def new_source_key
45
- @new_source_key ||= begin
46
- if new_resource.source_key.is_a?(String)
47
- source_key, source_key_format = Cheffish::KeyFormatter.decode(new_resource.source_key, new_resource.source_key_pass_phrase)
48
- elsif new_resource.source_key
49
- source_key = new_resource.source_key
50
- elsif new_resource.source_key_path
51
- source_key, source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
52
- else
53
- return nil
54
- end
55
-
56
- if source_key.private?
57
- @new_source_key_publicity = 'private'
58
- source_key.public_key
59
- else
60
- @new_source_key_publicity = 'public'
61
- source_key
62
- end
63
- end
64
- end
65
-
66
- def load_current_resource
67
- if ::File.exist?(new_resource.path)
68
- resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
69
- begin
70
- key, key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.path), nil, new_resource.path)
71
- if key
72
- @current_public_key = key
73
- resource.format key_format[:format]
74
- end
75
- rescue
76
- # If there is an error reading we assume format and such is broken
77
- end
78
-
79
- @current_resource = resource
80
- else
81
- not_found_resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
82
- not_found_resource.action :delete
83
- @current_resource = not_found_resource
84
- end
85
- end
86
- end
87
- end
88
- end
1
+ require 'chef/provider/lwrp_base'
2
+ require 'openssl'
3
+ require 'cheffish/key_formatter'
4
+
5
+ class Chef
6
+ class Provider
7
+ class PublicKey < Chef::Provider::LWRPBase
8
+ provides :public_key
9
+
10
+ action :create do
11
+ if !new_source_key
12
+ raise "No source key specified"
13
+ end
14
+ desired_output = encode_public_key(new_source_key)
15
+ if Array(current_resource.action) == [ :delete ] || desired_output != IO.read(new_resource.path)
16
+ converge_by "write #{new_resource.format} public key #{new_resource.path} from #{new_source_key_publicity} key #{new_resource.source_key_path}" do
17
+ IO.write(new_resource.path, desired_output)
18
+ # TODO permissions on file?
19
+ end
20
+ end
21
+ end
22
+
23
+ action :delete do
24
+ if Array(current_resource.action) == [ :create ]
25
+ converge_by "delete public key #{new_resource.path}" do
26
+ ::File.unlink(new_resource.path)
27
+ end
28
+ end
29
+ end
30
+
31
+ def whyrun_supported?
32
+ true
33
+ end
34
+
35
+ def encode_public_key(key)
36
+ key_format = {}
37
+ key_format[:format] = new_resource.format if new_resource.format
38
+ Cheffish::KeyFormatter.encode(key, key_format)
39
+ end
40
+
41
+ attr_reader :current_public_key
42
+ attr_reader :new_source_key_publicity
43
+
44
+ def new_source_key
45
+ @new_source_key ||= begin
46
+ if new_resource.source_key.is_a?(String)
47
+ source_key, source_key_format = Cheffish::KeyFormatter.decode(new_resource.source_key, new_resource.source_key_pass_phrase)
48
+ elsif new_resource.source_key
49
+ source_key = new_resource.source_key
50
+ elsif new_resource.source_key_path
51
+ source_key, source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
52
+ else
53
+ return nil
54
+ end
55
+
56
+ if source_key.private?
57
+ @new_source_key_publicity = 'private'
58
+ source_key.public_key
59
+ else
60
+ @new_source_key_publicity = 'public'
61
+ source_key
62
+ end
63
+ end
64
+ end
65
+
66
+ def load_current_resource
67
+ if ::File.exist?(new_resource.path)
68
+ resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
69
+ begin
70
+ key, key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.path), nil, new_resource.path)
71
+ if key
72
+ @current_public_key = key
73
+ resource.format key_format[:format]
74
+ end
75
+ rescue
76
+ # If there is an error reading we assume format and such is broken
77
+ end
78
+
79
+ @current_resource = resource
80
+ else
81
+ not_found_resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
82
+ not_found_resource.action :delete
83
+ @current_resource = not_found_resource
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -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