chef-rewind 0.0.5 → 0.0.6

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 (53) hide show
  1. data/CHANGELOG +17 -0
  2. data/Gemfile +42 -2
  3. data/README.md +2 -0
  4. data/chef-rewind.gemspec +1 -1
  5. data/lib/chef/rewind.rb +7 -0
  6. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -0
  7. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -0
  8. data/spec/data/cookbooks/apache2/recipes/default.rb +3 -0
  9. data/spec/data/cookbooks/borken/recipes/default.rb +2 -0
  10. data/spec/data/cookbooks/borken/templates/default/borken.erb +2 -0
  11. data/spec/data/cookbooks/chefignore +6 -0
  12. data/spec/data/cookbooks/java/files/default/java.response +2 -0
  13. data/spec/data/cookbooks/openldap/attributes/default.rb +16 -0
  14. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -0
  15. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -0
  16. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -0
  17. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  18. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  19. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  20. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +3 -0
  21. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +3 -0
  22. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  23. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +3 -0
  24. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +3 -0
  25. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -0
  26. data/spec/data/cookbooks/openldap/recipes/default.rb +3 -0
  27. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -0
  28. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -0
  29. data/spec/data/cookbooks/openldap/templates/default/openldap_stuff.conf.erb +1 -0
  30. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -0
  31. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -0
  32. data/spec/rewind_recipe_spec.rb +62 -0
  33. data/spec/rewind_resource_spec.rb +34 -0
  34. data/spec/spec_helper.rb +81 -0
  35. data/spec/support/chef_helpers.rb +52 -0
  36. data/spec/support/lib/chef/provider/easy.rb +35 -0
  37. data/spec/support/lib/chef/provider/snakeoil.rb +40 -0
  38. data/spec/support/lib/chef/resource/cat.rb +41 -0
  39. data/spec/support/lib/chef/resource/one_two_three_four.rb +43 -0
  40. data/spec/support/lib/chef/resource/zen_master.rb +46 -0
  41. data/spec/support/matchers/leak.rb +96 -0
  42. data/spec/support/mock/constant.rb +52 -0
  43. data/spec/support/mock/platform.rb +18 -0
  44. data/spec/support/platform_helpers.rb +31 -0
  45. data/spec/support/platforms/prof/gc.rb +54 -0
  46. data/spec/support/platforms/prof/win32.rb +46 -0
  47. data/spec/support/shared/functional/directory_resource.rb +85 -0
  48. data/spec/support/shared/functional/file_resource.rb +173 -0
  49. data/spec/support/shared/functional/knife.rb +37 -0
  50. data/spec/support/shared/functional/securable_resource.rb +394 -0
  51. data/spec/support/shared/unit/api_error_inspector.rb +192 -0
  52. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  53. metadata +99 -4
@@ -0,0 +1,17 @@
1
+ Peter Fern: Allow rewinding recipe_name
2
+ Peter Fern: Shef extensions have moved in 11.x, add compatible require
3
+ Peter Fern: Change deprecated Gemfile source `:rubygems` to `https://rubygems.org`
4
+ aabes: Update README.md
5
+ Bryan Berry: now with rspec tests using chef's spec_helper
6
+ Bryan Berry: rename to chef-rewind
7
+ Bryan Berry: use set_and_return for Chef::Resource.cookbook_name
8
+ Bryan Berry: update readme
9
+ Bryan Berry: revert earlier commit that sets cookbook_name
10
+ Bryan Berry: update readme
11
+ Bryan Berry: set cookbook_name to current cookbook at time of editing
12
+ Bryan Berry: don't create nonexistent resources
13
+ Nathen Harvey: Add recipe file name to the README
14
+ Bryan Berry: add note that need `chef_gem` to install it
15
+ Bryan Berry: update readme
16
+ Bryan Berry: set version #
17
+ Bryan Berry: initial commit
data/Gemfile CHANGED
@@ -1,4 +1,44 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in chef-edit.gemspec
4
- gemspec :name => "chef-rewind"
3
+ gemspec
4
+
5
+ gem "activesupport", :group => :compat_testing, :platform => "ruby"
6
+ gem "ronn"
7
+ gem "rspec"
8
+ gem "chef"
9
+ gem "pry"
10
+
11
+ group(:development, :test) do
12
+ gem 'rack'
13
+ gem 'thin'
14
+
15
+ # Eventmachine 1.0.0 is causing functional test failures on Solaris
16
+ # 9 SPARC. Pinning em to 0.12.10 solves this issue until we can
17
+ # replace thin with webrat or some other alternative.
18
+ gem 'eventmachine', '0.12.10', :platforms => :ruby
19
+
20
+ gem 'ruby-shadow', :platforms => :ruby unless RUBY_PLATFORM.downcase.match(/(darwin|freebsd)/)
21
+ # gem 'awesome_print'
22
+ # gem 'pry'
23
+ end
24
+
25
+ platforms :mswin, :mingw do
26
+ gem "ffi", "1.0.9"
27
+ gem "rdp-ruby-wmi", "0.3.1"
28
+ gem "windows-api", "0.4.0"
29
+ gem "windows-pr", "1.2.1"
30
+ gem "win32-api", "1.4.8"
31
+ gem "win32-dir", "0.3.7"
32
+ gem "win32-event", "0.5.2"
33
+ gem "win32-mutex", "0.3.1"
34
+ gem "win32-process", "0.6.5"
35
+ gem "win32-service", "0.7.2"
36
+ end
37
+
38
+ platforms :mingw_18 do
39
+ gem "win32-open3", "0.3.2"
40
+ end
41
+
42
+ # If you want to load debugging tools into the bundle exec sandbox,
43
+ # add these additional dependencies into chef/Gemfile.local
44
+ eval(IO.read(__FILE__ + '.local'), binding) if File.exists?(__FILE__ + '.local')
data/README.md CHANGED
@@ -6,6 +6,8 @@ a Chef::Exceptions::ResourceNotFound exception will be raised.
6
6
 
