f5-icontrol 0.1.4 → 0.1.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e2ccf984f9aaa3d6645583ff75c3508be131820
4
- data.tar.gz: 78529cded64b45df7353914bfe42559eaaff1903
3
+ metadata.gz: af1d81830bb6821e3a7ef6040d632673be052a82
4
+ data.tar.gz: 436e1982d1adc3b0354e93b9f436288f5c24609f
5
5
  SHA512:
6
- metadata.gz: 86cee5bf0ba8c08134ffc063e25d35a15b942abd26890c3fd988d333b6ab970e8166fad09affe2f8bf4a2d75b36f2bd3a950c299a21f3595140e501c100ed762
7
- data.tar.gz: 95fdc349be5609f6fedc0612a70745304636e12be1db3bf0bb328d8f30e694b2fde6e3d395f9e89280e846eb7b22c68b9997618af2bbdc990aa71ec1e7dec437
6
+ metadata.gz: fa4feeb14c8b10e1f04e17fdc285f40c1712483c937062d4d84baa1e7b365b0a10690c4c4fca87ed5d49165808f4a240a6e2ba30737cd65cd53b1b88316268e8
7
+ data.tar.gz: 61170981d9e12599418f8b55cef318467ba45fdc9517dc292b28605e250f7c05d6f449ff16510caf1b68225f4f06905c7e2875d37c00520335534513c5788478
data/README.md CHANGED
@@ -55,9 +55,14 @@ See specs subdir for more examples, especially as it pertains to passing paramet
55
55
  There's a command line version that's still being roughed out. You'll need a `~/.f5.yml` file containing your login information:
56
56
 
57
57
  ```
58
- host: foo.bar.com
59
- username: admin
60
- password: abc123
58
+ default:
59
+ host: foo.bar.com
60
+ username: admin
61
+ password: abc123
62
+ lb2:
63
+ host: 1.2.3.4
64
+ username: admin
65
+ password: abc123
61
66
  ```
62
67
 
63
68
  Then run `f5` and it'll provide help
data/bin/f5 CHANGED
@@ -3,12 +3,4 @@
3
3
  require 'f5/cli/application'
4
4
  require 'f5/icontrol'
5
5
 
6
- config ||= YAML.load_file("#{ENV['HOME']}/.f5.yml")
7
-
8
- F5::Icontrol.configure do |f5|
9
- f5.host = config['host']
10
- f5.username = config['username']
11
- f5.password = config['password']
12
- end
13
-
14
6
  F5::Cli::Application.start(ARGV)
@@ -2,7 +2,177 @@ require 'thor'
2
2
 
3
3
  module F5
4
4
  module Cli
