auser-poolparty 1.2.4 → 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/bin/cloud +8 -1
- data/bin/cloud-contract +1 -1
- data/bin/cloud-provision +0 -1
- data/bin/server-cloud-elections +9 -9
- data/bin/server-list-active +10 -17
- data/bin/server-manage-election +4 -5
- data/examples/basic.rb +5 -4
- data/examples/fairchild.rb +1 -1
- data/lib/poolparty.rb +1 -1
- data/lib/poolparty/core/hash.rb +10 -2
- data/lib/poolparty/helpers/optioner.rb +5 -5
- data/lib/poolparty/lite.rb +5 -2
- data/lib/poolparty/modules/cloud_resourcer.rb +12 -5
- data/lib/poolparty/modules/pretty_printer.rb +1 -1
- data/lib/poolparty/monitors/monitor_rack.rb +2 -2
- data/lib/poolparty/monitors/monitors/{time_monitor.rb → clock_monitor.rb} +2 -2
- data/lib/poolparty/monitors/monitors/neighborhood_monitor.rb +8 -5
- data/lib/poolparty/monitors/monitors/stats_monitor.rb +45 -29
- data/lib/poolparty/net/remoter/connections.rb +0 -1
- data/lib/poolparty/net/remoter/interactive.rb +6 -6
- data/lib/poolparty/net/remoter_base.rb +10 -2
- data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +14 -6
- data/lib/poolparty/net/remoter_bases/metavirt/metavirt.rb +1 -1
- data/lib/poolparty/plugins/apache2/apache.rb +16 -8
- data/lib/poolparty/poolparty/cloud.rb +22 -5
- data/lib/poolparty/poolparty/default.rb +21 -15
- data/lib/poolparty/poolparty/key.rb +1 -1
- data/lib/poolparty/poolparty/neighborhoods.rb +15 -4
- data/lib/poolparty/poolparty/pool.rb +1 -1
- data/lib/poolparty/poolparty/resource.rb +1 -0
- data/lib/poolparty/provision/boot_strapper.rb +10 -4
- data/lib/poolparty/provision/dr_configure.rb +9 -9
- data/lib/poolparty/schema.rb +5 -6
- data/lib/poolparty/templates/monitor.ru +1 -0
- data/spec/poolparty/core/ordered_hash_spec.rb +7 -7
- data/spec/poolparty/net/remote_instance_spec.rb +1 -1
- data/spec/poolparty/poolparty/cloud_spec.rb +18 -0
- data/spec/poolparty/poolparty/example_spec.rb +29 -9
- data/spec/poolparty/poolparty/key_spec.rb +1 -1
- data/spec/poolparty/poolparty/neighborhoods_spec.rb +1 -1
- data/tasks/poolparty.rake +2 -0
- data/vendor/gems/dslify/VERSION.yml +4 -0
- data/vendor/gems/dslify/dslify.gemspec +29 -0
- data/vendor/gems/dslify/lib/dslify.rb +1 -1
- data/vendor/gems/dslify/test/dslify_test.rb +82 -13
- data/vendor/gems/git-style-binaries/VERSION.yml +1 -1
- data/vendor/gems/git-style-binaries/doc/poolparty-binaries.screenplay +389 -20
- data/vendor/gems/git-style-binaries/git-style-binaries.gemspec +2 -2
- data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/name_resolver.rb +2 -2
- data/vendor/gems/git-style-binaries/lib/git-style-binary/parser.rb +2 -2
- metadata +5 -3
data/lib/poolparty/schema.rb
CHANGED
@@ -17,6 +17,7 @@ module PoolParty
|
|
17
17
|
JSON.parse(h).each {|k,v| self[k.to_sym] = v}
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
20
21
|
|
21
22
|
def [](k)
|
22
23
|
hsh[k]
|
@@ -53,16 +54,14 @@ module PoolParty
|
|
53
54
|
|
54
55
|
$pool_specfile = "/etc/poolparty/clouds.rb"
|
55
56
|
|
56
|
-
|
57
|
-
# TODO: Seriously, make this sexier
|
58
|
-
|
57
|
+
# TODO: Seriously, make this sexier
|
59
58
|
cld = OpenStruct.new(options)
|
60
59
|
cld.keypair = ::PoolParty::Key.new("/etc/poolparty/#{node[:keypair]}")
|
61
|
-
cld.remoter_base = remoter_base
|
60
|
+
# cld.remoter_base = PoolParty::Remote.module_eval( schema.options.remoter_base.camelcase )
|
61
|
+
cld.remote_base = PoolParty::Remote.module_eval( schema.options.remoter_base.camelcase )
|
62
62
|
cld.build_and_store_new_config_file = "/etc/poolparty/clouds.json"
|
63
63
|
cld.dependency_resolver = PoolParty.module_eval(options.dependency_resolver.split("::")[-1].camelcase).send(:new)
|
64
|
-
|
65
|
-
cld
|
64
|
+
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end
|
@@ -9,6 +9,7 @@ require "poolparty/monitors/monitor_rack"
|
|
9
9
|
app = Rack::Builder.new do
|
10
10
|
# use Rack::Reloader, 2
|
11
11
|
use Rack::ShowExceptions
|
12
|
+
use Rack::CommonLogger
|
12
13
|
# use Rack::PostBodyContentTypeParser #parses json requests to params hash
|
13
14
|
run Monitors::MonitorRack.new()
|
14
15
|
end
|
@@ -38,11 +38,11 @@ describe "Ordered Hash" do
|
|
38
38
|
@oh[:arr] = [1,2,3]
|
39
39
|
@oh.to_json.should == "{\"var1\":10,\"var2\":2,\"var3\":3,\"var4\":4,\"arr\":[1,2,3]}"
|
40
40
|
end
|
41
|
-
it "PoolParty Key" do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
JSO
|
46
|
-
|
47
|
-
end
|
41
|
+
it "PoolParty Key" #do
|
42
|
+
# @oh[:key] = [Key.new, Key.new('path/to/nowhere')]
|
43
|
+
# expected=<<JSO
|
44
|
+
# {\"var1\":10,\"var2\":2,\"var3\":3,\"var4\":4,\"key\":[{\"basename\":\"id_rsa\",\"full_filepath\": \"/etc/poolparty/id_rsa\"},{\"basename\":\"path/to/nowhere\",\"full_filepath\": \"/etc/poolparty/path/to/nowhere\"}]}
|
45
|
+
# JSO
|
46
|
+
# @oh.to_json.should == expected.strip
|
47
|
+
# end
|
48
48
|
end
|
@@ -5,7 +5,7 @@ include PoolParty::Remote
|
|
5
5
|
|
6
6
|
describe "Remote Instance" do
|
7
7
|
before(:each) do
|
8
|
-
@valid_hash = {:ip => "127.0.0.1", :name => "master", :responding => "true"}
|
8
|
+
@valid_hash = {:public_ip=>'33.44.55.66', :ip => "127.0.0.1", :name => "master", :responding => "true"}
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should have tests for the abstaract RemoteInstance class" do
|
@@ -296,6 +296,24 @@ describe "Cloud" do
|
|
296
296
|
end
|
297
297
|
end
|
298
298
|
end
|
299
|
+
|
300
|
+
describe "JSON" do
|
301
|
+
before(:each) do
|
302
|
+
pool :jason do
|
303
|
+
user "fred"
|
304
|
+
minimum_instances 10
|
305
|
+
access_key "pool_a_key"
|
306
|
+
cloud :stratus do
|
307
|
+
keypair "fake_keypair"
|
308
|
+
access_key "cloud_a_key"
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
end
|
313
|
+
it "should have to_json method" do
|
314
|
+
clouds[:stratus].to_json.class.should == String
|
315
|
+
end
|
316
|
+
end
|
299
317
|
|
300
318
|
# describe "instances" do
|
301
319
|
# before(:each) do
|
@@ -1,6 +1,26 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
require "open-uri"
|
3
3
|
|
4
|
+
# pool :application do
|
5
|
+
# instances 1..5
|
6
|
+
#
|
7
|
+
# cloud :basic_app do
|
8
|
+
# minimum_instances 3
|
9
|
+
# keypair 'front'
|
10
|
+
# image_id "ami-abc123"
|
11
|
+
# has_file :name => "/etc/motd", :content => "Welcome to your PoolParty instance"
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# cloud :basic_db do
|
15
|
+
# using :vmrun do
|
16
|
+
# vmx_hash "/path/to/vmx_file" => "192.168.248.122"
|
17
|
+
# end
|
18
|
+
# minimum_instances 1
|
19
|
+
# image_id "ami-1234bc"
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# end
|
23
|
+
|
4
24
|
describe "basic" do
|
5
25
|
before(:each) do
|
6
26
|
PoolParty.reset!
|
@@ -24,17 +44,17 @@ describe "basic" do
|
|
24
44
|
it "should have a cloud called :db" do
|
25
45
|
pools[:application].clouds[:basic_db].should_not == nil
|
26
46
|
end
|
27
|
-
it "should set the minimum_instances on the cloud
|
28
|
-
pools[:application].minimum_instances.should ==
|
29
|
-
clouds[:basic_app].minimum_instances.should ==
|
47
|
+
it "should set the minimum_instances on the cloud (overriding the pool options)" do
|
48
|
+
pools[:application].minimum_instances.should == 1
|
49
|
+
clouds[:basic_app].minimum_instances.should == 3
|
30
50
|
end
|
31
|
-
it "should set the maximum_instances on the cloud to
|
32
|
-
clouds[:basic_app].maximum_instances.should ==
|
51
|
+
it "should set the maximum_instances on the cloud to 5" do
|
52
|
+
clouds[:basic_app].maximum_instances.should == 5
|
33
53
|
end
|
34
|
-
it "should set the minimum_instances on the db cloud
|
35
|
-
clouds[:basic_db].minimum_instances.should ==
|
36
|
-
clouds[:basic_app].minimum_instances.should ==
|
37
|
-
pools[:application].minimum_instances.should ==
|
54
|
+
it "should set the minimum_instances on the db cloud " do
|
55
|
+
clouds[:basic_db].minimum_instances.should == 1
|
56
|
+
clouds[:basic_app].minimum_instances.should == 3
|
57
|
+
pools[:application].minimum_instances.should == 1
|
38
58
|
end
|
39
59
|
it "should set the parent to the pool" do
|
40
60
|
clouds[:basic_app].parent.should == pools[:application]
|
@@ -8,7 +8,7 @@ describe "Key" do
|
|
8
8
|
Key.new.filepath.should == "id_rsa"
|
9
9
|
end
|
10
10
|
it "should provide valid to_json" do
|
11
|
-
lambda {Key.new("file").to_json}.should_not raise_error end
|
11
|
+
lambda {Key.new("file").to_hash.to_json}.should_not raise_error end
|
12
12
|
describe "that exists" do
|
13
13
|
before(:each) do
|
14
14
|
@keypair = "/var/home/id_rsa"
|
@@ -41,7 +41,7 @@ describe "Neighborhoods" do
|
|
41
41
|
Neighborhoods.clump(sample_instances_list,filepath)
|
42
42
|
end
|
43
43
|
it "should load from the default properly with the first's instance's ip" do
|
44
|
-
str = "[{\"instance_id\":\"master\",\"launching_time\":\"2009/03/26 01:06:18 -0700\",\"ip\":\"127.0.0.1\"},{\"instance_id\":\"node1\",\"launching_time\":\"2009/03/26 01:06:18 -0700\",\"ip\":\"127.0.0.2\"}]"
|
44
|
+
str = "{\"instances\":[{\"instance_id\":\"master\",\"launching_time\":\"2009/03/26 01:06:18 -0700\",\"ip\":\"127.0.0.1\"},{\"instance_id\":\"node1\",\"launching_time\":\"2009/03/26 01:06:18 -0700\",\"ip\":\"127.0.0.2\"}]}"
|
45
45
|
::File.should_receive(:file?).with("/etc/poolparty/neighborhood.json").and_return true
|
46
46
|
::File.stub!(:file?).and_return false
|
47
47
|
|
data/tasks/poolparty.rake
CHANGED
@@ -11,6 +11,8 @@ task :slow_spec do
|
|
11
11
|
puts "#{stats[:failures]} total errors"
|
12
12
|
end
|
13
13
|
namespace(:poolparty) do
|
14
|
+
task :build_gem => ["poolparty:vendor:setup", "poolparty:vendor:update", :gemspec, :build]
|
15
|
+
|
14
16
|
namespace(:setup) do
|
15
17
|
desc "Generate a manifest for quicker loading times"
|
16
18
|
task :manifest do
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{dslify}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Ari Lerner"]
|
9
|
+
s.date = %q{2009-05-14}
|
10
|
+
s.email = %q{arilerner@mac.com}
|
11
|
+
s.extra_rdoc_files = ["README.rdoc", "LICENSE"]
|
12
|
+
s.files = ["README.rdoc", "VERSION.yml", "lib/dslify.rb", "test/dslify_test.rb", "test/test_helper.rb", "LICENSE"]
|
13
|
+
s.has_rdoc = true
|
14
|
+
s.homepage = %q{http://github.com/auser/dslify}
|
15
|
+
s.rdoc_options = ["--inline-source", "--charset=UTF-8"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubygems_version = %q{1.3.2}
|
18
|
+
s.summary = %q{TODO}
|
19
|
+
|
20
|
+
if s.respond_to? :specification_version then
|
21
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
22
|
+
s.specification_version = 3
|
23
|
+
|
24
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
25
|
+
else
|
26
|
+
end
|
27
|
+
else
|
28
|
+
end
|
29
|
+
end
|
@@ -68,7 +68,7 @@ module Dslify
|
|
68
68
|
def method_missing(m,*a,&block)
|
69
69
|
if m.to_s[-1..-1] == '?'
|
70
70
|
t = m.to_s.gsub(/\?/, '').to_sym
|
71
|
-
warn "DEPRECATED: Dslify will no longer support ? methods. Fix yo code
|
71
|
+
warn "DEPRECATED: Dslify will no longer support ? methods. Fix yo code.: #{m}"
|
72
72
|
respond_to?(t) && !self.send(t, *a, &block).nil?
|
73
73
|
else
|
74
74
|
super
|
@@ -26,7 +26,9 @@ class QuickieTest < Test::Unit::TestCase
|
|
26
26
|
end
|
27
27
|
it "should set and retrieve values back with an = sign" do
|
28
28
|
@q.author = ["Ari Lerner"]
|
29
|
+
@q.snobs = "Michael"
|
29
30
|
assert_equal @q.author, ["Ari Lerner"]
|
31
|
+
assert_equal @q.snobs, "Michael"
|
30
32
|
end
|
31
33
|
it "should set these values in the h Hash on the object" do
|
32
34
|
assert_raise NoMethodError do
|
@@ -43,19 +45,6 @@ class QuickieTest < Test::Unit::TestCase
|
|
43
45
|
end
|
44
46
|
assert_equal @q.author.class, Quickie
|
45
47
|
end
|
46
|
-
it "should not blow up when called with a ? at the end of the method" do
|
47
|
-
@q.set_vars_from_options({:pete => "and pete"})
|
48
|
-
assert_nothing_raised do
|
49
|
-
@q.pete?
|
50
|
-
end
|
51
|
-
end
|
52
|
-
it "should return false if the method exists" do
|
53
|
-
assert_equal @q.bobs?, false
|
54
|
-
end
|
55
|
-
it "should return true if the option is set" do
|
56
|
-
@q.gilligans_island "is a tv show"
|
57
|
-
assert @q.gilligans_island?
|
58
|
-
end
|
59
48
|
end
|
60
49
|
|
61
50
|
context "calling methods on an instance" do
|
@@ -194,4 +183,84 @@ class QuickieTest < Test::Unit::TestCase
|
|
194
183
|
# assert_equal t.taste, @bar.taste
|
195
184
|
# end
|
196
185
|
end
|
186
|
+
context "methods" do
|
187
|
+
setup do
|
188
|
+
class MrDanger
|
189
|
+
include Dslify
|
190
|
+
default_options :where_to => "The Grand Canyon"
|
191
|
+
def initialize(o={})
|
192
|
+
set_vars_from_options(o)
|
193
|
+
end
|
194
|
+
def where_to(*a)
|
195
|
+
"New York City"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
should "not override the method where_to" do
|
201
|
+
assert_equal MrDanger.new.where_to, "New York City"
|
202
|
+
end
|
203
|
+
should "not override the method where_to when called with set_vars_from_options" do
|
204
|
+
assert_equal MrDanger.new(:where_to => "Bank of America").where_to, "New York City"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context "when calling with a block" do
|
209
|
+
setup do
|
210
|
+
class ToddTheSquare
|
211
|
+
include Dslify
|
212
|
+
default_options :provider => :vmrun, :t => :nothing
|
213
|
+
|
214
|
+
def provider(&block)
|
215
|
+
instance_eval &block if block
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
should "should not evaluate the block" do
|
221
|
+
tts = ToddTheSquare.new
|
222
|
+
assert_equal tts.t, :nothing
|
223
|
+
end
|
224
|
+
|
225
|
+
should "should evaluate the block" do
|
226
|
+
tts = ToddTheSquare.new
|
227
|
+
tts.provider do
|
228
|
+
self.t = :something
|
229
|
+
end
|
230
|
+
assert_equal tts.t, :something
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context "set_vars_from_options" do
|
235
|
+
setup do
|
236
|
+
class VarrrrrrrrMatey
|
237
|
+
include Dslify
|
238
|
+
default_options :say => "hello", :to => "world"
|
239
|
+
|
240
|
+
def initialize(o={}, &block)
|
241
|
+
set_vars_from_options(o)
|
242
|
+
instance_eval &block if block
|
243
|
+
end
|
244
|
+
|
245
|
+
def to_s
|
246
|
+
say + " " + to
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
should "set the vars on the options with no options" do
|
252
|
+
assert_equal VarrrrrrrrMatey.new.to_s, "hello world"
|
253
|
+
end
|
254
|
+
should "update the options if called with options" do
|
255
|
+
assert_equal VarrrrrrrrMatey.new({:say => "goodbye"}).to_s, "goodbye world"
|
256
|
+
end
|
257
|
+
should "update the options if called with block" do
|
258
|
+
@v = VarrrrrrrrMatey.new do
|
259
|
+
to "me"
|
260
|
+
end
|
261
|
+
assert_equal @v.to_s, "hello me"
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
|
197
266
|
end
|
@@ -8,38 +8,407 @@
|
|
8
8
|
plugin "terminal"
|
9
9
|
plugin "keystack"
|
10
10
|
|
11
|
-
|
11
|
+
def cleanup
|
12
|
+
FileUtils.rm_rf(File.expand_path("~/poolparty-gsb-test/bin"))
|
13
|
+
end
|
14
|
+
|
15
|
+
cleanup
|
16
|
+
|
17
|
+
perform "Introduction" do
|
18
|
+
launch "Terminal", at(10, 10, 800, 600)
|
19
|
+
pause 1
|
20
|
+
|
21
|
+
say <<-eos
|
22
|
+
Hey, welcome to the git-style-binaries screencast.
|
23
|
+
First, lets talk a little about what a git-style-binary even is.
|
24
|
+
eos
|
25
|
+
end
|
26
|
+
|
27
|
+
cli "cd #{ENV['POOLPARTY_SRC']}"
|
28
|
+
|
29
|
+
perform "Describing Git Binaries" do
|
30
|
+
pause 1
|
31
|
+
while_saying "as you can see here, git has over one hundred binaries that all perform various functions." do
|
32
|
+
type "git-"
|
33
|
+
pause 1
|
34
|
+
keystroke_literal('tab')
|
35
|
+
keystroke_literal('tab')
|
36
|
+
type "y"
|
37
|
+
pause 2
|
38
|
+
type " "
|
39
|
+
keystroke_using('u', :control)
|
40
|
+
end
|
41
|
+
|
42
|
+
while_saying "for instance, we have. git-add for adding files. git-status for
|
43
|
+
getting the status of our repo and so on" do
|
44
|
+
cli "git-add"
|
45
|
+
pause 2
|
46
|
+
cli "git-status"
|
47
|
+
end
|
48
|
+
|
49
|
+
while_saying "one of the nice things about the git-style-binaries is that you
|
50
|
+
can choose to call the command with or without the dash.. so for instance, i
|
51
|
+
can call either 'git-add' or 'git add'." do
|
52
|
+
cli "git-add"
|
53
|
+
pause 2
|
54
|
+
cli "git add"
|
55
|
+
end
|
56
|
+
|
57
|
+
perform "Describe Help" do
|
58
|
+
while_saying "the help in git is also very handy. for instance, if you call
|
59
|
+
git help it will give you a listing of many of the available subcommands" do
|
60
|
+
cli "git help"
|
61
|
+
move to(44, 94)
|
62
|
+
move to(133, 87)
|
63
|
+
move to(127, 346)
|
64
|
+
move to(41, 343)
|
65
|
+
move to(44, 94)
|
66
|
+
end
|
67
|
+
|
68
|
+
while_saying "you can also ask for help about any of the subcommands. if we
|
69
|
+
want to get help on 'git-add', we simply type 'git help add'" do
|
70
|
+
cli "git help add"
|
71
|
+
type 'q'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
pause 2
|
76
|
+
|
77
|
+
perform "Describe Validation" do
|
78
|
+
while_saying "git also performs option validation, as you would expect. for
|
79
|
+
instance, if we provide an invalid option such as 'asdf' we get an error" do
|
80
|
+
cli "git add --asdf"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
while_saying "the goal of the git-style-binaries ruby gem is to bring this
|
85
|
+
functionality to your own custom binaries in an easy-to-use way. so lets take
|
86
|
+
a look at an example"
|
87
|
+
pause 2
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
perform "Introducing PoolParty" do
|
93
|
+
while_saying "we're going to be using PoolParty's binaries as an example on
|
94
|
+
how to build git-style-binaries using this gem" do
|
95
|
+
end
|
12
96
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
#
|
97
|
+
while_saying "just in case you're not familiar with poolparty, its a cloud
|
98
|
+
management system by Ari Lerner. It allows you to manage your cloud using ruby
|
99
|
+
code and plugins rather than, say, folders of bash scripts." do
|
100
|
+
# launch "Safari", at(10, 10, 800, 600)
|
101
|
+
# url "http://www.poolpartyrb.com" # ?
|
102
|
+
# pause 3
|
103
|
+
# keystroke_literal_using('tab', :command) # go back to terminal
|
104
|
+
end
|
105
|
+
|
106
|
+
while_saying "in poolparty the main binary is 'cloud'. we can do cloud help to see all of the available subcommands." do
|
107
|
+
cli "cloud help"
|
108
|
+
end
|
109
|
+
|
110
|
+
while_saying "as you can see here we have 'cloud-start', for starting our
|
111
|
+
cloud, 'cloud configure' to reconfigure our cloud after we change something,
|
112
|
+
even cloud-ssh, to ssh directly into a node of our cloud." do
|
113
|
+
pause 2
|
114
|
+
move to(86, 400)
|
115
|
+
pause 2
|
116
|
+
move to(72, 380)
|
117
|
+
end
|
118
|
+
|
119
|
+
pause 2
|
120
|
+
type "q"
|
121
|
+
|
122
|
+
while_saying "what i'd like to do is, rather than just opening up the existing
|
123
|
+
binaries, Im going to build poolparty-like binaries from the ground up. this
|
124
|
+
way you can see how to do this on your own."
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
perform "entering poolpary" do
|
129
|
+
cli "cd ~"
|
130
|
+
cli "mkdir -p poolparty-gsb-test/bin"
|
131
|
+
cli "cd poolparty-gsb-test"
|
132
|
+
end
|
133
|
+
|
134
|
+
perform "creating primary" do
|
135
|
+
while_saying "first we need to create our *primary* binary." do
|
136
|
+
cli "vim bin/cloud"
|
137
|
+
pause 2
|
138
|
+
type_pre <<-eof
|
139
|
+
i#!/usr/bin/env ruby
|
140
|
+
require 'git-style-binary/command'
|
141
|
+
eof
|
142
|
+
cli ":w"
|
143
|
+
cli ":e"
|
144
|
+
end
|
145
|
+
|
146
|
+
while_saying "and thats it! thats all we need if we want the default functionality" do
|
147
|
+
cli ":x"
|
148
|
+
end
|
149
|
+
end
|
17
150
|
|
18
151
|
pause 1
|
19
|
-
|
20
|
-
|
152
|
+
|
153
|
+
# opt :cloud_name, "Name of the working cloud", :type => String, :default => nil
|
154
|
+
|
155
|
+
perform "create cloud-start" do
|
156
|
+
while_saying "now lets create cloud-start.
|
157
|
+
we start by requiring git-style-binary/command, just like last time.
|
158
|
+
now we open up a #command block.
|
159
|
+
specify a version.
|
160
|
+
specify a banner and a short description.
|
161
|
+
and we put what we want to do in the 'run' block." do
|
162
|
+
|
163
|
+
cli "vim bin/cloud-start"
|
21
164
|
pause 1
|
22
|
-
|
23
|
-
|
24
|
-
|
165
|
+
vim_insert <<-eof
|
166
|
+
#!/usr/bin/env ruby
|
167
|
+
eof
|
168
|
+
cli ":w"
|
169
|
+
cli ":e"
|
170
|
+
cli ":set paste" # no auto indending
|
171
|
+
type "j"
|
172
|
+
|
173
|
+
vim_insert <<-eof
|
174
|
+
require 'git-style-binary/command'
|
175
|
+
|
176
|
+
GitStyleBinary.command do
|
177
|
+
version "PoolParty cloud-start 0.0.1"
|
178
|
+
banner <<-\EOS
|
179
|
+
Usage: cloud-start \#{all_options_string}
|
180
|
+
|
181
|
+
EOS
|
182
|
+
eof
|
183
|
+
|
184
|
+
vim_insert <<-eof
|
185
|
+
short_desc "List the clouds"
|
186
|
+
|
187
|
+
run do |command|
|
188
|
+
puts "Options: \#{command.opts.inspect}"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
eof
|
192
|
+
end
|
193
|
+
|
194
|
+
while_saying "the run block yields a command object. commands has an 'opts' attribute accessor, or you can just use brackets on 'command'" do
|
195
|
+
type ":0
|
196
|
+
cli ":w"
|
197
|
+
end
|
198
|
+
|
199
|
+
while_saying "you can add more options by calling 'opt' in the command block" do
|
200
|
+
vim_line_after("short_")
|
201
|
+
vim_insert " opt :name, \"the name of the cloud you are starting\", :type => String,
|
25
202
|
:default => \"default\""
|
203
|
+
end
|
204
|
+
|
205
|
+
while_saying "git-style-binaries uses the gem trollop for the option parsing.
|
206
|
+
trollop allows you to easily add validations and type conversions to options.
|
207
|
+
see their website for information on the syntax" do
|
208
|
+
end
|
209
|
+
# cli ":x"
|
210
|
+
pause 2
|
211
|
+
end
|
212
|
+
|
213
|
+
perform "running cloud-start" do
|
214
|
+
while_saying "now lets run cloud-start -h" do
|
215
|
+
keystroke_using('t', :command) # go back to terminal
|
216
|
+
pause 1
|
217
|
+
cli "cd poolparty-gsb-test"
|
218
|
+
cli "chmod +x bin/*"
|
219
|
+
cli "./bin/cloud-start -h"
|
220
|
+
end
|
221
|
+
pause 2
|
222
|
+
while_saying "notice a few things here. we've got automatic coloring, a list of all of our flags, and a list of all of our options. trollop has even automatically created the short flags for us" do
|
223
|
+
move to(36, 82)
|
224
|
+
pause 1
|
225
|
+
move to(123, 100)
|
226
|
+
pause 1
|
227
|
+
move to(279, 200)
|
228
|
+
pause 1
|
229
|
+
move to(96, 261)
|
230
|
+
move to(80, 521)
|
231
|
+
move to(96, 261)
|
232
|
+
pause 1
|
233
|
+
move to(53, 255)
|
234
|
+
move to(71, 259)
|
235
|
+
pause 1
|
236
|
+
move to(53, 255)
|
237
|
+
end
|
238
|
+
pause 3
|
239
|
+
type "q"
|
240
|
+
keystroke_using('w', :command) # go back to terminal
|
26
241
|
pause 2
|
27
|
-
type " "
|
28
|
-
keystroke_using('u', :control)
|
29
242
|
end
|
30
243
|
|
31
|
-
|
32
|
-
|
244
|
+
|
245
|
+
perform "creating cloud-ssh" do
|
246
|
+
|
247
|
+
while_saying "i'd like to show you a few more features of gsb. first lets create one more simple binary - cloud ssh" do
|
248
|
+
cli ":x"
|
249
|
+
pause 1
|
250
|
+
|
251
|
+
cli "vim bin/cloud-ssh"
|
252
|
+
pause 1
|
253
|
+
vim_insert <<-eof
|
254
|
+
#!/usr/bin/env ruby
|
255
|
+
eof
|
256
|
+
cli ":w"
|
257
|
+
cli ":e"
|
258
|
+
cli ":set paste" # no auto indending
|
259
|
+
type "j"
|
260
|
+
|
261
|
+
vim_insert <<-eof
|
262
|
+
require 'git-style-binary/command'
|
263
|
+
|
264
|
+
GitStyleBinary.command do
|
265
|
+
version "PoolParty cloud-ssh 0.0.1"
|
266
|
+
banner <<-\EOS
|
267
|
+
Usage: cloud-ssh \#{all_options_string}
|
268
|
+
|
269
|
+
EOS
|
270
|
+
eof
|
271
|
+
|
272
|
+
vim_insert <<-eof
|
273
|
+
short_desc "ssh into your cloud"
|
274
|
+
opt :name, "name of the cloud", :type => String
|
275
|
+
|
276
|
+
run do |command|
|
277
|
+
puts "you are sshing into \#{command[:name]}!"
|
278
|
+
end
|
279
|
+
end
|
280
|
+
eof
|
281
|
+
pause 1
|
282
|
+
cli ":x"
|
33
283
|
pause 2
|
34
|
-
|
284
|
+
end
|
285
|
+
|
35
286
|
end
|
36
287
|
|
37
|
-
|
38
|
-
|
288
|
+
perform "show help with both binaries" do
|
289
|
+
|
290
|
+
while_saying "now we have two binaries, cloud-start and cloud-ssh" do
|
291
|
+
cli "tree ."
|
292
|
+
end
|
293
|
+
|
294
|
+
while_saying "one of the cool things about gsb is that it will automatically pick up these files when you run the help commands" do
|
295
|
+
cli "./bin/cloud -h"
|
296
|
+
end
|
297
|
+
|
298
|
+
while_saying "see, here we have both cloud-start and cloud-ssh, along with their short descriptions, which are automatically loaded from their respective files" do
|
299
|
+
pause 0.5
|
300
|
+
shake 46, 401
|
301
|
+
pause 0.5
|
302
|
+
shake 49, 338
|
303
|
+
pause 0.5
|
304
|
+
move to(88, 291)
|
305
|
+
move to(354, 297)
|
306
|
+
pause 1
|
307
|
+
cli 'q'
|
308
|
+
end
|
309
|
+
|
39
310
|
end
|
40
311
|
|
41
|
-
|
312
|
+
perform "modify cloud primary" do
|
42
313
|
|
43
|
-
while_saying "
|
44
|
-
|
314
|
+
while_saying "notice that if we do cloud help start. we see that it already
|
315
|
+
has a number of options. these options come from the default binary options." do
|
316
|
+
cli "./bin/cloud help start"
|
317
|
+
pause 1
|
318
|
+
move to(123, 266)
|
319
|
+
pause 1
|
320
|
+
shake 116, 431
|
321
|
+
pause 1
|
322
|
+
move to(99, 515)
|
323
|
+
type 'q'
|
324
|
+
end
|
325
|
+
|
326
|
+
while_saying "gsb's get their options from three places 1) the default in code 2) the primary and 3) the subcommand itself" do
|
327
|
+
type "1) default options (in code)"
|
328
|
+
pause 0.5
|
329
|
+
keystroke_using('u', :control)
|
330
|
+
type "2) primary (ex: ./bin/cloud)"
|
331
|
+
pause 0.5
|
332
|
+
keystroke_using('u', :control)
|
333
|
+
type "3) subcommand (./bin/cloud-start)"
|
334
|
+
pause 0.5
|
335
|
+
keystroke_using('u', :control)
|
336
|
+
end
|
337
|
+
|
338
|
+
while_saying "if we add options to our primary these will be automatically inherited by the subcommands." do
|
339
|
+
end
|
340
|
+
|
341
|
+
while_saying "we want to be able to specify the name of our clouds.rb
|
342
|
+
specfile in any of the subcommands. so all we need to do is add that to the
|
343
|
+
primary.
|
344
|
+
|
345
|
+
now when we want to customize the primary we need to do a bit more work.
|
346
|
+
" do
|
347
|
+
cli "vim bin/cloud"
|
348
|
+
pause 2
|
349
|
+
type "jj"
|
350
|
+
type 'o' + ''
|
351
|
+
vim_insert <<-eof
|
352
|
+
GitStyleBinary.primary do
|
353
|
+
version "PoolParty cloud command"
|
354
|
+
banner <<-\EOS
|
355
|
+
eof
|
356
|
+
vim_insert <<-eof
|
357
|
+
Usage: cloud \\\#{all_options_string} COMMAND [ARGS]
|
358
|
+
|
359
|
+
The cloud subcommands commands are:
|
360
|
+
\\\#{GitStyleBinary.pretty_known_subcommands(:short).join(" ")}
|
361
|
+
EOS
|
362
|
+
opt :spec, "The name of the clouds.rb file", :type => String
|
363
|
+
|
364
|
+
run do
|
365
|
+
end
|
366
|
+
end
|
367
|
+
eof
|
368
|
+
pause 2
|
369
|
+
type ":x
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
perform "show subcommand opts" do
|
374
|
+
|
375
|
+
while_saying "now if we run the subcommand -h, we see that the spec option is there" do
|
376
|
+
cli "./bin/cloud-start -h"
|
377
|
+
pause 1
|
378
|
+
shake 61, 259
|
379
|
+
pause 1
|
380
|
+
type "q"
|
381
|
+
end
|
382
|
+
|
383
|
+
while_saying "you can also specify callbacks in your primary if you want to.
|
384
|
+
for instance, say you want to call something before the run block of each
|
385
|
+
subcommand. simply define a before_run block in your primary" do
|
386
|
+
|
387
|
+
cli "vim bin/cloud"
|
388
|
+
pause 2
|
389
|
+
vim_line_after("opt ")
|
390
|
+
vim_insert <<-eof
|
391
|
+
before_run do
|
392
|
+
puts "this happened before run"
|
393
|
+
end
|
394
|
+
eof
|
395
|
+
pause 2
|
396
|
+
type ":x
|
397
|
+
|
398
|
+
end
|
399
|
+
|
400
|
+
while_saying "now we run our subcommand again. and you can see that it gets the options!" do
|
401
|
+
cli "./bin/cloud-start"
|
402
|
+
end
|
403
|
+
|
404
|
+
end
|
405
|
+
|
406
|
+
perform "summary" do
|
407
|
+
while_saying "i hope this has been helpful for you. now go out and create your own git-style-binaries!"
|
408
|
+
end
|
409
|
+
|
410
|
+
|
411
|
+
at_exit do
|
412
|
+
cleanup
|
413
|
+
end
|
45
414
|
|
46
415
|
# vim: ft=ruby
|