chef-rewind 0.0.6 → 0.0.7
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.
- data/CHANGELOG +1 -0
- data/README.md +71 -7
- data/chef-rewind.gemspec +3 -3
- data/lib/chef/rewind.rb +27 -0
- data/spec/unwind_recipe_spec.rb +38 -0
- metadata +6 -4
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Chef::Rewind
|
2
2
|
|
3
3
|
This adds a simple function to the Chef library scope to
|
4
|
-
rewind an existing resource. If the given resource does not exist,
|
5
|
-
a Chef::Exceptions::ResourceNotFound exception will be raised.
|
4
|
+
rewind or unwind an existing resource. If the given resource does not exist,
|
5
|
+
a `Chef::Exceptions::ResourceNotFound` exception will be raised.
|
6
6
|
|
7
|
-
|
7
|
+
These functions are designed to assist the library cookbook pattern.
|
8
8
|
|
9
|
-
Effectively,
|
9
|
+
Effectively, rewind/unwind 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
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -24,6 +24,8 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
### rewind
|
28
|
+
|
27
29
|
```Ruby
|
28
30
|
# file postgresql/recipes/server.rb
|
29
31
|
user "postgres" do
|
@@ -44,11 +46,73 @@ end
|
|
44
46
|
|
45
47
|
```
|
46
48
|
|
47
|
-
The user
|
48
|
-
|
49
|
-
|
49
|
+
The user `postgres` will act once with the home directory
|
50
|
+
`/var/lib/pgsql/9.2` and the `cookbook_name` attribute is now
|
51
|
+
`my-postgresql` instead of `postgresql`. This last part is
|
50
52
|
particularly important for templates and cookbook files.
|
51
53
|
|
54
|
+
### unwind
|
55
|
+
|
56
|
+
```Ruby
|
57
|
+
# file postgresql/recipes/server.rb
|
58
|
+
user "postgres" do
|
59
|
+
uid 26
|
60
|
+
home '/home/postgres'
|
61
|
+
supports :manage_home => true
|
62
|
+
end
|
63
|
+
|
64
|
+
# file my-postgresql/recipes/server.rb
|
65
|
+
chef_gem "chef-rewind"
|
66
|
+
require 'chef/rewind'
|
67
|
+
|
68
|
+
include_recipe "postgresql::server"
|
69
|
+
|
70
|
+
unwind "user[postgres]"
|
71
|
+
|
72
|
+
```
|
73
|
+
|
74
|
+
This will completely remove the resource. It is useful
|
75
|
+
for resources that are impossible to change correctly.
|
76
|
+
Resource notifications, for example,
|
77
|
+
can't be overwritten by `rewind`, only appended.
|
78
|
+
|
79
|
+
So if you need to change notifications of a resource,
|
80
|
+
you need to `unwind` and redefine the resource. Example:
|
81
|
+
|
82
|
+
```Ruby
|
83
|
+
# file cookbook-elasticsearch/recipes/default.rb
|
84
|
+
template "logging.yml" do
|
85
|
+
path "#{node.elasticsearch[:path][:conf]}/logging.yml"
|
86
|
+
source "logging.yml.erb"
|
87
|
+
owner node.elasticsearch[:user] and group node.elasticsearch[:user] and mode 0755
|
88
|
+
|
89
|
+
notifies :restart, 'service[elasticsearch]'
|
90
|
+
end
|
91
|
+
|
92
|
+
# file my-elasticsearch/recipes/default.rb
|
93
|
+
chef_gem "chef-rewind"
|
94
|
+
require 'chef/rewind'
|
95
|
+
|
96
|
+
unwind "template[logging.yml]"
|
97
|
+
|
98
|
+
template "logging.yml" do
|
99
|
+
path "#{node.elasticsearch[:path][:conf]}/logging.yml"
|
100
|
+
source "logging.yml.erb"
|
101
|
+
owner node.elasticsearch[:user] and group node.elasticsearch[:user] and mode 0755
|
102
|
+
cookbook_name "elasticsearch"
|
103
|
+
|
104
|
+
# this is the only change from original definition
|
105
|
+
notifies :run, 'execute[Custom ElasticSearch restarter]'
|
106
|
+
end
|
107
|
+
|
108
|
+
```
|
109
|
+
|
110
|
+
This allows you to define your own ElasticSearch restart script.
|
111
|
+
It's impossible to `rewind` notifications,
|
112
|
+
thus you need to `unwind` and redefine it based on the original version.
|
113
|
+
|
114
|
+
|
115
|
+
|
52
116
|
## Gotchas *Important*
|
53
117
|
|
54
118
|
The rewind method does not automatically change the cookbook_name
|
data/chef-rewind.gemspec
CHANGED
@@ -3,8 +3,8 @@ $:.unshift(File.dirname(__FILE__) + '/lib')
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.authors = ["Bryan Berry"]
|
5
5
|
gem.email = ["bryan.berry@gmail.com"]
|
6
|
-
gem.description = %q{Monkey patches Chef to allow rewinding of existing resources}
|
7
|
-
gem.summary = %q{Monkey patches Chef to allow rewinding of existing resources}
|
6
|
+
gem.description = %q{Monkey patches Chef to allow rewinding and unwinding of existing resources}
|
7
|
+
gem.summary = %q{Monkey patches Chef to allow rewinding and unwinding of existing resources}
|
8
8
|
gem.homepage = ""
|
9
9
|
|
10
10
|
gem.files = `git ls-files`.split($\)
|
@@ -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.
|
15
|
+
gem.version = "0.0.7"
|
16
16
|
end
|
data/lib/chef/rewind.rb
CHANGED
@@ -28,6 +28,20 @@ class Chef
|
|
28
28
|
raise e
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
# unwinds an existing resource if it exists,
|
33
|
+
# otherwise raises the Chef::Exceptions::ResourceNotFound exception
|
34
|
+
# For example:
|
35
|
+
# # recipe postgresql::server defines user "postgres" and
|
36
|
+
# # sets the home directory to /var/pgsql/9.2
|
37
|
+
# include_recipe "postgresql::user"
|
38
|
+
#
|
39
|
+
# unwind "user[postgres]"
|
40
|
+
# === Parameters
|
41
|
+
# resource<String>:: String identifier for resource
|
42
|
+
def unwind(resource_id)
|
43
|
+
run_context.resource_collection.delete_resource resource_id
|
44
|
+
end
|
31
45
|
end
|
32
46
|
end
|
33
47
|
|
@@ -49,3 +63,16 @@ class Chef
|
|
49
63
|
end
|
50
64
|
end
|
51
65
|
end
|
66
|
+
|
67
|
+
|
68
|
+
class Chef
|
69
|
+
class ResourceCollection
|
70
|
+
def delete_resource(resource_id)
|
71
|
+
lookup resource_id
|
72
|
+
|
73
|
+
# assumes `resource_id` is the same as `Chef::Resource#to_s`
|
74
|
+
@resources.delete_if {|r| r.to_s == resource_id }
|
75
|
+
@resources_by_name.delete resource_id
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'chef/rewind'
|
3
|
+
|
4
|
+
describe Chef::Recipe do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@cookbook_repo = File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "cookbooks"))
|
8
|
+
cl = Chef::CookbookLoader.new(@cookbook_repo)
|
9
|
+
cl.load_cookbooks
|
10
|
+
@cookbook_collection = Chef::CookbookCollection.new(cl)
|
11
|
+
@node = Chef::Node.new
|
12
|
+
@node.normal[:tags] = Array.new
|
13
|
+
@events = Chef::EventDispatch::Dispatcher.new
|
14
|
+
@run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
|
15
|
+
@recipe = Chef::Recipe.new("hjk", "test", @run_context)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
describe "unwind" do
|
20
|
+
it "should remove resource when unwind is called" do
|
21
|
+
@recipe.zen_master "foobar" do
|
22
|
+
peace false
|
23
|
+
end
|
24
|
+
|
25
|
+
@recipe.unwind "zen_master[foobar]"
|
26
|
+
|
27
|
+
resources = @run_context.resource_collection.all_resources
|
28
|
+
resources.length.should == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should throw an error when unwinding a nonexistent resource" do
|
32
|
+
lambda do
|
33
|
+
@recipe.unwind "zen_master[foobar]"
|
34
|
+
end.should raise_error(Chef::Exceptions::ResourceNotFound)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-rewind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,9 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description: Monkey patches Chef to allow rewinding of existing resources
|
14
|
+
description: Monkey patches Chef to allow rewinding and unwinding of existing resources
|
15
15
|
email:
|
16
16
|
- bryan.berry@gmail.com
|
17
17
|
executables: []
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- spec/support/shared/functional/securable_resource.rb
|
74
74
|
- spec/support/shared/unit/api_error_inspector.rb
|
75
75
|
- spec/support/shared/unit/platform_introspector.rb
|
76
|
+
- spec/unwind_recipe_spec.rb
|
76
77
|
homepage: ''
|
77
78
|
licenses: []
|
78
79
|
post_install_message:
|
@@ -96,7 +97,7 @@ rubyforge_project:
|
|
96
97
|
rubygems_version: 1.8.25
|
97
98
|
signing_key:
|
98
99
|
specification_version: 3
|
99
|
-
summary: Monkey patches Chef to allow rewinding of existing resources
|
100
|
+
summary: Monkey patches Chef to allow rewinding and unwinding of existing resources
|
100
101
|
test_files:
|
101
102
|
- spec/data/cookbooks/angrybash/recipes/default.rb
|
102
103
|
- spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl
|
@@ -145,4 +146,5 @@ test_files:
|
|
145
146
|
- spec/support/shared/functional/securable_resource.rb
|
146
147
|
- spec/support/shared/unit/api_error_inspector.rb
|
147
148
|
- spec/support/shared/unit/platform_introspector.rb
|
149
|
+
- spec/unwind_recipe_spec.rb
|
148
150
|
has_rdoc:
|