netscaler 0.2.0 → 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 +8 -8
- data/README.rdoc +2 -0
- data/VERSION +1 -1
- data/lib/netscaler/connection.rb +14 -3
- data/lib/netscaler/http_adapter.rb +5 -1
- data/lib/netscaler/lb.rb +22 -0
- data/lib/netscaler/lb/monitor.rb +37 -0
- data/lib/netscaler/lb/vserver.rb +52 -0
- data/lib/netscaler/lb/vserver/bind.rb +27 -0
- data/lib/netscaler/lb/vserver/unbind.rb +29 -0
- data/lib/netscaler/mock_adapter.rb +6 -0
- data/lib/netscaler/monkey_patches.rb +3 -1
- data/lib/netscaler/policy/stringmap.rb +4 -8
- data/lib/netscaler/server.rb +21 -4
- data/lib/netscaler/service.rb +57 -5
- data/lib/netscaler/servicegroup.rb +72 -9
- data/netscaler.gemspec +9 -3
- data/spec/lbvserver_spec.rb +175 -0
- data/spec/netscaler_spec.rb +10 -0
- data/spec/server_spec.rb +32 -6
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTM3NDRkODQzNmM4MzYyMDhkZmZhYzFkODYzM2M5ZDdiODI0Mzc4ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmMxMWVjMzk2Yjc2ZTAyZTRmOTlhYzEzMWJlY2M2OTUwMTI5NTMxMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZGQ5YmJjOTkyNTE0ZjQxNTY0MWQ0MWMxOWE2ZDJmMjVkZTcwMWVkOWVmMWRh
|
10
|
+
Y2UwNDIyNDlkNWJmMjQ1ZWNmZWY3MWY0YjE4NDE0MmVlN2U1NTU3MzhhOWE3
|
11
|
+
YjlhM2ZiOTUxZjJlYTI0MjYzZWM3NmI1NWEwYmQxZWQ0NjhjZWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDM0MmI5YzcxYzU4OTAxZDRmNzJiZWQ5ZGYyN2ZlZGZlOGNjN2NlNGUxYzc0
|
14
|
+
ZDYwY2RmZTAyYmFiMmVlNWQxNTM4OGY1MmY4M2JjZDM3OWIxYTA1NjA0ZGVi
|
15
|
+
NWJhYTNiNWUzM2QwNTcxM2MzZjdjNWMzMzFkMmMzODg2YTk1N2U=
|
data/README.rdoc
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://travis-ci.org/GravityLabs/netscaler)
|
2
|
+
|
1
3
|
= Netscaler Gem
|
2
4
|
|
3
5
|
A gem that uses the Netscaler {Nitro API}[http://support.citrix.com/proddocs/topic/netscaler-main-api-10-map/ns-nitro-wrapper-con.html] to access configs and stats. This has been tested only on Netscaler 9.3. Hoping to have Netscaler 10.0 support added in the near future.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/netscaler/connection.rb
CHANGED
@@ -10,6 +10,7 @@ require 'netscaler/load_balancing'
|
|
10
10
|
require 'netscaler/http_adapter'
|
11
11
|
require 'netscaler/adapter'
|
12
12
|
require 'netscaler/policy'
|
13
|
+
require 'netscaler/lb'
|
13
14
|
|
14
15
|
module Netscaler
|
15
16
|
class Connection
|
@@ -22,14 +23,16 @@ module Netscaler
|
|
22
23
|
|
23
24
|
raise ArgumentError, "Required options are missing. #{missing_options.join(', ')}" if missing_options.length > 0
|
24
25
|
|
25
|
-
@username
|
26
|
-
@password
|
27
|
-
@
|
26
|
+
@username = options[:username]
|
27
|
+
@password = options[:password]
|
28
|
+
@verify_ssl = options[:verify_ssl].nil? ? true : options[:verify_ssl]
|
29
|
+
@adapter = HttpAdapter.new :hostname => "https://#{options[:hostname]}", :username => @username, :password => @password, :verify_ssl => @verify_ssl
|
28
30
|
@load_balancing = LoadBalancing.new self
|
29
31
|
@service = Service.new self
|
30
32
|
@servicegroups = ServiceGroup.new self
|
31
33
|
@servers = Server.new self
|
32
34
|
@policy = Policy.new self
|
35
|
+
@lb = Lb.new self
|
33
36
|
end
|
34
37
|
|
35
38
|
def adapter
|
@@ -56,6 +59,10 @@ module Netscaler
|
|
56
59
|
@policy
|
57
60
|
end
|
58
61
|
|
62
|
+
def lb
|
63
|
+
@lb
|
64
|
+
end
|
65
|
+
|
59
66
|
def servers
|
60
67
|
return @servers
|
61
68
|
end
|
@@ -64,6 +71,10 @@ module Netscaler
|
|
64
71
|
return @adapter.session
|
65
72
|
end
|
66
73
|
|
74
|
+
def verify_ssl
|
75
|
+
return @verify_ssl
|
76
|
+
end
|
77
|
+
|
67
78
|
def login()
|
68
79
|
payload = {
|
69
80
|
'username' => @username,
|
@@ -5,7 +5,11 @@ require 'json'
|
|
5
5
|
module Netscaler
|
6
6
|
class HttpAdapter < Adapter
|
7
7
|
def initialize(args)
|
8
|
-
@site=RestClient::Resource.new
|
8
|
+
@site = RestClient::Resource.new(args[:hostname], {
|
9
|
+
:user => args[:username],
|
10
|
+
:password => args[:password],
|
11
|
+
:verify_ssl => args[:verify_ssl]
|
12
|
+
})
|
9
13
|
end
|
10
14
|
|
11
15
|
def post_no_body(part, data, args={})
|
data/lib/netscaler/lb.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'netscaler/lb/monitor'
|
2
|
+
require 'netscaler/lb/vserver'
|
3
|
+
require 'netscaler/lb/vserver/bind'
|
4
|
+
require 'netscaler/lb/vserver/unbind'
|
5
|
+
|
6
|
+
module Netscaler
|
7
|
+
class Lb
|
8
|
+
|
9
|
+
def initialize(netscaler)
|
10
|
+
@netscaler = netscaler
|
11
|
+
end
|
12
|
+
|
13
|
+
def monitor
|
14
|
+
Monitor.new @netscaler
|
15
|
+
end
|
16
|
+
|
17
|
+
def vserver
|
18
|
+
Vserver.new @netscaler
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'netscaler/netscaler_service'
|
2
|
+
|
3
|
+
module Netscaler
|
4
|
+
class Lb
|
5
|
+
class Monitor < NetscalerService
|
6
|
+
|
7
|
+
def initialize(netscaler)
|
8
|
+
@netscaler = netscaler
|
9
|
+
end
|
10
|
+
|
11
|
+
def bind(payload) # :args: :monitorName => 'http', :entityName => 'foo' :entityType => '[service|servicegroup]'
|
12
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
13
|
+
validate_payload(payload, [:monitorName, :entityName, :entityType])
|
14
|
+
valid_entityTypes = %w(service servicegroup)
|
15
|
+
raise ArgumentError, ":entityType does not equal one of the following: #{valid_entityTypes.flatten}" unless valid_entityTypes.include?(payload[:entityType])
|
16
|
+
new_payload = {:monitorName => payload[:monitorName],
|
17
|
+
:"#{payload[:entityType]}Name" => payload[:entityName]}
|
18
|
+
|
19
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_#{payload[:entityType]}_binding/#{payload[:monitorName]}?action=bind",
|
20
|
+
{'params' => {'action' => 'bind'}, "lbmonitor_#{payload[:entityType]}_binding" => new_payload})
|
21
|
+
end
|
22
|
+
|
23
|
+
def unbind(payload) # :args: :monitorName => 'http', :entityName => 'foo' :entityType => '[service|servicegroup]'
|
24
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
25
|
+
validate_payload(payload, [:monitorName, :entityName, :entityType])
|
26
|
+
valid_entityTypes = %w(service servicegroup)
|
27
|
+
raise ArgumentError, ":entityType does not equal one of the following: #{valid_entityTypes.flatten}" unless valid_entityTypes.include?(payload[:entityType])
|
28
|
+
new_payload = {:monitorName => payload[:monitorName],
|
29
|
+
:"#{payload[:entityType]}Name" => payload[:entityName]}
|
30
|
+
|
31
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_servicegroup_binding/#{payload[:monitorName]}?action=unbind",
|
32
|
+
{'params' => {'action' => 'unbind'}, 'lbmonitor_servicegroup_binding' => new_payload})
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'netscaler/netscaler_service'
|
2
|
+
|
3
|
+
module Netscaler
|
4
|
+
class Lb
|
5
|
+
class Vserver < NetscalerService
|
6
|
+
def initialize(netscaler)
|
7
|
+
@netscaler=netscaler
|
8
|
+
end
|
9
|
+
|
10
|
+
def show(payload={})
|
11
|
+
if payload[:name] != nil then
|
12
|
+
validate_payload(payload, [:name])
|
13
|
+
return @netscaler.adapter.get("config/lbvserver/#{payload[:name]}")
|
14
|
+
elsif payload == {} then
|
15
|
+
return @netscaler.adapter.get('config/lbvserver/')
|
16
|
+
else
|
17
|
+
raise ArgumentError, 'payload supplied must have been missing :name'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def show_binding(payload)
|
22
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
23
|
+
payload = Netscaler.hash_hack(payload)
|
24
|
+
validate_payload(payload, [:name])
|
25
|
+
return @netscaler.adapter.get("config/lbvserver_binding/#{payload[:name]}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove(payload) # :args: :name
|
29
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
30
|
+
payload = Netscaler.hash_hack(payload)
|
31
|
+
validate_payload(payload, [:name])
|
32
|
+
return @netscaler.adapter.delete("config/lbvserver/#{payload[:name]}")
|
33
|
+
end
|
34
|
+
|
35
|
+
def add(payload)
|
36
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
37
|
+
payload = Netscaler.hash_hack(payload)
|
38
|
+
validate_payload(payload, [:name, :serviceType, :ipv46, :port])
|
39
|
+
return @netscaler.adapter.post_no_body('config/lbvserver/', {'lbvserver' => payload})
|
40
|
+
end
|
41
|
+
|
42
|
+
def bind
|
43
|
+
Bind.new @netscaler
|
44
|
+
end
|
45
|
+
|
46
|
+
def unbind
|
47
|
+
Unbind.new @netscaler
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Netscaler
|
2
|
+
class Lb
|
3
|
+
class Vserver
|
4
|
+
class Bind < NetscalerService
|
5
|
+
def initialize(netscaler)
|
6
|
+
@netscaler=netscaler
|
7
|
+
end
|
8
|
+
|
9
|
+
def service(payload)
|
10
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
11
|
+
validate_payload(payload, [:name, :serviceName])
|
12
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{payload['name']}?action=bind/", {'params' => {'action' => 'bind'}, 'lbvserver_service_binding' => payload})
|
13
|
+
end
|
14
|
+
|
15
|
+
def rewrite_policy(payload)
|
16
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
17
|
+
validate_payload(payload, [:name, :policyName, :priority, :bindpoint])
|
18
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{payload['name']}?action=bind/", {'params' => {'action' => 'bind'}, 'lbvserver_rewritepolicy_binding' => payload})
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#require 'netscaler/netscaler_service'
|
2
|
+
module Netscaler
|
3
|
+
class Lb
|
4
|
+
class Vserver
|
5
|
+
class Unbind < NetscalerService
|
6
|
+
def initialize(netscaler)
|
7
|
+
@netscaler=netscaler
|
8
|
+
end
|
9
|
+
|
10
|
+
def service(payload)
|
11
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
12
|
+
validate_payload(payload, [:name, :serviceName])
|
13
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{payload['name']}?action=unbind/", {'params' => {'action' => 'unbind'}, 'lbvserver_service_binding' => payload})
|
14
|
+
end
|
15
|
+
|
16
|
+
def rewrite_policy(payload)
|
17
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
18
|
+
validate_payload(payload, [:name, :policyName])
|
19
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{payload['name']}?action=bind/", {'params' => {'action' => 'unbind'}, 'lbvserver_rewritepolicy_binding' => payload})
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module Netscaler
|
2
|
-
|
2
|
+
# #hash_hack is mainly used in all the methods to provide backward compatibility for the older methods.
|
3
|
+
# Prior to this the method argument keys were string. We later made them to symbols. This allows users
|
4
|
+
# to use both but will eventually deprecate this.
|
3
5
|
def self.hash_hack(hash)
|
4
6
|
raise ArgumentError, 'payload must be a hash.' unless hash.is_a?(Hash)
|
5
7
|
hash.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil}
|
@@ -7,9 +7,8 @@ module Netscaler
|
|
7
7
|
@netscaler = netscaler
|
8
8
|
end
|
9
9
|
|
10
|
-
def list(payload = nil)
|
10
|
+
def list(payload = nil) # :args: :name => 'foo'
|
11
11
|
if payload !=nil then
|
12
|
-
payload = Netscaler.hash_hack(payload)
|
13
12
|
validate_payload(payload, [:name])
|
14
13
|
return @netscaler.adapter.get("config/policystringmap/#{payload[:name]}")
|
15
14
|
else
|
@@ -17,23 +16,20 @@ module Netscaler
|
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
|
-
def add(payload)
|
19
|
+
def add(payload) # :args: :name => 'foo'
|
21
20
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
22
|
-
payload = Netscaler.hash_hack(payload)
|
23
21
|
validate_payload(payload, [:name])
|
24
22
|
return @netscaler.adapter.post_no_body('config/policystringmap/', 'policystringmap' => payload)
|
25
23
|
end
|
26
24
|
|
27
|
-
def get(payload)
|
25
|
+
def get(payload) # :args: :name => 'foo'
|
28
26
|
raise ArgumentError, 'arg must contain name of policystringmap! :name => "foo"' if payload.nil?
|
29
|
-
payload = Netscaler.hash_hack(payload)
|
30
27
|
validate_payload(payload, [:name])
|
31
28
|
return @netscaler.adapter.get("config/policystringmap_pattern_binding/#{payload[:name]}")
|
32
29
|
end
|
33
30
|
|
34
|
-
def bind(payload)
|
31
|
+
def bind(payload) # :args: :name => 'foo', :key => 'a', :value => '1'
|
35
32
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
36
|
-
payload = Netscaler.hash_hack(payload)
|
37
33
|
validate_payload(payload, [:name, :key, :value])
|
38
34
|
return @netscaler.adapter.post_no_body('config/policystringmap_pattern_binding/', 'policystringmap_pattern_binding' => payload)
|
39
35
|
end
|
data/lib/netscaler/server.rb
CHANGED
@@ -6,16 +6,33 @@ module Netscaler
|
|
6
6
|
@netscaler = netscaler
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
##
|
10
|
+
# method #add requires arg :name but :ipaddress and :domain are optional but requires one of them.
|
11
|
+
def add(server) # :args: :name => 'foo', :ipaddress => '192.168.1.10', :domain => 'bar.com'
|
10
12
|
raise ArgumentError, 'server cannot be null' if server.nil?
|
11
13
|
server = Netscaler.hash_hack(server)
|
12
|
-
if server[:
|
13
|
-
validate_payload(server, [:name, :ipaddress])
|
14
|
-
else
|
14
|
+
if server[:domain] != nil then
|
15
15
|
validate_payload(server, [:name, :domain])
|
16
|
+
else
|
17
|
+
validate_payload(server, [:name, :ipaddress])
|
16
18
|
end
|
17
19
|
|
18
20
|
return @netscaler.adapter.post_no_body('config/server/', {'server' => server})
|
19
21
|
end
|
22
|
+
|
23
|
+
def remove(payload) # :args: :server
|
24
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
25
|
+
payload = Netscaler.hash_hack(payload)
|
26
|
+
validate_payload(payload, [:server])
|
27
|
+
return @netscaler.adapter.delete("config/server/#{payload[:server]}")
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# :category: Deprecated Methods
|
32
|
+
# DEPRECATED: Please use #add instead=.
|
33
|
+
def add_server(server)
|
34
|
+
warn '[DEPRECATION] "add_server" is deprecated. Please use "#add" instead.'
|
35
|
+
self.add server
|
36
|
+
end
|
20
37
|
end
|
21
38
|
end
|
data/lib/netscaler/service.rb
CHANGED
@@ -1,52 +1,104 @@
|
|
1
1
|
require 'netscaler/netscaler_service'
|
2
2
|
|
3
3
|
module Netscaler
|
4
|
+
##
|
5
|
+
# Netscaler::Service handles all service entity calls.
|
6
|
+
# This includes #add, #enable, #disable and #show
|
4
7
|
class Service < NetscalerService
|
5
8
|
def initialize(netscaler)
|
6
9
|
@netscaler=netscaler
|
7
10
|
end
|
8
11
|
|
9
|
-
|
12
|
+
##
|
13
|
+
# This method require you already have a server created using Netscaler::Server#add
|
14
|
+
# or if it is already configured on the netscaler.
|
15
|
+
def add(payload) # :args: :name, :serverName, :serviceType, :port
|
10
16
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
11
17
|
payload = Netscaler.hash_hack(payload)
|
12
18
|
validate_payload(payload, [:name, :serverName, :serviceType, :port])
|
13
19
|
return @netscaler.adapter.post_no_body('config/service/', {'service' => payload})
|
14
20
|
end
|
15
21
|
|
16
|
-
|
17
|
-
|
22
|
+
##
|
23
|
+
# :category: Deprecated Methods
|
24
|
+
# DEPRECATED: Please use #add instead=.
|
25
|
+
def add_service(payload)
|
26
|
+
warn '[DEPRECATION] "add_service" is deprecated. Please use "#add" instead.'
|
27
|
+
self.add(payload)
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# :serverName is optional, if omitted it will return all services
|
32
|
+
# configured on the Netscaler.
|
33
|
+
def show(payload) # :args: :serverName => 'foo'
|
34
|
+
return @netscaler.adapter.get('config/service/', args) if payload.nil?
|
18
35
|
payload = Netscaler.hash_hack(payload)
|
19
36
|
validate_payload(payload, [:serviceName])
|
20
37
|
return @netscaler.adapter.get("config/service/#{payload[:serviceName]}")
|
21
38
|
end
|
22
39
|
|
40
|
+
##
|
41
|
+
# :category: Deprecated Methods
|
42
|
+
# DEPRECATED: Please use #show instead=.
|
43
|
+
def get_service(payload)
|
44
|
+
warn '[DEPRECATION] "get_service" is deprecated. Please use "#show" instead.'
|
45
|
+
self.show(payload)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# :category: Deprecated Methods
|
50
|
+
# DEPRECATED: Please use #show instead=.
|
23
51
|
def get_services(args={})
|
52
|
+
warn '[DEPRECATION] "get_services" is deprecated. Please use "#show" instead.'
|
24
53
|
return @netscaler.adapter.get('config/service/', args)
|
25
54
|
end
|
26
55
|
|
27
|
-
def
|
56
|
+
def enable(payload) # :args: :name => 'foo'
|
28
57
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
29
58
|
payload = Netscaler.hash_hack(payload)
|
30
59
|
validate_payload(payload, [:name])
|
31
60
|
return @netscaler.adapter.post_no_body('config/service/', {'params' => {'action' => 'enable'}, 'service' => payload})
|
32
61
|
end
|
33
62
|
|
34
|
-
|
63
|
+
##
|
64
|
+
# :category: Deprecated Methods
|
65
|
+
# DEPRECATED: Please use #enable instead=.
|
66
|
+
def enable_service(payload)
|
67
|
+
warn '[DEPRECATION] "enable_service" is deprecated. Please use "#enable" instead.'
|
68
|
+
self.enable(payload)
|
69
|
+
end
|
70
|
+
|
71
|
+
def disable(payload) # :args: :name => 'foo'
|
35
72
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
36
73
|
payload = Netscaler.hash_hack(payload)
|
37
74
|
validate_payload(payload, [:name])
|
38
75
|
return @netscaler.adapter.post_no_body('config/service/', {'params' => {'action' => 'disable'}, 'service' => payload})
|
39
76
|
end
|
40
77
|
|
78
|
+
##
|
79
|
+
# :category: Deprecated Methods
|
80
|
+
# DEPRECATED: Please use #disable instead=.
|
81
|
+
def disable_service(payload)
|
82
|
+
warn '[DEPRECATION] "disable_service" is deprecated. Please use "#disable" instead.'
|
83
|
+
self.disable(payload)
|
84
|
+
end
|
41
85
|
|
86
|
+
##
|
87
|
+
# :category: Deprecated Methods
|
88
|
+
# DEPRECATED: Please use Netscaler::Lb::Monitor.bind instead=.
|
42
89
|
def lbmonitor_service_binding(payload)
|
90
|
+
warn '[DEPRECATION] "lbmonitor_service_binding" is deprecated. Please use "Netscaler::Lb::Monitor.bind" instead.'
|
43
91
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
44
92
|
payload = Netscaler.hash_hack(payload)
|
45
93
|
validate_payload(payload, [:serviceName, :monitorName])
|
46
94
|
return @netscaler.adapter.post_no_body("config/lbmonitor_service_binding/#{payload[:monitorName]}?action=bind", {'params' => {'action' => 'bind'}, 'lbmonitor_service_binding' => payload})
|
47
95
|
end
|
48
96
|
|
97
|
+
##
|
98
|
+
# :category: Deprecated Methods
|
99
|
+
# DEPRECATED: Please use Netscaler::Lb::Monitor.unbind instead=.
|
49
100
|
def lbmonitor_service_unbinding(payload)
|
101
|
+
warn '[DEPRECATION] "lbmonitor_service_binding" is deprecated. Please use "Netscaler::Lb::Monitor.bind" instead.'
|
50
102
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
51
103
|
payload = Netscaler.hash_hack(payload)
|
52
104
|
validate_payload(payload, [:serviceName, :monitorName])
|
@@ -6,60 +6,123 @@ module Netscaler
|
|
6
6
|
@netscaler=netscaler
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def add(payload) # :args: :serviceGroupName => 'foo', :serviceType => 'HTTP'
|
10
10
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
11
11
|
payload = Netscaler.hash_hack(payload)
|
12
12
|
validate_payload(payload, [:serviceGroupName, :serviceType])
|
13
13
|
return @netscaler.adapter.post_no_body("config/servicegroup/", "servicegroup" => payload)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
##
|
17
|
+
# :category: Deprecated Methods
|
18
|
+
# DEPRECATED: Please use #add instead=.
|
19
|
+
def add_servicegroup(payload)
|
20
|
+
warn '[DEPRECATION] "add_servicegroup" is deprecated. Please use "#add" instead.'
|
21
|
+
self.add(payload)
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove(payload) # :arg: serviceGroupName
|
17
25
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
18
26
|
payload = Netscaler.hash_hack(payload)
|
19
27
|
validate_payload(payload, [:serviceGroupName])
|
20
28
|
return @netscaler.adapter.delete("config/servicegroup/#{payload[:serviceGroupName]}")
|
21
29
|
end
|
22
30
|
|
23
|
-
|
24
|
-
|
31
|
+
##
|
32
|
+
# :category: Deprecated Methods
|
33
|
+
# DEPRECATED: Please use #remove instead=.
|
34
|
+
def remove_servicegroup(payload)
|
35
|
+
warn '[DEPRECATION] "remove_servicegroup" is deprecated. Please use "#remove" instead.'
|
36
|
+
self.remove(payload)
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# argument is optional, if left empty it will return all servicegroups
|
41
|
+
def show(payload) # :arg: servicegroupname
|
42
|
+
return @netscaler.adapter.get("config/servicegroup/", args) if payload.nil?
|
25
43
|
return @netscaler.adapter.get("config/servicegroup/#{payload}")
|
26
44
|
end
|
27
45
|
|
28
|
-
|
29
|
-
|
46
|
+
##
|
47
|
+
# :category: Deprecated Methods
|
48
|
+
# DEPRECATED: Please use #show instead=.
|
49
|
+
def get_servicegroup(payload)
|
50
|
+
warn '[DEPRECATION] "get_servicegroup" is deprecated. Please use "#show" instead.'
|
51
|
+
self.show(payload)
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# :category: Deprecated Methods
|
56
|
+
# DEPRECATED: Please use #show instead=.
|
57
|
+
def get_servicegroups(payload)
|
58
|
+
warn '[DEPRECATION] "get_servicegroup" is deprecated. Please use "#show" instead.'
|
59
|
+
self.show(payload)
|
30
60
|
end
|
31
61
|
|
32
|
-
def
|
62
|
+
def show_bindings(payload) # :args: servicegroupname
|
33
63
|
return @netscaler.adapter.get("config/servicegroup_servicegroupmember_binding/#{payload}")
|
34
64
|
end
|
35
65
|
|
66
|
+
##
|
67
|
+
# :category: Deprecated Methods
|
68
|
+
# DEPRECATED: Please use #show_bindings instead=.
|
69
|
+
def get_servicegroup_servicegroupmember_bindings(payload)
|
70
|
+
warn '[DEPRECATION] "get_servicegroup_servicegroupmember_bindings" is deprecated. Please use "#show_bindings" instead.'
|
71
|
+
self.show_bindings(payload)
|
72
|
+
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# :category: Deprecated Methods
|
76
|
+
# DEPRECATED: Please use Netscaler::Lb::Monitor.bind instead=.
|
36
77
|
def lbmonitor_servicegroup_binding(payload)
|
78
|
+
warn '[DEPRECATION] "lbmonitor_servicegroup_binding" is deprecated. Please use "Netscaler::Lb::Monitor.bind" instead.'
|
37
79
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
38
80
|
payload = Netscaler.hash_hack(payload)
|
39
81
|
validate_payload(payload, [:serviceGroupName, :monitorName])
|
40
82
|
return @netscaler.adapter.post_no_body("config/lbmonitor_servicegroup_binding/#{payload[:monitorName]}?action=bind", {'params' => {'action' => 'bind'}, 'lbmonitor_servicegroup_binding' => payload})
|
41
83
|
end
|
42
84
|
|
85
|
+
##
|
86
|
+
# :category: Deprecated Methods
|
87
|
+
# DEPRECATED: Please use Netscaler::Lb::Monitor.unbind instead=.
|
43
88
|
def lbmonitor_servicegroup_unbinding(payload)
|
89
|
+
warn '[DEPRECATION] "lbmonitor_servicegroup_unbinding" is deprecated. Please use "Netscaler::Lb::Monitor.unbind" instead.'
|
44
90
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
45
91
|
payload = Netscaler.hash_hack(payload)
|
46
92
|
validate_payload(payload, [:serviceGroupName, :monitorName])
|
47
93
|
return @netscaler.adapter.post_no_body("config/lbmonitor_servicegroup_binding/#{payload[:monitorName]}?action=unbind", {'params' => {'action' => 'unbind'}, 'lbmonitor_servicegroup_binding' => payload})
|
48
94
|
end
|
49
95
|
|
50
|
-
def
|
96
|
+
def bind(payload) # :args: :serviceGroupName => 'foo', :port => '80', :serverName => 'bar'
|
51
97
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
52
98
|
payload = Netscaler.hash_hack(payload)
|
53
99
|
validate_payload(payload, [:serviceGroupName, :port, :serverName])
|
54
100
|
return @netscaler.adapter.post_no_body("config/servicegroup_servicegroupmember_binding/#{payload['serviceGroupName']}?action=bind", {'params' => {'action' => 'bind'}, 'servicegroup_servicegroupmember_binding' => payload})
|
55
101
|
end
|
56
102
|
|
57
|
-
|
103
|
+
|
104
|
+
##
|
105
|
+
# :category: Deprecated Methods
|
106
|
+
# DEPRECATED: Please use #bind instead=.
|
107
|
+
def bind_servicegroup_servicegroupmember(payload)
|
108
|
+
warn '[DEPRECATION] "bind_servicegroup_servicegroupmember" is deprecated. Please use #bind instead.'
|
109
|
+
self.bind(payload)
|
110
|
+
end
|
111
|
+
|
112
|
+
def unbind(payload) # :args: :serviceGroupName => 'foo', :port => '80', :serverName => 'bar'
|
58
113
|
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
59
114
|
payload = Netscaler.hash_hack(payload)
|
60
115
|
validate_payload(payload, [:serviceGroupName, :port, :serverName])
|
61
116
|
return @netscaler.adapter.post_no_body("config/servicegroup_servicegroupmember_binding/#{payload['serviceGroupName']}?action=unbind", {'params' => {'action' => 'unbind'}, 'servicegroup_servicegroupmember_binding' => payload})
|
62
117
|
end
|
63
118
|
|
119
|
+
##
|
120
|
+
# :category: Deprecated Methods
|
121
|
+
# DEPRECATED: Please use #unbind instead=.
|
122
|
+
def unbind_servicegroup_servicegroupmember(payload)
|
123
|
+
warn '[DEPRECATION] "unbind_servicegroup_servicegroupmember" is deprecated. Please use #unbind instead.'
|
124
|
+
self.unbind(payload)
|
125
|
+
end
|
126
|
+
|
64
127
|
end
|
65
128
|
end
|
data/netscaler.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: netscaler 0.
|
5
|
+
# stub: netscaler 0.3.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "netscaler"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.3.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Jeremy Custenborder", "David Andrew", "Jarrett Irons"]
|
14
|
-
s.date = "2014-
|
14
|
+
s.date = "2014-10-26"
|
15
15
|
s.description = "Netscaler api working against the Citrix Nitro api. Currently supports Nitro 9.3. Hope to add support for 10.X. Currently has support for som basics such as adding servers/services/servicegroups."
|
16
16
|
s.email = ["jeremy@scarcemedia.com", "david.andrew@webtrends.com", "jarrett.irons@gmail.com"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,11 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/netscaler/adapter.rb",
|
32
32
|
"lib/netscaler/connection.rb",
|
33
33
|
"lib/netscaler/http_adapter.rb",
|
34
|
+
"lib/netscaler/lb.rb",
|
35
|
+
"lib/netscaler/lb/monitor.rb",
|
36
|
+
"lib/netscaler/lb/vserver.rb",
|
37
|
+
"lib/netscaler/lb/vserver/bind.rb",
|
38
|
+
"lib/netscaler/lb/vserver/unbind.rb",
|
34
39
|
"lib/netscaler/load_balancing.rb",
|
35
40
|
"lib/netscaler/mock_adapter.rb",
|
36
41
|
"lib/netscaler/monkey_patches.rb",
|
@@ -41,6 +46,7 @@ Gem::Specification.new do |s|
|
|
41
46
|
"lib/netscaler/service.rb",
|
42
47
|
"lib/netscaler/servicegroup.rb",
|
43
48
|
"netscaler.gemspec",
|
49
|
+
"spec/lbvserver_spec.rb",
|
44
50
|
"spec/netscaler_spec.rb",
|
45
51
|
"spec/policy_stringmap_spec.rb",
|
46
52
|
"spec/server_spec.rb",
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'netscaler'
|
3
|
+
require 'netscaler/mock_adapter'
|
4
|
+
|
5
|
+
describe Netscaler::Lb::Vserver do
|
6
|
+
|
7
|
+
connection = Netscaler::Connection.new 'hostname' => 'foo', 'password' => 'bar', 'username' => 'bar'
|
8
|
+
connection.adapter = Netscaler::MockAdapter.new :body => '{ "errorcode": 0, "message": "Done" }'
|
9
|
+
|
10
|
+
context 'when adding a new lbvserver' do
|
11
|
+
it 'a name is required' do
|
12
|
+
expect {
|
13
|
+
connection.lb.vserver.add(:serviceType => 'HTTP', :port => '80', :ipv46 => '1.1.1.1')
|
14
|
+
}.should raise_error(ArgumentError, /name/)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'a service type is required' do
|
18
|
+
expect {
|
19
|
+
connection.lb.vserver.add(:name => 'foo', :port => '80', :ipv46 => '1.1.1.1')
|
20
|
+
}.should raise_error(ArgumentError, /serviceType/)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'a port is required' do
|
24
|
+
expect {
|
25
|
+
connection.lb.vserver.add(:name => 'foo', :serviceType => 'HTTP', :ipv46 => '1.1.1.1')
|
26
|
+
}.should raise_error(ArgumentError, /port/)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'a ipv46 is required' do
|
30
|
+
expect {
|
31
|
+
connection.lb.vserver.add(:name => 'foo', :serviceType => 'HTTP', :port => '80')
|
32
|
+
}.should raise_error(ArgumentError, /ipv46/)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'return hash when supplied all required params' do
|
36
|
+
result = connection.lb.vserver.add(:name => 'foo', :serviceType => 'HTTP', :port => '80', :ipv46 => '1.1.1.1')
|
37
|
+
result.should be_kind_of(Hash)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when using the show method in Lb::Vserver' do
|
42
|
+
it 'with no param used it will return all vservers' do
|
43
|
+
result = connection.lb.vserver.show
|
44
|
+
result.should be_kind_of(Hash)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'supplying the name parameter will return Hash' do
|
48
|
+
result = connection.lb.vserver.show :name => 'foo'
|
49
|
+
result.should be_kind_of(Hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'when showing a particular lb vserver string is invalid' do
|
53
|
+
expect {
|
54
|
+
connection.lb.vserver.show('asdf')
|
55
|
+
}.should raise_error(TypeError, /convert/)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'when showing a particular lb vserver :name is required' do
|
59
|
+
expect {
|
60
|
+
connection.lb.vserver.show(:foo => 'bar')
|
61
|
+
}.should raise_error(ArgumentError, /name/)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'when removing an lb vserver' do
|
66
|
+
it 'a name is required' do
|
67
|
+
expect {
|
68
|
+
connection.lb.vserver.remove()
|
69
|
+
}.should raise_error(ArgumentError, /wrong number/)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'throw an arg error if :name arg is missing' do
|
73
|
+
expect {
|
74
|
+
connection.lb.vserver.remove(:foo => 'bar')
|
75
|
+
}.should raise_error(ArgumentError, /name/)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should return a hash if :name is supplied' do
|
79
|
+
result = connection.lb.vserver.remove :name => 'foo'
|
80
|
+
result.should be_kind_of(Hash)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when showing lbvserver bindings' do
|
85
|
+
it 'should throw an error if there is no arg' do
|
86
|
+
expect {
|
87
|
+
connection.lb.vserver.show_binding()
|
88
|
+
}.should raise_error(ArgumentError, /wrong number/)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'throw an arg error if :name arg is missing' do
|
92
|
+
expect {
|
93
|
+
connection.lb.vserver.show_binding(:foo => 'bar')
|
94
|
+
}.should raise_error(ArgumentError, /name/)
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should return a hash if :name is supplied' do
|
98
|
+
result = connection.lb.vserver.show_binding :name => 'foo'
|
99
|
+
result.should be_kind_of(Hash)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when [un]binding services to lb vserver' do
|
104
|
+
it 'should throw an error if :name arg is not given' do
|
105
|
+
expect {
|
106
|
+
connection.lb.vserver.bind.service :serviceName => 'foo'
|
107
|
+
}.should raise_error(ArgumentError, /name/)
|
108
|
+
expect {
|
109
|
+
connection.lb.vserver.unbind.service :serviceName => 'foo'
|
110
|
+
}.should raise_error(ArgumentError, /name/)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should throw an error if :serviceName arg is not given' do
|
114
|
+
expect {
|
115
|
+
connection.lb.vserver.bind.service :name => 'foo'
|
116
|
+
}.should raise_error(ArgumentError, /serviceName/)
|
117
|
+
|
118
|
+
expect {
|
119
|
+
connection.lb.vserver.unbind.service :name => 'foo'
|
120
|
+
}.should raise_error(ArgumentError, /serviceName/)
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should return a Hash if all require arguments are supplied' do
|
125
|
+
result = connection.lb.vserver.bind.service :name => 'foo', :serviceName => ''
|
126
|
+
result.should be_kind_of(Hash)
|
127
|
+
unbind_result = connection.lb.vserver.unbind.service :name => 'foo', :serviceName => ''
|
128
|
+
unbind_result.should be_kind_of(Hash)
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when [un]binding rewritepolicies to lb vserver' do
|
134
|
+
it 'should throw an error if :name arg is not given' do
|
135
|
+
expect {
|
136
|
+
connection.lb.vserver.bind.rewrite_policy :policyName => 'bar', :priority => '10', :bindpoint => 'request'
|
137
|
+
}.should raise_error(ArgumentError, /name/)
|
138
|
+
|
139
|
+
expect {
|
140
|
+
connection.lb.vserver.unbind.rewrite_policy :policyName => 'bar', :priority => '10', :bindpoint => 'request'
|
141
|
+
}.should raise_error(ArgumentError, /name/)
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should throw an error if :policyName arg is not given' do
|
146
|
+
expect {
|
147
|
+
connection.lb.vserver.bind.rewrite_policy :name => 'foo', :priority => '10', :bindpoint => 'request'
|
148
|
+
}.should raise_error(ArgumentError, /policyName/)
|
149
|
+
|
150
|
+
expect {
|
151
|
+
connection.lb.vserver.unbind.rewrite_policy :name => 'foo', :priority => '10', :bindpoint => 'request'
|
152
|
+
}.should raise_error(ArgumentError, /policyName/)
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should throw an error if :priority arg is not given' do
|
156
|
+
expect {
|
157
|
+
connection.lb.vserver.bind.rewrite_policy :name => 'foo', :policyName => 'bar', :bindpoint => 'request'
|
158
|
+
}.should raise_error(ArgumentError, /priority/)
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should throw an error if :bindpoint arg is not given' do
|
162
|
+
expect {
|
163
|
+
connection.lb.vserver.bind.rewrite_policy :name => 'foo', :policyName => 'bar', :priority => '10'
|
164
|
+
}.should raise_error(ArgumentError, /bindpoint/)
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should return a Hash if all require arguments are supplied' do
|
168
|
+
result = connection.lb.vserver.bind.rewrite_policy :name => 'foo', :policyName => 'bar', :priority => '10', :bindpoint => 'request'
|
169
|
+
result.should be_kind_of(Hash)
|
170
|
+
unbind_result = connection.lb.vserver.unbind.rewrite_policy :name => 'foo', :policyName => 'bar'
|
171
|
+
unbind_result.should be_kind_of(Hash)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
data/spec/netscaler_spec.rb
CHANGED
@@ -19,6 +19,16 @@ describe Netscaler do
|
|
19
19
|
netscaler = Netscaler::Connection.new 'username'=> 'foo', 'hostname' => 'bar'
|
20
20
|
}.should raise_error(ArgumentError, /password/)
|
21
21
|
end
|
22
|
+
it 'verify_ssl should be true' do
|
23
|
+
netscaler = Netscaler::Connection.new 'username'=> 'foo', 'hostname' => 'bar', 'password' => 'baz'
|
24
|
+
netscaler.verify_ssl == true
|
25
|
+
end
|
26
|
+
context 'if setting verify_ssl to false' do
|
27
|
+
it 'verify_ssl should be false' do
|
28
|
+
netscaler = Netscaler::Connection.new 'username'=> 'foo', 'hostname' => 'bar', 'password' => 'baz', 'verify_ssl' => false
|
29
|
+
netscaler.verify_ssl == false
|
30
|
+
end
|
31
|
+
end
|
22
32
|
end
|
23
33
|
|
24
34
|
context 'when logging in' do
|
data/spec/server_spec.rb
CHANGED
@@ -3,21 +3,47 @@ require 'netscaler'
|
|
3
3
|
require 'netscaler/mock_adapter'
|
4
4
|
|
5
5
|
describe Netscaler::Server do
|
6
|
-
|
7
|
-
|
6
|
+
connection = Netscaler::Connection.new 'hostname'=> 'foo', 'password' => 'bar', 'username'=> 'bar'
|
7
|
+
connection.adapter = Netscaler::MockAdapter.new :body => '{ "errorcode": 0, "message": "Done" }'
|
8
8
|
|
9
|
+
context 'when adding a new server' do
|
9
10
|
it 'a name is required' do
|
10
|
-
#netscaler.adapter = Netscaler::MockAdapter.new :status_code=>400, :body => '{ "errorcode": 1095, "message": "Required argument missing [name]", "severity": "ERROR" }',
|
11
|
-
|
12
11
|
expect {
|
13
12
|
connection.servers.add_server({'ipaddress'=>'123.123.123.123'})
|
14
13
|
}.should raise_error(ArgumentError, /name/)
|
14
|
+
|
15
|
+
expect {
|
16
|
+
connection.servers.add({'ipaddress'=>'123.123.123.123'})
|
17
|
+
}.should raise_error(ArgumentError, /name/)
|
15
18
|
end
|
16
19
|
|
17
|
-
it '
|
20
|
+
it 'an ipaddress is required' do
|
18
21
|
expect {
|
19
22
|
connection.servers.add_server({'name'=>'hostname'})
|
20
|
-
}.should raise_error(ArgumentError, /
|
23
|
+
}.should raise_error(ArgumentError, /ipaddress/)
|
24
|
+
|
25
|
+
expect {
|
26
|
+
connection.servers.add({'name'=>'hostname'})
|
27
|
+
}.should raise_error(ArgumentError, /ipaddress/)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns a Hash object if all necessary args are supplied' do
|
31
|
+
result = connection.servers.add :name => 'foo', :domain => 'foo.bar.com'
|
32
|
+
result.should be_kind_of(Hash)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when removing a server' do
|
37
|
+
it ':server is required' do
|
38
|
+
expect {
|
39
|
+
connection.servers.remove({'ipaddress'=>'123.123.123.123'})
|
40
|
+
}.should raise_error(ArgumentError, /server/)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns a Hash object if all necessary args are supplied' do
|
44
|
+
result = connection.servers.remove :server => 'foo'
|
45
|
+
result.should be_kind_of(Hash)
|
21
46
|
end
|
22
47
|
end
|
48
|
+
|
23
49
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netscaler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Custenborder
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-10-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
@@ -149,6 +149,11 @@ files:
|
|
149
149
|
- lib/netscaler/adapter.rb
|
150
150
|
- lib/netscaler/connection.rb
|
151
151
|
- lib/netscaler/http_adapter.rb
|
152
|
+
- lib/netscaler/lb.rb
|
153
|
+
- lib/netscaler/lb/monitor.rb
|
154
|
+
- lib/netscaler/lb/vserver.rb
|
155
|
+
- lib/netscaler/lb/vserver/bind.rb
|
156
|
+
- lib/netscaler/lb/vserver/unbind.rb
|
152
157
|
- lib/netscaler/load_balancing.rb
|
153
158
|
- lib/netscaler/mock_adapter.rb
|
154
159
|
- lib/netscaler/monkey_patches.rb
|
@@ -159,6 +164,7 @@ files:
|
|
159
164
|
- lib/netscaler/service.rb
|
160
165
|
- lib/netscaler/servicegroup.rb
|
161
166
|
- netscaler.gemspec
|
167
|
+
- spec/lbvserver_spec.rb
|
162
168
|
- spec/netscaler_spec.rb
|
163
169
|
- spec/policy_stringmap_spec.rb
|
164
170
|
- spec/server_spec.rb
|