cheffish 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +4 -0
  4. data/Rakefile +23 -0
  5. data/lib/chef/provider/chef_client.rb +44 -0
  6. data/lib/chef/provider/chef_data_bag.rb +50 -0
  7. data/lib/chef/provider/chef_data_bag_item.rb +273 -0
  8. data/lib/chef/provider/chef_environment.rb +78 -0
  9. data/lib/chef/provider/chef_node.rb +82 -0
  10. data/lib/chef/provider/chef_role.rb +79 -0
  11. data/lib/chef/provider/chef_user.rb +48 -0
  12. data/lib/chef/provider/private_key.rb +160 -0
  13. data/lib/chef/provider/public_key.rb +83 -0
  14. data/lib/chef/resource/chef_client.rb +44 -0
  15. data/lib/chef/resource/chef_data_bag.rb +18 -0
  16. data/lib/chef/resource/chef_data_bag_item.rb +114 -0
  17. data/lib/chef/resource/chef_environment.rb +71 -0
  18. data/lib/chef/resource/chef_node.rb +18 -0
  19. data/lib/chef/resource/chef_role.rb +104 -0
  20. data/lib/chef/resource/chef_user.rb +51 -0
  21. data/lib/chef/resource/in_parallel.rb +6 -0
  22. data/lib/chef/resource/private_key.rb +39 -0
  23. data/lib/chef/resource/public_key.rb +16 -0
  24. data/lib/cheffish.rb +245 -0
  25. data/lib/cheffish/actor_provider_base.rb +120 -0
  26. data/lib/cheffish/chef_provider_base.rb +222 -0
  27. data/lib/cheffish/cheffish_server_api.rb +21 -0
  28. data/lib/cheffish/inline_resource.rb +88 -0
  29. data/lib/cheffish/key_formatter.rb +93 -0
  30. data/lib/cheffish/recipe_dsl.rb +98 -0
  31. data/lib/cheffish/version.rb +4 -0
  32. data/spec/integration/chef_client_spec.rb +48 -0
  33. data/spec/integration/chef_node_spec.rb +75 -0
  34. data/spec/integration/chef_user_spec.rb +48 -0
  35. data/spec/integration/private_key_spec.rb +356 -0
  36. data/spec/integration/recipe_dsl_spec.rb +29 -0
  37. data/spec/support/key_support.rb +29 -0
  38. data/spec/support/spec_support.rb +148 -0
  39. metadata +124 -0
