befog 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,127 @@
1
+ require 'fog'
2
+
3
+ module Befog
4
+ module Commands
5
+ module Mixins
6
+ module Scope
7
+
8
+ def provider_name
9
+ options[:provider] or bank["provider"] or
10
+ error("Specify a provider with --provider or by adding one to the '#{bank_name}' bank.")
11
+ end
12
+
13
+ def provider?
14
+ !!options[:provider] or bank["provider"]
15
+ end
16
+
17
+ def providers
18
+ @providers ||= (configuration["providers"] ||= {})
19
+ end
20
+
21
+ def provider
22
+ @provider ||= (providers[provider_name] ||= {})
23
+ end
24
+
25
+ def account_key
26
+ provider["key"]
27
+ end
28
+
29
+ def account_secret
30
+ provider["secret"]
31
+ end
32
+
33
+ # TODO: do something clever once we have more than 2-3 providers
34
+ def compute
35
+ case provider_name
36
+ when "aws"
37
+ @compute ||= Fog::Compute.new(:provider => "AWS",
38
+ :aws_access_key_id => account_key,
39
+ :aws_secret_access_key => account_secret,
40
+ :region => region)
41
+ else
42
+ error("Provider '#{provider_name}' is currently unsupported.")
43
+ end
44
+ end
45
+
46
+ def get_server(id)
47
+ compute.servers.get(id)
48
+ end
49
+
50
+
51
+ def region
52
+ options[:region] or bank["region"] or
53
+ error("Specify a region with --region or by adding one to the '#{bank_name}' bank.")
54
+ end
55
+
56
+ def region?
57
+ !!options[:region] or bank["region"]
58
+ end
59
+
60
+ def flavor
61
+ options[:type] or bank["type"] or
62
+ error("Specify an instance type (flavor) with --type or by adding one to the '#{bank_name}' bank.")
63
+ end
64
+
65
+ def flavor?
66
+ !!options[:type] or bank["type"]
67
+ end
68
+
69
+ def image
70
+ options[:image] or bank["image"] or
71
+ error("Specify an image with --image or by adding one to the '#{bank_name}' bank.")
72
+ end
73
+
74
+ def image?
75
+ !!options[:image] or bank["image"]
76
+ end
77
+
78
+ def security_group
79
+ options[:group] or bank["group"] or
80
+ error("Specify a security group with --group or by adding one to the '#{bank_name}' bank.")
81
+ end
82
+
83
+ def security_group?
84
+ options[:group] or bank["group"]
85
+ end
86
+
87
+ def keypair
88
+ options[:keypair] or bank["keypair"] or
89
+ error("Specify a keypair with --keypair or by adding one to the '#{bank_name}' bank.")
90
+ end
91
+
92
+ def keypair?
93
+ !!options[:keypair] or bank["keypair"]
94
+ end
95
+
96
+ def banks
97
+ configuration["banks"] ||= {}
98
+ end
99
+
100
+ def _bank
101
+ banks[bank_name] ||= {}
102
+ end
103
+
104
+ def bank
105
+ _bank["configuration"] ||= {}
106
+ end
107
+
108
+ def bank?
109
+ !!options[:bank]
110
+ end
111
+
112
+ def bank_name
113
+ options[:bank] or error("Did you mean to include a bank name?")
114
+ end
115
+
116
+ def servers
117
+ _bank["servers"] ||= []
118
+ end
119
+
120
+ def servers=(array)
121
+ _bank["servers"] = array
122
+ end
123
+
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,62 @@
1
+ module Befog
2
+ module Commands
3
+ module Mixins
4
+ module Selectable
5
+ def self.included(target)
6
+ target.module_eval do
7
+
8
+ option :provider,
9
+ :short => :q,
10
+ :description => "Select servers from this provider"
11
+
12
+ option :region,
13
+ :short => :r,
14
+ :description => "Select servers from this region"
15
+
16
+ option :image,
17
+ :short => :i,
18
+ :description => "Select servers using this image"
19
+
20
+ option :keypair,
21
+ :short => :x,
22
+ :description => "Select servers using this keypair"
23
+
24
+ option :group,
25
+ :short => :g,
26
+ :description => "Select servers using this group"
27
+
28
+ option :type,
29
+ :short => :t,
30
+ :description => "Select servers of this type (flavor)"
31
+
32
+ option :id,
33
+ :short => :z,
34
+ :description => "Select server with the given ID"
35
+
36
+ end
37
+ end
38
+
39
+ def run_for_selected(&block)
40
+ if bank?
41
+ servers.each(&block)
42
+ else
43
+ banks.keys.each do |name|
44
+ options[:bank] = name
45
+ if options[:id]
46
+ block.call(options[:id]) if servers.include?(options[:id])
47
+ else
48
+ servers.each(&block) if ((not provider? or (bank["provider"] == provider_name)) and
49
+ (not region? or (bank["region"] == region)) and
50
+ (not image? or (bank["image"] == image)) and
51
+ (not security_group? or (bank["group"] == security_group)) and
52
+ (not flavor? or (bank["type"] == flavor)))
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -0,0 +1,29 @@
1
+ module Befog
2
+ module Commands
3
+ module Mixins
4
+ module Traceable
5
+ def self.included(target)
6
+ target.module_eval do
7
+ option :rehearse,
8
+ :short => :u,
9
+ :description => "Dry-run, verbose logging, but don't actually run anything"
10
+ end
11
+ end
12
+
13
+ def rehearse?
14
+ !!options[:rehearse]
15
+ end
16
+
17
+ def verbose?
18
+ !!options[:verbose] or rehearse?
19
+ end
20
+
21
+ def verbose(message)
22
+ log(message) if verbose?
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -1,8 +1,8 @@
1
1
  require "befog/commands/mixins/command"