7
7
  This function is designed to assist the library cookbook pattern.
8
8
 
9
+ Effectively, the rewind resource allows you to monkeypatch a cookbook that you would rather not modify directly. It will modify some properties of a resource, during the complile phase, before chef-client actually starts the run phase.
10
+
9
11
  ## Installation
10
12
 
11
13
  Add this line to your application's Gemfile:
@@ -12,5 +12,5 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "chef-rewind"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = "0.0.5"
15
+ gem.version = "0.0.6"
16
16
  end
@@ -40,5 +40,12 @@ class Chef
40
40
  arg,
41
41
  :kind_of => String)
42
42
  end
43
+
44
+ def recipe_name(arg=nil)
45
+ set_or_return(
46
+ :recipe_name,
47
+ arg,
48
+ :kind_of => String)
49
+ end
43
50
  end
44
51
  end
@@ -0,0 +1,8 @@
1
+ bash "go off the rails" do
2
+ code <<-END
3
+ for i in localhost 127.0.0.1 #{Socket.gethostname()}
4
+ do
5
+ echo "grant all on *.* to root@'$i' identified by 'a_password'; flush privileges;" | mysql -u root -h 127.0.0.1
6
+ done
7
+ END
8
+ end
@@ -0,0 +1,2 @@
1
+ # apache2_module_conf_generate.pl
2
+ # this is just here for show.
@@ -0,0 +1,3 @@
1
+ #
2
+ # Nothing ot see here
3
+ #
@@ -0,0 +1,2 @@
1
+ a cat walked on the keyboard one day...
2
+ (*&(*&(*&(*&(*^%$%^%#^^&(*)(*{}}}}}}}}+++++===))))))
@@ -0,0 +1,2 @@
1
+ a cat walked on the keyboard one day...
2
+ <%= (*&)(*^^^^*******++_+_--- }}}}]]]end)%>
@@ -0,0 +1,6 @@
1
+ #
2
+ # The ignore file allows you to skip files in cookbooks with the same name that appear
3
+ # later in the search path.
4
+ #
5
+
6
+ recipes/ignoreme.rb
@@ -0,0 +1,2 @@
1
+ # Hi, I'm pretending to be the preseed file for installing the Sun JDK on debian
2
+ # or Ubuntu
@@ -0,0 +1,16 @@
1
+ chef_env ||= nil
2
+ case chef_env
3
+ when "prod"
4
+ default[:ldap_server] = "ops1prod"
5
+ default[:ldap_basedn] = "dc=hjksolutions,dc=com"
6
+ default[:ldap_replication_password] = "yes"
7
+ when "corp"
8
+ default[:ldap_server] = "ops1prod"
9
+ default[:ldap_basedn] = "dc=hjksolutions,dc=com"
10
+ default[:ldap_replication_password] = "yougotit"
11
+ else
12
+
13
+ default[:ldap_server] = "ops1prod"
14
+ default[:ldap_basedn] = "dc=hjksolutions,dc=com"
15
+ default[:ldap_replication_password] = "forsure"
16
+ end
@@ -0,0 +1 @@
1
+ default[:smokey] = "robinson"
@@ -0,0 +1,5 @@
1
+ define :openldap_client, :mothra => "a big monster" do
2
+ cat "#{params[:name]}" do
3
+ pretty_kitty true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ define :openldap_server, :mothra => "a big monster" do
2
+ cat "#{params[:name]}" do
3
+ pretty_kitty true
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ I am here to test .dotfiles work in file directories.
@@ -0,0 +1,3 @@
1
+ # remote directory
2
+ # file specificity: default
3
+ # relpath: remotedir/remote_dir_file1.txt
@@ -0,0 +1,3 @@
1
+ # remote directory
2
+ # file specificity: default
3
+ # relpath: remotedir/remote_dir_file2.txt
@@ -0,0 +1 @@
1
+ this is a file with a name beginning with a . dot
@@ -0,0 +1,3 @@
1
+ # remote directory
2
+ # file specificity: default
3
+ # relpath: remotedir/remotesubdir/remote_dir_file1.txt
@@ -0,0 +1,3 @@
1
+ # remote directory
2
+ # file specificity: default
3
+ # relpath: remotedir/remotesubdir/remote_dir_file2.txt
@@ -0,0 +1,3 @@
1
+ # remote directory
2
+ # file specificity: default
3
+ # relpath: remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt
@@ -0,0 +1,3 @@
1
+ cat "blanket" do
2
+ pretty_kitty true
3
+ end
@@ -0,0 +1,3 @@
1
+ cat "blanket" do
2
+ pretty_kitty false
3
+ end
@@ -0,0 +1,15 @@
1
+ ##
2
+ # Nodes should have a unique name
3
+ ##
4
+ name "test.example.com-default"
5
+
6
+ ##
7
+ # Nodes can set arbitrary arguments
8
+ ##
9
+ sunshine "in"
10
+ something "else"
11
+
12
+ ##
13
+ # Nodes should have recipes
14
+ ##
15
+ recipes "operations-master", "operations-monitoring"
@@ -0,0 +1 @@
1
+ slappiness is <%= node[:slappiness] -%>
@@ -0,0 +1 @@
1
+ We could be diving for pearls!
@@ -0,0 +1,62 @@
1
+
2
+ require 'spec_helper'
3
+ require 'chef/rewind'
4
+
5
+ describe Chef::Recipe do
6
+
7
+ before(:each) do
8
+ @cookbook_repo = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "cookbooks"))
9
+ cl = Chef::CookbookLoader.new(@cookbook_repo)
10
+ cl.load_cookbooks
11
+ @cookbook_collection = Chef::CookbookCollection.new(cl)
12
+ @node = Chef::Node.new
13
+ @node.normal[:tags] = Array.new
14
+ @events = Chef::EventDispatch::Dispatcher.new
15
+ @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
16
+ @recipe = Chef::Recipe.new("hjk", "test", @run_context)
17
+
18
+ # Shell/ext.rb is on the run path, and it defines
19
+ # Chef::Recipe#resources to call pp, which we don't want when
20
+ # we're running tests.
21
+ @recipe.stub!(:pp)
22
+ end
23
+
24
+
25
+ describe "rewind" do
26
+ it "rewind an existing resource rather than create a new one" do
27
+
28
+ @recipe.zen_master "foobar" do
29
+ peace false
30
+ end
31
+
32
+ @recipe.rewind "zen_master[foobar]" do
33
+ peace true
34
+ end
35
+ resources = @run_context.resource_collection.all_resources
36
+ resources.length.should == 1
37
+ end
38
+
39
+ it "change the value of an existing resource" do
40
+ @recipe.zen_master "foobar" do
41
+ peace false
42
+ end
43
+
44
+ @recipe.rewind "zen_master[foobar]" do
45
+ peace true
46
+ end
47
+
48
+ zen_master = @run_context.resource_collection.find("zen_master[foobar]")
49
+ peace_status = zen_master.instance_exec { @peace }
50
+ peace_status.should == true
51
+ end
52
+
53
+ it "throw an error when rewinding a nonexistent resource" do
54
+ lambda do
55
+ @recipe.rewind "zen_master[foobar]" do
56
+ peace true
57
+ end
58
+ end.should raise_error(Chef::Exceptions::ResourceNotFound)
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'chef/rewind'
3
+
4
+ class ResourceTestHarness < Chef::Resource
5
+ provider_base Chef::Provider::Package
6
+ end
7
+
8
+ describe Chef::Resource do
9
+ before(:each) do
10
+ @cookbook_repo_path = File.join(CHEF_SPEC_DATA, 'cookbooks')
11
+ @cookbook_collection = Chef::CookbookCollection.new(Chef::CookbookLoader.new(@cookbook_repo_path))
12
+ @node = Chef::Node.new
13
+ @events = Chef::EventDispatch::Dispatcher.new
14
+ @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
15
+ @resource = Chef::Resource.new("funk", @run_context)
16
+ end
17
+
18
+ describe "cookbook_name" do
19
+ it "cookbook_name sets @cookbook_name properly" do
20
+ @resource.cookbook_name "foobar"
21
+ @resource.cookbook_name.should == "foobar"
22
+ end
23
+
24
+ end
25
+
26
+ describe "recipe_name" do
27
+ it "recipe_name sets @recipe_name properly" do
28
+ @resource.recipe_name "foobar"
29
+ @resource.recipe_name.should == "foobar"
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,81 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ # If you need to add anything in here, don't.
19
+ # Add it to one of the files in spec/support
20
+
21
+ # Abuse ruby's constant lookup to avoid undefined constant errors
22
+ module Shef
23
+ JUST_TESTING_MOVE_ALONG = true unless defined? JUST_TESTING_MOVE_ALONG
24
+ IRB = nil unless defined? IRB
25
+ end
26
+
27
+ # Ruby 1.9 Compat
28
+ $:.unshift File.expand_path("../..", __FILE__)
29
+
30
+ require 'rubygems'
31
+ require 'rspec/mocks'
32
+
33
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
34
+ $:.unshift(File.expand_path("../lib", __FILE__))
35
+ $:.unshift(File.dirname(__FILE__))
36
+
37
+ require 'chef'
38
+ require 'chef/knife'
39
+ Chef::Knife.load_commands
40
+ require 'chef/mixins'
41
+ require 'chef/application'
42
+ require 'chef/applications'
43
+
44
+ begin
45
+ require 'chef/shef'
46
+ rescue LoadError
47
+ require 'chef/shef/ext'
48
+ end
49
+ require 'chef/util/file_edit'
50
+
51
+ # If you want to load anything into the testing environment
52
+ # without versioning it, add it to spec/support/local_gems.rb
53
+ require 'spec/support/local_gems.rb' if File.exists?(File.join(File.dirname(__FILE__), 'support', 'local_gems.rb'))
54
+
55
+ # Explicitly require spec helpers that need to load first
56
+ require 'spec/support/platform_helpers'
57
+
58
+ # Autoloads support files
59
+ # Excludes support/platforms by default
60
+ # Do not change the gsub.
61
+ Dir["spec/support/**/*.rb"].
62
+ reject { |f| f =~ %r{^spec/support/platforms} }.
63
+ map { |f| f.gsub(%r{.rb$}, '') }.
64
+ each { |f| require f }
65
+
66
+ RSpec.configure do |config|
67
+ config.include(Matchers)
68
+ config.filter_run :focus => true
69
+ config.filter_run_excluding :external => true
70
+
71
+ # Add jruby filters here
72
+ config.filter_run_excluding :windows_only => true unless windows?
73
+ config.filter_run_excluding :unix_only => true unless unix?
74
+ config.filter_run_excluding :ruby_18_only => true unless ruby_18?
75
+ config.filter_run_excluding :ruby_19_only => true unless ruby_19?
76
+ config.filter_run_excluding :requires_root => true unless ENV['USER'] == 'root'
77
+ config.filter_run_excluding :requires_unprivileged_user => true if ENV['USER'] == 'root'
78
+
79
+ config.run_all_when_everything_filtered = true
80
+ config.treat_symbols_as_metadata_keys_with_true_values = true
81
+ end
@@ -0,0 +1,52 @@
1
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
2
+ # License:: Apache License, Version 2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ CHEF_SPEC_DATA = File.expand_path(File.dirname(__FILE__) + "/../data/")
17
+ CHEF_SPEC_BACKUP_PATH = File.join(Dir.tmpdir, 'test-backup-path')
18
+
19
+ Chef::Config[:log_level] = :fatal
20
+ Chef::Config[:cache_type] = "Memory"
21
+ Chef::Config[:cache_options] = { }
22
+ Chef::Config[:persistent_queue] = false
23
+ Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
24
+
25
+ Chef::Log.level(Chef::Config.log_level)
26
+ Chef::Config.solo(false)
27
+
28
+ Chef::Log.logger = Logger.new(StringIO.new)
29
+
30
+ def sha256_checksum(path)
31
+ Digest::SHA256.hexdigest(File.read(path))
32
+ end
33
+
34
+ # From Ruby 1.9.2+
35
+ # Here for backwards compatibility with Ruby 1.8.7
36
+ # http://rubydoc.info/stdlib/tmpdir/1.9.2/Dir/Tmpname
37
+ def make_tmpname(prefix_suffix, n)
38
+ case prefix_suffix
39
+ when String
40
+ prefix = prefix_suffix
41
+ suffix = ""
42
+ when Array
43
+ prefix = prefix_suffix[0]
44
+ suffix = prefix_suffix[1]
45
+ else
46
+ raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
47
+ end
48
+ t = Time.now.strftime("%Y%m%d")
49
+ path = "#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
50
+ path << "-#{n}" if n
51
+ path << suffix
52
+ end