shadow_puppet 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.gitmodules +3 -0
- data/Rakefile +100 -0
- data/bin/shadow_puppet +9 -1
- data/ginger_scenarios.rb +23 -0
- data/lib/shadow_puppet.rb +4 -3
- data/lib/shadow_puppet/core_ext.rb +12 -2
- data/lib/shadow_puppet/manifest.rb +8 -12
- data/lib/shadow_puppet/test.rb +2 -2
- data/shadow_puppet.gemspec +85 -0
- data/spec/fixtures/manifests.rb +95 -0
- data/spec/manifest_spec.rb +201 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/test_spec.rb +42 -0
- data/spec/type_spec.rb +12 -0
- metadata +89 -35
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
require 'jeweler'
|
4
|
+
Jeweler::Tasks.new do |gem|
|
5
|
+
gem.name = "shadow_puppet"
|
6
|
+
gem.summary = %Q{A Ruby Puppet DSL}
|
7
|
+
gem.description = %Q{A Ruby Puppet DSL}
|
8
|
+
gem.email = "jesse@railsmachine.com"
|
9
|
+
gem.homepage = "http://railsmachine.github.com/shadow_puppet"
|
10
|
+
gem.rubyforge_project = "moonshine"
|
11
|
+
gem.authors = ["Jesse Newland", "Josh Nichols"]
|
12
|
+
|
13
|
+
gem.version = "0.3.3"
|
14
|
+
|
15
|
+
gem.add_dependency('puppet', ["= 0.24.8"])
|
16
|
+
gem.add_dependency('facter', [">= 1.5.4"])
|
17
|
+
gem.add_dependency('highline', [">= 1.5.0"])
|
18
|
+
gem.add_dependency('builder', [">= 2.1.2"])
|
19
|
+
gem.add_dependency('activesupport', [">= 2.0.0"])
|
20
|
+
|
21
|
+
gem.rdoc_options << '--inline-source' << '--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/'
|
22
|
+
|
23
|
+
gem.add_development_dependency "rspec", ">= 0"
|
24
|
+
|
25
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
26
|
+
end
|
27
|
+
Jeweler::GemcutterTasks.new
|
28
|
+
|
29
|
+
|
30
|
+
begin
|
31
|
+
require 'rubygems'
|
32
|
+
require 'hanna/rdoctask'
|
33
|
+
rescue LoadError
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
end
|
36
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
37
|
+
rdoc.rdoc_files.include('lib/shadow_puppet/*.rb')
|
38
|
+
rdoc.rdoc_files.include('bin/shadow_puppet')
|
39
|
+
rdoc.rdoc_files.include('README.rdoc')
|
40
|
+
|
41
|
+
rdoc.main = "README.rdoc" # page to start on
|
42
|
+
rdoc.title = "ShadowPuppet documentation"
|
43
|
+
|
44
|
+
rdoc.rdoc_dir = 'doc' # rdoc output folder
|
45
|
+
rdoc.options << '--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/'
|
46
|
+
end
|
47
|
+
|
48
|
+
task :default => :spec
|
49
|
+
task :spec do
|
50
|
+
system("spec --options spec/spec.opts spec/*_spec.rb") || raise
|
51
|
+
end
|
52
|
+
|
53
|
+
task :build => :cleanup do
|
54
|
+
system "gem build *.gemspec"
|
55
|
+
end
|
56
|
+
|
57
|
+
task :install => :build do
|
58
|
+
system "sudo gem install *.gem"
|
59
|
+
end
|
60
|
+
|
61
|
+
task :uninstall do
|
62
|
+
system "sudo gem uninstall *.gem"
|
63
|
+
end
|
64
|
+
|
65
|
+
task :cleanup do
|
66
|
+
system "rm *.gem"
|
67
|
+
end
|
68
|
+
|
69
|
+
task :pull do
|
70
|
+
system "git pull origin master"
|
71
|
+
system "git pull github master"
|
72
|
+
end
|
73
|
+
|
74
|
+
task :_push do
|
75
|
+
system "git push origin master"
|
76
|
+
system "git push github master"
|
77
|
+
end
|
78
|
+
|
79
|
+
task :push => [:redoc, :pull, :spec, :_push]
|
80
|
+
|
81
|
+
task :redoc do
|
82
|
+
#clean
|
83
|
+
system "git checkout gh-pages && git pull origin gh-pages && git pull github gh-pages"
|
84
|
+
system "rm -rf doc"
|
85
|
+
system "git checkout master"
|
86
|
+
system "rm -rf doc"
|
87
|
+
|
88
|
+
#doc
|
89
|
+
Rake::Task['rdoc'].invoke
|
90
|
+
|
91
|
+
#switch branch
|
92
|
+
system "git checkout gh-pages"
|
93
|
+
|
94
|
+
#move it all to the root
|
95
|
+
system "cp -r doc/* . && rm -rf doc"
|
96
|
+
|
97
|
+
#commit and push
|
98
|
+
system "git commit -am 'regenerate rdocs' && git push origin gh-pages && git push github gh-pages"
|
99
|
+
system "git checkout master"
|
100
|
+
end
|
data/bin/shadow_puppet
CHANGED
@@ -74,6 +74,14 @@ begin
|
|
74
74
|
opts.parse!
|
75
75
|
|
76
76
|
require 'rubygems'
|
77
|
+
|
78
|
+
# hack around absurd number of deprecation warnings from puppet
|
79
|
+
# using `metaclass`
|
80
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
81
|
+
require 'active_support/core_ext/kernel/reporting'
|
82
|
+
require 'active_support/deprecation'
|
83
|
+
ActiveSupport::Deprecation.silenced = true
|
84
|
+
|
77
85
|
require 'shadow_puppet'
|
78
86
|
require 'active_support/inflector'
|
79
87
|
require 'active_support/core_ext/string/inflections'
|
@@ -101,4 +109,4 @@ rescue Exception => e
|
|
101
109
|
puts e.backtrace.join("\n")
|
102
110
|
exit(1)
|
103
111
|
end
|
104
|
-
end
|
112
|
+
end
|
data/ginger_scenarios.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ginger'
|
2
|
+
|
3
|
+
def create_scenario(version)
|
4
|
+
scenario = Ginger::Scenario.new("Rails #{version}")
|
5
|
+
scenario[/^activesupport$/] = version
|
6
|
+
scenario[/^activerecord$/] = version
|
7
|
+
scenario[/^actionpack$/] = version
|
8
|
+
scenario[/^actioncontroller$/] = version
|
9
|
+
scenario
|
10
|
+
end
|
11
|
+
|
12
|
+
Ginger.configure do |config|
|
13
|
+
config.aliases["rails"] = "rails"
|
14
|
+
|
15
|
+
rails_2_3_5 = create_scenario('2.3.5')
|
16
|
+
rails_2_3_8 = create_scenario('2.3.8')
|
17
|
+
|
18
|
+
rails_3_0_0_beta = create_scenario('3.0.0.beta')
|
19
|
+
rails_3_0_0_beta3 = create_scenario('3.0.0.beta3')
|
20
|
+
|
21
|
+
config.scenarios << rails_2_3_5 << rails_2_3_8 << rails_3_0_0_beta << rails_3_0_0_beta3
|
22
|
+
end
|
23
|
+
|
data/lib/shadow_puppet.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'puppet'
|
2
2
|
require 'erb'
|
3
|
-
|
4
|
-
require
|
3
|
+
|
4
|
+
require 'shadow_puppet/core_ext'
|
5
|
+
require 'shadow_puppet/manifest'
|
5
6
|
|
6
7
|
class ShadowPuppet::Manifest::Setup < ShadowPuppet::Manifest
|
7
8
|
recipe :setup_directories
|
@@ -27,4 +28,4 @@ class ShadowPuppet::Manifest::Setup < ShadowPuppet::Manifest
|
|
27
28
|
end
|
28
29
|
|
29
30
|
setup = ShadowPuppet::Manifest::Setup.new
|
30
|
-
setup.execute
|
31
|
+
setup.execute
|
@@ -1,8 +1,16 @@
|
|
1
|
+
require 'active_support/version'
|
2
|
+
|
1
3
|
require 'active_support/core_ext/class/attribute_accessors'
|
2
4
|
require 'active_support/core_ext/array'
|
3
5
|
require 'active_support/inflector'
|
4
6
|
require 'active_support/core_ext/class/inheritable_attributes'
|
5
|
-
|
7
|
+
|
8
|
+
if ActiveSupport::VERSION::MAJOR < 3
|
9
|
+
require 'active_support/core_ext/duplicable'
|
10
|
+
else
|
11
|
+
require 'active_support/core_ext/object/duplicable'
|
12
|
+
end
|
13
|
+
|
6
14
|
class Hash #:nodoc:
|
7
15
|
def deep_merge(other_hash)
|
8
16
|
self.merge(other_hash) do |key, oldval, newval|
|
@@ -11,9 +19,11 @@ class Hash #:nodoc:
|
|
11
19
|
oldval.is_a?(Hash) && newval.is_a?(Hash) ? oldval.deep_merge(newval) : newval
|
12
20
|
end
|
13
21
|
end
|
22
|
+
|
14
23
|
def deep_merge!(other_hash)
|
15
24
|
replace(deep_merge(other_hash))
|
16
25
|
end
|
26
|
+
|
17
27
|
def deep_symbolize_keys
|
18
28
|
self.inject({}) { |result, (key, value)|
|
19
29
|
value = value.deep_symbolize_keys if value.is_a?(Hash)
|
@@ -21,4 +31,4 @@ class Hash #:nodoc:
|
|
21
31
|
result
|
22
32
|
}
|
23
33
|
end
|
24
|
-
end
|
34
|
+
end
|
@@ -24,15 +24,15 @@ module ShadowPuppet
|
|
24
24
|
# end
|
25
25
|
#
|
26
26
|
# def lamp
|
27
|
-
# #install a basic LAMP stack
|
27
|
+
# # install a basic LAMP stack
|
28
28
|
# end
|
29
29
|
#
|
30
30
|
# def ruby
|
31
|
-
# #install a ruby interpreter and tools
|
31
|
+
# # install a ruby interpreter and tools
|
32
32
|
# end
|
33
33
|
#
|
34
34
|
# def mysql(options)
|
35
|
-
# #install a mysql server and set the root password to options[:root_password]
|
35
|
+
# # install a mysql server and set the root password to options[:root_password]
|
36
36
|
# end
|
37
37
|
#
|
38
38
|
# end
|
@@ -110,10 +110,10 @@ module ShadowPuppet
|
|
110
110
|
# Subclasses of the Manifest class properly inherit the parent classes'
|
111
111
|
# calls to recipe.
|
112
112
|
def self.recipe(*methods)
|
113
|
-
return nil if methods.nil? || methods == []
|
113
|
+
return nil if methods.nil? || methods == [] # TODO can probably replace with if methods.blank?
|
114
114
|
options = methods.extract_options!
|
115
115
|
methods.each do |meth|
|
116
|
-
options = configuration[meth.to_sym] if options == {}
|
116
|
+
options = configuration[meth.to_sym] if options == {} # TODO can probably be replaced with options.blank?
|
117
117
|
options ||= {}
|
118
118
|
recipes << [meth.to_sym, options]
|
119
119
|
end
|
@@ -197,7 +197,7 @@ module ShadowPuppet
|
|
197
197
|
def self.register_puppet_types
|
198
198
|
Puppet::Type.loadall
|
199
199
|
Puppet::Type.eachtype do |type|
|
200
|
-
#remove the method rdoc placeholders
|
200
|
+
# remove the method rdoc placeholders
|
201
201
|
remove_method(type.name) rescue nil
|
202
202
|
define_method(type.name) do |*args|
|
203
203
|
if args && args.flatten.size == 1
|
@@ -329,12 +329,12 @@ module ShadowPuppet
|
|
329
329
|
@scope
|
330
330
|
end
|
331
331
|
|
332
|
-
#Create a reference to another Puppet Resource.
|
332
|
+
# Create a reference to another Puppet Resource.
|
333
333
|
def reference(type, title)
|
334
334
|
Puppet::Parser::Resource::Reference.new(:type => type.to_s, :title => title.to_s, :scope => scope)
|
335
335
|
end
|
336
336
|
|
337
|
-
#Creates a new Puppet Resource.
|
337
|
+
# Creates a new Puppet Resource.
|
338
338
|
def new_resource(type, name, params = {})
|
339
339
|
unless obj = @puppet_resources[type][name]
|
340
340
|
obj = Puppet::Parser::Resource.new(
|
@@ -370,7 +370,3 @@ module ShadowPuppet
|
|
370
370
|
|
371
371
|
end
|
372
372
|
end
|
373
|
-
|
374
|
-
Dir.glob(File.join(File.dirname(__FILE__), '..', 'facts', '*.rb')).each do |fact|
|
375
|
-
require fact
|
376
|
-
end
|
data/lib/shadow_puppet/test.rb
CHANGED
@@ -30,7 +30,7 @@ module ShadowPuppet
|
|
30
30
|
# manifest.files['/etc/motd'].content
|
31
31
|
# manifest.execs['service ssh restart'].onlyif
|
32
32
|
#
|
33
|
-
# ===Example
|
33
|
+
# === Example
|
34
34
|
#
|
35
35
|
# Given this manifest:
|
36
36
|
#
|
@@ -66,4 +66,4 @@ module ShadowPuppet
|
|
66
66
|
register_puppet_types_for_testing
|
67
67
|
|
68
68
|
end
|
69
|
-
end
|
69
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{shadow_puppet}
|
8
|
+
s.version = "0.3.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jesse Newland", "Josh Nichols"]
|
12
|
+
s.date = %q{2010-06-29}
|
13
|
+
s.default_executable = %q{shadow_puppet}
|
14
|
+
s.description = %q{A Ruby Puppet DSL}
|
15
|
+
s.email = %q{jesse@railsmachine.com}
|
16
|
+
s.executables = ["shadow_puppet"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".gitignore",
|
23
|
+
".gitmodules",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"bin/shadow_puppet",
|
28
|
+
"examples/foo.rb",
|
29
|
+
"ginger_scenarios.rb",
|
30
|
+
"lib/shadow_puppet.rb",
|
31
|
+
"lib/shadow_puppet/core_ext.rb",
|
32
|
+
"lib/shadow_puppet/manifest.rb",
|
33
|
+
"lib/shadow_puppet/test.rb",
|
34
|
+
"shadow_puppet.gemspec",
|
35
|
+
"spec/fixtures/manifests.rb",
|
36
|
+
"spec/manifest_spec.rb",
|
37
|
+
"spec/spec.opts",
|
38
|
+
"spec/spec_helper.rb",
|
39
|
+
"spec/test_spec.rb",
|
40
|
+
"spec/type_spec.rb"
|
41
|
+
]
|
42
|
+
s.homepage = %q{http://railsmachine.github.com/shadow_puppet}
|
43
|
+
s.rdoc_options = ["--charset=UTF-8", "--inline-source", "--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubyforge_project = %q{moonshine}
|
46
|
+
s.rubygems_version = %q{1.3.6}
|
47
|
+
s.summary = %q{A Ruby Puppet DSL}
|
48
|
+
s.test_files = [
|
49
|
+
"spec/fixtures/manifests.rb",
|
50
|
+
"spec/manifest_spec.rb",
|
51
|
+
"spec/spec_helper.rb",
|
52
|
+
"spec/test_spec.rb",
|
53
|
+
"spec/type_spec.rb",
|
54
|
+
"examples/foo.rb"
|
55
|
+
]
|
56
|
+
|
57
|
+
if s.respond_to? :specification_version then
|
58
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
59
|
+
s.specification_version = 3
|
60
|
+
|
61
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
62
|
+
s.add_runtime_dependency(%q<puppet>, ["= 0.24.8"])
|
63
|
+
s.add_runtime_dependency(%q<facter>, [">= 1.5.4"])
|
64
|
+
s.add_runtime_dependency(%q<highline>, [">= 1.5.0"])
|
65
|
+
s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
|
66
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.0"])
|
67
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
68
|
+
else
|
69
|
+
s.add_dependency(%q<puppet>, ["= 0.24.8"])
|
70
|
+
s.add_dependency(%q<facter>, [">= 1.5.4"])
|
71
|
+
s.add_dependency(%q<highline>, [">= 1.5.0"])
|
72
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
73
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.0"])
|
74
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
75
|
+
end
|
76
|
+
else
|
77
|
+
s.add_dependency(%q<puppet>, ["= 0.24.8"])
|
78
|
+
s.add_dependency(%q<facter>, [">= 1.5.4"])
|
79
|
+
s.add_dependency(%q<highline>, [">= 1.5.0"])
|
80
|
+
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
81
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.0"])
|
82
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
class BlankManifest < ShadowPuppet::Manifest
|
2
|
+
end
|
3
|
+
|
4
|
+
#this does nothing
|
5
|
+
class NoOpManifest < ShadowPuppet::Manifest
|
6
|
+
def foo
|
7
|
+
exec('foo', :command => 'true')
|
8
|
+
end
|
9
|
+
|
10
|
+
def bar
|
11
|
+
exec('bar', :command => 'true')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
#demonstrate the default method of satifying requirements: instance methods
|
16
|
+
class RequiresMetViaMethods < ShadowPuppet::Manifest
|
17
|
+
recipe :foo, :bar
|
18
|
+
|
19
|
+
configure({ :foo => :bar , :nested_hash => { :nested_foo => :bar } })
|
20
|
+
|
21
|
+
def foo
|
22
|
+
exec('foo', :command => 'true')
|
23
|
+
end
|
24
|
+
|
25
|
+
def bar
|
26
|
+
exec('bar', :command => 'true')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class RequiresMetViaMethodsSubclass < RequiresMetViaMethods
|
31
|
+
recipe :baz
|
32
|
+
|
33
|
+
configure({ :baz => :bar, :nested_hash => { :nested_baz => :bar } })
|
34
|
+
|
35
|
+
def baz
|
36
|
+
exec('baz', :command => 'true')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#requirements can also be handled by functions in external modules
|
41
|
+
class ProvidedViaModules < ShadowPuppet::Manifest
|
42
|
+
module FooRecipe
|
43
|
+
def foo
|
44
|
+
file('/tmp/moonshine_foo', :ensure => 'present', :content => 'foo')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module BarRecipe
|
49
|
+
def bar
|
50
|
+
file('/tmp/moonshine_bar', :ensure => 'absent')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
include FooRecipe
|
54
|
+
include BarRecipe
|
55
|
+
recipe :foo, :bar
|
56
|
+
end
|
57
|
+
|
58
|
+
#requirements can also be handled by functions in external modules
|
59
|
+
class PassingArguments < ShadowPuppet::Manifest
|
60
|
+
def foo(options = {})
|
61
|
+
file(options[:name], :ensure => 'present', :content => 'foo')
|
62
|
+
end
|
63
|
+
recipe :foo, :name => '/tmp/moonshine_foo'
|
64
|
+
end
|
65
|
+
|
66
|
+
# since self.respond_to?(:foo) == false, this raises an error when run
|
67
|
+
class RequirementsNotMet < ShadowPuppet::Manifest
|
68
|
+
recipe :foo, :bar
|
69
|
+
|
70
|
+
# def foo
|
71
|
+
# end
|
72
|
+
|
73
|
+
def bar
|
74
|
+
#this is okay
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class ConfigurationWithConvention < ShadowPuppet::Manifest
|
79
|
+
configure(:foo => :bar)
|
80
|
+
def foo(string)
|
81
|
+
file('/tmp/moonshine_foo', :ensure => 'present', :content => string.to_s)
|
82
|
+
end
|
83
|
+
recipe :foo
|
84
|
+
end
|
85
|
+
|
86
|
+
# setting up a few different resource types to test the test helpers
|
87
|
+
class TestHelpers < ShadowPuppet::Manifest
|
88
|
+
|
89
|
+
def foo
|
90
|
+
exec('foo', :command => 'true',:onlyif => 'test `hostname` == "foo"')
|
91
|
+
package('bar',:ensure => :installed)
|
92
|
+
file('baz', :content => 'bar',:mode => '644',:owner => 'rails')
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe "A manifest" do
|
4
|
+
|
5
|
+
describe "when blank" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@manifest = BlankManifest.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "does nothing" do
|
12
|
+
@manifest.class.recipes.should == []
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns true when executed" do
|
16
|
+
@manifest.execute.should be_true
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "without specified recipes" do
|
22
|
+
|
23
|
+
before(:each) do
|
24
|
+
@manifest = NoOpManifest.new
|
25
|
+
end
|
26
|
+
|
27
|
+
it "is executable by default" do
|
28
|
+
@manifest.should be_executable
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when calling instance methods" do
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
@manifest.foo
|
35
|
+
end
|
36
|
+
|
37
|
+
it "creates resources" do
|
38
|
+
@manifest.execs.keys.sort.should == ['foo']
|
39
|
+
end
|
40
|
+
|
41
|
+
it "applies our customizations to resources" do
|
42
|
+
@manifest.execs["foo"].path.should == ENV["PATH"]
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "and then executing" do
|
46
|
+
|
47
|
+
before(:each) do
|
48
|
+
@manifest = @manifest.execute
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns true" do
|
52
|
+
@manifest.should be_true
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "when recipes aren't fullfilled" do
|
62
|
+
|
63
|
+
before(:each) do
|
64
|
+
@manifest = RequirementsNotMet.new
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns false when executed" do
|
68
|
+
@manifest.execute.should be_false
|
69
|
+
end
|
70
|
+
|
71
|
+
it "raises an error when executed!" do
|
72
|
+
lambda {
|
73
|
+
@manifest.execute!
|
74
|
+
}.should raise_error(NameError)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "in general" do
|
80
|
+
|
81
|
+
before(:each) do
|
82
|
+
@manifest = RequiresMetViaMethods.new
|
83
|
+
end
|
84
|
+
|
85
|
+
it "knows what it's supposed to do" do
|
86
|
+
@manifest.class.recipes.should == [[:foo, {}], [:bar, {}]]
|
87
|
+
end
|
88
|
+
|
89
|
+
it "loading configuration on the class" do
|
90
|
+
@manifest.class.configuration[:foo].should == :bar
|
91
|
+
end
|
92
|
+
|
93
|
+
it "can access the same configuration hash on the instance" do
|
94
|
+
@manifest.configuration[:foo].should == :bar
|
95
|
+
end
|
96
|
+
|
97
|
+
it "has a name" do
|
98
|
+
@manifest.name.should == "#{@manifest.class}##{@manifest.object_id}"
|
99
|
+
end
|
100
|
+
|
101
|
+
describe 'when evaluated' do
|
102
|
+
|
103
|
+
it "calls specified methods" do
|
104
|
+
@manifest.should_receive(:foo)
|
105
|
+
@manifest.should_receive(:bar)
|
106
|
+
@manifest.send(:evaluate_recipes)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "passes the configuration hash key named by each method if no options given" do
|
110
|
+
@manifest = ConfigurationWithConvention.new
|
111
|
+
@manifest.should_receive(:foo).with(:bar).exactly(1).times
|
112
|
+
@manifest.send(:evaluate_recipes)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "creates new resources" do
|
116
|
+
@manifest.should_receive(:new_resource).with(Puppet::Type::Exec, 'foo', :command => 'true').exactly(1).times
|
117
|
+
@manifest.should_receive(:new_resource).with(Puppet::Type::Exec, 'bar', :command => 'true').exactly(1).times
|
118
|
+
@manifest.send(:evaluate_recipes)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "creates new resources" do
|
122
|
+
@manifest.send(:evaluate_recipes)
|
123
|
+
@manifest.puppet_resources[Puppet::Type::Exec].keys.sort.should == ['bar', 'foo']
|
124
|
+
end
|
125
|
+
|
126
|
+
it "can acess a flat array of resources" do
|
127
|
+
@manifest.send(:flat_resources).should == []
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "when executed" do
|
133
|
+
|
134
|
+
it "calls evaluate_recipes and apply" do
|
135
|
+
@manifest.should_receive(:evaluate_recipes)
|
136
|
+
@manifest.should_receive(:apply)
|
137
|
+
@manifest.execute
|
138
|
+
end
|
139
|
+
|
140
|
+
it "returns true" do
|
141
|
+
@manifest.execute.should be_true
|
142
|
+
end
|
143
|
+
|
144
|
+
it "cannot be executed again" do
|
145
|
+
@manifest.execute.should be_true
|
146
|
+
@manifest.execute.should be_false
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "after execution" do
|
152
|
+
|
153
|
+
before(:each) do
|
154
|
+
@manifest = ProvidedViaModules.new
|
155
|
+
@manifest.execute
|
156
|
+
end
|
157
|
+
|
158
|
+
it "allows creation of other similar resources" do
|
159
|
+
m = PassingArguments.new
|
160
|
+
m.execute.should be_true
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "that subclasses an existing manifest" do
|
168
|
+
|
169
|
+
before(:each) do
|
170
|
+
@manifest = RequiresMetViaMethodsSubclass.new
|
171
|
+
end
|
172
|
+
|
173
|
+
it "inherits recipes from the parent class" do
|
174
|
+
@manifest.class.recipes.map(&:first).should include(:foo, :bar)
|
175
|
+
@manifest.class.recipes.first.first.should == :foo
|
176
|
+
end
|
177
|
+
|
178
|
+
it "appends recipes created in the subclass" do
|
179
|
+
@manifest.class.recipes.map(&:first).should include(:baz)
|
180
|
+
@manifest.class.recipes.last.first.should == :baz
|
181
|
+
end
|
182
|
+
|
183
|
+
it "merges it's configuration with that of the parent" do
|
184
|
+
@manifest.class.configuration[:foo].should == :bar
|
185
|
+
@manifest.class.configuration[:baz].should == :bar
|
186
|
+
end
|
187
|
+
|
188
|
+
it "deep_merges it's configuration with that of the parent" do
|
189
|
+
@manifest.class.configuration[:nested_hash][:nested_baz].should == :bar
|
190
|
+
@manifest.class.configuration[:nested_hash][:nested_foo].should == :bar
|
191
|
+
end
|
192
|
+
|
193
|
+
it "is able to add configuration parameters on the instance" do
|
194
|
+
@manifest.configure 'boo' => :bar
|
195
|
+
@manifest.configuration[:boo].should == :bar
|
196
|
+
@manifest.class.configuration[:boo].should == :bar
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ginger'
|
3
|
+
gem 'rspec'
|
4
|
+
require 'spec'
|
5
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'shadow_puppet.rb')
|
6
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'shadow_puppet', 'test.rb')
|
7
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'fixtures', '*.rb')).each do |manifest|
|
8
|
+
require manifest
|
9
|
+
end
|
data/spec/test_spec.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe "ShadowPuppet's test helpers" do
|
4
|
+
|
5
|
+
it "should be created when register_puppet_types_for_testing is called" do
|
6
|
+
Puppet::Type.newtype(:dummy){ }
|
7
|
+
Puppet::Type.type(:dummy).provide(:generic){ }
|
8
|
+
|
9
|
+
BlankManifest.new.respond_to?(:dummies).should == false
|
10
|
+
ShadowPuppet::Manifest.register_puppet_types_for_testing
|
11
|
+
BlankManifest.new.respond_to?(:dummies).should == true
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "when used in tests" do
|
15
|
+
|
16
|
+
before do
|
17
|
+
@manifest = TestHelpers.new
|
18
|
+
@manifest.foo
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should allow simple resource lookup" do
|
22
|
+
@manifest.execs.should == @manifest.puppet_resources[Puppet::Type::Exec]
|
23
|
+
@manifest.packages.should == @manifest.puppet_resources[Puppet::Type::Package]
|
24
|
+
@manifest.files.should == @manifest.puppet_resources[Puppet::Type::File]
|
25
|
+
end
|
26
|
+
|
27
|
+
# making sure that properties such as, e.g the :onlyif condition of Exec[foo]
|
28
|
+
# can be accessed simply as manifest.execs['foo'].onlyif rather than via the
|
29
|
+
# param hash
|
30
|
+
it "should allow referencing params directly" do
|
31
|
+
%w(execs files packages).each do |type|
|
32
|
+
@manifest.send(type.to_sym).each do |name,resource|
|
33
|
+
resource.params.keys.each do |param|
|
34
|
+
resource.send(param.to_sym).should == resource.params[param.to_sym].value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/type_spec.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe "ShadowPuppet's type loading mechanism" do
|
4
|
+
it "should create a new type helper methods when register_puppet_types is called" do
|
5
|
+
Puppet::Type.newtype(:dummy_1){ }
|
6
|
+
Puppet::Type.type(:dummy_1).provide(:generic){ }
|
7
|
+
|
8
|
+
BlankManifest.new.respond_to?(:dummy_1).should == false
|
9
|
+
ShadowPuppet::Manifest.register_puppet_types
|
10
|
+
BlankManifest.new.respond_to?(:dummy_1).should == true
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,94 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shadow_puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 3
|
8
|
+
- 3
|
9
|
+
version: 0.3.3
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Jesse Newland
|
13
|
+
- Josh Nichols
|
8
14
|
autorequire:
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-06-29 00:00:00 -04:00
|
13
19
|
default_executable: shadow_puppet
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: puppet
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
25
|
requirements:
|
21
26
|
- - "="
|
22
27
|
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 24
|
31
|
+
- 8
|
23
32
|
version: 0.24.8
|
24
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
25
35
|
- !ruby/object:Gem::Dependency
|
26
36
|
name: facter
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
39
|
requirements:
|
31
40
|
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 1
|
44
|
+
- 5
|
45
|
+
- 4
|
33
46
|
version: 1.5.4
|
34
|
-
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
35
49
|
- !ruby/object:Gem::Dependency
|
36
50
|
name: highline
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
53
|
requirements:
|
41
54
|
- - ">="
|
42
55
|
- !ruby/object:Gem::Version
|
56
|
+
segments:
|
57
|
+
- 1
|
58
|
+
- 5
|
59
|
+
- 0
|
43
60
|
version: 1.5.0
|
44
|
-
|
61
|
+
type: :runtime
|
62
|
+
version_requirements: *id003
|
45
63
|
- !ruby/object:Gem::Dependency
|
46
64
|
name: builder
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
67
|
requirements:
|
51
68
|
- - ">="
|
52
69
|
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 2
|
72
|
+
- 1
|
73
|
+
- 2
|
53
74
|
version: 2.1.2
|
54
|
-
|
75
|
+
type: :runtime
|
76
|
+
version_requirements: *id004
|
55
77
|
- !ruby/object:Gem::Dependency
|
56
78
|
name: activesupport
|
57
|
-
|
58
|
-
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
60
81
|
requirements:
|
61
82
|
- - ">="
|
62
83
|
- !ruby/object:Gem::Version
|
84
|
+
segments:
|
85
|
+
- 2
|
86
|
+
- 0
|
87
|
+
- 0
|
63
88
|
version: 2.0.0
|
64
|
-
|
89
|
+
type: :runtime
|
90
|
+
version_requirements: *id005
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rspec
|
93
|
+
prerelease: false
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
type: :development
|
102
|
+
version_requirements: *id006
|
65
103
|
description: A Ruby Puppet DSL
|
66
|
-
email:
|
67
|
-
- jesse@railsmachine.com
|
104
|
+
email: jesse@railsmachine.com
|
68
105
|
executables:
|
69
106
|
- shadow_puppet
|
70
107
|
extensions: []
|
71
108
|
|
72
109
|
extra_rdoc_files:
|
110
|
+
- LICENSE
|
73
111
|
- README.rdoc
|
74
|
-
- bin/shadow_puppet
|
75
112
|
files:
|
76
|
-
-
|
113
|
+
- .gitignore
|
114
|
+
- .gitmodules
|
77
115
|
- LICENSE
|
116
|
+
- README.rdoc
|
117
|
+
- Rakefile
|
78
118
|
- bin/shadow_puppet
|
79
119
|
- examples/foo.rb
|
120
|
+
- ginger_scenarios.rb
|
80
121
|
- lib/shadow_puppet.rb
|
81
|
-
- lib/shadow_puppet/manifest.rb
|
82
122
|
- lib/shadow_puppet/core_ext.rb
|
123
|
+
- lib/shadow_puppet/manifest.rb
|
83
124
|
- lib/shadow_puppet/test.rb
|
125
|
+
- shadow_puppet.gemspec
|
126
|
+
- spec/fixtures/manifests.rb
|
127
|
+
- spec/manifest_spec.rb
|
128
|
+
- spec/spec.opts
|
129
|
+
- spec/spec_helper.rb
|
130
|
+
- spec/test_spec.rb
|
131
|
+
- spec/type_spec.rb
|
84
132
|
has_rdoc: true
|
85
133
|
homepage: http://railsmachine.github.com/shadow_puppet
|
86
134
|
licenses: []
|
87
135
|
|
88
136
|
post_install_message:
|
89
137
|
rdoc_options:
|
90
|
-
- --
|
91
|
-
- README.rdoc
|
138
|
+
- --charset=UTF-8
|
92
139
|
- --inline-source
|
93
140
|
- --webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/
|
94
141
|
require_paths:
|
@@ -97,20 +144,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
144
|
requirements:
|
98
145
|
- - ">="
|
99
146
|
- !ruby/object:Gem::Version
|
147
|
+
segments:
|
148
|
+
- 0
|
100
149
|
version: "0"
|
101
|
-
version:
|
102
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
151
|
requirements:
|
104
152
|
- - ">="
|
105
153
|
- !ruby/object:Gem::Version
|
154
|
+
segments:
|
155
|
+
- 0
|
106
156
|
version: "0"
|
107
|
-
version:
|
108
157
|
requirements: []
|
109
158
|
|
110
159
|
rubyforge_project: moonshine
|
111
|
-
rubygems_version: 1.3.
|
160
|
+
rubygems_version: 1.3.6
|
112
161
|
signing_key:
|
113
|
-
specification_version:
|
162
|
+
specification_version: 3
|
114
163
|
summary: A Ruby Puppet DSL
|
115
|
-
test_files:
|
116
|
-
|
164
|
+
test_files:
|
165
|
+
- spec/fixtures/manifests.rb
|
166
|
+
- spec/manifest_spec.rb
|
167
|
+
- spec/spec_helper.rb
|
168
|
+
- spec/test_spec.rb
|
169
|
+
- spec/type_spec.rb
|
170
|
+
- examples/foo.rb
|