befog 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/befog +12 -11
- data/lib/befog/cli.rb +40 -33
- data/lib/befog/commands/add.rb +64 -30
- data/lib/befog/commands/configure.rb +27 -40
- data/lib/befog/commands/list.rb +17 -55
- data/lib/befog/commands/mixins/command.rb +52 -45
- data/lib/befog/commands/mixins/configurable.rb +9 -9
- data/lib/befog/commands/mixins/help.rb +2 -4
- data/lib/befog/commands/mixins/safely.rb +28 -0
- data/lib/befog/commands/mixins/scope.rb +127 -0
- data/lib/befog/commands/mixins/selectable.rb +62 -0
- data/lib/befog/commands/mixins/traceable.rb +29 -0
- data/lib/befog/commands/remove.rb +36 -31
- data/lib/befog/commands/run.rb +31 -23
- data/lib/befog/commands/start.rb +21 -18
- data/lib/befog/commands/stop.rb +17 -19
- data/lib/befog.rb +1 -0
- metadata +24 -37
- data/lib/befog/commands/mixins/bank.rb +0 -50
- data/lib/befog/commands/mixins/provider.rb +0 -40
- data/lib/befog/commands/mixins/server.rb +0 -13
- data/lib/befog/providers/aws.rb +0 -20
data/bin/befog
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'befog' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
2
8
|
|
3
|
-
require
|
4
|
-
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
5
12
|
|
6
|
-
|
7
|
-
require
|
8
|
-
bin_file = Pathname.new(__FILE__).realpath
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
9
15
|
|
10
|
-
|
11
|
-
$:.unshift File.expand_path("../../lib", bin_file)
|
12
|
-
|
13
|
-
require "befog"
|
14
|
-
|
15
|
-
Befog::CLI.run(*ARGV)
|
16
|
+
load Gem.bin_path('befog', 'befog')
|
data/lib/befog/cli.rb
CHANGED
@@ -5,16 +5,20 @@ require "befog/commands/stop"
|
|
5
5
|
require "befog/commands/run"
|
6
6
|
require "befog/commands/list"
|
7
7
|
require "befog/commands/configure"
|
8
|
+
require "befog/commands/mixins/safely"
|
8
9
|
|
9
10
|
module Befog
|
10
11
|
|
11
12
|
module CLI
|
12
13
|
|
13
14
|
class Error < RuntimeError ; end
|
14
|
-
|
15
|
+
|
16
|
+
extend Befog::Commands::Mixins::Safely
|
17
|
+
|
15
18
|
COMMANDS = {
|
16
19
|
"add" => Befog::Commands::Add,
|
17
20
|
"remove" => Befog::Commands::Remove,
|
21
|
+
"rm" => Befog::Commands::Remove,
|
18
22
|
"start" => Befog::Commands::Start,
|
19
23
|
"stop" => Befog::Commands::Stop,
|
20
24
|
"run" => Befog::Commands::Run,
|
@@ -24,35 +28,39 @@ module Befog
|
|
24
28
|
"config" => Befog::Commands::Configure
|
25
29
|
}
|
26
30
|
|
27
|
-
def self.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
rescue Befog::CLI::Error => e
|
37
|
-
$stderr.puts "befog: #{e.message}"
|
38
|
-
exit(-1)
|
39
|
-
rescue => e # uh-oh
|
40
|
-
$stderr.puts "Unexpected error"
|
41
|
-
$stderr.puts "#{e.class}: #{e.message}"
|
42
|
-
$stderr.puts e.backtrace
|
43
|
-
exit(-1)
|
44
|
-
end
|
45
|
-
else
|
46
|
-
if subcommand
|
47
|
-
usage "'#{subcommand}' is not a supported command"
|
31
|
+
def self.parse(arguments)
|
32
|
+
options = {}
|
33
|
+
key = :bank
|
34
|
+
while not arguments.empty?
|
35
|
+
argument = arguments.shift
|
36
|
+
flag, short, long = /^(?:\-(\w)|\-\-(\w+))$/.match(argument).to_a
|
37
|
+
if flag
|
38
|
+
key = (short or long).to_sym
|
39
|
+
options[key] = true
|
48
40
|
else
|
49
|
-
|
41
|
+
case options[key]
|
42
|
+
when Array then options[key] << argument
|
43
|
+
when String then options[key] = [ options[key], argument ]
|
44
|
+
when true, nil then options[key] = argument
|
45
|
+
end
|
50
46
|
end
|
51
47
|
end
|
48
|
+
return options
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.run(arguments)
|
52
|
+
subcommand = arguments.shift
|
53
|
+
if subcommand && (command = COMMANDS[subcommand])
|
54
|
+
command.run(CLI.parse(arguments))
|
55
|
+
elsif subcommand
|
56
|
+
usage "'#{subcommand}' is not a supported command"
|
57
|
+
else
|
58
|
+
usage
|
59
|
+
end
|
52
60
|
end
|
53
61
|
|
54
|
-
def self.usage(message)
|
55
|
-
$stderr.puts "befog: #{message}"
|
62
|
+
def self.usage(message=nil)
|
63
|
+
$stderr.puts "befog: #{message}" if message
|
56
64
|
$stderr.puts <<-eos
|
57
65
|
|
58
66
|
Usage: befog <subcommand> [<bank>] [<options>]
|
@@ -66,14 +74,13 @@ Adds 3 servers to the bank "web-servers"
|
|
66
74
|
|
67
75
|
Valid commands:
|
68
76
|
|
69
|
-
configure Configure a bank of servers
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
list,ls List all servers with optional bank, region, or provider
|
77
|
+
configure, config Configure a bank of servers
|
78
|
+
add Provision new servers for a bank of servers
|
79
|
+
remove, rm De-provision servers
|
80
|
+
start Start servers
|
81
|
+
stop Stop (suspend) servers
|
82
|
+
run Run a command on each of a bank of servers
|
83
|
+
list, ls List servers
|
77
84
|
|
78
85
|
You can get more options for any command with --help or -h.
|
79
86
|
eos
|
data/lib/befog/commands/add.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require "befog/commands/mixins/command"
|
2
2
|
require "befog/commands/mixins/configurable"
|
3
|
-
require "befog/commands/mixins/
|
4
|
-
require "befog/commands/mixins/
|
3
|
+
require "befog/commands/mixins/scope"
|
4
|
+
require "befog/commands/mixins/safely"
|
5
5
|
require "befog/commands/mixins/help"
|
6
|
+
require "befog/commands/mixins/traceable"
|
6
7
|
|
7
8
|
module Befog
|
8
9
|
module Commands
|
@@ -11,47 +12,80 @@ module Befog
|
|
11
12
|
|
12
13
|
include Mixins::Command
|
13
14
|
include Mixins::Configurable
|
14
|
-
include Mixins::
|
15
|
-
include Mixins::Provider
|
15
|
+
include Mixins::Scope
|
16
16
|
include Mixins::Help
|
17
|
+
include Mixins::Traceable
|
18
|
+
include Mixins::Safely
|
17
19
|
|
18
20
|
|
19
|
-
command
|
21
|
+
command :name => :add,
|
22
|
+
:usage => "befog add <bank> [<options>]",
|
20
23
|
:default_to_help => true
|
21
24
|
|
22
25
|
option :count,
|
23
|
-
:short =>
|
24
|
-
:long => "--count COUNT",
|
26
|
+
:short => :c,
|
25
27
|
:required => true,
|
26
28
|
:description => "The number of machines to provision"
|
27
|
-
|
29
|
+
|
30
|
+
option :type,
|
31
|
+
:short => :t,
|
32
|
+
:description => "The type of machines to provision"
|
33
|
+
|
28
34
|
def run
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
+
provision_servers(options[:count].to_i)
|
36
|
+
end
|
37
|
+
|
38
|
+
def provision_servers(count)
|
39
|
+
error("Count must be greater than zero.") unless (count > 0)
|
40
|
+
provisioned = []; threads = []
|
35
41
|
count.times do |i|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
:
|
41
|
-
|
42
|
-
:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
verbose <<-EOF.gsub(/^\s*/,"")
|
43
|
+
Provision server:
|
44
|
+
- region: #{region}
|
45
|
+
- type: #{flavor}
|
46
|
+
- image: #{image}
|
47
|
+
- security group: #{security_group}
|
48
|
+
- keypair: #{keypair}
|
49
|
+
EOF
|
50
|
+
threads << Thread.new do
|
51
|
+
safely do
|
52
|
+
unless rehearse?
|
53
|
+
log "Provisioning server #{i+1} for bank '#{bank_name}'..."
|
54
|
+
server = provision_server
|
55
|
+
server.wait_for { ready? }
|
56
|
+
provisioned << server
|
57
|
+
servers << server.id
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
49
61
|
end
|
50
|
-
|
51
|
-
$stdout.
|
62
|
+
unless rehearse?
|
63
|
+
$stdout.print "This may take a few minutes .."
|
64
|
+
sleep 1 while threads.any? { |t| $stdout.print "."; $stdout.flush ; t.alive? }
|
65
|
+
$stdout.print "\n"
|
66
|
+
provisioned.each do |server|
|
67
|
+
log "Server #{server.id} is ready at #{server.dns_name}."
|
68
|
+
end
|
69
|
+
save
|
52
70
|
end
|
53
|
-
save
|
54
71
|
end
|
72
|
+
|
73
|
+
def provision_server
|
74
|
+
compute.servers.create(
|
75
|
+
:tags => {"Name" => generate_server_name},
|
76
|
+
:region => region, :flavor_id => flavor, :image_id => image,
|
77
|
+
:security_group_ids => security_group, :key_name => keypair)
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate_server_name
|
81
|
+
"#{bank_name}-#{generate_id}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def generate_id
|
85
|
+
bank["counter"] ||= 0
|
86
|
+
bank["counter"] += 1
|
87
|
+
end
|
88
|
+
|
55
89
|
end
|
56
90
|
end
|
57
91
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "befog/commands/mixins/command"
|
2
2
|
require "befog/commands/mixins/configurable"
|
3
|
-
require "befog/commands/mixins/
|
4
|
-
require "befog/commands/mixins/
|
3
|
+
require "befog/commands/mixins/scope"
|
4
|
+
require "befog/commands/mixins/safely"
|
5
5
|
require "befog/commands/mixins/help"
|
6
6
|
|
7
7
|
module Befog
|
@@ -12,74 +12,61 @@ module Befog
|
|
12
12
|
|
13
13
|
include Mixins::Command
|
14
14
|
include Mixins::Configurable
|
15
|
-
include Mixins::
|
16
|
-
include Mixins::
|
15
|
+
include Mixins::Scope
|
16
|
+
include Mixins::Safely
|
17
17
|
include Mixins::Help
|
18
18
|
|
19
|
-
command
|
19
|
+
command :name => :configure,
|
20
|
+
:usage => "befog configure [<bank>] [<options>]",
|
20
21
|
:default_to_help => true
|
21
22
|
|
22
23
|
option :key,
|
23
|
-
:short =>
|
24
|
-
:long => "--key KEY",
|
24
|
+
:short => :k,
|
25
25
|
:description => "Your account key"
|
26
26
|
|
27
27
|
option :secret,
|
28
|
-
:short =>
|
29
|
-
:long => "--secret SECRET",
|
28
|
+
:short => :s,
|
30
29
|
:description => "Your account secret"
|
31
30
|
|
32
31
|
option :provider,
|
33
|
-
:short =>
|
34
|
-
:long => "--provider PROVIDER",
|
32
|
+
:short => :q,
|
35
33
|
:description => "The provider provisioning a bank of servers"
|
36
34
|
|
37
35
|
option :region,
|
38
|
-
:short =>
|
39
|
-
:long => "--region REGION",
|
36
|
+
:short => :r,
|
40
37
|
:description => "The region (datacenter) where a bank is provisioned"
|
41
38
|
|
42
39
|
option :image,
|
43
|
-
:short =>
|
44
|
-
:long => "--image IMAGE",
|
40
|
+
:short => :i,
|
45
41
|
:description => "The image for provisioning pods"
|
46
42
|
|
47
43
|
option :keypair,
|
48
|
-
:short =>
|
49
|
-
:long => "--keypair KEYPAIR",
|
44
|
+
:short => :x,
|
50
45
|
:description => "The keypair name to use with SSH"
|
51
46
|
|
52
47
|
option :group,
|
53
|
-
:short =>
|
54
|
-
:long => "--group GROUP",
|
48
|
+
:short => :g,
|
55
49
|
:description => "The security group to use for new instances"
|
56
50
|
|
57
51
|
option :type,
|
58
|
-
:short =>
|
59
|
-
:long => "--type TYPE",
|
52
|
+
:short => :t,
|
60
53
|
:description => "The number of machines to provision"
|
61
54
|
|
62
|
-
def self.run(args)
|
63
|
-
self.new(args).run
|
64
|
-
end
|
65
|
-
|
66
|
-
def initialize(arguments)
|
67
|
-
process_arguments(arguments)
|
68
|
-
end
|
69
|
-
|
70
55
|
def run
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
bank
|
56
|
+
safely do
|
57
|
+
%w( key secret ).each do |key|
|
58
|
+
_key = key.to_sym
|
59
|
+
provider[key] = options[_key] if options[_key]
|
60
|
+
end
|
61
|
+
%w( region image keypair group type ).each do |key|
|
62
|
+
_key = key.to_sym
|
63
|
+
bank[key] = options[_key] if options[_key]
|
64
|
+
end
|
65
|
+
if options[:bank] and options[:provider]
|
66
|
+
bank["provider"] = options[:provider]
|
67
|
+
end
|
68
|
+
save
|
81
69
|
end
|
82
|
-
save
|
83
70
|
end
|
84
71
|
end
|
85
72
|
end
|
data/lib/befog/commands/list.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
require "fog"
|
2
2
|
require "befog/commands/mixins/command"
|
3
3
|
require "befog/commands/mixins/configurable"
|
4
|
-
require "befog/commands/mixins/
|
5
|
-
require "befog/commands/mixins/
|
6
|
-
require "befog/commands/mixins/
|
4
|
+
require "befog/commands/mixins/scope"
|
5
|
+
require "befog/commands/mixins/safely"
|
6
|
+
require "befog/commands/mixins/selectable"
|
7
7
|
require "befog/commands/mixins/help"
|
8
8
|
|
9
9
|
module Befog
|
@@ -13,65 +13,27 @@ module Befog
|
|
13
13
|
|
14
14
|
include Mixins::Command
|
15
15
|
include Mixins::Configurable
|
16
|
-
include Mixins::
|
17
|
-
include Mixins::
|
18
|
-
include Mixins::
|
16
|
+
include Mixins::Scope
|
17
|
+
include Mixins::Safely
|
18
|
+
include Mixins::Selectable
|
19
19
|
include Mixins::Help
|
20
20
|
|
21
|
-
command
|
22
|
-
:
|
21
|
+
command :name => :list,
|
22
|
+
:usage => "befog list [<bank>] <options>",
|
23
|
+
:default_to_help => true
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
:
|
27
|
-
:description => "
|
25
|
+
|
26
|
+
option :all,
|
27
|
+
:short => :a,
|
28
|
+
:description => "Deprovision all selected servers"
|
28
29
|
|
29
30
|
|
30
31
|
def run
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
list_provider(options[:provider])
|
35
|
-
else
|
36
|
-
list_all
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def list_all
|
41
|
-
$stdout.puts "All Servers"
|
42
|
-
banks.keys.select do |name|
|
43
|
-
list_bank(name)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def list_provider(provider,indent="")
|
48
|
-
$stdout.puts "#{indent}- Provider: #{provider}"
|
49
|
-
indent += " "
|
50
|
-
banks.select do |name,b|
|
51
|
-
if b["configuration"] and b["configuration"]["provider"] == provider
|
52
|
-
list_bank(name,indent)
|
53
|
-
end
|
32
|
+
run_for_selected do |id|
|
33
|
+
server = compute.servers.get(id)
|
34
|
+
log "%-15s %-15s %-15s %-45s %-10s" % [id,server.flavor_id,server.tags["Name"],(server.dns_name||"-"),server.state]
|
54
35
|
end
|
55
36
|
end
|
56
|
-
|
57
|
-
def list_bank(name, indent="")
|
58
|
-
out = []
|
59
|
-
out << "#{indent}- Bank: #{name}"
|
60
|
-
indent += " "
|
61
|
-
configuration = banks[name]["configuration"]
|
62
|
-
out += %w( provider region image keypair type ).reduce([]) do |rval,key|
|
63
|
-
rval << "#{key}: #{configuration[key]}" unless configuration[key].nil?
|
64
|
-
rval
|
65
|
-
end
|
66
|
-
out << "instances:"
|
67
|
-
banks[name]["servers"].each do |id|
|
68
|
-
c = compute(configuration["provider"])
|
69
|
-
s = c.servers.get(id)
|
70
|
-
out << "- #{s.flavor_id} #{s.public_ip_address} #{s.state}"
|
71
|
-
end
|
72
|
-
$stdout.puts out.join("\n#{indent}")
|
73
|
-
end
|
74
|
-
|
75
37
|
end
|
76
38
|
end
|
77
|
-
end
|
39
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'ostruct'
|
2
2
|
|
3
3
|
module Befog
|
4
4
|
module Commands
|
@@ -10,8 +10,8 @@ module Befog
|
|
10
10
|
|
11
11
|
class << self
|
12
12
|
|
13
|
-
def command(
|
14
|
-
@command =
|
13
|
+
def command(descriptor=nil)
|
14
|
+
descriptor ? (@command = OpenStruct.new(descriptor)) : @command
|
15
15
|
end
|
16
16
|
|
17
17
|
def option(name,descriptor)
|
@@ -20,43 +20,8 @@ module Befog
|
|
20
20
|
|
21
21
|
def options ; @options||=[] ; end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
results = {}; required = []
|
26
|
-
parser = OptionParser.new do |parser|
|
27
|
-
parser.banner = "Usage: #{@command.name} [options]"
|
28
|
-
options.each do |name,descriptor|
|
29
|
-
if descriptor[:help]
|
30
|
-
parser.on_tail(*descriptor.values_at(:short,:long,:description)) do |value|
|
31
|
-
$stdout.puts parser
|
32
|
-
exit(0)
|
33
|
-
end
|
34
|
-
else
|
35
|
-
results[name] = descriptor[:default] if descriptor[:default]
|
36
|
-
required << name if descriptor[:required]
|
37
|
-
parser.on(*descriptor.values_at(:short,:long,:description)) do |value|
|
38
|
-
results[name] = value
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
if @command.descriptor[:default_to_help] and arguments.empty?
|
44
|
-
$stdout.puts parser
|
45
|
-
exit(0)
|
46
|
-
end
|
47
|
-
parser.parse!(arguments)
|
48
|
-
required.each do |name|
|
49
|
-
unless results[name]
|
50
|
-
$stderr.puts "Missing required option '#{name}'"
|
51
|
-
$stderr.puts parser
|
52
|
-
exit(-1)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
results
|
56
|
-
end
|
57
|
-
|
58
|
-
def run(arguments)
|
59
|
-
new(arguments).run
|
23
|
+
def run(options)
|
24
|
+
new(options).run
|
60
25
|
end
|
61
26
|
|
62
27
|
end
|
@@ -66,12 +31,54 @@ module Befog
|
|
66
31
|
|
67
32
|
attr_reader :options
|
68
33
|
|
69
|
-
def initialize(
|
70
|
-
|
34
|
+
def initialize(_options)
|
35
|
+
safely do
|
36
|
+
@options = process_options(_options)
|
37
|
+
end
|
71
38
|
end
|
72
|
-
|
73
|
-
def
|
74
|
-
|
39
|
+
|
40
|
+
def command
|
41
|
+
self.class.command
|
42
|
+
end
|
43
|
+
|
44
|
+
# TODO: Support multi-line descriptions?
|
45
|
+
def process_options(_options)
|
46
|
+
if (command.default_to_help and _options.empty?) or _options[:help]
|
47
|
+
usage
|
48
|
+
exit(0)
|
49
|
+
end
|
50
|
+
self.class.options.each do |name,descriptor|
|
51
|
+
short, required, default, type = descriptor.values_at(:short,:required,:default,:type)
|
52
|
+
_options[name] ||= (_options[short]||default)
|
53
|
+
_options.delete(short)
|
54
|
+
if required and not _options[name]
|
55
|
+
error("Missing required option --#{name}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
# TODO: add type conversion
|
59
|
+
return _options
|
60
|
+
end
|
61
|
+
|
62
|
+
def usage
|
63
|
+
$stderr.puts command.usage
|
64
|
+
usage = []
|
65
|
+
self.class.options.each do |name,descriptor|
|
66
|
+
short, required, default, description = descriptor.values_at(:short,:required,:default,:description)
|
67
|
+
required = (required ? "(required) " : "")
|
68
|
+
default = (default ? "(default: #{default}) " : "")
|
69
|
+
usage << "\t%-3s %-20s\t%-40s" % ["-#{short},", "--#{name} #{name.to_s.upcase}", "#{description} #{required}#{default}"]
|
70
|
+
end
|
71
|
+
$stderr.puts *(usage.sort)
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
def error(message)
|
77
|
+
raise CLI::Error.new(message)
|
78
|
+
end
|
79
|
+
|
80
|
+
def log(message)
|
81
|
+
$stdout.puts(message)
|
75
82
|
end
|
76
83
|
end
|
77
84
|
end
|
@@ -8,16 +8,12 @@ module Befog
|
|
8
8
|
target.module_eval do
|
9
9
|
|
10
10
|
option :path,
|
11
|
-
:short =>
|
12
|
-
:
|
13
|
-
:default => "~/.befog",
|
14
|
-
:description => "Path to the configuration file you want to use (defaults to '~/.befog')"
|
11
|
+
:short => :p, :default => "~/.befog",
|
12
|
+
:description => "Path to the configuration file"
|
15
13
|
|
16
14
|
option :name,
|
17
|
-
:short =>
|
18
|
-
:
|
19
|
-
:default => "default",
|
20
|
-
:description => "The name of this configuration (defaults to 'default')"
|
15
|
+
:short => :n, :default => "default",
|
16
|
+
:description => "The name of this configuration"
|
21
17
|
|
22
18
|
end
|
23
19
|
end
|
@@ -31,7 +27,11 @@ module Befog
|
|
31
27
|
end
|
32
28
|
|
33
29
|
def configuration
|
34
|
-
_configuration[
|
30
|
+
_configuration[configuration_name] ||= {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def configuration_name
|
34
|
+
options[:name]
|
35
35
|
end
|
36
36
|
|
37
37
|
def save
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Befog
|
2
|
+
module Commands
|
3
|
+
module Mixins
|
4
|
+
module Safely
|
5
|
+
|
6
|
+
def safely
|
7
|
+
begin
|
8
|
+
yield
|
9
|
+
rescue Befog::CLI::Error => e
|
10
|
+
$stderr.puts "befog #{command.name}: #{e.message}"
|
11
|
+
exit(-1)
|
12
|
+
rescue => e # uh-oh
|
13
|
+
$stderr.puts "Unexpected error"
|
14
|
+
$stderr.puts "#{e.class}: #{e.message}"
|
15
|
+
$stderr.puts e.backtrace
|
16
|
+
exit(-1)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|