blimpy 0.5.1 → 0.6.0
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/.gitignore +2 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/Rakefile +11 -11
- data/cucumber.yml +7 -0
- data/features/cli/version.feature +8 -0
- data/features/liveries.feature +28 -2
- data/features/step_definitions/cli_steps.rb +4 -0
- data/features/step_definitions/liveries_steps.rb +19 -0
- data/features/support/env.rb +13 -6
- data/lib/blimpy.rb +21 -1
- data/lib/blimpy/box.rb +15 -45
- data/lib/blimpy/boxes/aws.rb +2 -2
- data/lib/blimpy/cli.rb +12 -10
- data/lib/blimpy/livery.rb +4 -1
- data/lib/blimpy/livery/base.rb +59 -0
- data/lib/blimpy/livery/cwd.rb +33 -0
- data/lib/blimpy/livery/puppet.rb +64 -0
- data/lib/blimpy/version.rb +1 -1
- data/scripts/puppet.sh +0 -2
- data/spec/blimpy/box_spec.rb +50 -0
- data/spec/blimpy/livery/base_spec.rb +21 -0
- data/spec/blimpy/livery/cwd_spec.rb +7 -0
- data/spec/blimpy/livery/puppet_spec.rb +33 -0
- data/spec/blimpy_spec.rb +54 -0
- data/spec/spec_helper.rb +3 -0
- metadata +24 -13
- data/lib/blimpy/engine.rb +0 -30
- data/spec/blimpy/engine_spec.rb +0 -57
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -50,8 +50,8 @@ Here's an example Blimpfile:
|
|
50
50
|
fleet.add(:aws) do |ship|
|
51
51
|
ship.name = 'rails-app'
|
52
52
|
ship.ports = [22, 80, 8080] # [Optional] Create a security group with these ports open
|
53
|
-
ship.image_id = 'ami-
|
54
|
-
ship.livery =
|
53
|
+
ship.image_id = 'ami-4438b474' # [Optional] defaults to Ubuntu 12.04 64-bit
|
54
|
+
ship.livery = Blimpy::Livery::CWD # [Optional]
|
55
55
|
ship.group = 'Simple' # [Optional] The name of the desired Security Group
|
56
56
|
ship.region = 'us-west-1' # [Optional] defaults to us-west-2
|
57
57
|
ship.username = 'ubuntu' # [Optional] SSH username, defaults to "ubuntu" for AWS machines
|
data/Rakefile
CHANGED
@@ -9,28 +9,28 @@ RSpec::Core::RakeTask.new('spec') do |t|
|
|
9
9
|
end
|
10
10
|
|
11
11
|
|
12
|
-
|
13
|
-
cucumber_opts = '--color --format progress --tags ~@wip'
|
12
|
+
Cucumber::Rake::Task.new('cucumber')
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
namespace :cucumber do
|
15
|
+
Cucumber::Rake::Task.new('aws') do |t|
|
16
|
+
t.cucumber_opts = '-p aws'
|
17
17
|
end
|
18
18
|
|
19
|
-
Cucumber::Rake::Task.new('
|
20
|
-
t.cucumber_opts =
|
19
|
+
Cucumber::Rake::Task.new('openstack') do |t|
|
20
|
+
t.cucumber_opts = '-p openstack'
|
21
21
|
end
|
22
22
|
|
23
|
-
Cucumber::Rake::Task.new('
|
24
|
-
t.cucumber_opts =
|
23
|
+
Cucumber::Rake::Task.new('wip') do |t|
|
24
|
+
t.cucumber_opts = '-p wip'
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
desc 'Run the basic test suite'
|
29
|
-
task :test => [
|
29
|
+
task :test => ['spec', 'cucumber']
|
30
30
|
|
31
31
|
namespace :test do
|
32
|
-
desc 'Run all the tests, including the slow integration tests'
|
33
|
-
task :all => [
|
32
|
+
desc 'Run all the tests, including the slow (AWS-based) integration tests'
|
33
|
+
task :all => ['spec', 'cucumber', 'cucumber:aws']
|
34
34
|
end
|
35
35
|
|
36
36
|
|
data/cucumber.yml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<%
|
2
|
+
opts = "--color --format progress --format junit --out features/reports --format html --out features/report.html"
|
3
|
+
%>
|
4
|
+
default: <%= opts %> --tags ~@wip --tags ~@slow
|
5
|
+
aws: <%= opts %> --tags ~@wip --tags @slow --tags ~@openstack
|
6
|
+
openstack: <%= opts %> --tags ~@wip --tags @openstack
|
7
|
+
wip: <%= opts %> --tags @wip
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Feature: Expose the current version to the user
|
2
|
+
As a user
|
3
|
+
I want to be able to check the blimpy version
|
4
|
+
So that I can tell if I should update or not
|
5
|
+
|
6
|
+
Scenario: Simple version check
|
7
|
+
When I run `blimpy version`
|
8
|
+
Then the output should contain the current Blimpy version
|
data/features/liveries.feature
CHANGED
@@ -4,6 +4,32 @@ Feature: Craft machines based on a livery
|
|
4
4
|
When I specify a specific livery then that livery should provision
|
5
5
|
the host the way I would expect it to.
|
6
6
|
|
7
|
+
Scenario: Using a configuration-less livery
|
8
|
+
Given the following Blimpfile contents:
|
9
|
+
"""
|
10
|
+
Blimpy.fleet do |f|
|
11
|
+
f.add(:aws) do |ship|
|
12
|
+
ship.name = 'cucumber-livery'
|
13
|
+
ship.livery = Blimpy::Livery::CWD
|
14
|
+
end
|
15
|
+
end
|
16
|
+
"""
|
17
|
+
When I evaluate the Blimpfile
|
18
|
+
Then the CWD livery should be set up
|
7
19
|
|
8
|
-
|
9
|
-
|
20
|
+
Scenario: Configuration-less liveries
|
21
|
+
Given the following Blimpfile contents:
|
22
|
+
"""
|
23
|
+
Blimpy.fleet do |f|
|
24
|
+
f.add(:aws) do |ship|
|
25
|
+
ship.name = 'cucumber-livery'
|
26
|
+
ship.livery = Blimpy::Livery::Puppet.configure do |p|
|
27
|
+
p.module_path = './modules'
|
28
|
+
p.manifest_path = './test/site.pp'
|
29
|
+
p.options = '--verbose'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
"""
|
34
|
+
When I evaluate the Blimpfile
|
35
|
+
Then the Puppet livery should be correctly configured
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Given /^the following Blimpfile contents:$/ do |buffer|
|
2
|
+
@blimpfile = buffer
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I evaluate the Blimpfile$/ do
|
6
|
+
@blimpfile.should_not be_nil
|
7
|
+
@fleet = eval(@blimpfile)
|
8
|
+
end
|
9
|
+
|
10
|
+
Then /^the CWD livery should be set up$/ do
|
11
|
+
@fleet.should_not be_nil
|
12
|
+
@fleet.ships.first.livery.should == Blimpy::Livery::CWD
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^the Puppet livery should be correctly configured$/ do
|
16
|
+
@fleet.should_not be_nil
|
17
|
+
@fleet.ships.first.livery.should be_instance_of(Blimpy::Livery::Puppet)
|
18
|
+
end
|
19
|
+
|
data/features/support/env.rb
CHANGED
@@ -1,19 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'aruba/cucumber'
|
2
3
|
require 'fileutils'
|
4
|
+
require 'ruby-debug'
|
3
5
|
require 'temp_dir'
|
4
6
|
|
5
7
|
|
6
8
|
# Pull in my gem working directory bin directory
|
7
9
|
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
8
10
|
|
11
|
+
$:.unshift(File.expand_path(File.dirname(__FILE__) + "/../../lib"))
|
12
|
+
require 'blimpy'
|
13
|
+
require 'blimpy/livery'
|
9
14
|
|
10
|
-
module
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
+
module Blimpy
|
16
|
+
module Cucumber
|
17
|
+
def create_blimpfile(string)
|
18
|
+
path = File.join(@tempdir, 'Blimpfile')
|
19
|
+
File.open(path, 'w') do |f|
|
20
|
+
f.write(string)
|
21
|
+
end
|
15
22
|
end
|
16
23
|
end
|
17
24
|
end
|
18
25
|
|
19
|
-
World(
|
26
|
+
World(Blimpy::Cucumber)
|
data/lib/blimpy.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'fog/core'
|
3
|
+
require 'fog/compute'
|
4
|
+
|
1
5
|
require 'blimpy/box'
|
2
|
-
require 'blimpy/engine'
|
3
6
|
require 'blimpy/fleet'
|
4
7
|
require 'blimpy/version'
|
5
8
|
|
@@ -13,6 +16,22 @@ module Blimpy
|
|
13
16
|
fleet
|
14
17
|
end
|
15
18
|
|
19
|
+
def self.load_file(file_content)
|
20
|
+
if file_content.nil? || file_content.empty?
|
21
|
+
raise InvalidBlimpFileError, 'File appears empty'
|
22
|
+
end
|
23
|
+
|
24
|
+
begin
|
25
|
+
fleet = eval(file_content)
|
26
|
+
if fleet and !(fleet.instance_of? Blimpy::Fleet)
|
27
|
+
raise Exception, 'File does not create a Fleet'
|
28
|
+
end
|
29
|
+
rescue Exception => e
|
30
|
+
raise InvalidBlimpFileError, e.to_s
|
31
|
+
end
|
32
|
+
fleet
|
33
|
+
end
|
34
|
+
|
16
35
|
class UnknownError < Exception
|
17
36
|
end
|
18
37
|
class InvalidBlimpFileError < Exception
|
@@ -27,4 +46,5 @@ module Blimpy
|
|
27
46
|
end
|
28
47
|
class UnsupportedFeatureException < Exception
|
29
48
|
end
|
49
|
+
class InvalidLiveryException < Exception; end;
|
30
50
|
end
|
data/lib/blimpy/box.rb
CHANGED
@@ -75,10 +75,16 @@ module Blimpy
|
|
75
75
|
|
76
76
|
def bootstrap
|
77
77
|
@exec_commands = false
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
if @livery.nil?
|
79
|
+
return
|
80
|
+
end
|
81
|
+
|
82
|
+
if @livery.respond_to? :new
|
83
|
+
@livery = @livery.new
|
81
84
|
end
|
85
|
+
|
86
|
+
wait_for_sshd
|
87
|
+
bootstrap_livery
|
82
88
|
end
|
83
89
|
|
84
90
|
def stop
|
@@ -204,46 +210,14 @@ module Blimpy
|
|
204
210
|
end
|
205
211
|
|
206
212
|
def bootstrap_livery
|
207
|
-
|
208
|
-
|
209
|
-
if livery == :cwd
|
210
|
-
script = File.join(Dir.pwd, '/bootstrap.sh')
|
211
|
-
end
|
212
|
-
|
213
|
-
unless File.exists?(script)
|
214
|
-
puts "Could not find `#{script}` which is needed to kick-start the machine"
|
215
|
-
return
|
216
|
-
end
|
217
|
-
|
218
|
-
unpack_command = 'true'
|
219
|
-
dir_name = File.basename(Dir.pwd)
|
220
|
-
|
221
|
-
if can_rsync?
|
222
|
-
unpack_command = "cd #{dir_name}"
|
223
|
-
run_command('rsync', '-avL',
|
224
|
-
'-e',
|
225
|
-
'ssh -o StrictHostKeyChecking=no',
|
226
|
-
'--exclude=.git',
|
227
|
-
'--exclude=.svn',
|
228
|
-
'--exclude=.blimpy.d',
|
229
|
-
'.',
|
230
|
-
"#{username}@#{dns}:#{dir_name}/")
|
231
|
-
else
|
232
|
-
puts "Remote host has no rsync(1), falling back to copying a full tarball over"
|
233
|
-
tarball = Blimpy::Livery.tarball_directory(Dir.pwd)
|
234
|
-
scp_file(tarball)
|
235
|
-
# HAXX
|
236
|
-
basename = File.basename(tarball)
|
237
|
-
ssh_into("tar -zxf #{basename} && cd #{dir_name}")
|
213
|
+
if @livery.kind_of? Symbol
|
214
|
+
raise Blimpy::InvalidLiveryException, 'Symbol liveries are unsupported!'
|
238
215
|
end
|
239
216
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
end
|
245
|
-
scp_file(script, dir_name)
|
246
|
-
ssh_into("cd #{dir_name} && #{run_sudo} ./#{File.basename(script)}")
|
217
|
+
@livery.setup_on(self)
|
218
|
+
@livery.preflight(self)
|
219
|
+
@livery.flight(self)
|
220
|
+
@livery.postflight(self)
|
247
221
|
end
|
248
222
|
|
249
223
|
def wait_for_sshd
|
@@ -273,10 +247,6 @@ module Blimpy
|
|
273
247
|
raise NotImplementedError, '#fog should be implemented by cloud-specific subclasses'
|
274
248
|
end
|
275
249
|
|
276
|
-
def can_rsync?
|
277
|
-
@can_rsync ||= ssh_into('-q', 'which rsync > /dev/null')
|
278
|
-
end
|
279
|
-
|
280
250
|
|
281
251
|
private
|
282
252
|
|
data/lib/blimpy/boxes/aws.rb
CHANGED
@@ -5,8 +5,8 @@ module Blimpy::Boxes
|
|
5
5
|
class AWS < Blimpy::Box
|
6
6
|
# Default to US West (Oregon)
|
7
7
|
DEFAULT_REGION = 'us-west-2'
|
8
|
-
# Default to
|
9
|
-
DEFAULT_IMAGE_ID = 'ami-
|
8
|
+
# Default to 12.04 64-bit
|
9
|
+
DEFAULT_IMAGE_ID = 'ami-4438b474'
|
10
10
|
|
11
11
|
def self.fog_server_for_instance(id, blimpdata)
|
12
12
|
region = blimpdata[:region] || DEFAULT_REGION
|
data/lib/blimpy/cli.rb
CHANGED
@@ -2,7 +2,6 @@ require 'rubygems'
|
|
2
2
|
require 'thor'
|
3
3
|
|
4
4
|
require 'blimpy'
|
5
|
-
require 'blimpy/engine'
|
6
5
|
|
7
6
|
module Blimpy
|
8
7
|
class CLI < Thor
|
@@ -16,18 +15,16 @@ module Blimpy
|
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
def
|
20
|
-
|
21
|
-
engine.load_file(File.open(BLIMPFILE).read)
|
22
|
-
engine
|
18
|
+
def load_blimpfile
|
19
|
+
Blimpy.load_file(File.open(BLIMPFILE).read)
|
23
20
|
end
|
24
21
|
|
25
22
|
def box_by_name(name)
|
26
|
-
|
23
|
+
fleet = load_blimpfile
|
27
24
|
box = nil
|
28
25
|
ship_id = nil
|
29
26
|
data = nil
|
30
|
-
|
27
|
+
fleet.members.each do |instance_id, instance_data|
|
31
28
|
next unless instance_data[:name] == name
|
32
29
|
ship_id = instance_id
|
33
30
|
data = instance_data
|
@@ -38,7 +35,7 @@ module Blimpy
|
|
38
35
|
return nil
|
39
36
|
end
|
40
37
|
|
41
|
-
|
38
|
+
fleet.ships.each do |ship|
|
42
39
|
next unless ship.name == name
|
43
40
|
ship.with_data(ship_id, data)
|
44
41
|
return ship
|
@@ -62,7 +59,7 @@ module Blimpy
|
|
62
59
|
def start
|
63
60
|
ensure_blimpfile
|
64
61
|
begin
|
65
|
-
|
62
|
+
fleet = load_blimpfile
|
66
63
|
rescue Blimpy::InvalidBlimpFileError => e
|
67
64
|
puts "The Blimpfile is invalid!"
|
68
65
|
exit 1
|
@@ -73,7 +70,7 @@ module Blimpy
|
|
73
70
|
exit 0
|
74
71
|
end
|
75
72
|
|
76
|
-
|
73
|
+
fleet.start
|
77
74
|
end
|
78
75
|
|
79
76
|
desc 'status', 'Show running blimps'
|
@@ -185,5 +182,10 @@ end
|
|
185
182
|
end
|
186
183
|
end
|
187
184
|
end
|
185
|
+
|
186
|
+
desc 'version', 'Print the current Blimpy gem version'
|
187
|
+
def version
|
188
|
+
puts Blimpy::VERSION
|
189
|
+
end
|
188
190
|
end
|
189
191
|
end
|
data/lib/blimpy/livery.rb
CHANGED
@@ -2,8 +2,11 @@ require 'rubygems'
|
|
2
2
|
require 'zlib'
|
3
3
|
require 'archive/tar/minitar'
|
4
4
|
|
5
|
+
require 'blimpy/livery/cwd'
|
6
|
+
require 'blimpy/livery/puppet'
|
7
|
+
|
5
8
|
module Blimpy
|
6
|
-
|
9
|
+
module Livery
|
7
10
|
def self.tarball_directory(directory)
|
8
11
|
if directory.nil? || !(File.directory? directory)
|
9
12
|
raise ArgumentError, "The argument '#{directory}' doesn't appear to be a directory"
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
module Blimpy
|
3
|
+
module Livery
|
4
|
+
class Base
|
5
|
+
def preflight(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def flight(*args)
|
9
|
+
raise NotImplementedError
|
10
|
+
end
|
11
|
+
|
12
|
+
def postflight(*args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def rsync_excludes
|
16
|
+
['.git', '.svn', '.blimpy.d']
|
17
|
+
end
|
18
|
+
|
19
|
+
def rsync_command
|
20
|
+
excludes = rsync_excludes.map { |x| "--exclude=#{x}" }
|
21
|
+
['rsync',
|
22
|
+
'-avL',
|
23
|
+
'-e',
|
24
|
+
'ssh -o StrictHostKeyChecking=no'] + excludes
|
25
|
+
end
|
26
|
+
|
27
|
+
def can_rsync?(box)
|
28
|
+
@can_rsync ||= box.ssh_into('-q', 'which rsync > /dev/null')
|
29
|
+
end
|
30
|
+
|
31
|
+
def sync_to(box)
|
32
|
+
if can_rsync? box
|
33
|
+
command = rsync_command + ['.', "#{box.username}@#{box.dns}:#{dir_name}/"]
|
34
|
+
box.run_command(*command)
|
35
|
+
else
|
36
|
+
puts "Remote host has no rsync(1), falling back to copying a full tarball over"
|
37
|
+
tarball = Blimpy::Livery.tarball_directory(livery_root)
|
38
|
+
box.scp_file(tarball)
|
39
|
+
# HAXX
|
40
|
+
basename = File.basename(tarball)
|
41
|
+
box.ssh_into("tar -zxf #{basename} && cd #{dir_name}")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def livery_root
|
47
|
+
Dir.pwd
|
48
|
+
end
|
49
|
+
|
50
|
+
def dir_name
|
51
|
+
File.basename(livery_root)
|
52
|
+
end
|
53
|
+
|
54
|
+
def setup_on(box)
|
55
|
+
sync_to(box)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'blimpy/livery/base'
|
2
|
+
|
3
|
+
module Blimpy
|
4
|
+
module Livery
|
5
|
+
class CWD < Base
|
6
|
+
def script
|
7
|
+
'bootstrap.sh'
|
8
|
+
end
|
9
|
+
|
10
|
+
def preflight(box)
|
11
|
+
box.scp_file(bootstrap_script, dir_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def use_sudo?(box)
|
15
|
+
box.username != 'root'
|
16
|
+
end
|
17
|
+
|
18
|
+
def flight(box)
|
19
|
+
run_sudo = 'sudo'
|
20
|
+
|
21
|
+
unless use_sudo?(box)
|
22
|
+
run_sudo = ''
|
23
|
+
end
|
24
|
+
|
25
|
+
box.ssh_into("cd #{dir_name} && #{run_sudo} ./#{script}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def bootstrap_script
|
29
|
+
File.join(livery_root, script)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'blimpy/livery/base'
|
2
|
+
require 'blimpy/livery/cwd'
|
3
|
+
|
4
|
+
module Blimpy
|
5
|
+
module Livery
|
6
|
+
class Puppet < CWD
|
7
|
+
attr_accessor :module_path, :manifest_path, :options
|
8
|
+
|
9
|
+
def initialize(*args)
|
10
|
+
super
|
11
|
+
@module_path = './modules'
|
12
|
+
@manifest_path = 'manifests/site.pp'
|
13
|
+
@options = '--verbose'
|
14
|
+
@puppet_exists = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def script
|
18
|
+
'puppet.sh'
|
19
|
+
end
|
20
|
+
|
21
|
+
def preflight(box)
|
22
|
+
# If we find Puppet in our default path, we don't really need to send
|
23
|
+
# the bootstrap script again
|
24
|
+
@puppet_exists = box.ssh_into('which puppet > /dev/null')
|
25
|
+
unless @puppet_exists
|
26
|
+
super(box)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def flight(box)
|
31
|
+
unless @puppet_exists
|
32
|
+
# This should get our puppet.sh bootstrap script run
|
33
|
+
super(box)
|
34
|
+
end
|
35
|
+
|
36
|
+
# At this point we should be safe to actually invoke Puppet
|
37
|
+
command = "puppet apply --modulepath=#{module_path} #{options} #{manifest_path}"
|
38
|
+
|
39
|
+
run_sudo = ''
|
40
|
+
run_sudo = 'sudo' if use_sudo?(box)
|
41
|
+
|
42
|
+
box.ssh_into("cd #{dir_name} && #{run_sudo} #{command}")
|
43
|
+
end
|
44
|
+
|
45
|
+
def postflight(box)
|
46
|
+
end
|
47
|
+
|
48
|
+
def bootstrap_script
|
49
|
+
File.expand_path(File.dirname(__FILE__) + "/../../../scripts/#{script}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.configure(&block)
|
53
|
+
if block.nil?
|
54
|
+
raise Blimpy::InvalidLiveryException, "Puppet livery must be given a block in order to configure itself"
|
55
|
+
end
|
56
|
+
instance = self.new
|
57
|
+
yield instance
|
58
|
+
instance
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/blimpy/version.rb
CHANGED
data/scripts/puppet.sh
CHANGED
data/spec/blimpy/box_spec.rb
CHANGED
@@ -144,5 +144,55 @@ describe Blimpy::Box do
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
end
|
147
|
+
|
148
|
+
describe '#bootstrap_livery' do
|
149
|
+
let(:livery) { double('Mock-livery') }
|
150
|
+
|
151
|
+
it 'should raise an error if the livery is a symbol (old style)' do
|
152
|
+
subject.livery = :deprecated
|
153
|
+
expect {
|
154
|
+
subject.bootstrap_livery
|
155
|
+
}.to raise_error(Blimpy::InvalidLiveryException)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should invoke the correct livery methods' do
|
159
|
+
subject.livery = livery
|
160
|
+
livery.should_receive(:setup_on).with(subject)
|
161
|
+
livery.should_receive(:preflight).with(subject)
|
162
|
+
livery.should_receive(:flight).with(subject)
|
163
|
+
livery.should_receive(:postflight).with(subject)
|
164
|
+
|
165
|
+
subject.bootstrap_livery
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe '#bootstrap' do
|
170
|
+
context 'when livery is not defined' do
|
171
|
+
before :each do
|
172
|
+
subject.livery = nil
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should not call any of the bootstrap methods' do
|
176
|
+
subject.should_receive(:wait_for_sshd).never
|
177
|
+
subject.should_receive(:bootstrap_livery).never
|
178
|
+
subject.bootstrap
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'when a livery is defined' do
|
183
|
+
before :each do
|
184
|
+
subject.should_receive(:wait_for_sshd)
|
185
|
+
subject.should_receive(:bootstrap_livery)
|
186
|
+
end
|
187
|
+
|
188
|
+
context 'as a class object' do
|
189
|
+
it 'should instantiate the livery' do
|
190
|
+
subject.livery = Blimpy::Livery::CWD
|
191
|
+
subject.livery.should_receive(:new)
|
192
|
+
subject.bootstrap
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
147
197
|
end
|
148
198
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blimpy/livery/base'
|
3
|
+
|
4
|
+
|
5
|
+
describe Blimpy::Livery::Base do
|
6
|
+
describe '#rsync_excludes' do
|
7
|
+
it { subject.rsync_excludes.should be_instance_of Array }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#rsync_command' do
|
11
|
+
subject { described_class.new.rsync_command }
|
12
|
+
|
13
|
+
it { expect(subject.first).to eql('rsync') }
|
14
|
+
it { should include('--exclude=.git') }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#livery_root' do
|
18
|
+
it { expect(subject.livery_root).to eql(Dir.pwd) }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'blimpy/livery/puppet'
|
4
|
+
|
5
|
+
describe Blimpy::Livery::Puppet do
|
6
|
+
context 'class methods' do
|
7
|
+
subject { described_class }
|
8
|
+
|
9
|
+
it { should respond_to :configure }
|
10
|
+
describe '#configure' do
|
11
|
+
it 'should return an instance of the Puppet livery' do
|
12
|
+
result = subject.configure { |p| }
|
13
|
+
expect(result).to be_instance_of described_class
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should raise a nice error if no configuration specified' do
|
17
|
+
expect {
|
18
|
+
subject.configure
|
19
|
+
}.to raise_error(Blimpy::InvalidLiveryException)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should yield an instance of the Puppet livery' do
|
23
|
+
yielded = nil
|
24
|
+
subject.configure { |p| yielded = p }
|
25
|
+
expect(yielded).to be_instance_of described_class
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it { should respond_to :module_path= }
|
31
|
+
it { should respond_to :manifest_path= }
|
32
|
+
it { should respond_to :options= }
|
33
|
+
end
|
data/spec/blimpy_spec.rb
CHANGED
@@ -25,4 +25,58 @@ describe Blimpy do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
describe '#load_file' do
|
30
|
+
context 'no contents' do
|
31
|
+
let(:content) { '' }
|
32
|
+
|
33
|
+
it 'should raise InvalidBlimpFileError' do
|
34
|
+
expect {
|
35
|
+
subject.load_file(content)
|
36
|
+
}.to raise_error(Blimpy::InvalidBlimpFileError)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'invalid content' do
|
42
|
+
let(:content) do
|
43
|
+
"""
|
44
|
+
this is totally invalid Ruby
|
45
|
+
"""
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should raise InvalidBlimpFileError' do
|
49
|
+
expect {
|
50
|
+
subject.load_file(content)
|
51
|
+
}.to raise_error(Blimpy::InvalidBlimpFileError)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'valid content' do
|
56
|
+
let(:content) do
|
57
|
+
"""
|
58
|
+
Blimpy.fleet do |fleet|
|
59
|
+
fleet.add(:aws) do |ship|
|
60
|
+
ship.image_id = 'ami-349b495d'
|
61
|
+
ship.livery = 'rails'
|
62
|
+
ship.group = 'Simple'
|
63
|
+
ship.region = 'us-west-1'
|
64
|
+
ship.name = 'Rails App Server'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
"""
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should create the appropriate Fleet object' do
|
71
|
+
result = subject.load_file(content)
|
72
|
+
result.should be_instance_of Blimpy::Fleet
|
73
|
+
result.ships.should be_instance_of Array
|
74
|
+
result.ships.size.should == 1
|
75
|
+
|
76
|
+
ship = result.ships.first
|
77
|
+
ship.group.should == 'Simple'
|
78
|
+
ship.name.should == 'Rails App Server'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
28
82
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blimpy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-25 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
16
|
-
requirement: &
|
16
|
+
requirement: &6595860 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *6595860
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: thor
|
27
|
-
requirement: &
|
27
|
+
requirement: &6592700 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *6592700
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: minitar
|
38
|
-
requirement: &
|
38
|
+
requirement: &6573460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *6573460
|
47
47
|
description: Blimpy is a tool for managing a fleet of machines in the CLOUD!
|
48
48
|
email:
|
49
49
|
- tyler@monkeypox.org
|
@@ -59,15 +59,18 @@ files:
|
|
59
59
|
- Rakefile
|
60
60
|
- bin/blimpy
|
61
61
|
- blimpy.gemspec
|
62
|
+
- cucumber.yml
|
62
63
|
- features/cli/init.feature
|
63
64
|
- features/cli/provision.feature
|
64
65
|
- features/cli/scp.feature
|
65
66
|
- features/cli/ssh.feature
|
66
67
|
- features/cli/start.feature
|
67
68
|
- features/cli/status.feature
|
69
|
+
- features/cli/version.feature
|
68
70
|
- features/liveries.feature
|
69
71
|
- features/openstack.feature
|
70
72
|
- features/step_definitions/cli_steps.rb
|
73
|
+
- features/step_definitions/liveries_steps.rb
|
71
74
|
- features/support/env.rb
|
72
75
|
- features/support/hooks.rb
|
73
76
|
- lib/blimpy.rb
|
@@ -76,21 +79,25 @@ files:
|
|
76
79
|
- lib/blimpy/boxes/aws.rb
|
77
80
|
- lib/blimpy/boxes/openstack.rb
|
78
81
|
- lib/blimpy/cli.rb
|
79
|
-
- lib/blimpy/engine.rb
|
80
82
|
- lib/blimpy/fleet.rb
|
81
83
|
- lib/blimpy/helpers/state.rb
|
82
84
|
- lib/blimpy/keys.rb
|
83
85
|
- lib/blimpy/livery.rb
|
86
|
+
- lib/blimpy/livery/base.rb
|
87
|
+
- lib/blimpy/livery/cwd.rb
|
88
|
+
- lib/blimpy/livery/puppet.rb
|
84
89
|
- lib/blimpy/securitygroups.rb
|
85
90
|
- lib/blimpy/version.rb
|
86
91
|
- scripts/puppet.sh
|
87
92
|
- spec/blimpy/box_spec.rb
|
88
93
|
- spec/blimpy/boxes/aws_spec.rb
|
89
94
|
- spec/blimpy/boxes/openstack_spec.rb
|
90
|
-
- spec/blimpy/engine_spec.rb
|
91
95
|
- spec/blimpy/fleet_spec.rb
|
92
96
|
- spec/blimpy/helpers/state_spec.rb
|
93
97
|
- spec/blimpy/keys_spec.rb
|
98
|
+
- spec/blimpy/livery/base_spec.rb
|
99
|
+
- spec/blimpy/livery/cwd_spec.rb
|
100
|
+
- spec/blimpy/livery/puppet_spec.rb
|
94
101
|
- spec/blimpy/livery_spec.rb
|
95
102
|
- spec/blimpy/securitygroups_spec.rb
|
96
103
|
- spec/blimpy_spec.rb
|
@@ -109,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
116
|
version: '0'
|
110
117
|
segments:
|
111
118
|
- 0
|
112
|
-
hash:
|
119
|
+
hash: 932416498555668498
|
113
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
121
|
none: false
|
115
122
|
requirements:
|
@@ -118,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
125
|
version: '0'
|
119
126
|
segments:
|
120
127
|
- 0
|
121
|
-
hash:
|
128
|
+
hash: 932416498555668498
|
122
129
|
requirements: []
|
123
130
|
rubyforge_project:
|
124
131
|
rubygems_version: 1.8.10
|
@@ -132,18 +139,22 @@ test_files:
|
|
132
139
|
- features/cli/ssh.feature
|
133
140
|
- features/cli/start.feature
|
134
141
|
- features/cli/status.feature
|
142
|
+
- features/cli/version.feature
|
135
143
|
- features/liveries.feature
|
136
144
|
- features/openstack.feature
|
137
145
|
- features/step_definitions/cli_steps.rb
|
146
|
+
- features/step_definitions/liveries_steps.rb
|
138
147
|
- features/support/env.rb
|
139
148
|
- features/support/hooks.rb
|
140
149
|
- spec/blimpy/box_spec.rb
|
141
150
|
- spec/blimpy/boxes/aws_spec.rb
|
142
151
|
- spec/blimpy/boxes/openstack_spec.rb
|
143
|
-
- spec/blimpy/engine_spec.rb
|
144
152
|
- spec/blimpy/fleet_spec.rb
|
145
153
|
- spec/blimpy/helpers/state_spec.rb
|
146
154
|
- spec/blimpy/keys_spec.rb
|
155
|
+
- spec/blimpy/livery/base_spec.rb
|
156
|
+
- spec/blimpy/livery/cwd_spec.rb
|
157
|
+
- spec/blimpy/livery/puppet_spec.rb
|
147
158
|
- spec/blimpy/livery_spec.rb
|
148
159
|
- spec/blimpy/securitygroups_spec.rb
|
149
160
|
- spec/blimpy_spec.rb
|
data/lib/blimpy/engine.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'rubygems'
|
3
|
-
require 'fog/core'
|
4
|
-
require 'fog/compute'
|
5
|
-
|
6
|
-
module Blimpy
|
7
|
-
class Engine
|
8
|
-
attr_reader :fleet
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@fleet = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def load_file(file_content)
|
15
|
-
if file_content.nil? || file_content.empty?
|
16
|
-
raise InvalidBlimpFileError, 'File appears empty'
|
17
|
-
end
|
18
|
-
|
19
|
-
begin
|
20
|
-
@fleet = eval(file_content)
|
21
|
-
if @fleet and !(@fleet.instance_of? Blimpy::Fleet)
|
22
|
-
raise Exception, 'File does not create a Fleet'
|
23
|
-
end
|
24
|
-
rescue Exception => e
|
25
|
-
raise InvalidBlimpFileError, e.to_s
|
26
|
-
end
|
27
|
-
@fleet
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/spec/blimpy/engine_spec.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Blimpy::Engine do
|
4
|
-
describe '#load_file' do
|
5
|
-
context 'no contents' do
|
6
|
-
let(:content) { '' }
|
7
|
-
|
8
|
-
it 'should raise InvalidBlimpFileError' do
|
9
|
-
expect {
|
10
|
-
subject.load_file(content)
|
11
|
-
}.to raise_error(Blimpy::InvalidBlimpFileError)
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'invalid content' do
|
17
|
-
let(:content) do
|
18
|
-
"""
|
19
|
-
this is totally invalid Ruby
|
20
|
-
"""
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should raise InvalidBlimpFileError' do
|
24
|
-
expect {
|
25
|
-
subject.load_file(content)
|
26
|
-
}.to raise_error(Blimpy::InvalidBlimpFileError)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'valid content' do
|
31
|
-
let(:content) do
|
32
|
-
"""
|
33
|
-
Blimpy.fleet do |fleet|
|
34
|
-
fleet.add(:aws) do |ship|
|
35
|
-
ship.image_id = 'ami-349b495d'
|
36
|
-
ship.livery = 'rails'
|
37
|
-
ship.group = 'Simple'
|
38
|
-
ship.region = 'us-west-1'
|
39
|
-
ship.name = 'Rails App Server'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
"""
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should create the appropriate Fleet object' do
|
46
|
-
result = subject.load_file(content)
|
47
|
-
result.should be_instance_of Blimpy::Fleet
|
48
|
-
result.ships.should be_instance_of Array
|
49
|
-
result.ships.size.should == 1
|
50
|
-
|
51
|
-
ship = result.ships.first
|
52
|
-
ship.group.should == 'Simple'
|
53
|
-
ship.name.should == 'Rails App Server'
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|