rump 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+