boxcutter 0.0.1 → 0.2
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/Gemfile +1 -1
- data/Gemfile.lock +12 -5
- data/README.markdown +1 -1
- data/boxcutter.gemspec +4 -2
- data/lib/boxcutter/api.rb +10 -3
- data/lib/boxcutter/command.rb +74 -0
- data/lib/boxcutter/load_balancer/service.rb +8 -0
- data/lib/boxcutter/load_balancer.rb +4 -4
- data/lib/boxcutter/server.rb +4 -0
- data/lib/boxcutter.rb +5 -4
- data/lib/version.rb +1 -1
- metadata +72 -43
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
boxcutter (0.0.1)
|
5
|
+
faraday
|
6
|
+
trollop
|
7
|
+
yajl-ruby
|
8
|
+
|
1
9
|
GEM
|
2
|
-
remote:
|
10
|
+
remote: https://rubygems.org/
|
3
11
|
specs:
|
4
12
|
faraday (0.8.1)
|
5
13
|
multipart-post (~> 1.1)
|
6
|
-
faraday_middleware (0.8.7)
|
7
|
-
faraday (>= 0.7.4, < 0.9)
|
8
14
|
multipart-post (1.1.5)
|
15
|
+
trollop (1.16.2)
|
16
|
+
yajl-ruby (1.1.0)
|
9
17
|
|
10
18
|
PLATFORMS
|
11
19
|
ruby
|
12
20
|
|
13
21
|
DEPENDENCIES
|
14
|
-
|
15
|
-
faraday_middleware
|
22
|
+
boxcutter!
|
data/README.markdown
CHANGED
@@ -23,7 +23,7 @@ section for more information.
|
|
23
23
|
Then load up the API in irb:
|
24
24
|
|
25
25
|
```irb
|
26
|
-
$ irb -r './lib/
|
26
|
+
$ irb -r './lib/boxcutter'
|
27
27
|
1.9.3p194 :001 > apps = Boxcutter::LoadBalancer::Application.all
|
28
28
|
=> [#<Application id:'88888888-cccc-4444-8888-dddddddddddd' name:'example.com' ip_v4:'192.168.1.1' ip_v6:'::1'>]
|
29
29
|
```
|
data/boxcutter.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.summary = %q{Wrapper for BlueBoxGroup's API}
|
9
9
|
gem.homepage = "https://github.com/dplummer/boxcutter"
|
10
10
|
|
11
|
-
gem.files
|
11
|
+
gem.files = %w[
|
12
12
|
.gitignore
|
13
13
|
Gemfile
|
14
14
|
Gemfile.lock
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
boxcutter.gemspec
|
19
19
|
lib/boxcutter.rb
|
20
20
|
lib/boxcutter/api.rb
|
21
|
+
lib/boxcutter/command.rb
|
21
22
|
lib/boxcutter/load_balancer.rb
|
22
23
|
lib/boxcutter/load_balancer/application.rb
|
23
24
|
lib/boxcutter/load_balancer/backend.rb
|
@@ -33,5 +34,6 @@ Gem::Specification.new do |gem|
|
|
33
34
|
gem.version = Boxcutter::VERSION
|
34
35
|
|
35
36
|
gem.add_dependency('faraday')
|
36
|
-
gem.add_dependency('
|
37
|
+
gem.add_dependency('trollop')
|
38
|
+
gem.add_dependency('yajl-ruby')
|
37
39
|
end
|
data/lib/boxcutter/api.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'yajl'
|
3
|
+
|
1
4
|
module Boxcutter
|
2
5
|
class Api
|
3
6
|
def initialize(customer_id, api_key_secret)
|
@@ -10,12 +13,16 @@ module Boxcutter
|
|
10
13
|
end
|
11
14
|
|
12
15
|
def get(path)
|
13
|
-
conn.get(path)
|
16
|
+
response = conn.get(path)
|
17
|
+
begin
|
18
|
+
Yajl::Parser.new.parse(response.body)
|
19
|
+
rescue Yajl::ParseError
|
20
|
+
{:message => response.body}
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
24
|
def conn
|
17
25
|
@conn ||= Faraday.new(:url => "https://boxpanel.bluebox.net/api") do |conn|
|
18
|
-
conn.response :json
|
19
26
|
conn.request :url_encoded
|
20
27
|
conn.adapter Faraday.default_adapter
|
21
28
|
conn.basic_auth(@customer_id, @api_key_secret)
|
@@ -68,7 +75,7 @@ module Boxcutter
|
|
68
75
|
# backup - Only direct traffic to this node if all the other nodes are down.
|
69
76
|
def create_machine(backend_id, machine_id, options = {})
|
70
77
|
data = { 'lb_machine' => machine_id }
|
71
|
-
data['lb_options'] = options unless options.
|
78
|
+
data['lb_options'] = options unless options.empty?
|
72
79
|
conn.post("lb_backends/#{backend_id}/lb_machines", data)
|
73
80
|
end
|
74
81
|
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Boxcutter
|
2
|
+
class Command
|
3
|
+
def initialize(logger = $stdout)
|
4
|
+
@logger = logger
|
5
|
+
end
|
6
|
+
|
7
|
+
# options:
|
8
|
+
# - :backend
|
9
|
+
# - :hostname
|
10
|
+
# - :dryrun
|
11
|
+
def remove_machine(opts = {})
|
12
|
+
backend_name = opts.fetch(:backend, 'default')
|
13
|
+
dryrun = opts.fetch(:dryrun, false)
|
14
|
+
hostname = opts.fetch(:hostname)
|
15
|
+
|
16
|
+
app = Boxcutter::LoadBalancer::Application.all.first
|
17
|
+
|
18
|
+
app.services.each do |service|
|
19
|
+
if backend = service.backends.detect {|backend| backend.name == backend_name}
|
20
|
+
if machine = backend.machines.detect {|machine| machine.hostname == hostname}
|
21
|
+
log "Removing #{machine} from #{backend}"
|
22
|
+
|
23
|
+
unless dryrun
|
24
|
+
response = machine.remove!
|
25
|
+
log "Response was: #{response.body}"
|
26
|
+
else
|
27
|
+
log "#{hostname} was not removed from the backend because --dryrun was specified"
|
28
|
+
end
|
29
|
+
else
|
30
|
+
log "Could not find '#{hostname}' on #{backend}"
|
31
|
+
end
|
32
|
+
else
|
33
|
+
log "Could not find '#{backend_name}' backend on #{service}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# options:
|
39
|
+
# - :backend
|
40
|
+
# - :hostname
|
41
|
+
# - :dryrun
|
42
|
+
def add_machine(opts = {})
|
43
|
+
backend_name = opts.fetch(:backend, 'default')
|
44
|
+
dryrun = opts.fetch(:dryrun, false)
|
45
|
+
hostname = opts.fetch(:hostname)
|
46
|
+
|
47
|
+
if machine = Boxcutter::Server.find_by_hostname("#{hostname}.blueboxgrid.com")
|
48
|
+
|
49
|
+
app = Boxcutter::LoadBalancer::Application.all.first
|
50
|
+
|
51
|
+
app.services.each do |service|
|
52
|
+
if backend = service.backends.detect {|backend| backend.name == backend_name}
|
53
|
+
log "Adding machine #{machine.hostname} to backend #{backend.name}"
|
54
|
+
unless dryrun
|
55
|
+
response = backend.add_machine(machine.id, :port => 80)
|
56
|
+
log "Added #{machine.hostname} to #{backend.name} with response: #{response.body}"
|
57
|
+
else
|
58
|
+
log "#{machine.hostname} was not added to the backend because --dryrun was specified"
|
59
|
+
end
|
60
|
+
else
|
61
|
+
log "Could not find default backend on #{service}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
else
|
65
|
+
log "Could not find server '#{hostname}' on BlueBoxGroup"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def log(msg)
|
71
|
+
@logger.puts msg
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -27,6 +27,14 @@ module Boxcutter::LoadBalancer
|
|
27
27
|
@attrs["service_type"]
|
28
28
|
end
|
29
29
|
|
30
|
+
def http?
|
31
|
+
service_type == 'http'
|
32
|
+
end
|
33
|
+
|
34
|
+
def https?
|
35
|
+
service_type == 'https'
|
36
|
+
end
|
37
|
+
|
30
38
|
def backends
|
31
39
|
api.backends(id).map {|attrs| Backend.new(api, attrs)}
|
32
40
|
end
|
@@ -3,7 +3,7 @@ module Boxcutter
|
|
3
3
|
end
|
4
4
|
end
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
require 'boxcutter/load_balancer/application'
|
7
|
+
require 'boxcutter/load_balancer/service'
|
8
|
+
require 'boxcutter/load_balancer/backend'
|
9
|
+
require 'boxcutter/load_balancer/machine'
|
data/lib/boxcutter/server.rb
CHANGED
data/lib/boxcutter.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler"
|
3
|
-
Bundler.
|
3
|
+
Bundler.setup(:default)
|
4
4
|
|
5
5
|
module Boxcutter
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
require 'boxcutter/api'
|
9
|
+
require 'boxcutter/server'
|
10
|
+
require 'boxcutter/load_balancer'
|
11
|
+
require 'boxcutter/command'
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,55 +1,73 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: boxcutter
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Donald Plummer
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2012-06-15 00:00:00 Z
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
15
20
|
name: faraday
|
16
|
-
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
23
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
22
31
|
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: trollop
|
23
35
|
prerelease: false
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: faraday_middleware
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
33
37
|
none: false
|
34
|
-
requirements:
|
35
|
-
- -
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 3
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
version: "0"
|
38
45
|
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: yajl-ruby
|
39
49
|
prerelease: false
|
40
|
-
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
51
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
type: :runtime
|
60
|
+
version_requirements: *id003
|
46
61
|
description: Wrapper for BlueBoxGroup's API
|
47
|
-
email:
|
62
|
+
email:
|
48
63
|
- donald@cideasphere.com
|
49
64
|
executables: []
|
65
|
+
|
50
66
|
extensions: []
|
67
|
+
|
51
68
|
extra_rdoc_files: []
|
52
|
-
|
69
|
+
|
70
|
+
files:
|
53
71
|
- .gitignore
|
54
72
|
- Gemfile
|
55
73
|
- Gemfile.lock
|
@@ -59,6 +77,7 @@ files:
|
|
59
77
|
- boxcutter.gemspec
|
60
78
|
- lib/boxcutter.rb
|
61
79
|
- lib/boxcutter/api.rb
|
80
|
+
- lib/boxcutter/command.rb
|
62
81
|
- lib/boxcutter/load_balancer.rb
|
63
82
|
- lib/boxcutter/load_balancer/application.rb
|
64
83
|
- lib/boxcutter/load_balancer/backend.rb
|
@@ -68,27 +87,37 @@ files:
|
|
68
87
|
- lib/version.rb
|
69
88
|
homepage: https://github.com/dplummer/boxcutter
|
70
89
|
licenses: []
|
90
|
+
|
71
91
|
post_install_message:
|
72
92
|
rdoc_options: []
|
73
|
-
|
93
|
+
|
94
|
+
require_paths:
|
74
95
|
- lib
|
75
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
97
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
|
81
|
-
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
106
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
hash: 3
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
version: "0"
|
87
114
|
requirements: []
|
115
|
+
|
88
116
|
rubyforge_project:
|
89
117
|
rubygems_version: 1.8.24
|
90
118
|
signing_key:
|
91
119
|
specification_version: 3
|
92
120
|
summary: Wrapper for BlueBoxGroup's API
|
93
121
|
test_files: []
|
122
|
+
|
94
123
|
has_rdoc:
|