2
2
  require "befog/commands/mixins/configurable"
3
- require "befog/commands/mixins/bank"
4
- require "befog/commands/mixins/provider"
5
- require "befog/commands/mixins/server"
3
+ require "befog/commands/mixins/scope"
4
+ require "befog/commands/mixins/safely"
5
+ require "befog/commands/mixins/selectable"
6
6
  require "befog/commands/mixins/help"
7
7
 
8
8
  module Befog
@@ -12,46 +12,51 @@ module Befog
12
12
 
13
13
  include Mixins::Command
14
14
  include Mixins::Configurable
15
- include Mixins::Bank
16
- include Mixins::Provider
17
- include Mixins::Server
15
+ include Mixins::Scope
16
+ include Mixins::Safely
17
+ include Mixins::Selectable
18
18
  include Mixins::Help
19
19
 
20
- command "befog remove <bank>",
20
+ command :name => :remove,
21
+ :usage => "befog remove [<bank>] <options>",
21
22
  :default_to_help => true
22
23
 
23
24
  option :count,
24
- :short => "-c COUNT",
25
- :long => "--count COUNT",
26
- :required => true,
25
+ :short => :c,
27
26
  :description => "The number of machines to de-provision"
27
+
28
+ option :all,
29
+ :short => :a,
30
+ :description => "Deprovision all selected servers"
31
+
28
32
 
29
33
  def run
30
- if servers.empty?
31
- $stderr.puts "No servers are in bank '#{name}'."
32
- return
33
- end
34
- count = options[:count].to_i
35
- if count <= 0
36
- $stderr.puts "Number must be an integer greater than 0."
37
- return
38
- end
39
- if count > servers.size
40
- $stderr.puts "Number must be less than or equal to the bank size of #{bank.size}."
41
- return
34
+ count = 0 ; threads = [] ; deleted = []
35
+ unless options[:all]
36
+ count = options[:count].to_i
37
+ if count <= 0
38
+ error "Count must be an integer greater than 0."
39
+ end
42
40
  end
43
- count.times do |i|
44
- id = servers.pop
45
- $stdout.puts "Deprovisioning server #{id} ..."
46
- begin
47
- get_server(id).destroy
48
- rescue => e
49
- $stderr.puts "Error deprovisioning server #{id}"
50
- servers.push id
41
+ run_for_selected do |id|
42
+ if options[:all] or count > 0
43
+ threads << Thread.new do
44
+ safely do
45
+ log "Deprovisioning server #{id} ..."
46
+ compute.servers.get(id).destroy
47
+ deleted << id
48
+ count -= 1
49
+ end
50
+ end
51
51
  end
52
- save
53
52
  end
53
+ $stdout.print "This may take a few minutes .."
54
+ sleep 1 while threads.any? { |t| $stdout.print "."; $stdout.flush ; t.alive? }
55
+ $stdout.print "\n"
56
+ self.servers -= deleted
57
+ save
54
58
  end
59
+
55
60
  end
56
61
  end
57
62
  end
@@ -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/bank"
5
- require "befog/commands/mixins/provider"
6
- require "befog/commands/mixins/server"
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
 
@@ -14,34 +14,42 @@ module Befog
14
14
 
15
15
  include Mixins::Command
16
16
  include Mixins::Configurable
17
- include Mixins::Bank
18
- include Mixins::Provider
19
- include Mixins::Server
17
+ include Mixins::Scope
18
+ include Mixins::Safely
19
+ include Mixins::Selectable
20
20
  include Mixins::Help
