f5-icontrol 0.3.1 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +5 -0
- data/f5-icontrol.gemspec +2 -1
- data/lib/f5/cli/application.rb +125 -2
- data/lib/f5/icontrol/rapi.rb +3 -1
- data/lib/f5/icontrol/rapi/resource.rb +1 -1
- data/lib/f5/icontrol/version.rb +1 -1
- data/spec/models/rapi_spec.rb +9 -0
- metadata +22 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cbee28f646b9200087841aa35846106d4246bafecd3db0ce256d26dc0945f7fb
|
4
|
+
data.tar.gz: 527e6119839ee1891c3a696477e043eef9e63fadb7249d054252997d49b3c7b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 348e4ff11cf46ab6d756bb4b4fab8eecbe676a1a0947958f73f3aa3d9ad4cfc6764a56fa775a2129f760115a77a5c20b0e110b7c79563cf5bd842531ceb4ab80
|
7
|
+
data.tar.gz: 63a0f8df5e1b8624069bcab887ffa5b5cde4833d182a7bef28417b918d6763347de2c49a939a8689f9369899e46c7f3bd504545ab44d65b5b5452c1e621b0a13
|
data/CHANGELOG.md
CHANGED
data/f5-icontrol.gemspec
CHANGED
@@ -22,12 +22,13 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency "rest-client"
|
23
23
|
spec.add_dependency "thor"
|
24
24
|
spec.add_dependency "json"
|
25
|
+
spec.add_dependency "wasabi", "<= 3.5.0"
|
25
26
|
|
26
27
|
spec.add_development_dependency "awesome_print"
|
27
28
|
spec.add_development_dependency "bundler", "~> 1.3"
|
28
29
|
spec.add_development_dependency "byebug"
|
29
30
|
spec.add_development_dependency "rake"
|
30
31
|
spec.add_development_dependency "rspec"
|
31
|
-
spec.add_development_dependency "webmock", "~>
|
32
|
+
spec.add_development_dependency "webmock", "~> 3.7.0"
|
32
33
|
spec.add_development_dependency "vcr"
|
33
34
|
end
|
data/lib/f5/cli/application.rb
CHANGED
@@ -25,9 +25,9 @@ module F5
|
|
25
25
|
|
26
26
|
def client
|
27
27
|
return @client if @client
|
28
|
-
config = YAML.load_file(
|
28
|
+
config = YAML.load_file(options[:config])
|
29
29
|
if config.key?('username') && options[:lb] == 'default'
|
30
|
-
puts "Warning: credentials in
|
30
|
+
puts "Warning: credentials in #{options[:config]} should be put under a named load balancer."
|
31
31
|
configure_lb_as(config)
|
32
32
|
else
|
33
33
|
configure_lb_as config[options[:lb]]
|
@@ -360,9 +360,120 @@ module F5
|
|
360
360
|
|
361
361
|
end
|
362
362
|
|
363
|
+
class Config < Subcommand
|
364
|
+
desc "list", "Lists the current configuration variables."
|
365
|
+
def list
|
366
|
+
response = client.Management.DBVariable.get_list
|
367
|
+
|
368
|
+
dbVariables = Array(response[:item])
|
369
|
+
if dbVariables.empty?
|
370
|
+
puts "No config variables found"
|
371
|
+
else
|
372
|
+
dbVariables.each do |p|
|
373
|
+
puts "#{p[:name]}: #{p[:value]}"
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
class Device < Subcommand
|
380
|
+
desc "list", "Lists the all devices regardless of device group."
|
381
|
+
def list
|
382
|
+
response = client.Management.Device.get_list
|
383
|
+
|
384
|
+
devices = Array(response[:item])
|
385
|
+
if devices.empty?
|
386
|
+
puts "No devices found"
|
387
|
+
else
|
388
|
+
devices.each do |p|
|
389
|
+
puts p
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
class DeviceGroup < Subcommand
|
396
|
+
desc "list", "Lists the all device groups."
|
397
|
+
def list
|
398
|
+
response = client.Management.DeviceGroup.get_list
|
399
|
+
|
400
|
+
devices = Array(response[:item])
|
401
|
+
if devices.empty?
|
402
|
+
puts "No devices found"
|
403
|
+
else
|
404
|
+
devices.each do |p|
|
405
|
+
puts p
|
406
|
+
end
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
desc "status DEVICE_GROUP", "Shows the sync status between devices in the specified device group. (Shows status of all device groups of one is not specified.)"
|
411
|
+
def status(device_group=nil)
|
412
|
+
response = client.Management.DeviceGroup.get_sync_status(device_groups: { item: [ device_group ] })
|
413
|
+
puts "STATUS: #{response[:item][:status]}";
|
414
|
+
puts "STATUS COLOR: #{response[:item][:color]}";
|
415
|
+
puts "STATUS DESCRIPTION: #{response[:item][:member_state]}";
|
416
|
+
puts "STATUS SUMMARY: #{response[:item][:summary]}";
|
417
|
+
puts "STATUS DETAILS:"
|
418
|
+
puts response[:item][:details][:item].nil? ? "No further details." : response[:item][:details][:item]
|
419
|
+
end
|
420
|
+
|
421
|
+
desc "sync DEVICE_GROUP DEVICE_WITH_CHANGES_PENDING", "This will sync configs between devices in the specified device group."
|
422
|
+
def sync(device_group, device)
|
423
|
+
device = "#{device.gsub(%r{^/Common/}, '')}"
|
424
|
+
response = client.System.ConfigSync.synchronize_to_group_v2(group: device_group, device: "/Common/#{device}", force: false)
|
425
|
+
if response.nil? || response.empty?
|
426
|
+
puts "Sync completed."
|
427
|
+
else
|
428
|
+
puts "Sync did not complete."
|
429
|
+
end
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
class VirtualServer < Subcommand
|
434
|
+
|
435
|
+
desc "list", "Lists all the virtual servers"
|
436
|
+
def list
|
437
|
+
response = client.LocalLB.VirtualServer.get_list
|
438
|
+
|
439
|
+
virtualservers = Array(response[:item])
|
440
|
+
if virtualservers.empty?
|
441
|
+
puts "No virtual servers found"
|
442
|
+
else
|
443
|
+
virtualservers.each do |p|
|
444
|
+
puts p
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
desc "show VSERVER_NAME", "Shows information about a virtual server"
|
450
|
+
def show(vserver)
|
451
|
+
destination = extract_items client.LocalLB.VirtualServer.get_destination(virtual_servers: { item: [vserver] } )
|
452
|
+
protocol = extract_items client.LocalLB.VirtualServer.get_protocol(virtual_servers: { item: [vserver] } )
|
453
|
+
default_pool = extract_items client.LocalLB.VirtualServer.get_default_pool_name(virtual_servers: { item: [vserver] } )
|
454
|
+
|
455
|
+
puts "%-25s %-20s %-20s %-20s" % ["Destination Address", "Destination Port", "Protocol", "Default Pool"]
|
456
|
+
puts "%-25s %-20s %-20s %-20s" % [destination[:address], destination[:port], protocol.split('_').last, default_pool]
|
457
|
+
end
|
458
|
+
|
459
|
+
desc "status VSERVER_NAME", "Shows the status of the virtual server"
|
460
|
+
def status(vserver)
|
461
|
+
response = client.LocalLB.VirtualServer.get_object_status(virtual_servers: { item: [vserver] } )
|
462
|
+
|
463
|
+
availability = response[:item][:availability_status].split('_').last
|
464
|
+
enabled = response[:item][:enabled_status].split('_').last
|
465
|
+
status_description = response[:item][:status_description]
|
466
|
+
|
467
|
+
puts "%-40s %-20s %-20s %-20s" % ["Name", "Availability", "Enabled", "Status Description"]
|
468
|
+
puts "%-40s %-20s %-20s %-20s" % [vserver, availability, enabled, status_description]
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
363
472
|
class Application < Thor
|
364
473
|
class_option :lb, default: 'default'
|
365
474
|
|
475
|
+
class_option :config, :type => :string, :default => "#{ENV['HOME']}/.f5.yml", :desc => "Defines the location of the configuration file."
|
476
|
+
|
366
477
|
desc "node SUBCOMMAND ...ARGS", "manage nodes"
|
367
478
|
subcommand "node", Node
|
368
479
|
|
@@ -377,6 +488,18 @@ module F5
|
|
377
488
|
|
378
489
|
desc "vlan SUBCOMMAND ...ARGS", "manage vlans"
|
379
490
|
subcommand "vlan", VLAN
|
491
|
+
|
492
|
+
desc "config SUBCOMMAND ...ARGS", "view config values"
|
493
|
+
subcommand "config", Config
|
494
|
+
|
495
|
+
desc "device SUBCOMMAND ...ARGS", "manage devices"
|
496
|
+
subcommand "device", Device
|
497
|
+
|
498
|
+
desc "devicegroup SUBCOMMAND ...ARGS", "manage device groups"
|
499
|
+
subcommand "devicegroup", DeviceGroup
|
500
|
+
|
501
|
+
desc "vserver SUBCOMMAND ...ARGS", "manage virtual servers"
|
502
|
+
subcommand "vserver", VirtualServer
|
380
503
|
end
|
381
504
|
end
|
382
505
|
end
|
data/lib/f5/icontrol/rapi.rb
CHANGED
@@ -63,7 +63,9 @@ module F5
|
|
63
63
|
|
64
64
|
private
|
65
65
|
def url
|
66
|
-
|
66
|
+
pool_match = @method_chain.match %r{(/pool/[A-Za-z0-9\-_~]+)}
|
67
|
+
method_chain = @method_chain.tr '_', '-'
|
68
|
+
method_chain = method_chain.sub %r{/pool/[A-Za-z0-9\-_~]+}, pool_match[1] unless pool_match.nil?
|
67
69
|
method_chain.gsub! %r{^/}, ''
|
68
70
|
"https://#{@args[:host]}/#{method_chain}"
|
69
71
|
end
|
@@ -15,7 +15,7 @@ module F5
|
|
15
15
|
potential_collection = "#{method}Reference"
|
16
16
|
if @args.key? potential_collection
|
17
17
|
link = @args[potential_collection]["link"]
|
18
|
-
link.
|
18
|
+
link.sub! %r{^https?://[A-Za-z0-9\-._]+/}, ""
|
19
19
|
return F5::Icontrol::RAPI.new(link, @credentials)
|
20
20
|
end
|
21
21
|
end
|
data/lib/f5/icontrol/version.rb
CHANGED
data/spec/models/rapi_spec.rb
CHANGED
@@ -40,6 +40,15 @@ describe F5::Icontrol::RAPI do
|
|
40
40
|
expect(WebMock).to have_requested(:get, "#{baseurl}/foo-bar/")
|
41
41
|
end
|
42
42
|
|
43
|
+
it "preserves underscores in pool names" do
|
44
|
+
stub_request(:get, "#{baseurl}/pool/foo_bar").
|
45
|
+
to_return(body: pool_collection)
|
46
|
+
|
47
|
+
subject.pool.load('foo_bar')
|
48
|
+
|
49
|
+
expect(WebMock).to have_requested(:get, "#{baseurl}/pool/foo_bar")
|
50
|
+
end
|
51
|
+
|
43
52
|
it "understands `each` implicitly calls `get_collection`" do
|
44
53
|
stub_request(:get, "#{baseurl}/foo/bar/").
|
45
54
|
to_return(body: pool_collection)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: f5-icontrol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Walberg
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: savon
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: wasabi
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "<="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.5.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "<="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.5.0
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: awesome_print
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +156,14 @@ dependencies:
|
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
159
|
+
version: 3.7.0
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
166
|
+
version: 3.7.0
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: vcr
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -480,7 +494,7 @@ homepage: https://github.com/swalberg/f5-icontrol
|
|
480
494
|
licenses:
|
481
495
|
- MIT
|
482
496
|
metadata: {}
|
483
|
-
post_install_message:
|
497
|
+
post_install_message:
|
484
498
|
rdoc_options: []
|
485
499
|
require_paths:
|
486
500
|
- lib
|
@@ -495,9 +509,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
495
509
|
- !ruby/object:Gem::Version
|
496
510
|
version: '0'
|
497
511
|
requirements: []
|
498
|
-
|
499
|
-
|
500
|
-
signing_key:
|
512
|
+
rubygems_version: 3.1.2
|
513
|
+
signing_key:
|
501
514
|
specification_version: 4
|
502
515
|
summary: A gem to manage F5 BigIP devices using the iControl API
|
503
516
|
test_files:
|