f5-icontrol 0.2.7 → 0.3.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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/README.md +60 -3
- data/f5-icontrol.gemspec +4 -1
- data/lib/f5/icontrol.rb +2 -0
- data/lib/f5/icontrol/rapi.rb +72 -0
- data/lib/f5/icontrol/rapi/resource.rb +25 -0
- data/lib/f5/icontrol/version.rb +1 -1
- data/spec/models/rapi/resource_spec.rb +24 -0
- data/spec/models/rapi_spec.rb +106 -0
- data/spec/spec_helper.rb +1 -0
- metadata +57 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ab74fd490e1b266c571be1645b623203f869e83
|
4
|
+
data.tar.gz: 956cab3ba87c5cbc478d3404c78a9808668ac526
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6c6c35ce03680285ee8a035ba9bbd8b35b0cdb2a8591bb1305357ba16d5ceb0e3d63969d8666b2a6905135f86646f4d1124e8433be049935244ff557e24b913
|
7
|
+
data.tar.gz: a3eeaddfeed7c3a38b471e8d5ead2887100f94079a56ee1ba4c0461cf71122202784aac473b2d583a339f3776ee206f01a44f54f7cc1d7e9b30f1006c815f5f0
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/swalberg/f5-icontrol)
|
4
4
|
|
5
|
-
This is the F5-
|
5
|
+
This is the F5-icontrol gem. If you have an F5, it can use the iControl API to automate things
|
6
6
|
|
7
7
|
This is not the official library. That one is [here](https://devcentral.f5.com/d/icontrol-ruby-library). This copy is without warranty. Heck, it probably doesn't even work.
|
8
8
|
|
@@ -13,7 +13,7 @@ I originally set out to improve the official one:
|
|
13
13
|
* Support Ruby 2.0.0 and 2.1.0
|
14
14
|
* Make the interface to the library more Ruby-esque
|
15
15
|
|
16
|
-
But given the original one was pretty bare-bones, I started over.
|
16
|
+
But given the original one was pretty bare-bones, I started over.
|
17
17
|
|
18
18
|
## Installation
|
19
19
|
|
@@ -29,7 +29,64 @@ Or install it yourself as:
|
|
29
29
|
|
30
30
|
$ gem install f5-icontrol
|
31
31
|
|
32
|
-
## Usage
|
32
|
+
## Usage (REST interface)
|
33
|
+
|
34
|
+
*NOTE:* The REST interface is still a work in progress! The conventions may change until we release.
|
35
|
+
|
36
|
+
First configure an instance of the API to point to your F5
|
37
|
+
|
38
|
+
```Ruby
|
39
|
+
require 'f5/icontrol'
|
40
|
+
|
41
|
+
f5 = F5::Icontrol::RAPI.new username: 'admin', password: 'admin', host: '10.1.1.1'
|
42
|
+
```
|
43
|
+
|
44
|
+
After that, the calls should line up directly to the [API Docs](https://devcentral.f5.com/wiki/iControlREST.APIRef.ashx). For collections, use the following methods:
|
45
|
+
|
46
|
+
| HTTP Verb | Method |
|
47
|
+
|-----------|----------------|
|
48
|
+
| GET | get_collection |
|
49
|
+
|
50
|
+
Note that `get_collection` is optional if you call `#each` or some `Enumberable` method. So `foo.get_collection.each` can be shortened to `foo.each`.
|
51
|
+
|
52
|
+
For resources
|
53
|
+
|
54
|
+
| HTTP Verb | Method |
|
55
|
+
|-----------|----------------|
|
56
|
+
| GET | load |
|
57
|
+
| PUT | update |
|
58
|
+
| DELETE | delete |
|
59
|
+
| POST | create |
|
60
|
+
|
61
|
+
|
62
|
+
For example, to get all the pools:
|
63
|
+
|
64
|
+
```Ruby
|
65
|
+
pools = f5.mgmt.tm.ltm.pool.get_collection
|
66
|
+
|
67
|
+
puts pools.map(&:name)
|
68
|
+
|
69
|
+
# shorter method
|
70
|
+
puts f5.mgmt.tm.ltm.pool.map(&:name)
|
71
|
+
```
|
72
|
+
|
73
|
+
It'll also understand subresources:
|
74
|
+
|
75
|
+
```Ruby
|
76
|
+
members = pools.members.load
|
77
|
+
puts members.map(&:address)
|
78
|
+
|
79
|
+
```
|
80
|
+
|
81
|
+
Or, let's create a pool:
|
82
|
+
|
83
|
+
```Ruby
|
84
|
+
api.mgmt.tm.ltm.pool.create(name: 'seanstestrest')
|
85
|
+
```
|
86
|
+
|
87
|
+
## Usage (SOAP interface)
|
88
|
+
|
89
|
+
*Note* - SOAP will likely be deprecated prior to version 1.0 of this gem. The REST interface is more intuitive and dropping SOAP makes this gem so much lighter.
|
33
90
|
|
34
91
|
First, configure the gem:
|
35
92
|
|
data/f5-icontrol.gemspec
CHANGED
@@ -19,13 +19,16 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "savon", "~> 2.0"
|
22
|
+
spec.add_dependency "rest-client"
|
22
23
|
spec.add_dependency "thor"
|
24
|
+
spec.add_dependency "rack", "~> 1.6.4"
|
25
|
+
spec.add_dependency "json"
|
23
26
|
|
24
27
|
spec.add_development_dependency "awesome_print"
|
25
28
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
29
|
spec.add_development_dependency "byebug"
|
27
30
|
spec.add_development_dependency "rake"
|
28
31
|
spec.add_development_dependency "rspec"
|
32
|
+
spec.add_development_dependency "webmock", "~> 2.1.0"
|
29
33
|
spec.add_development_dependency "vcr"
|
30
|
-
spec.add_development_dependency "webmock"
|
31
34
|
end
|
data/lib/f5/icontrol.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "f5/icontrol/version"
|
2
|
+
require "f5/icontrol/rapi"
|
2
3
|
require "f5/icontrol/api"
|
3
4
|
require 'f5/icontrol/common/enabled_state'
|
4
5
|
require 'f5/icontrol/common/enum_item'
|
@@ -9,6 +10,7 @@ require 'f5/icontrol/locallb/enabled_status'
|
|
9
10
|
require 'f5/icontrol/locallb/profile_context_type'
|
10
11
|
require 'f5/icontrol/locallb/profile_type'
|
11
12
|
require 'f5/icontrol/locallb/server_ssl_certificate_mode'
|
13
|
+
require 'f5/icontrol/rapi/resource'
|
12
14
|
require "openssl"
|
13
15
|
require "savon"
|
14
16
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module F5
|
5
|
+
module Icontrol
|
6
|
+
class RAPI
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def initialize(method_chain = nil, **args)
|
10
|
+
@method_chain = method_chain || ''
|
11
|
+
@args = args
|
12
|
+
end
|
13
|
+
|
14
|
+
def load(resource = nil)
|
15
|
+
tail = resource.nil? ? '' : "/#{resource}"
|
16
|
+
response = RestClient::Request.execute(method: :get,
|
17
|
+
url: "#{url}#{tail}",
|
18
|
+
user: @args[:username],
|
19
|
+
password: @args[:password],
|
20
|
+
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
21
|
+
)
|
22
|
+
object = JSON.parse response.body
|
23
|
+
|
24
|
+
if object.has_key? 'items'
|
25
|
+
object['items'].map { |r| Resource.new r, @args }
|
26
|
+
else
|
27
|
+
Resource.new object, @args
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_collection
|
32
|
+
response = RestClient::Request.execute(method: :get,
|
33
|
+
url: "#{url}/",
|
34
|
+
user: @args[:username],
|
35
|
+
password: @args[:password],
|
36
|
+
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
37
|
+
)
|
38
|
+
objects = JSON.parse response.body
|
39
|
+
|
40
|
+
objects['items'].map { |r| Resource.new r, @args }
|
41
|
+
end
|
42
|
+
|
43
|
+
def create(options = {})
|
44
|
+
response = RestClient::Request.execute(method: :post,
|
45
|
+
url: url,
|
46
|
+
user: @args[:username],
|
47
|
+
password: @args[:password],
|
48
|
+
verify_ssl: OpenSSL::SSL::VERIFY_NONE,
|
49
|
+
payload: options.to_json,
|
50
|
+
headers: { "content-type" => "application/json" }
|
51
|
+
)
|
52
|
+
JSON.parse response.body
|
53
|
+
end
|
54
|
+
|
55
|
+
def method_missing(method, *args, &block)
|
56
|
+
new_method_chain = @method_chain == '/' ? '': "#{@method_chain}/"
|
57
|
+
F5::Icontrol::RAPI.new("#{new_method_chain}#{method}", @args)
|
58
|
+
end
|
59
|
+
|
60
|
+
def each(&block)
|
61
|
+
get_collection.each &block
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def url
|
66
|
+
method_chain = @method_chain.gsub /_/, '-'
|
67
|
+
method_chain.gsub! %r{^/}, ''
|
68
|
+
"https://#{@args[:host]}/#{method_chain}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module F5
|
2
|
+
module Icontrol
|
3
|
+
class RAPI
|
4
|
+
class Resource
|
5
|
+
def initialize(args, credentials)
|
6
|
+
@args = args
|
7
|
+
@credentials = credentials
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing(method, *args, &block)
|
11
|
+
if @args.key? method.to_s
|
12
|
+
return @args[method.to_s]
|
13
|
+
end
|
14
|
+
|
15
|
+
potential_collection = "#{method}Reference"
|
16
|
+
if @args.key? potential_collection
|
17
|
+
link = @args[potential_collection]["link"]
|
18
|
+
link.gsub! /^http?s:\/\/localhost\//, ""
|
19
|
+
return F5::Icontrol::RAPI.new(link, @credentials)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/f5/icontrol/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe F5::Icontrol::RAPI::Resource do
|
4
|
+
subject { described_class.new pool, {} }
|
5
|
+
describe "#initialize" do
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "get attribute" do
|
9
|
+
it 'returns an attribute that exists' do
|
10
|
+
expect(subject.ipTosToServer).to eq 'pass-through'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "get subcollection" do
|
15
|
+
it 'returns an api reference' do
|
16
|
+
expect(subject.members).to be_an_instance_of F5::Icontrol::RAPI
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def pool
|
21
|
+
JSON.parse '{"kind":"tm:ltm:pool:poolstate","name":"reallybasic","partition":"Common","fullPath":"/Common/reallybasic","generation":845,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic?ver=11.5.1","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic/members?ver=11.5.1","isSubcollection":true}}'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe F5::Icontrol::RAPI do
|
4
|
+
let(:host) { 'somehost' }
|
5
|
+
let(:username) { 'me' }
|
6
|
+
let(:password) { 'secret' }
|
7
|
+
let(:base64) { Base64.encode64("#{username}:#{password}") }
|
8
|
+
|
9
|
+
let(:baseurl) { "https://#{host}" }
|
10
|
+
|
11
|
+
before(:all) { VCR.turn_off! }
|
12
|
+
|
13
|
+
subject { F5::Icontrol::RAPI.new(username: username, password: password, host: host) }
|
14
|
+
|
15
|
+
describe "asking for a collection" do
|
16
|
+
context "collections" do
|
17
|
+
it "calls the url based on the method chain" do
|
18
|
+
stub_request(:get, "#{baseurl}/foo/bar/").
|
19
|
+
to_return(body: pool_collection)
|
20
|
+
subject.foo.bar.get_collection
|
21
|
+
expect(WebMock).to have_requested(:get, "#{baseurl}/foo/bar/")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns an array of resources" do
|
25
|
+
stub_request(:get, "#{baseurl}/foo/bar/").
|
26
|
+
to_return(body: pool_collection)
|
27
|
+
|
28
|
+
bars = subject.foo.bar.get_collection
|
29
|
+
|
30
|
+
expect(bars).to be_an_instance_of(Array)
|
31
|
+
expect(bars.first).to be_an_instance_of(F5::Icontrol::RAPI::Resource)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "converts underscores to dashes in the call" do
|
35
|
+
stub_request(:get, "#{baseurl}/foo-bar/").
|
36
|
+
to_return(body: pool_collection)
|
37
|
+
|
38
|
+
subject.foo_bar.get_collection
|
39
|
+
|
40
|
+
expect(WebMock).to have_requested(:get, "#{baseurl}/foo-bar/")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "understands `each` implicitly calls `get_collection`" do
|
44
|
+
stub_request(:get, "#{baseurl}/foo/bar/").
|
45
|
+
to_return(body: pool_collection)
|
46
|
+
|
47
|
+
bars = subject.foo.bar.each
|
48
|
+
|
49
|
+
expect(bars).to be_an_instance_of(Enumerator)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "handles a block passed to an enumerable method" do
|
53
|
+
stub_request(:get, "#{baseurl}/foo/bar/").
|
54
|
+
to_return(body: pool_collection)
|
55
|
+
|
56
|
+
pools = subject.foo.bar.map(&:name)
|
57
|
+
|
58
|
+
expect(pools).to eq %w{reallybasic reallybasic2}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "subcollections" do
|
63
|
+
it "resolves the url based on the method chain and object id" do
|
64
|
+
stub_request(:get, "#{baseurl}/mgmt/tm/ltm/pool/").
|
65
|
+
to_return(body: pool_collection)
|
66
|
+
|
67
|
+
pools = subject.mgmt.tm.ltm.pool.get_collection
|
68
|
+
|
69
|
+
stub_request(:get, "#{baseurl}/mgmt/tm/ltm/pool/~Common~reallybasic/members?ver=11.5.1/").
|
70
|
+
to_return(body: pool_collection)
|
71
|
+
|
72
|
+
pool = pools.first.members.get_collection
|
73
|
+
|
74
|
+
expect(WebMock).to have_requested(:get, "#{baseurl}/mgmt/tm/ltm/pool/~Common~reallybasic/members?ver=11.5.1/")
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'creating a new resource' do
|
81
|
+
before do
|
82
|
+
stub_request(:post, "#{baseurl}/mgmt/tm/ltm/pool").
|
83
|
+
with(body: /"name":"foobar"/, headers: { "Content-Type" => "application/json" }).
|
84
|
+
to_return(body: new_pool_response)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'posts to the api' do
|
88
|
+
new_pool = subject.mgmt.tm.ltm.pool.create(name: 'foobar')
|
89
|
+
expect(WebMock).to have_requested(:post, "#{baseurl}/mgmt/tm/ltm/pool")
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns the hash containing the data' do
|
93
|
+
new_pool = subject.mgmt.tm.ltm.pool.create(name: 'foobar')
|
94
|
+
|
95
|
+
expect(new_pool).to be_an_kind_of Hash
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def pool_collection
|
100
|
+
'{"kind":"tm:ltm:pool:poolcollectionstate","selfLink":"https://localhost/mgmt/tm/ltm/pool?ver=11.5.1","items":[{"kind":"tm:ltm:pool:poolstate","name":"reallybasic","partition":"Common","fullPath":"/Common/reallybasic","generation":845,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic?ver=11.5.1","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic/members?ver=11.5.1","isSubcollection":true}},{"kind":"tm:ltm:pool:poolstate","name":"reallybasic2","partition":"Common","fullPath":"/Common/reallybasic2","generation":819,"selfLink":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic2?ver=11.5.1","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~reallybasic2/members?ver=11.5.1","isSubcollection":true}}]}'
|
101
|
+
end
|
102
|
+
|
103
|
+
def new_pool_response
|
104
|
+
'{"kind":"tm:ltm:pool:poolstate","name":"foobar","fullPath":"foobar","generation":848,"selfLink":"https://localhost/mgmt/tm/ltm/pool/foobar?ver=11.5.1","allowNat":"yes","allowSnat":"yes","ignorePersistedWeight":"disabled","ipTosToClient":"pass-through","ipTosToServer":"pass-through","linkQosToClient":"pass-through","linkQosToServer":"pass-through","loadBalancingMode":"round-robin","minActiveMembers":0,"minUpMembers":0,"minUpMembersAction":"failover","minUpMembersChecking":"disabled","queueDepthLimit":0,"queueOnConnectionLimit":"disabled","queueTimeLimit":0,"reselectTries":0,"slowRampTime":10,"membersReference":{"link":"https://localhost/mgmt/tm/ltm/pool/~Common~foobar/members?ver=11.5.1","isSubcollection":true}}'
|
105
|
+
end
|
106
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Walberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: savon
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: thor
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,34 @@ dependencies:
|
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.6.4
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.6.4
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: json
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: awesome_print
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,21 +151,21 @@ dependencies:
|
|
109
151
|
- !ruby/object:Gem::Version
|
110
152
|
version: '0'
|
111
153
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
154
|
+
name: webmock
|
113
155
|
requirement: !ruby/object:Gem::Requirement
|
114
156
|
requirements:
|
115
|
-
- - "
|
157
|
+
- - "~>"
|
116
158
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
159
|
+
version: 2.1.0
|
118
160
|
type: :development
|
119
161
|
prerelease: false
|
120
162
|
version_requirements: !ruby/object:Gem::Requirement
|
121
163
|
requirements:
|
122
|
-
- - "
|
164
|
+
- - "~>"
|
123
165
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
166
|
+
version: 2.1.0
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
168
|
+
name: vcr
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
128
170
|
requirements:
|
129
171
|
- - ">="
|
@@ -165,6 +207,8 @@ files:
|
|
165
207
|
- lib/f5/icontrol/locallb/profile_type.rb
|
166
208
|
- lib/f5/icontrol/locallb/server_ssl_certificate_mode.rb
|
167
209
|
- lib/f5/icontrol/locallb/virtual_server/source_address_translation.rb
|
210
|
+
- lib/f5/icontrol/rapi.rb
|
211
|
+
- lib/f5/icontrol/rapi/resource.rb
|
168
212
|
- lib/f5/icontrol/version.rb
|
169
213
|
- lib/wsdl/ASM.LoggingProfile.wsdl
|
170
214
|
- lib/wsdl/ASM.ObjectParams.wsdl
|
@@ -443,6 +487,8 @@ files:
|
|
443
487
|
- spec/cassettes/F5_Icontrol_System_SystemInfo/retrieves_the_version.yml
|
444
488
|
- spec/cli/pool_spec.rb
|
445
489
|
- spec/models/api_spec.rb
|
490
|
+
- spec/models/rapi/resource_spec.rb
|
491
|
+
- spec/models/rapi_spec.rb
|
446
492
|
- spec/spec_helper.rb
|
447
493
|
homepage: https://github.com/swalberg/f5-icontrol
|
448
494
|
licenses:
|
@@ -464,7 +510,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
464
510
|
version: '0'
|
465
511
|
requirements: []
|
466
512
|
rubyforge_project:
|
467
|
-
rubygems_version: 2.
|
513
|
+
rubygems_version: 2.5.1
|
468
514
|
signing_key:
|
469
515
|
specification_version: 4
|
470
516
|
summary: A gem to manage F5 BigIP devices using the iControl API
|
@@ -475,4 +521,6 @@ test_files:
|
|
475
521
|
- spec/cassettes/F5_Icontrol_System_SystemInfo/retrieves_the_version.yml
|
476
522
|
- spec/cli/pool_spec.rb
|
477
523
|
- spec/models/api_spec.rb
|
524
|
+
- spec/models/rapi/resource_spec.rb
|
525
|
+
- spec/models/rapi_spec.rb
|
478
526
|
- spec/spec_helper.rb
|