rump 0.2.1

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.
@@ -0,0 +1,143 @@
1
+ Given /^I am working in "([^\"]*)"$/ do |directory|
2
+ @basedir = Pathname.new(directory)
3
+ end
4
+
5
+ Given /^I have an empty git repository named "([^\"]*)"$/ do |repo_name|
6
+ repo_path = @basedir.join(repo_name)
7
+ FileUtils.rm_rf(repo_path)
8
+ FileUtils.mkdir_p(repo_path)
9
+
10
+ Dir.chdir(repo_path) do
11
+ commands = [ "git init -q",
12
+ "touch foo",
13
+ "git add foo",
14
+ "git commit -qm 'init' ." ]
15
+ commands.each do |command|
16
+ system(command).should be_true
17
+ end
18
+ end
19
+
20
+ File.exists?(repo_path.join('.git')).should be_true
21
+ end
22
+
23
+ When /^I run "([^\"]*)"$/ do |cmd|
24
+ if cmd.split(' ').first == "rump"
25
+ command = %w(ruby -rubygems)
26
+ command << ROOT.join('bin', 'rump')
27
+ command << cmd.split[1..-1].join(' ')
28
+ command = command.join(' ')
29
+ else
30
+ command = cmd
31
+ end
32
+
33
+ Dir.chdir(@basedir) do
34
+ system(command).should be_true
35
+ end
36
+ end
37
+
38
+ Then /^running "([^\"]*)" should fail$/ do |command|
39
+ Dir.chdir(@basedir) do
40
+ system(command).should be_false
41
+ end
42
+ end
43
+
44
+ Then /^running "([^\"]*)" should succeed$/ do |command|
45
+ Dir.chdir(@basedir) do
46
+ system(command).should be_true
47
+ end
48
+ end
49
+
50
+ Then /^running "([^\"]*)" should output "([^\"]*)"$/ do |cmd, string|
51
+ if cmd.split(' ').first == "rump"
52
+ command = %w(ruby -rubygems)
53
+ command << ROOT.join('bin', 'rump')
54
+ command << cmd.split[1..-1].join(' ')
55
+ command = command.join(' ')
56
+ else
57
+ command = cmd
58
+ end
59
+
60
+ Dir.chdir(@basedir) do
61
+ (`#{command}` =~ /#{string}/).should be_true
62
+ end
63
+ end
64
+
65
+ Then /^I should have a git repository at "([^\"]*)"$/ do |repo_name|
66
+ repo_path = @basedir.join(repo_name)
67
+ File.exists?(repo_path.join('.git')).should be_true
68
+ end
69
+
70
+ Given /^there is no "([^\"]*)" repository$/ do |repo_name|
71
+ repo_path = @basedir.join(repo_name)
72
+ FileUtils.rm_rf(repo_path)
73
+ end
74
+
75
+ Given /^I have a simple Puppet repository named "([^\"]*)"$/ do |repo_name|
76
+ repo_path = @basedir.join(repo_name)
77
+ simple_path = ROOT.join('features', 'support', 'repos', 'simple')
78
+ hostname = Socket.gethostname.split('.').first
79
+
80
+ FileUtils.rm_rf(repo_path)
81
+ FileUtils.cp_r(simple_path, repo_path)
82
+
83
+ File.open(repo_path.join('manifests', 'nodes', "#{hostname}.pp"), 'w') do |f|
84
+ f << "node #{hostname} { include 'test' }"
85
+ end
86
+
87
+ Dir.chdir(repo_path) do
88
+ commands = ["git init -q", "git add .", "git commit -qm 'init' ."]
89
+ commands.each do |command|
90
+ system(command).should be_true
91
+ end
92
+ end
93
+
94
+ File.exists?(repo_path.join('.git')).should be_true
95
+ end
96
+
97
+ Given /^I have a simple Puppet 2.6 repository named "([^"]*)"$/ do |repo_name|
98
+ repo_path = @basedir.join(repo_name)
99
+ simple_path = ROOT.join('features', 'support', 'repos', 'simple_26')
100
+ hostname = Socket.gethostname.split('.').first
101
+
102
+ FileUtils.rm_rf(repo_path)
103
+ FileUtils.cp_r(simple_path, repo_path)
104
+
105
+ File.open(repo_path.join('manifests', 'nodes', "#{hostname}.pp"), 'w') do |f|
106
+ f << "node #{hostname} { include 'test' }"
107
+ end
108
+
109
+ Dir.chdir(repo_path) do
110
+ commands = ["git init -q", "git add .", "git commit -qm 'init' ."]
111
+ commands.each do |command|
112
+ system(command).should be_true
113
+ end
114
+ end
115
+
116
+ File.exists?(repo_path.join('.git')).should be_true
117
+ end
118
+
119
+ Then /^I should see a file at "([^\"]*)"$/ do |path|
120
+ File.exists?(path).should be_true
121
+ end
122
+
123
+ Then /^I should see a directory at "([^\"]*)"$/ do |path|
124
+ File.directory?(path).should be_true
125
+ end
126
+
127
+ Given /^there is no "([^\"]*)" file$/ do |file|
128
+ FileUtils.rm_rf(file).should be_true
129
+ end
130
+
131
+ Given /^"([^\"]*)" is on my path$/ do |command|
132
+ system("which #{command} > /dev/null").should be_true
133
+ end
134
+
135
+ Then /^I should see the following directories:$/ do |table|
136
+ table.hashes.each do |attrs|
137
+ File.directory?(attrs["directory"]).should be_true
138
+ end
139
+ end
140
+
141
+ When /^I touch "([^\"]*)"$/ do |filename|
142
+ system("touch #{filename} > /dev/null").should be_true
143
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'socket'
4
+ require 'pathname'
5
+
6
+ ROOT = Pathname.new(File.expand_path(File.join(File.dirname(__FILE__), '..', '..')))
7
+
8
+ def silent_system(cmd)
9
+ command = [cmd, "2>&1 /dev/null"]
10
+ system(command)
11
+ end
@@ -0,0 +1 @@
1
+ import "nodes/*"
@@ -0,0 +1,5 @@
1
+ class test {
2
+ file { "/tmp/checkout":
3
+ content => "checkout"
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ import "nodes/*"
@@ -0,0 +1,5 @@
1
+ class test($path="/tmp/checkout") {
2
+ file { "$path":
3
+ source => "puppet:///modules/test/checkout"
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ a Rump-ified repository of Puppet manifests
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "socket"
4
+
5
+ name = ENV['GIT_AUTHOR_NAME'] || `git config user.name`
6
+ email = ENV['GIT_AUTHOR_EMAIL'] || `git config user.email`
7
+ hostname = Socket.gethostname
8
+
9
+ @errors = []
10
+ case
11
+ when !name, name.strip.empty?
12
+ @errors << "You don't have an author name set."
13
+ @errors << "Please set this to your real name before committing."
14
+ when !email, email.strip.empty?
15
+ @errors << "You don't have an author email address set."
16
+ @errors << "Please set this to your real email address before committing."
17
+ when name == "root", name =~ /^\s*$/
18
+ @errors << "Your author name is '#{name}'."
19
+ @errors << "Please set this to your real name before committing."
20
+ when email =~ /^\s*$/, email =~ /#{hostname}/
21
+ @errors << "You author email is '#{email}'."
22
+ @errors << "This matches part of the system hostname (#{hostname})."
23
+ @errors << "If this is correct, please run again with --no-verify."
24
+ end
25
+
26
+ if @errors.size > 0
27
+ puts @errors
28
+ exit 1
29
+ end
File without changes
@@ -0,0 +1,6 @@
1
+ # git-ls-files --others --exclude-from=.git/info/exclude
2
+ # Lines that start with '#' are comments.
3
+ # For a project mostly in C, the following would be a good set of
4
+ # exclude patterns (uncomment them if you want to use them):
5
+ # *.[oa]
6
+ # *~
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require 'pathname'
5
+
6
+ module Logging
7
+ ESCAPES = { :green => "\033[0;32m",
8
+ :yellow => "\033[0;33m",
9
+ :red => "\033[47;31m",
10
+ :reset => "\033[0m" }
11
+
12
+ def info(message)
13
+ emit(:message => message, :color => :green)
14
+ end
15
+
16
+ def warn(message)
17
+ emit(:message => message, :color => :yellow)
18
+ end
19
+
20
+ def error(message)
21
+ emit(:message => message, :color => :red)
22
+ end
23
+
24
+ def emit(opts={})
25
+ color = opts[:color]
26
+ message = opts[:message]
27
+ print ESCAPES[color]
28
+ print message
29
+ print ESCAPES[:reset]
30
+ print "\n"
31
+ end
32
+ end
33
+
34
+ # Thor's default stack trace on errors is ugly - make it pretty.
35
+ class Thor
36
+ class << self
37
+ def handle_argument_error(task, error)
38
+ puts "#{task.name.inspect} was called incorrectly. Call as #{task.formatted_usage(self, banner_base == "thor").inspect}."
39
+ exit 1
40
+ end
41
+ end
42
+ end
43
+
44
+
45
+ class Rump < Thor
46
+ include Logging
47
+
48
+ def initialize
49
+ super
50
+ @root = Pathname.new(Dir.getwd)
51
+ @install_root = Pathname.new(File.expand_path(File.join(File.dirname(__FILE__))))
52
+ end
53
+
54
+ desc "clone <repository> [directory]", "clone a Git repository of Puppet manifests"
55
+ def clone(repository, directory=nil)
56
+ abort_unless_git_installed
57
+ directory ||= File.basename(repository.split('/').last, '.git')
58
+ command = "git clone -q #{repository} #{directory}"
59
+ system(command)
60
+
61
+ # A cloned repo may have submodules - automatically initialise them.
62
+ if File.exists?(File.join(directory, '.gitmodules'))
63
+ Dir.chdir(directory) do
64
+ system("git submodule init")
65
+ system("git submodule update")
66
+ end
67
+ end
68
+ end
69
+
70
+ desc "go [puppet arguments]", "do a local Puppet run"
71
+ def go(*puppet_args)
72
+ if ENV['USER'] != "root"
73
+ warn "You should probably be root when running this! Proceeding anyway..."
74
+ end
75
+
76
+ args = []
77
+ if has_frozen_components?
78
+ args << "ruby"
79
+ Dir.glob("#{@root.join('vendor')}/*").each do |dir|
80
+ args << "-I #{@root.join('vendor', dir, 'lib')}"
81
+ end
82
+ args << "#{@root.join('vendor', 'puppet', 'bin', 'puppet')}"
83
+ info "Using frozen Puppet from #{@root.join('vendor', 'puppet')}."
84
+ else
85
+ abort_unless_puppet_installed(:message => "Please either install it on your system or freeze it with 'rump freeze'")
86
+ args << "puppet"
87
+ end
88
+ args << "--modulepath #{@root.join('modules')}"
89
+ args << "--confdir #{@root.join('etc')}" unless puppet_args.include?("--confdir")
90
+ args << "--vardir #{@root.join('var')}" unless puppet_args.include?("--vardir")
91
+ args << "#{@root.join('manifests', 'site.pp')}"
92
+
93
+ args += puppet_args
94
+
95
+ command = args.join(' ')
96
+ puts command if args.include?("--debug")
97
+ system(command) ? exit(0) : exit(2)
98
+ end
99
+
100
+ desc "freeze [repository, project]", "freeze Puppet into your manifests repository"
101
+ def freeze(*args)
102
+ abort_unless_git_installed
103
+
104
+ commands = []
105
+ if args.size >= 2
106
+ project = args[0]
107
+ repository = args[1]
108
+ commands << { :command => "git submodule add #{repository} #{@root.join('vendor', project)}" }
109
+ if args.detect { |arg| arg =~ /^--release\=(.+)/ }
110
+ version = $1
111
+ commands << { :command => "git checkout -b #{version} #{version}", :directory => @root.join('vendor', project) }
112
+ end
113
+ commands << { :command => "git commit --quiet -am 'Froze in #{repository} as a submodule'" }
114
+ else
115
+ commands << { :command => "git submodule add git://github.com/puppetlabs/puppet.git #{@root.join('vendor', 'puppet')}" }
116
+ commands << { :command => "git submodule add git://github.com/puppetlabs/facter.git #{@root.join('vendor', 'facter')}" }
117
+ commands << { :command => "git commit --quiet -am 'Froze in Puppet + Facter as submodules'" }
118
+ end
119
+
120
+ commands.each do |attrs|
121
+ dir = attrs[:directory] || @root
122
+ Dir.chdir(dir) do
123
+ exit(2) unless system(attrs[:command])
124
+ end
125
+ end
126
+
127
+ info "Freezing complete."
128
+ end
129
+
130
+ desc "scaffold <project>", "generate scaffolding for a repository of Puppet manifests"
131
+ def scaffold(project)
132
+ [ @root + project,
133
+ @root + project + 'manifests',
134
+ @root + project + 'modules',
135
+ @root + project + 'var/reports',
136
+ @root + project + 'vendor' ].each do |directory|
137
+ FileUtils.mkdir_p(directory)
138
+ end
139
+
140
+ File.open(@root.join(project, 'README.md'), 'w') do |f|
141
+ f << <<-README.gsub(/^ {8}/, '')
142
+ #{project} manifests
143
+ #{"=" * project.size}==========
144
+
145
+ modules/ <= Puppet modules
146
+ manifests/ <= Puppet nodes
147
+ vendor/ <= frozen Puppet + Facter
148
+
149
+ Running Puppet with Rump
150
+ ------------------------
151
+
152
+ From within this directory, run:
153
+
154
+ rump go
155
+
156
+ You can pass options to Puppet after the 'go':
157
+
158
+ rump go --debug --test
159
+
160
+ Freezing Puppet
161
+ ---------------
162
+
163
+ Firstly, you need to create a git repository:
164
+
165
+ git init
166
+
167
+ Now you can freeze Puppet:
168
+
169
+ rump freeze
170
+
171
+ Once Rump has frozen Puppet, commit the changes:
172
+
173
+ git commit -m 'added facter + puppet submodules' .
174
+
175
+ Now Rump will use the frozen Puppet when you run 'rump go'.
176
+
177
+ README
178
+ end
179
+ end
180
+
181
+ desc "init <project>", "initialise a repo of scaffolded Puppet manifests"
182
+ def init(project)
183
+ scaffold(project)
184
+ repo_path = @root.join(project)
185
+ template_path = @install_root.join('generators', 'git')
186
+
187
+ Dir.chdir(repo_path) do
188
+ commands = [ "git init --quiet --template=#{template_path}",
189
+ "git add .",
190
+ "git commit --quiet -am 'Initial commit.'" ]
191
+ commands.each do |command|
192
+ system(command)
193
+ end
194
+ end
195
+
196
+ info "Your new Rump project has been initialised in #{repo_path}"
197
+ end
198
+
199
+ desc "whoami [rfc2822-address]", "set the current commit author"
200
+ def whoami(address=nil)
201
+ # getter
202
+ if address
203
+ name = address[/^(.+)\s+</, 1]
204
+ email = address[/<(.+)>$/, 1]
205
+
206
+ unless name && email
207
+ abort("Supplied address isn't a valid rfc2822 email address")
208
+ end
209
+
210
+ system("git config user.name '#{name}'")
211
+ system("git config user.email '#{email}'")
212
+ # setter
213
+ else
214
+ name = `git config user.name`.strip
215
+ email = `git config user.email`.strip
216
+
217
+ if name.empty? || email.empty?
218
+ warn "You don't have a name or email set."
219
+ else
220
+ puts "#{name} <#{email}>"
221
+ end
222
+ end
223
+ end
224
+
225
+ private
226
+ def has_frozen_components?
227
+ vendored = Dir.glob("#{@root.join('vendor')}/*").map {|v| v.split('/').last}
228
+ vendored.include?("puppet") && vendored.include?("facter")
229
+ end
230
+
231
+ # helper + abortive methods
232
+ %w(puppet git).each do |bin|
233
+ class_eval <<-METHOD, __FILE__, __LINE__
234
+ no_tasks do
235
+ def #{bin}_installed?
236
+ `which #{bin}` =~ /#{bin}$/ ? true : false
237
+ end
238
+
239
+ def abort_unless_#{bin}_installed(opts={})
240
+ unless #{bin}_installed?
241
+ error "You don't have #{bin.capitalize} installed!"
242
+ error opts[:message] || "Please install it on your system."
243
+ exit 3
244
+ end
245
+ end
246
+ end
247
+ METHOD
248
+ end
249
+
250
+ end
251
+