@@ -0,0 +1,29 @@
1
+ require 'support/spec_support'
2
+ require 'chef/resource/chef_node'
3
+ require 'chef/provider/chef_node'
4
+ require 'tmpdir'
5
+
6
+ describe 'Cheffish Recipe DSL' do
7
+ extend SpecSupport
8
+
9
+ context 'when we include with_chef_local_server' do
10
+ before :each do
11
+ @tmp_repo = tmp_repo = Dir.mktmpdir('chef_repo')
12
+ run_recipe do
13
+ with_chef_local_server :chef_repo_path => tmp_repo
14
+ end
15
+ end
16
+
17
+ after :each do
18
+ FileUtils.remove_entry_secure @tmp_repo
19
+ end
20
+
21
+ it 'chef_nodes get put into said server' do
22
+ run_recipe do
23
+ chef_node 'blah'
24
+ end
25
+ chef_run.should have_updated 'chef_node[blah]', :create
26
+ File.should exist("#{@tmp_repo}/nodes/blah.json")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ RSpec::Matchers.define :be_public_key_for do |private_key, pass_phrase|
2
+ match do |public_key|
3
+ if public_key.is_a?(String)
4
+ public_key, public_key_format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(public_key)), pass_phrase, public_key)
5
+ end
6
+ if private_key.is_a?(String)
7
+ private_key, private_key_format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(private_key)), pass_phrase, private_key)
8
+ end
9
+
10
+ encrypted = public_key.public_encrypt('hi there')
11
+ private_key.private_decrypt(encrypted).should == 'hi there'
12
+ end
13
+ end
14
+
15
+ RSpec::Matchers.define :match_private_key do |expected, pass_phrase|
16
+ match do |actual|
17
+ if expected.is_a?(String)
18
+ expected, format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(expected)), pass_phrase, expected)
19
+ end
20
+ if actual.is_a?(String)
21
+ actual, format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(actual)), pass_phrase, actual)
22
+ end
23
+
24
+ encrypted = actual.public_encrypt('hi there')
25
+ expected.private_decrypt(encrypted).should == 'hi there'
26
+ encrypted = expected.public_encrypt('hi there')
27
+ actual.private_decrypt(encrypted).should == 'hi there'
28
+ end
29
+ end
@@ -0,0 +1,148 @@
1
+ require 'chef_zero/rspec'
2
+ require 'chef/recipe'
3
+ require 'chef/run_context'
4
+ require 'chef/event_dispatch/dispatcher'
5
+ require 'chef/cookbook/cookbook_collection'
6
+ require 'chef/runner'
7
+ require 'chef/server_api'
8
+ require 'cheffish'
9
+
10
+ module SpecSupport
11
+ include ChefZero::RSpec
12
+
13
+ def self.extended(klass)
14
+ klass.class_eval do
15
+ def get(*args)
16
+ Chef::ServerAPI.new.get(*args)
17
+ end
18
+
19
+ def chef_run
20
+ @event_sink.events
21
+ end
22
+
23
+ def run_recipe(&block)
24
+ node = Chef::Node.new
25
+ node.name 'test'
26
+ node.automatic[:platform] = 'test'
27
+ node.automatic[:platform_version] = 'test'
28
+ @event_sink ||= EventSink.new
29
+ run_context = Chef::RunContext.new(node, {}, Chef::EventDispatch::Dispatcher.new(@event_sink))
30
+ recipe = Chef::Recipe.new('test', 'test', run_context)
31
+ recipe.instance_eval(&block)
32
+ Chef::Runner.new(run_context).converge
33
+ end
34
+ end
35
+ end
36
+
37
+ def with_recipe(&block)
38
+ before :each do
39
+ run_recipe(&block)
40
+ end
41
+ end
42
+
43
+ class EventSink
44
+ def initialize
45
+ @events = []
46
+ end
47
+
48
+ attr_reader :events
49
+
50
+ def method_missing(method, *args)
51
+ @events << [ method, *args ]
52
+ end
53
+ end
54
+ end
55
+
56
+ RSpec::Matchers.define :have_updated do |resource_name, *expected_actions|
57
+ match do |actual|
58
+ actual_actions = actual.select { |event, resource, action| event == :resource_updated && resource.to_s == resource_name }.map { |event, resource, action| action }
59
+ actual_actions.should == expected_actions
60
+ end
61
+ failure_message_for_should do |actual|
62
+ updates = actual.select { |event, resource, action| event == :resource_updated }.to_a
63
+ result = "expected that the chef_run would #{expected_actions.join(',')} #{resource_name}."
64
+ if updates.size > 0
65
+ result << " Actual updates were #{updates.map { |event, resource, action| "#{resource.to_s} => #{action.inspect}" }.join(', ')}"
66
+ else
67
+ result << " Nothing was updated."
68
+ end
69
+ result
70
+ end
71
+ end
72
+
73
+ RSpec.configure do |config|
74
+ config.filter_run :focus => true
75
+ config.run_all_when_everything_filtered = true
76
+ config.treat_symbols_as_metadata_keys_with_true_values = true
77
+
78
+ config.before :each do
79
+ Chef::Config.reset
80
+ Cheffish.reset
81
+ end
82
+ end
83
+
84
+ # Stuff that should have been required in Chef, but wasn't (Chef will be fixed)
85
+ require 'chef/platform'
86
+
87
+ require 'chef/provider/service/simple'
88
+ require 'chef/provider/service/init'
89
+
90
+ require 'chef/provider/cron'
91
+ require 'chef/provider/cron/aix'
92
+ require 'chef/provider/cron/solaris'
93
+ require 'chef/provider/directory'
94
+ require 'chef/provider/env/windows'
95
+ require 'chef/provider/erl_call'
96
+ require 'chef/provider/execute'
97
+ require 'chef/provider/file'
98
+ require 'chef/provider/group/aix'
99
+ require 'chef/provider/group/dscl'
100
+ require 'chef/provider/group/gpasswd'
101
+ require 'chef/provider/group/groupmod'
102
+ require 'chef/provider/group/pw'
103
+ require 'chef/provider/group/suse'
104
+ require 'chef/provider/group/usermod'
105
+ require 'chef/provider/group/windows'
106
+ require 'chef/provider/http_request'
107
+ require 'chef/provider/ifconfig'
108
+ require 'chef/provider/ifconfig/aix'
109
+ require 'chef/provider/ifconfig/debian'
110
+ require 'chef/provider/ifconfig/redhat'
111
+ require 'chef/provider/link'
112
+ require 'chef/provider/log'
113
+ require 'chef/provider/mdadm'
114
+ require 'chef/provider/mount/aix'
115
+ require 'chef/provider/mount/mount'
116
+ require 'chef/provider/mount/windows'
117
+ require 'chef/provider/package/aix'
118
+ require 'chef/provider/package/apt'
119
+ require 'chef/provider/package/freebsd'
120
+ require 'chef/provider/package/ips'
121
+ require 'chef/provider/package/macports'
122
+ require 'chef/provider/package/pacman'
123
+ require 'chef/provider/package/portage'
124
+ require 'chef/provider/package/solaris'
125
+ require 'chef/provider/package/smartos'
126
+ require 'chef/provider/package/yum'
127
+ require 'chef/provider/package/zypper'
128
+ require 'chef/provider/remote_directory'
129
+ require 'chef/provider/route'
130
+ require 'chef/provider/ruby_block'
131
+ require 'chef/provider/script'
132
+ require 'chef/provider/service/arch'
133
+ require 'chef/provider/service/debian'
134
+ require 'chef/provider/service/freebsd'
135
+ require 'chef/provider/service/gentoo'
136
+ require 'chef/provider/service/init'
137
+ require 'chef/provider/service/insserv'
138
+ require 'chef/provider/service/macosx'
139
+ require 'chef/provider/service/redhat'
140
+ require 'chef/provider/service/solaris'
141
+ require 'chef/provider/service/upstart'
142
+ require 'chef/provider/service/windows'
143
+ require 'chef/provider/template'
144
+ require 'chef/provider/user/dscl'
145
+ require 'chef/provider/user/pw'
146
+ require 'chef/provider/user/useradd'
147
+ require 'chef/provider/user/solaris'
148
+ require 'chef/provider/user/windows'
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cheffish
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - John Keiser
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chef
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A library to manipulate Chef in Chef.
56
+ email: jkeiser@opscode.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - README.md
61
+ - LICENSE
62
+ files:
63
+ - Rakefile
64
+ - LICENSE
65
+ - README.md
66
+ - lib/chef/provider/chef_client.rb
67
+ - lib/chef/provider/chef_data_bag.rb
68
+ - lib/chef/provider/chef_data_bag_item.rb
69
+ - lib/chef/provider/chef_environment.rb
70
+ - lib/chef/provider/chef_node.rb
71
+ - lib/chef/provider/chef_role.rb
72
+ - lib/chef/provider/chef_user.rb
73
+ - lib/chef/provider/private_key.rb
74
+ - lib/chef/provider/public_key.rb
75
+ - lib/chef/resource/chef_client.rb
76
+ - lib/chef/resource/chef_data_bag.rb
77
+ - lib/chef/resource/chef_data_bag_item.rb
78
+ - lib/chef/resource/chef_environment.rb
79
+ - lib/chef/resource/chef_node.rb
80
+ - lib/chef/resource/chef_role.rb
81
+ - lib/chef/resource/chef_user.rb
82
+ - lib/chef/resource/in_parallel.rb
83
+ - lib/chef/resource/private_key.rb
84
+ - lib/chef/resource/public_key.rb
85
+ - lib/cheffish/actor_provider_base.rb
86
+ - lib/cheffish/chef_provider_base.rb
87
+ - lib/cheffish/cheffish_server_api.rb
88
+ - lib/cheffish/inline_resource.rb
89
+ - lib/cheffish/key_formatter.rb
90
+ - lib/cheffish/recipe_dsl.rb
91
+ - lib/cheffish/version.rb
92
+ - lib/cheffish.rb
93
+ - spec/integration/chef_client_spec.rb
94
+ - spec/integration/chef_node_spec.rb
95
+ - spec/integration/chef_user_spec.rb
96
+ - spec/integration/private_key_spec.rb
97
+ - spec/integration/recipe_dsl_spec.rb
98
+ - spec/support/key_support.rb
99
+ - spec/support/spec_support.rb
100
+ homepage: http://wiki.opscode.com/display/chef
101
+ licenses: []
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.3
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: A library to manipulate Chef in Chef.
123
+ test_files: []
124
+ has_rdoc: