rackspace_lb_cli 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/rackspace_lb_cli +6 -0
- data/lib/rackspace_lb_cli.rb +236 -0
- metadata +131 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ae1e3adb72bfd3ffe3279224f4ebce9071d086d9
|
4
|
+
data.tar.gz: 8456a25fc10bf33554edf3c8342f43b5079c4126
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8b66be819298d90e1708faa3a565e43ee629bb32988efd975f0e1ec824ac29eafb1e8c930e3d04e30f0072a94a8b92b16df9e2560efbf8b2317976bf0557ae2b
|
7
|
+
data.tar.gz: 10c36145c4ae451f36ed853bf02b011cb89d34da896fd53af886d3cd8efcc74de166d86aa97b410c4664f5760b2d880d947f94a7d0346175ab5b1a7d0dc4601f
|
@@ -0,0 +1,236 @@
|
|
1
|
+
require 'fog' # http://www.rubydoc.info/github/fog/fog/Fog/Rackspace/LoadBalancers/LoadBalancer
|
2
|
+
require 'optparse' # http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
class RackspaceLbCli
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@options = cmdlineopts(ARGV)
|
9
|
+
@lb_api = init_rackspace_lb_api
|
10
|
+
@nova_api = init_rackspace_nova_api
|
11
|
+
|
12
|
+
debug "Action: #{@options.action.to_s}"
|
13
|
+
|
14
|
+
case @options.action
|
15
|
+
when :list
|
16
|
+
list_lbs
|
17
|
+
when :create
|
18
|
+
# Create LB, Add BEs
|
19
|
+
if get_lb(@options.lb_name,@options.lb_port,@options.lb_proto).nil?
|
20
|
+
lb = create_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
21
|
+
health_monitor_lb(lb)
|
22
|
+
end
|
23
|
+
when :destroy
|
24
|
+
# Destroy LB, BE are removed automatically
|
25
|
+
if get_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
26
|
+
destroy_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
27
|
+
end
|
28
|
+
when :add
|
29
|
+
# Add BE to LB
|
30
|
+
if lb = get_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
31
|
+
if @options.lb_backends
|
32
|
+
@options.lb_backends.each do | be |
|
33
|
+
be_name, be_port = be.split(':')
|
34
|
+
be_port = be_port || @options.lb_port
|
35
|
+
cldsrv = get_server(be_name)
|
36
|
+
if cldsrv
|
37
|
+
add_backend(lb, cldsrv, be_port)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
when :remove
|
43
|
+
# Remove BE from LB
|
44
|
+
if lb = get_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
45
|
+
if @options.lb_backends
|
46
|
+
@options.lb_backends.each do | be |
|
47
|
+
be_name, be_port = be.split(':')
|
48
|
+
be_port = be_port || @options.lb_port
|
49
|
+
cldsrv = get_server(be_name)
|
50
|
+
if cldsrv
|
51
|
+
remove_backend(lb, cldsrv, be_port)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
when :describe
|
57
|
+
# Describe LB with it's backends
|
58
|
+
if lb = get_lb(@options.lb_name,@options.lb_port,@options.lb_proto)
|
59
|
+
describe_lb(lb)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def debug(debugoutput)
|
65
|
+
if @options.debug
|
66
|
+
puts STDERR.puts(debugoutput)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def init_rackspace_lb_api()
|
71
|
+
Fog::Rackspace::LoadBalancers.new(
|
72
|
+
:rackspace_username => @options.rs_username,
|
73
|
+
:rackspace_api_key => @options.rs_apikey,
|
74
|
+
:rackspace_region => @options.rs_region
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def init_rackspace_nova_api()
|
79
|
+
Fog::Compute.new(
|
80
|
+
:provider => 'rackspace',
|
81
|
+
:rackspace_username => @options.rs_username,
|
82
|
+
:rackspace_api_key => @options.rs_apikey,
|
83
|
+
:rackspace_region => @options.rs_region
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_lb(lb_name, lb_port, lb_proto)
|
88
|
+
lb = @lb_api.load_balancers.all.find { |lb| lb.name == lb_name }
|
89
|
+
if lb
|
90
|
+
debug "LB object: name=#{lb.name.to_s} Port=#{lb.port.to_s} Proto=#{lb.protocol.to_s}"
|
91
|
+
if lb.port.to_s == lb_port and lb.protocol.to_s == lb_proto
|
92
|
+
return lb
|
93
|
+
end
|
94
|
+
end
|
95
|
+
return nil
|
96
|
+
end
|
97
|
+
|
98
|
+
def create_lb(lb_name, lb_port = '443', lb_proto = 'HTTPS', lb_viptype = 'PUBLIC')
|
99
|
+
if not get_lb(lb_name, lb_port, lb_proto)
|
100
|
+
lb = @lb_api.load_balancers.create(
|
101
|
+
:name => lb_name,
|
102
|
+
:protocol => lb_proto,
|
103
|
+
:port => lb_port,
|
104
|
+
:virtual_ips => [{ :type => lb_viptype }],
|
105
|
+
:nodes => []
|
106
|
+
)
|
107
|
+
lb.wait_for { ready? }
|
108
|
+
return lb
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def destroy_lb(lb_name, lb_port, lb_proto)
|
113
|
+
if lb = get_lb(lb_name, lb_port, lb_proto)
|
114
|
+
lb.destroy
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def health_monitor_lb(lb, monitor=['CONNECT',10,10,3])
|
119
|
+
lb.enable_health_monitor(*monitor)
|
120
|
+
lb.wait_for { ready? }
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_server(server_name)
|
124
|
+
@nova_api.servers.all.find { |srv| srv.name == server_name }
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_backend(lb, ip)
|
128
|
+
lb.nodes.all.find { |nde| nde.address == ip }
|
129
|
+
end
|
130
|
+
|
131
|
+
def remove_backend(lb, be)
|
132
|
+
be.destroy
|
133
|
+
lb.wait_for { ready? }
|
134
|
+
end
|
135
|
+
|
136
|
+
def add_backend(lb, be, be_port)
|
137
|
+
#if not be_port be_port = lb.port
|
138
|
+
if not lb.nodes.all.find { |nde| nde.address == be.public_ip_address }
|
139
|
+
lb.nodes.create(
|
140
|
+
:address => be.public_ip_address,
|
141
|
+
:port => be_port,
|
142
|
+
:condition => 'ENABLED'
|
143
|
+
)
|
144
|
+
lb.wait_for { ready? }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def list_lbs()
|
149
|
+
@lb_api.load_balancers.all.each { |lb| puts "#{lb.id} | #{lb.name.ljust(30)} | #{lb.port.to_s.ljust(5)} | #{lb.protocol.ljust(18)} | #{lb.virtual_ips.map{ |vip| vip.address }.join(',')}" }
|
150
|
+
end
|
151
|
+
|
152
|
+
def describe_lb(lb)
|
153
|
+
puts "Id: #{lb.id}"
|
154
|
+
puts "Port: #{lb.port}"
|
155
|
+
puts "Proto: #{lb.protocol}"
|
156
|
+
puts "VIPs: #{lb.virtual_ips.map{ |vip| vip.address }.join(',')}"
|
157
|
+
puts "Backends:"
|
158
|
+
puts "#{lb.nodes.map{ |nde| " #{nde.address}:#{nde.port}" }.join("\n")}"
|
159
|
+
end
|
160
|
+
|
161
|
+
def cmdlineopts(args)
|
162
|
+
|
163
|
+
# defaults
|
164
|
+
options = OpenStruct.new
|
165
|
+
options.action = :list
|
166
|
+
options.rs_region = ENV['RS_REGION'] || 'LON'
|
167
|
+
options.rs_apikey = ENV['RS_API_KEY']
|
168
|
+
options.rs_username = ENV['RS_USERNAME']
|
169
|
+
options.lb_port = '443'
|
170
|
+
options.lb_proto = 'HTTPS'
|
171
|
+
options.debug = false
|
172
|
+
|
173
|
+
args.options do |opts|
|
174
|
+
|
175
|
+
opts.banner = 'Usage: rackspace_lb_cli [options]'
|
176
|
+
opts.separator ''
|
177
|
+
|
178
|
+
opts.on_tail("-d", "--debug", "Send debug output to stderr. For developers.") do
|
179
|
+
options.debug = true
|
180
|
+
end
|
181
|
+
|
182
|
+
opts.separator 'Common options for all actions'
|
183
|
+
opts.on('-k','--rs-apikey rs_apikey','Rackspace Api Key [RS_API_KEY]') do |opt|
|
184
|
+
options.rs_apikey = opt
|
185
|
+
end
|
186
|
+
|
187
|
+
opts.on('-u','--rs-username rs_username','Rackspace username [RS_USERNAME]') do |opt|
|
188
|
+
options.rs_username = opt
|
189
|
+
end
|
190
|
+
|
191
|
+
opts.on('-r','--rs-region rs_region','Rackspace region, defaults to LON [RS_REGION]') do |opt|
|
192
|
+
options.rs_region = opt
|
193
|
+
end
|
194
|
+
|
195
|
+
opts.on("-h", "--help", "Show this message") do
|
196
|
+
puts opts
|
197
|
+
exit
|
198
|
+
end
|
199
|
+
|
200
|
+
opts.on('-v','--version', "Show version") do
|
201
|
+
spec = Gem::Specification::load("rackspace_lb_cli.gemspec")
|
202
|
+
puts spec.version
|
203
|
+
exit
|
204
|
+
end
|
205
|
+
|
206
|
+
opts.separator 'Options for the various actions'
|
207
|
+
opts.on('-a','--action action','[create|destroy|add|remove|list|describe]','create loadbalancer,destroy loadbalancer, add backends, remove backends','list list all loadbalancers, desc describe a specific loadbalancer') do |opt|
|
208
|
+
options.action = opt.to_sym
|
209
|
+
end
|
210
|
+
|
211
|
+
opts.on('-n','--name lb_name','A Name for the loadbalancer') do |opt|
|
212
|
+
options.lb_name = opt
|
213
|
+
end
|
214
|
+
|
215
|
+
opts.on('-p','--port port','The numeric port number, the loadbalancer should listen to') do |opt|
|
216
|
+
options.lb_port = opt
|
217
|
+
end
|
218
|
+
|
219
|
+
opts.on('-o','--protocol proto','The protocol. HTTPS is default') do |opt|
|
220
|
+
options.lb_proto = opt
|
221
|
+
end
|
222
|
+
|
223
|
+
opts.on('-b','--backends x,y,z','Comma-separated list of backends. Can be in the form backend:port') do |opt|
|
224
|
+
options.lb_backends = opt.split(',')
|
225
|
+
end
|
226
|
+
|
227
|
+
opts.parse!
|
228
|
+
|
229
|
+
raise OptionParser::MissingArgument if options.rs_username.nil?
|
230
|
+
raise OptionParser::MissingArgument if options.rs_apikey.nil?
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
return options
|
235
|
+
end
|
236
|
+
end
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rackspace_lb_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andreas John
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fog
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.38'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.38'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fog-rackspace
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 0.1.1
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0.1'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.1.1
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.6'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.6'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '10.3'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 10.3.2
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '10.3'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 10.3.2
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
description: " This is a cli tool for the management of loadbalancers in the Rackspace
|
96
|
+
public cloud. "
|
97
|
+
email:
|
98
|
+
- himself@derjohn.de
|
99
|
+
executables:
|
100
|
+
- rackspace_lb_cli
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- bin/rackspace_lb_cli
|
105
|
+
- lib/rackspace_lb_cli.rb
|
106
|
+
homepage: https://github.com/derjohn/rackspace_lb_cli
|
107
|
+
licenses:
|
108
|
+
- Apache-2.0
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.2.5
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: This is a cli tool for the management of loadbalancers in the Rackspace public
|
130
|
+
cloud.
|
131
|
+
test_files: []
|