cucumber-puppet 0.0.2
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/VERSION.yml +5 -0
- data/bin/cucumber-puppet +28 -0
- data/bin/cucumber-puppet-gen +54 -0
- data/lib/cucumber-puppet.rb +6 -0
- data/lib/cucumber-puppet/puppet.rb +60 -0
- data/lib/generators/feature/%feature_name%.feature +9 -0
- data/lib/generators/world/steps/file.rb +29 -0
- data/lib/generators/world/steps/package.rb +14 -0
- data/lib/generators/world/steps/puppet.rb +65 -0
- data/lib/generators/world/steps/service.rb +14 -0
- data/lib/generators/world/steps/user.rb +3 -0
- data/lib/generators/world/support/hooks.rb +6 -0
- data/lib/generators/world/support/world.rb +5 -0
- metadata +101 -0
data/VERSION.yml
ADDED
data/bin/cucumber-puppet
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
unless ARGV[0]
|
4
|
+
puts "Usage: cucumber-puppet <feature> [<feature> <feature> ...]"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
8
|
+
ARGV.each { |f|
|
9
|
+
unless File.exists?(f)
|
10
|
+
puts "No such file or directory: #{f}"
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
}
|
14
|
+
|
15
|
+
# XXX be more creative, finding this directory
|
16
|
+
features_dir = "features"
|
17
|
+
unless File.directory?(features_dir)
|
18
|
+
puts "Cannot find '#{features_dir}' directory."
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
command = ""
|
23
|
+
command << "cucumber "
|
24
|
+
command << "--strict "
|
25
|
+
command << "--require #{features_dir} "
|
26
|
+
command << ARGV.join(' ')
|
27
|
+
|
28
|
+
system(command) ? exit(0) : exit(1)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'cucumber-puppet'
|
5
|
+
require 'templater'
|
6
|
+
|
7
|
+
module CucumberPuppetGenerators
|
8
|
+
|
9
|
+
extend Templater::Manifold
|
10
|
+
|
11
|
+
class FeatureGenerator < Templater::Generator
|
12
|
+
def source_root
|
13
|
+
File.join(File.dirname(__FILE__), '..', 'lib', 'generators', 'feature')
|
14
|
+
end
|
15
|
+
|
16
|
+
desc <<-DESC
|
17
|
+
Generate a cucumber feature.
|
18
|
+
cucumber-puppet-gen feature <module-name> <feature-name>
|
19
|
+
DESC
|
20
|
+
|
21
|
+
first_argument :mod, :required => true, :desc => "Module name"
|
22
|
+
second_argument :feature, :required => true, :desc => "Feature name"
|
23
|
+
|
24
|
+
template :feature do |template|
|
25
|
+
template.source = "%feature_name%.feature"
|
26
|
+
template.destination = "features/modules/#{mod}/#{feature}.feature"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class WorldGenerator < Templater::Generator
|
31
|
+
def source_root
|
32
|
+
File.join(File.dirname(__FILE__), '..', 'lib', 'generators', 'world')
|
33
|
+
end
|
34
|
+
|
35
|
+
def destination_root
|
36
|
+
File.join(@destination_root, 'features')
|
37
|
+
end
|
38
|
+
|
39
|
+
desc <<-DESC
|
40
|
+
Generate cucumber step and support files.
|
41
|
+
cucumber-puppet-gen world
|
42
|
+
DESC
|
43
|
+
|
44
|
+
directory('steps', 'steps')
|
45
|
+
directory('support', 'support')
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Generators for cucumber-puppet"
|
49
|
+
add :feature, FeatureGenerator
|
50
|
+
add :world, WorldGenerator
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
CucumberPuppetGenerators.run_cli Dir.pwd, 'cucumber-puppet-gen', CucumberPuppet::VERSION, ARGV
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'puppet'
|
2
|
+
require 'puppet/network/client'
|
3
|
+
|
4
|
+
class CucumberPuppet
|
5
|
+
def initialize
|
6
|
+
@confdir = "/etc/puppet"
|
7
|
+
@manifest = @confdir + "/manifest/site.pp"
|
8
|
+
|
9
|
+
# default facts
|
10
|
+
@facts = {
|
11
|
+
'architecture' => "",
|
12
|
+
'domain' => "no.domain",
|
13
|
+
'environment' => "production",
|
14
|
+
'hostname' => "testnode",
|
15
|
+
'lsbdistcodename' => "",
|
16
|
+
'network_eth0' => "127.0.0.0",
|
17
|
+
'operatingsystem' => "",
|
18
|
+
}
|
19
|
+
|
20
|
+
Puppet::Util::Log.newdestination(:console)
|
21
|
+
Puppet::Util::Log.level = :notice
|
22
|
+
end
|
23
|
+
|
24
|
+
def debug
|
25
|
+
Puppet::Util::Log.level = :debug
|
26
|
+
end
|
27
|
+
|
28
|
+
def klass=(klass)
|
29
|
+
@klass = klass.to_a
|
30
|
+
end
|
31
|
+
|
32
|
+
def compile_catalog
|
33
|
+
Puppet[:confdir] = @confdir
|
34
|
+
Puppet[:manifest] = @manifest
|
35
|
+
Puppet.parse_config
|
36
|
+
|
37
|
+
node = Puppet::Node.new(@facts['hostname'], :classes => @klass)
|
38
|
+
node.merge(@facts)
|
39
|
+
|
40
|
+
begin
|
41
|
+
# Compile our catalog
|
42
|
+
@catalog = Puppet::Node::Catalog.find(node.name, :use_node => node)
|
43
|
+
rescue => detail
|
44
|
+
if Puppet[:trace]
|
45
|
+
puts detail.backtrace
|
46
|
+
end
|
47
|
+
if detail.is_a?(XMLRPC::FaultException)
|
48
|
+
$stderr.puts detail.message
|
49
|
+
else
|
50
|
+
$stderr.puts detail
|
51
|
+
end
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def resource(title)
|
57
|
+
resource = @catalog.resource(title)
|
58
|
+
return resource
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Then /^the file should be a symlink to "([^\"]*)"$/ do |target|
|
2
|
+
fail unless @resource["ensure"] == target
|
3
|
+
end
|
4
|
+
|
5
|
+
Then /^the file should contain "([^\"]*)"$/ do |text|
|
6
|
+
fail unless @resource["content"].include?(text)
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^the (file|script) should have standard permissions$/ do |type|
|
10
|
+
if type == "file"
|
11
|
+
mode = "0444"
|
12
|
+
elsif type == "script"
|
13
|
+
mode = "0555"
|
14
|
+
end
|
15
|
+
|
16
|
+
steps %Q{
|
17
|
+
Then the file should have a "group" of "root"
|
18
|
+
And the file should have a "mode" of "#{mode}"
|
19
|
+
And the file should have an "owner" of "root"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^there should be a (file|script) "([^\"]*)"$/ do |type, name|
|
24
|
+
steps %Q{
|
25
|
+
Then there should be a resource "File[#{name}]"
|
26
|
+
And the state should be "present"
|
27
|
+
And the #{type} should have standard permissions
|
28
|
+
}
|
29
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Then /^package "([^\"]*)" should be "([^\"]*)"$/ do |package, state|
|
2
|
+
steps %Q{
|
3
|
+
Then there should be a resource "Package[#{package}]"
|
4
|
+
And the state should be "#{state}"
|
5
|
+
And the package should require "Exec[update_apt]"
|
6
|
+
}
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
Then /^package "([^\"]*)" should not be installed$/ do |package|
|
11
|
+
steps %Q{
|
12
|
+
Then there should be no resource "Package[#{package}]"
|
13
|
+
}
|
14
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
Given /^a node of class "([^\"]*)"$/ do |klass|
|
2
|
+
@klass = klass
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^a node named "([^\"]*)"$/ do |name|
|
6
|
+
@facts['hostname'] = name
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /^a node in network "([^\"]*)"$/ do |network|
|
10
|
+
@facts['network_eth0'] = network
|
11
|
+
end
|
12
|
+
|
13
|
+
Given /^it is a virtual node$/ do
|
14
|
+
@facts['processor0'] = "QEMU Virtual CPU version 0.11.0"
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^I compile the catalog$/ do
|
18
|
+
compile_catalog
|
19
|
+
end
|
20
|
+
|
21
|
+
Then /^the [a-z]* should have "([^\"]*)" set to "(false|true)"$/ do |res, bool|
|
22
|
+
if bool == "false"
|
23
|
+
fail unless @resource[res] == false
|
24
|
+
else
|
25
|
+
fail unless @resource[res] == true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^the [a-z]* should have an? "([^\"]*)" of "([^\"]*)"$/ do |property, value|
|
30
|
+
fail unless @resource[property] == value
|
31
|
+
end
|
32
|
+
|
33
|
+
Then /^the [a-z]* should notify "([^\"]*)"$/ do |res|
|
34
|
+
fail unless @resource["notify"].to_s == res
|
35
|
+
end
|
36
|
+
|
37
|
+
Then /^the [a-z]* should require "([^\"]*)"$/ do |resource|
|
38
|
+
req = @resource["require"]
|
39
|
+
if req.is_a?(Array)
|
40
|
+
found = false
|
41
|
+
req.each do |r|
|
42
|
+
if r.to_s == resource
|
43
|
+
found = true
|
44
|
+
break
|
45
|
+
end
|
46
|
+
end
|
47
|
+
fail unless found
|
48
|
+
else
|
49
|
+
fail unless req.to_s == resource
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
Then /^the state should be "([^\"]*)"$/ do |state|
|
54
|
+
fail unless @resource["ensure"] == state
|
55
|
+
end
|
56
|
+
|
57
|
+
Then /^there should be a resource "([^\"]*)"$/ do |res|
|
58
|
+
@resource = resource(res)
|
59
|
+
fail unless @resource
|
60
|
+
end
|
61
|
+
|
62
|
+
Then /^there should be no resource "([^\"]*)"$/ do |res|
|
63
|
+
@resource = resource(res)
|
64
|
+
fail if @resource
|
65
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Then /^service "([^\"]*)" should be "([^\"]*)"$/ do |name, state|
|
2
|
+
steps %Q{
|
3
|
+
Then there should be a resource "Service[#{name}]"
|
4
|
+
}
|
5
|
+
if state == "disabled"
|
6
|
+
steps %Q{
|
7
|
+
Then the service should have "enable" set to "false"
|
8
|
+
}
|
9
|
+
elsif state == "running"
|
10
|
+
steps %Q{
|
11
|
+
Then the state should be "#{state}"
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cucumber-puppet
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Nikolay Sturm
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-17 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: cucumber
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 6
|
30
|
+
- 4
|
31
|
+
version: 0.6.4
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: templater
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 0
|
44
|
+
version: "1.0"
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
description: cucumber-puppet allows you writing behavioural tests for your puppet manifest
|
48
|
+
email: cucumber-puppet@erisiandiscord.de
|
49
|
+
executables:
|
50
|
+
- cucumber-puppet
|
51
|
+
- cucumber-puppet-gen
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
extra_rdoc_files: []
|
55
|
+
|
56
|
+
files:
|
57
|
+
- bin/cucumber-puppet
|
58
|
+
- bin/cucumber-puppet-gen
|
59
|
+
- lib/cucumber-puppet.rb
|
60
|
+
- lib/cucumber-puppet/puppet.rb
|
61
|
+
- lib/generators/feature/%feature_name%.feature
|
62
|
+
- lib/generators/world/steps/file.rb
|
63
|
+
- lib/generators/world/steps/package.rb
|
64
|
+
- lib/generators/world/steps/puppet.rb
|
65
|
+
- lib/generators/world/steps/service.rb
|
66
|
+
- lib/generators/world/steps/user.rb
|
67
|
+
- lib/generators/world/support/hooks.rb
|
68
|
+
- lib/generators/world/support/world.rb
|
69
|
+
- VERSION.yml
|
70
|
+
has_rdoc: true
|
71
|
+
homepage: http://github.com/nistude/cucumber-puppet/
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirements: []
|
94
|
+
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.3.6
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: Puppet manifest testing with Cucumber
|
100
|
+
test_files: []
|
101
|
+
|