befog 0.3.0 → 0.4.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.
@@ -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