21
21
 
22
- command "befog run <bank>",
22
+ command :name => :run,
23
+ :usage => "befog run [<bank>] <options>",
23
24
  :default_to_help => true
24
25
 
25
26
  option :command,
26
- :short => "-c COMMAND",
27
- :long => "--command COMMAND",
27
+ :short => :c,
28
28
  :required => true,
29
29
  :description => "Command to run (required)"
30
-
31
- def run
32
- run_for_each_server
33
- end
30
+
31
+ option :all,
32
+ :short => :a,
33
+ :description => "Deprovision all selected servers"
34
34
 
35
- def run_for_server(id)
36
- server = get_server(id)
37
- if server.state == "running"
38
- address = server.public_ip_address
39
- $stdout.puts "Running command '#{options[:command]}' for #{address} ..."
40
- result = Fog::SSH.new(address, "root").run(options[:command]).first
41
- $stdout.puts "[#{address}: STDOUT] #{result.stdout}"
42
- $stderr.puts "[#{address}: STDERR] #{result.stderr}"
43
- else
44
- $stdout.puts "Server #{id} isn't running - skipping"
35
+
36
+ def run
37
+ run_for_selected do |id|
38
+ threads = []; threads << Thread.new do
39
+ safely do
40
+ server = get_server(id)
41
+ if server.state == "running"
42
+ address = server.public_ip_address
43
+ $stdout.puts "Running command '#{options[:command]}' for #{address} ..."
44
+ result = Fog::SSH.new(address, "root").run(options[:command]).first
45
+ $stdout.puts "#{address} STDOUT: #{result.stdout}"
46
+ $stderr.puts "#{address} STDERR: #{result.stderr}" unless result.stderr.empty?
47
+ else
48
+ $stdout.puts "Server #{id} isn't running - skipping"
49
+ end
50
+ end
51
+ end
52
+ sleep 1 while threads.any? { |t| t.alive? }
45
53
  end
46
54
  end
47
55
 
@@ -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/bank"
5
- require "befog/commands/mixins/provider"
6
- require "befog/commands/mixins/server"
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,25 +13,28 @@ module Befog
13
13
 
14
14
  include Mixins::Command
15
15
  include Mixins::Configurable
16
- include Mixins::Bank
17
- include Mixins::Provider
18
- include Mixins::Server
16
+ include Mixins::Scope
17
+ include Mixins::Safely
18
+ include Mixins::Selectable
19
19
  include Mixins::Help
20
20
 
21
- command "befog start <bank>",
22
- :default_to_help => false
21
+ command :name => :start,
22
+ :usage => "befog start [<bank>] [<options>]",
23
+ :default_to_help => true
23
24
 
24
- def run
25
- run_for_each_server
26
- end
25
+ option :all,
26
+ :short => :a,
27
+ :description => "Deprovision all selected servers"
27
28
 
28
- def run_for_server(id)
29
- server = get_server(id)
30
- if server.state == "stopped"
31
- $stdout.puts "Starting server #{id} ..."
32
- server.start
33
- else
34
- $stdout.puts "Server #{id} is already (or still) running"
29
+ def run
30
+ run_for_selected do |id|
31
+ server = get_server(id)
32
+ if server.state == "stopped"
33
+ $stdout.puts "Starting server #{id} ..."
34
+ server.start
35
+ else
36
+ $stdout.puts "Server #{id} is already (or still) running"
37
+ end
35
38
  end
36
39
  end
37
40
 
@@ -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/bank"
5
- require "befog/commands/mixins/provider"
6
- require "befog/commands/mixins/server"
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
@@ -14,28 +14,26 @@ module Befog
14
14
 
15
15
  include Mixins::Command
16
16
  include Mixins::Configurable
17
- include Mixins::Bank
18
- include Mixins::Provider
19
- include Mixins::Server
17
+ include Mixins::Scope
18
+ include Mixins::Selectable
19
+ include Mixins::Safely
20
20
  include Mixins::Help
21
21
 
22
- command "befog stop <bank>",
23
- :default_to_help => false
22
+ command :name => :stop,
23
+ :usage => "befog stop [<bank>] <options>",
24
+ :default_to_help => true
24
25
 
25
26
  def run
26
- run_for_each_server
27
- end
28
-
29
- def run_for_server(id)
30
- server = get_server(id)
31
- if server.state == "running"
32
- $stdout.puts "Stopping server #{id} ..."
33
- server.stop
34
- else
35
- $stdout.puts "Server #{id} is not (yet) running"
27
+ run_for_selected do |id|
28
+ server = get_server(id)
29
+ if server.state == "running"
30
+ $stdout.puts "Stopping server #{id} ..."
31
+ server.stop
32
+ else
33
+ $stdout.puts "Server #{id} is not (yet) running"
34
+ end
36
35
  end
37
36
  end
38
-
39
37
  end
40
38
  end
41
39
  end
data/lib/befog.rb CHANGED
@@ -1 +1,2 @@
1
+ require "bundler/setup"
1
2
  require "befog/cli"
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: befog
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
5
+ version: 0.4.0
11
6
  platform: ruby
12
7
  authors:
13
8
  - Carlo Flores carlo@spire.io
@@ -16,54 +11,52 @@ autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
13
 
19
- date: 2012-04-04 00:00:00 Z
14
+ date: 2012-09-12 00:00:00 Z
20
15
  dependencies:
21
16
  - !ruby/object:Gem::Dependency
22
- name: fog
17
+ name: bundler
23
18
  prerelease: false
24
19
  requirement: &id001 !ruby/object:Gem::Requirement
25
20
  none: false
26
21
  requirements:
27
22
  - - ~>
28
23
  - !ruby/object:Gem::Version
29
- hash: 23
30
- segments:
31
- - 1
32
- - 1
33
- - 2
34
- version: 1.1.2
24
+ version: "1.2"
35
25
  type: :runtime
36
26
  version_requirements: *id001
37
27
  - !ruby/object:Gem::Dependency
38
- name: rspec
28
+ name: fog
39
29
  prerelease: false
40
30
  requirement: &id002 !ruby/object:Gem::Requirement
41
31
  none: false
42
32
  requirements:
43
33
  - - ~>
44
34
  - !ruby/object:Gem::Version
45
- hash: 13
46
- segments:
47
- - 2
48
- - 7
35
+ version: "1.3"
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
49
46
  version: "2.7"
50
47
  type: :development
51
- version_requirements: *id002
48
+ version_requirements: *id003
52
49
  - !ruby/object:Gem::Dependency
53
50
  name: yard
54
51
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirement: &id004 !ruby/object:Gem::Requirement
56
53
  none: false
57
54
  requirements:
58
55
  - - ~>
59
56
  - !ruby/object:Gem::Version
60
- hash: 5
61
- segments:
62
- - 0
63
- - 7
64
57
  version: "0.7"
65
58
  type: :development
66
- version_requirements: *id003
59
+ version_requirements: *id004
67
60
  description: "\t\tThe befog gem allows you to manage your cloud servers\n\
68
61
  \t\tdirectly from the command-line. \n"
69
62
  email:
@@ -80,18 +73,18 @@ files:
80
73
  - lib/befog/commands/add.rb
81
74
  - lib/befog/commands/configure.rb
82
75
  - lib/befog/commands/list.rb
83
- - lib/befog/commands/mixins/bank.rb
84
76
  - lib/befog/commands/mixins/command.rb
85
77
  - lib/befog/commands/mixins/configurable.rb
86
78
  - lib/befog/commands/mixins/help.rb
87
- - lib/befog/commands/mixins/provider.rb
88
- - lib/befog/commands/mixins/server.rb
79
+ - lib/befog/commands/mixins/safely.rb
80
+ - lib/befog/commands/mixins/scope.rb
81
+ - lib/befog/commands/mixins/selectable.rb
82
+ - lib/befog/commands/mixins/traceable.rb
89
83
  - lib/befog/commands/remove.rb
90
84
  - lib/befog/commands/run.rb
91
85
  - lib/befog/commands/start.rb
92
86
  - lib/befog/commands/stop.rb
93
87
  - lib/befog/commands.rb
94
- - lib/befog/providers/aws.rb
95
88
  - lib/befog.rb
96
89
  - bin/befog
97
90
  homepage: https://github.com/spire-io/befog
@@ -107,23 +100,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
100
  requirements:
108
101
  - - ">="
109
102
  - !ruby/object:Gem::Version
110
- hash: 3
111
- segments:
112
- - 0
113
103
  version: "0"
114
104
  required_rubygems_version: !ruby/object:Gem::Requirement
115
105
  none: false
116
106
  requirements:
117
107
  - - ">="
118
108
  - !ruby/object:Gem::Version
119
- hash: 3
120
- segments:
121
- - 0
122
109
  version: "0"
123
110
  requirements: []
124
111
 
125
112
  rubyforge_project:
126
- rubygems_version: 1.8.11
113
+ rubygems_version: 1.8.23
127
114
  signing_key:
128
115
  specification_version: 3
129
116
  summary: Cloud provisioning CLI