cucumber-puppet 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +2 -2
- data/bin/cucumber-puppet-gen +16 -0
- data/lib/cucumber-puppet/puppet.rb +22 -8
- data/lib/cucumber-puppet/steps.rb +41 -0
- data/lib/generators/policy/catalog/policy.feature +14 -0
- data/lib/generators/world/support/hooks.rb +2 -1
- data/lib/generators/world/support/world.rb +1 -0
- data/man/cucumber-puppet-gen.1 +2 -2
- data/man/cucumber-puppet.1 +4 -4
- metadata +51 -21
- data/lib/generators/world/steps/catalog_specs.rb +0 -67
data/VERSION.yml
CHANGED
data/bin/cucumber-puppet-gen
CHANGED
@@ -32,6 +32,21 @@ module CucumberPuppetGenerators
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
class PolicyGenerator < Templater::Generator
|
36
|
+
include CucumberPuppet::Helper
|
37
|
+
|
38
|
+
def source_root
|
39
|
+
File.join(File.dirname(__FILE__), '..', 'lib', 'generators', 'policy')
|
40
|
+
end
|
41
|
+
|
42
|
+
desc <<-DESC
|
43
|
+
Generate a catalog policy
|
44
|
+
cucumber-puppet-gen policy
|
45
|
+
DESC
|
46
|
+
|
47
|
+
directory('catalog', 'catalog', 'features/catalog')
|
48
|
+
end
|
49
|
+
|
35
50
|
class TestcaseGenerator < Templater::Generator
|
36
51
|
extend CucumberPuppet::Helper
|
37
52
|
|
@@ -74,6 +89,7 @@ module CucumberPuppetGenerators
|
|
74
89
|
|
75
90
|
desc "Generators for cucumber-puppet"
|
76
91
|
add :feature, FeatureGenerator
|
92
|
+
add :policy, PolicyGenerator
|
77
93
|
add :testcase, TestcaseGenerator
|
78
94
|
add :world, WorldGenerator
|
79
95
|
|
@@ -7,7 +7,7 @@ class CucumberPuppet
|
|
7
7
|
# Returns a new CucumberPuppet object.
|
8
8
|
def initialize
|
9
9
|
@confdir = "/etc/puppet"
|
10
|
-
@manifest = @confdir + "/
|
10
|
+
@manifest = @confdir + "/manifests/site.pp"
|
11
11
|
|
12
12
|
# default facts
|
13
13
|
@facts = {
|
@@ -41,9 +41,11 @@ class CucumberPuppet
|
|
41
41
|
# @manifest defaults to @confdir + '/manifests/site.pp'
|
42
42
|
#
|
43
43
|
def compile_catalog( node = nil )
|
44
|
-
Puppet
|
45
|
-
Puppet[:manifest] = @manifest
|
44
|
+
Puppet.settings.handlearg("--confdir", @confdir)
|
46
45
|
Puppet.parse_config
|
46
|
+
# reset confdir in case it got overwritten
|
47
|
+
Puppet.settings.handlearg("--confdir", @confdir)
|
48
|
+
Puppet.settings.handlearg("--manifest", @manifest)
|
47
49
|
|
48
50
|
unless node.is_a?(Puppet::Node)
|
49
51
|
node = Puppet::Node.new(@facts['hostname'], :classes => @klass)
|
@@ -71,12 +73,24 @@ class CucumberPuppet
|
|
71
73
|
end
|
72
74
|
|
73
75
|
# Returns an Object with the given title from catalog.
|
74
|
-
def get_resource(title)
|
75
|
-
@catalog.resource(title)
|
76
|
-
end
|
77
|
-
# XXX add deprecation warning for resource()
|
78
76
|
def resource(title)
|
79
|
-
|
77
|
+
@catalog.resource(title)
|
80
78
|
end
|
81
79
|
|
80
|
+
# Returns an Array with the catalog's Puppet::Resource objects.
|
81
|
+
def catalog_resources
|
82
|
+
# This method exists to supply a common interface to the puppet catalog
|
83
|
+
# for different versions of puppet.
|
84
|
+
@catalog.resources.map do |r|
|
85
|
+
if r.is_a?(Puppet::Resource)
|
86
|
+
# puppet 2.6 and newer
|
87
|
+
r
|
88
|
+
elsif r.is_a?(String)
|
89
|
+
# puppet 0.25 and older
|
90
|
+
resource(r)
|
91
|
+
else
|
92
|
+
raise "Unknown resource object #{r.class}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
82
96
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Given /^a node specified by "([^\"]*)"$/ do |file|
|
2
|
+
# file: yaml node file
|
3
|
+
fail("Cannot find node facts #{file}.") unless File.exist?(file)
|
4
|
+
@node = YAML.load_file(file)
|
5
|
+
fail("Invalid node file #{file}, this should come from " +
|
6
|
+
"/var/lib/puppet/yaml/node.") unless @node.is_a?(Puppet::Node)
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /^I use storeconfigs$/ do
|
10
|
+
# XXX workaround storeconfig warnings
|
11
|
+
Puppet::Util::Log.level = :err
|
12
|
+
end
|
13
|
+
|
14
|
+
When /^I compile its catalog$/ do
|
15
|
+
compile_catalog(@node)
|
16
|
+
end
|
17
|
+
|
18
|
+
Then /^all resource dependencies should resolve$/ do
|
19
|
+
steps %Q{
|
20
|
+
Then all "before" should resolve
|
21
|
+
And all "notify" should resolve
|
22
|
+
And all "require" should resolve
|
23
|
+
And all "subscribe" should resolve
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
Then /^all "(before|notify|require|subscribe)" should resolve$/ do |parameter|
|
28
|
+
catalog_resources.each do |resource|
|
29
|
+
dependency = [ resource[parameter] ].flatten.compact
|
30
|
+
|
31
|
+
dependency.each do |dep|
|
32
|
+
fail("#{resource} cannot #{parameter} #{dep}, not in catalog.") \
|
33
|
+
unless resource(dep.to_s)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Then /^compilation should succeed$/ do
|
39
|
+
fail("Catalog compilation failed.") unless
|
40
|
+
@catalog.is_a?(Puppet::Resource::Catalog)
|
41
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: General policy for all catalogs
|
2
|
+
In order to ensure applicability of a host's catalog
|
3
|
+
As a manifest developer
|
4
|
+
I want all catalogs to obey some general rules
|
5
|
+
|
6
|
+
Scenario Outline: Compile and verify catalog
|
7
|
+
Given a node specified by "features/yaml/<hostname>.example.com.yaml"
|
8
|
+
When I compile its catalog
|
9
|
+
Then compilation should succeed
|
10
|
+
And all resource dependencies should resolve
|
11
|
+
|
12
|
+
Examples:
|
13
|
+
| hostname |
|
14
|
+
| localhost |
|
@@ -1,6 +1,7 @@
|
|
1
1
|
Before do
|
2
2
|
# local configuration
|
3
|
-
@confdir = File.dirname(__FILE__)
|
3
|
+
# @confdir = File.join(File.dirname(__FILE__), '..', '..')
|
4
|
+
# @manifest = File.join(@confdir, 'manifests', 'site.pp')
|
4
5
|
# adjust facts like this
|
5
6
|
@facts['architecture'] = "i386"
|
6
7
|
end
|
data/man/cucumber-puppet-gen.1
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "CUCUMBER\-PUPPET\-GEN" "1" "
|
4
|
+
.TH "CUCUMBER\-PUPPET\-GEN" "1" "September 2010" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBcucumber\-puppet\-gen\fR \- Generator script for cucumber\-puppet
|
@@ -69,7 +69,7 @@ $ cucumber\-puppet\-gen feature foo bar
|
|
69
69
|
.IP "" 0
|
70
70
|
.
|
71
71
|
.SH "REPORTING BUGS"
|
72
|
-
|
72
|
+
Please report any bugs at http://projects\.puppetlabs\.com/projects/cucumber\-puppet/issues/new or send an email to \fIcucumber\-puppet@erisiandiscord\.de\fR\.
|
73
73
|
.
|
74
74
|
.SH "COPYRIGHT"
|
75
75
|
\fBcucumber\-puppet\fR is Copyright (c) 2010 Nikolay Sturm \fIsturm@nistu\.de\fR
|
data/man/cucumber-puppet.1
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "CUCUMBER\-PUPPET" "1" "
|
4
|
+
.TH "CUCUMBER\-PUPPET" "1" "September 2010" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
|
-
\fBcucumber\-puppet\fR \- Puppet
|
7
|
+
\fBcucumber\-puppet\fR \- Puppet catalog testing with Cucumber
|
8
8
|
.
|
9
9
|
.SH "SYNOPSIS"
|
10
10
|
\fBcucumber\-puppet\fR [ OPTIONS ] FILE | DIR \.\.\.
|
11
11
|
.
|
12
12
|
.SH "DESCRIPTION"
|
13
|
-
\fBcucumber\-puppet\fR is a tool for behavioral testing of Puppet
|
13
|
+
\fBcucumber\-puppet\fR is a tool for behavioral testing of Puppet catalogs\. It provides the glue necessary to access Puppet\'s data structures from Cucumber\'s step definitions\.
|
14
14
|
.
|
15
15
|
.P
|
16
16
|
\fBcucumber\-puppet\fR takes a list of feature files or directories, containing feature files, as argument\. These will then be run through \fBcucumber\fR\. It needs to be started from somewhere inside the Puppet directory tree\.
|
@@ -119,7 +119,7 @@ $ cucumber\-puppet features/modules/foo/bar\.feature
|
|
119
119
|
.IP "" 0
|
120
120
|
.
|
121
121
|
.SH "REPORTING BUGS"
|
122
|
-
|
122
|
+
Please report any bugs at http://projects\.puppetlabs\.com/projects/cucumber\-puppet/issues/new or send an email to \fIcucumber\-puppet@erisiandiscord\.de\fR\.
|
123
123
|
.
|
124
124
|
.SH "COPYRIGHT"
|
125
125
|
\fBcucumber\-puppet\fR is Copyright (c) 2010 Nikolay Sturm \fIsturm@nistu\.de\fR
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Nikolay Sturm
|
@@ -9,40 +15,57 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-10-20 00:00:00 +02:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: cucumber
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 6
|
33
|
+
- 4
|
23
34
|
version: 0.6.4
|
24
|
-
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
25
37
|
- !ruby/object:Gem::Dependency
|
26
38
|
name: gem-man
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
30
42
|
requirements:
|
31
43
|
- - ">="
|
32
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 23
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 2
|
49
|
+
- 0
|
33
50
|
version: 0.2.0
|
34
|
-
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
35
53
|
- !ruby/object:Gem::Dependency
|
36
54
|
name: templater
|
37
|
-
|
38
|
-
|
39
|
-
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
40
58
|
requirements:
|
41
59
|
- - ">="
|
42
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 15
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 0
|
43
65
|
version: "1.0"
|
44
|
-
|
45
|
-
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id003
|
68
|
+
description: cucumber-puppet is a tool for behavioral testing of Puppet catalogs
|
46
69
|
email: cucumber-puppet@erisiandiscord.de
|
47
70
|
executables:
|
48
71
|
- cucumber-puppet
|
@@ -57,13 +80,14 @@ files:
|
|
57
80
|
- lib/cucumber-puppet.rb
|
58
81
|
- lib/cucumber-puppet/helper.rb
|
59
82
|
- lib/cucumber-puppet/puppet.rb
|
83
|
+
- lib/cucumber-puppet/steps.rb
|
60
84
|
- lib/cucumber-puppet/rake/task.rb
|
61
85
|
- lib/generators/feature/%feature_name%.feature
|
86
|
+
- lib/generators/policy/catalog/policy.feature
|
62
87
|
- man/cucumber-puppet.1
|
63
88
|
- man/cucumber-puppet-gen.1
|
64
89
|
- VERSION.yml
|
65
90
|
- lib/generators/world/steps/package.rb
|
66
|
-
- lib/generators/world/steps/catalog_specs.rb
|
67
91
|
- lib/generators/world/steps/exec.rb
|
68
92
|
- lib/generators/world/steps/user.rb
|
69
93
|
- lib/generators/world/steps/file.rb
|
@@ -73,7 +97,7 @@ files:
|
|
73
97
|
- lib/generators/world/support/hooks.rb
|
74
98
|
- lib/generators/world/support/world.rb
|
75
99
|
has_rdoc: true
|
76
|
-
homepage: http://
|
100
|
+
homepage: http://projects.puppetlabs.com/projects/cucumber-puppet
|
77
101
|
licenses: []
|
78
102
|
|
79
103
|
post_install_message:
|
@@ -82,23 +106,29 @@ rdoc_options: []
|
|
82
106
|
require_paths:
|
83
107
|
- lib
|
84
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
85
110
|
requirements:
|
86
111
|
- - ">="
|
87
112
|
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
88
116
|
version: "0"
|
89
|
-
version:
|
90
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
91
119
|
requirements:
|
92
120
|
- - ">="
|
93
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 3
|
123
|
+
segments:
|
124
|
+
- 0
|
94
125
|
version: "0"
|
95
|
-
version:
|
96
126
|
requirements: []
|
97
127
|
|
98
128
|
rubyforge_project:
|
99
|
-
rubygems_version: 1.3.
|
129
|
+
rubygems_version: 1.3.7
|
100
130
|
signing_key:
|
101
131
|
specification_version: 3
|
102
|
-
summary: Puppet
|
132
|
+
summary: Puppet catalog testing with Cucumber
|
103
133
|
test_files: []
|
104
134
|
|
@@ -1,67 +0,0 @@
|
|
1
|
-
Given /^a node specified by "([^\"]*)"$/ do |file|
|
2
|
-
# file: yaml node file, usually from /var/lib/puppet/yaml/node
|
3
|
-
fail("Cannot find node facts #{file}.") unless File.exist?(file)
|
4
|
-
@node = YAML.load_file(file)
|
5
|
-
file("Invalid node file #{file}, this should come from " +
|
6
|
-
"/var/lib/puppet/yaml/node.") unless @node.is_a?(Puppet::Node)
|
7
|
-
end
|
8
|
-
|
9
|
-
When /^I compile its catalog$/ do
|
10
|
-
compile_catalog(@node)
|
11
|
-
end
|
12
|
-
|
13
|
-
Then /^all "([^\"]*)" should resolve$/ do |parameter|
|
14
|
-
# paramter: before, notify, require, or subscribe
|
15
|
-
@catalog.resources.each do |name|
|
16
|
-
resource = get_resource(name)
|
17
|
-
|
18
|
-
dependency = resource[parameter]
|
19
|
-
next unless dependency
|
20
|
-
if dependency.is_a?(Array)
|
21
|
-
dependency.each do |dep|
|
22
|
-
fail("#{resource} cannot #{parameter} #{dep}, not in catalog.") \
|
23
|
-
unless get_resource(dep.to_s)
|
24
|
-
end
|
25
|
-
elsif dependency.is_a?(Puppet::Resource::Reference)
|
26
|
-
fail("#{resource} cannot #{parameter} #{dependency}, not in catalog.") \
|
27
|
-
unless get_resource(dependency.to_s)
|
28
|
-
else
|
29
|
-
fail("#{resource} #{parameter} #{dependency} of unknown class.")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
Then /^all file sources should exist in git repository$/ do
|
35
|
-
@catalog.resources.each do |name|
|
36
|
-
next unless name.match(/^File/)
|
37
|
-
file = get_resource(name)
|
38
|
-
|
39
|
-
next unless file['source']
|
40
|
-
source = file['source']
|
41
|
-
|
42
|
-
filepath = source.gsub(%r{^puppet:///([^/]*)/(.*)$}, 'modules/\1/files/\2')
|
43
|
-
fail("#{name}: source #{filepath} not in git repository.") unless
|
44
|
-
system("git cat-file -e :#{filepath} > /dev/null 2>&1")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
Then /^all file templates should exist in git repository$/ do
|
49
|
-
Dir.glob('modules/*/templates/**.erb').each do |template|
|
50
|
-
fail("#{template} not in git.") unless
|
51
|
-
system("git cat-file -e :#{template} > /dev/null 2>&1")
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
Then /^all resource dependencies should resolve$/ do
|
56
|
-
steps %Q{
|
57
|
-
Then all "before" should resolve
|
58
|
-
And all "notify" should resolve
|
59
|
-
And all "require" should resolve
|
60
|
-
And all "subscribe" should resolve
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
Then /^compilation should succeed$/ do
|
65
|
-
fail("Catalog compilation failed.") unless
|
66
|
-
@catalog.is_a?(Puppet::Resource::Catalog)
|
67
|
-
end
|