5
- class Pool < Thor
5
+ class Subcommand < Thor
6
+
7
+ private
8
+
9
+ def extract_items(response, opts = nil)
10
+ items = response[:item]
11
+
12
+ if items.nil?
13
+ return opts == :as_array ? [] : nil
14
+ end
15
+
16
+ if items.is_a?(Hash) && items.has_key?(:item)
17
+ items = items[:item]
18
+ end
19
+ if opts == :as_array && items.is_a?(Hash)
20
+ [ items ]
21
+ else
22
+ items
23
+ end
24
+ end
25
+
26
+ def client
27
+ return @client if @client
28
+ config = YAML.load_file("#{ENV['HOME']}/.f5.yml")
29
+ if config.key?('username') && options[:lb] == 'default'
30
+ puts "Warning: credentials in .f5.yml should be put under a named load balancer."
31
+ configure_lb_as(config)
32
+ else
33
+ configure_lb_as config[options[:lb]]
34
+ end
35
+ F5::Icontrol::API.new
36
+ end
37
+
38
+ def configure_lb_as(config)
39
+ F5::Icontrol.configure do |f5|
40
+ f5.host = config['host']
41
+ f5.username = config['username']
42
+ f5.password = config['password']
43
+ end
44
+ end
45
+
46
+ def itemize(option)
47
+ {
48
+ item: [ option ]
49
+ }
50
+ end
51
+
52
+ end
53
+
54
+ class SelfIP < Subcommand
55
+ desc "list", "Lists all the self IPs"
56
+ def list
57
+ response = client.Networking.SelfIPV2.get_list
58
+
59
+ selfips = extract_items(response, :as_array)
60
+ if selfips.empty?
61
+ puts "No selfips found"
62
+ else
63
+ selfips.each do |selfip|
64
+ puts selfip
65
+ end
66
+ end
67
+ end
68
+
69
+ desc "show NAME", "Shows information about a self IP"
70
+ def show(name)
71
+ address = extract_items client.Networking.SelfIPV2.get_address(self_ips: { item: [ name ] })
72
+ netmask = extract_items client.Networking.SelfIPV2.get_netmask(self_ips: { item: [ name ] })
73
+ vlan = extract_items client.Networking.SelfIPV2.get_vlan(self_ips: { item: [ name ] })
74
+ trafficgroup = extract_items client.Networking.SelfIPV2.get_traffic_group(self_ips: { item: [ name ] })
75
+ floating = extract_items client.Networking.SelfIPV2.get_floating_state(self_ips: { item: [ name ] })
76
+
77
+ puts "#{address}/#{netmask}"
78
+ puts vlan
79
+ puts "#{trafficgroup} #{floating == 'STATE_ENABLED' ? 'FLOATING' : 'NONFLOATING'}"
80
+ end
81
+
82
+ desc "create NAME IP/NETMASK VLAN", "Creates a self IP"
83
+ option :floating, type: :boolean, default: false
84
+ option :traffic_group, default: 'traffic-group-local-only'
85
+ def create(name, address, vlan)
86
+ (ip, netmask) = address.split(/\//)
87
+ result = client.Networking.SelfIPV2.create(
88
+ self_ips: itemize(name),
89
+ vlan_names: itemize(vlan),
90
+ addresses: itemize(ip),
91
+ netmasks: itemize(netmask),
92
+ traffic_groups: itemize(options[:traffic_group]),
93
+ floating_states: itemize(options[:floating] ? 'STATE_ENABLED' : 'STATE_DISABLED')
94
+ )
95
+ end
96
+ end
97
+
98
+ class Interface < Subcommand
99
+
100
+ desc "list", "Lists all the interfaces"
101
+ def list
102
+ response = client.Networking.Interfaces.get_list
103
+
104
+ interfaces = extract_items(response, :as_array)
105
+ if interfaces.empty?
106
+ puts "No interfaces found"
107
+ else
108
+ interfaces.each do |interface|
109
+ puts interface
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ class VLAN < Subcommand
116
+
117
+ desc "list", "Lists all the vlans"
118
+ def list
119
+ response = client.Networking.VLAN.get_list
120
+
121
+ vlans = extract_items(response, :as_array)
122
+ if vlans.empty?
123
+ puts "No VLANs found"
124
+ else
125
+ vlans.each do |vlan|
126
+ puts vlan
127
+ end
128
+ end
129
+ end
130
+
131
+ desc "show VLAN_NAME", "Show a particular vlan"
132
+ def show(name)
133
+ members = extract_items client.Networking.VLAN.get_member(vlans: { item: [ name ] } ), :as_array
134
+
135
+ vid = extract_items client.Networking.VLAN.get_vlan_id(vlans: { item: [ name ] } )
136
+
137
+ failsafe_state = extract_items client.Networking.VLAN.get_failsafe_state(vlans: { item: [ name ] } )
138
+
139
+ puts "VLAN id #{vid} and failsafe is #{failsafe_state}"
140
+ members.each do |member|
141
+ puts "Interface %s is a %s and tag state is %s" % [ member[:member_name], member[:member_type], member[:tag_state] ]
142
+ end
143
+ end
144
+
145
+ desc "create VLAN_ID VLAN_NAME member1type:member1name ", "Create a vlan with the name and ID, attached to the given members"
146
+ def create(vid, name, *members)
147
+ if members.empty?
148
+ puts "I need at least one member interface"
149
+ exit
150
+ end
151
+
152
+ memberdata = members.map do |m|
153
+ (mtype, mname) = m.split /:/
154
+ if mname.nil?
155
+ puts "Each member must be in the form of interface/trunk:id"
156
+ exit
157
+ end
158
+ { member_name: mname,
159
+ member_type: (mtype == 'trunk' ? 'MEMBER_TRUNK' : 'MEMBER_INTERFACE'),
160
+ tag_state: 'MEMBER_TAGGED' }
161
+ end
162
+
163
+ response = client.Networking.VLAN.create_v2(
164
+ vlans: { item: [ name ] },
165
+ vlan_ids: { item: [ vid ] },
166
+ members: { item: [ item: memberdata ] },
167
+ failsafe_states: { item: [ 'STATE_DISABLED' ] },
168
+ timeouts: { item: [ 100 ] } #???
169
+ )
170
+ puts response
171
+
172
+ end
173
+ end
174
+
175
+ class Pool < Subcommand
6
176
 
7
177
  desc "list", "Lists all the pools"
8
178
  def list
@@ -103,7 +273,6 @@ module F5
103
273
  end
104
274
 
105
275
  private
106
-
107
276
  def pool_members(pool)
108
277
  response = client.LocalLB.Pool.get_member_v2(pool_names: { item: [ pool ] } )
109
278
 
@@ -113,17 +282,22 @@ module F5
113
282
  members.map { |m| { address: m[:address], port: m[:port] } }
114
283
  end
115
284
 
116
- def client
117
- @client || F5::Icontrol::API.new
118
- end
119
-
120
285
  end
121
286
 
122
287
  class Application < Thor
288
+ class_option :lb, default: 'default'
123
289
 
124
290
  desc "pool SUBCOMMAND ...ARGS", "manage pools"
125
291
  subcommand "pool", Pool
126
292
 
293
+ desc "interface SUBCOMMAND ...ARGS", "manage interfaces"
294
+ subcommand "interface", Interface
295
+
296
+ desc "selfip SUBCOMMAND ...ARGS", "manage self IPs"
297
+ subcommand "selfip", SelfIP
298
+
299
+ desc "vlan SUBCOMMAND ...ARGS", "manage vlans"
300
+ subcommand "vlan", VLAN
127
301
  end
128
302
  end
129
303
  end
@@ -1,5 +1,5 @@
1
1
  module F5
2
2
  module Icontrol
3
- VERSION = "0.1.4"
3
+ VERSION = "0.1.5"
4
4
  end
5
5
  end
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.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Walberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-12 00:00:00.000000000 Z
11
+ date: 2015-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
@@ -411,3 +411,4 @@ test_files:
411
411
  - spec/cli/pool_spec.rb
412
412
  - spec/models/api_spec.rb
413
413
  - spec/spec_helper.rb
414
+ has_rdoc: