netscaler 0.0.9 → 0.1.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 +15 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +34 -4
- data/README.rdoc +13 -3
- data/Rakefile +8 -8
- data/VERSION +1 -1
- data/lib/netscaler.rb +1 -0
- data/lib/netscaler/adapter.rb +4 -4
- data/lib/netscaler/connection.rb +16 -10
- data/lib/netscaler/http_adapter.rb +12 -3
- data/lib/netscaler/load_balancing.rb +22 -8
- data/lib/netscaler/mock_adapter.rb +1 -7
- data/lib/netscaler/monkey_patches.rb +8 -0
- data/lib/netscaler/netscaler_service.rb +4 -1
- data/lib/netscaler/server.rb +7 -1
- data/lib/netscaler/service.rb +46 -4
- data/lib/netscaler/servicegroup.rb +65 -0
- data/spec/netscaler_spec.rb +1 -1
- data/spec/server_spec.rb +2 -2
- data/spec/servicegroup_spec.rb +103 -0
- metadata +22 -61
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MTQyOGQ1ZGJlNDZjZWZlNDQ2N2RmMmVmZDdkZGRlODMyMTU5NTllYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MzJlZTA2MTk1ZDE3OWQ3NWQyNTM0OWYxNGRjYjlhNzBkNDE1ZTZkYQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NTQ3NWJlMTdjNmRkNjVhYmU1Zjc5MDk3YmQ3ZTJlZTM0OThhZmQ5YzBjMWYz
|
10
|
+
ODZhNGM1OTVjNDg0NjVkZmExNjRkY2JmYjgyNDI2MDA3Y2RmOGMxZWFjZGUy
|
11
|
+
OWRmNzdiNmZlMzkwMmQxYmU4YTM4OWM0NDQ2YWE3NzQ0MmNhZWI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDFkOTcwYzQxYzllMmVhNDQ1OGM0MWU0YTdlMzk4Y2I0MmNiZTg2OGJiNzk5
|
14
|
+
NGM2OTM0NGQ0ZTdkNGI2ZjNjMzAxOGJmYjU1YzU5YTI4ZDc1MzNhZmY1OTdi
|
15
|
+
MzRlMGJjZGUzODZjZjJlNGRmYzUyMGI0ZDQwNDE3MmUwNDliNzY=
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,16 +1,46 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
4
6
|
diff-lcs (1.1.3)
|
5
|
-
|
6
|
-
|
7
|
+
faraday (0.8.9)
|
8
|
+
multipart-post (~> 1.2.0)
|
9
|
+
git (1.2.6)
|
10
|
+
github_api (0.10.1)
|
11
|
+
addressable
|
12
|
+
faraday (~> 0.8.1)
|
13
|
+
hashie (>= 1.2)
|
14
|
+
multi_json (~> 1.4)
|
15
|
+
nokogiri (~> 1.5.2)
|
16
|
+
oauth2
|
17
|
+
hashie (2.0.5)
|
18
|
+
highline (1.6.20)
|
19
|
+
jeweler (1.8.8)
|
20
|
+
builder
|
7
21
|
bundler (~> 1.0)
|
8
22
|
git (>= 1.2.5)
|
23
|
+
github_api (= 0.10.1)
|
24
|
+
highline (>= 1.6.15)
|
25
|
+
nokogiri (= 1.5.10)
|
9
26
|
rake
|
10
27
|
rdoc
|
11
28
|
json (1.7.5)
|
29
|
+
jwt (0.1.11)
|
30
|
+
multi_json (>= 1.5)
|
12
31
|
mime-types (1.19)
|
13
|
-
|
32
|
+
multi_json (1.8.4)
|
33
|
+
multi_xml (0.5.5)
|
34
|
+
multipart-post (1.2.0)
|
35
|
+
nokogiri (1.5.10)
|
36
|
+
oauth2 (0.9.3)
|
37
|
+
faraday (>= 0.8, < 0.10)
|
38
|
+
jwt (~> 0.1.8)
|
39
|
+
multi_json (~> 1.3)
|
40
|
+
multi_xml (~> 0.5)
|
41
|
+
rack (~> 1.2)
|
42
|
+
rack (1.5.2)
|
43
|
+
rake (10.1.1)
|
14
44
|
rdoc (3.12)
|
15
45
|
json (~> 1.4)
|
16
46
|
rest-client (1.6.7)
|
@@ -29,7 +59,7 @@ PLATFORMS
|
|
29
59
|
|
30
60
|
DEPENDENCIES
|
31
61
|
bundler
|
32
|
-
jeweler
|
62
|
+
jeweler (~> 1.8.8)
|
33
63
|
json
|
34
64
|
rdoc (~> 3.12)
|
35
65
|
rest-client
|
data/README.rdoc
CHANGED
@@ -1,8 +1,18 @@
|
|
1
|
-
=
|
1
|
+
= Netscaler Gem
|
2
2
|
|
3
|
-
|
3
|
+
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.
|
4
4
|
|
5
|
-
|
5
|
+
= THIS IS PRE-ALPHA!!!
|
6
|
+
|
7
|
+
It is currently *Pre-Alpha* hence the 0-dot version and is suseptible to methods, classes and modules being renamed, added or deleted. I will try my best to back support as much as i can but will provide release notes of changes. Would love to get community support, i have access to a Netscaler and will add this to the spec as well down the road.
|
8
|
+
|
9
|
+
== TODO
|
10
|
+
|
11
|
+
* Add new definitions for deleting netscaler object entities
|
12
|
+
* Add stats
|
13
|
+
* Add support for Nitro 10.0, 10.1
|
14
|
+
|
15
|
+
== Contributing to Netscaler Gem
|
6
16
|
|
7
17
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
8
18
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
data/Rakefile
CHANGED
@@ -14,15 +14,15 @@ require 'rake'
|
|
14
14
|
require 'jeweler'
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name =
|
18
|
-
gem.homepage =
|
19
|
-
gem.license =
|
17
|
+
gem.name = 'netscaler'
|
18
|
+
gem.homepage = 'http://github.com/GravityLabs/netscaler'
|
19
|
+
gem.license = 'MIT'
|
20
20
|
gem.summary = 'Netscaler api working against the Citrix Nitro api.'
|
21
|
-
gem.description = 'Netscaler api working against the Citrix Nitro api.'
|
22
|
-
gem.email =
|
23
|
-
gem.authors = [
|
24
|
-
gem.add_dependency 'json'
|
25
|
-
gem.add_dependency 'rest-client'
|
21
|
+
gem.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.'
|
22
|
+
gem.email = %w(jeremy@scarcemedia.com david.andrew@webtrends.com jarrett.irons@gmail.com)
|
23
|
+
gem.authors = ['Jeremy Custenborder', 'David Andrew', 'Jarrett Irons']
|
24
|
+
#gem.add_dependency 'json'
|
25
|
+
#gem.add_dependency 'rest-client'
|
26
26
|
# dependencies defined in Gemfile
|
27
27
|
end
|
28
28
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/netscaler.rb
CHANGED
data/lib/netscaler/adapter.rb
CHANGED
@@ -12,9 +12,9 @@ module Netscaler
|
|
12
12
|
|
13
13
|
def prepare_payload(data)
|
14
14
|
if data.is_a?(String)
|
15
|
-
post_data = data
|
15
|
+
post_data = "object=#{data}"
|
16
16
|
else
|
17
|
-
post_data = data.to_json
|
17
|
+
post_data = "object=#{data.to_json}"
|
18
18
|
end
|
19
19
|
return post_data
|
20
20
|
end
|
@@ -32,8 +32,8 @@ module Netscaler
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def check_error(payload)
|
35
|
-
if payload['
|
36
|
-
raise
|
35
|
+
if payload['errorcode'] != 0
|
36
|
+
raise Exception, "ErrorCode #{payload['errorcode']} -> #{payload['message']}"
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
data/lib/netscaler/connection.rb
CHANGED
@@ -2,8 +2,10 @@ require 'rest_client'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
+
|
5
6
|
require 'netscaler/server'
|
6
7
|
require 'netscaler/service'
|
8
|
+
require 'netscaler/servicegroup'
|
7
9
|
require 'netscaler/load_balancing'
|
8
10
|
require 'netscaler/http_adapter'
|
9
11
|
require 'netscaler/adapter'
|
@@ -12,19 +14,19 @@ module Netscaler
|
|
12
14
|
class Connection
|
13
15
|
def initialize(options={})
|
14
16
|
missing_options=[]
|
15
|
-
|
16
|
-
|
17
|
+
options = Netscaler.hash_hack(options)
|
18
|
+
[:username, :password, :hostname].each do |required_option|
|
19
|
+
missing_options << required_option unless options[required_option] != nil
|
17
20
|
end
|
18
21
|
|
19
22
|
raise ArgumentError, "Required options are missing. #{missing_options.join(', ')}" if missing_options.length > 0
|
20
23
|
|
21
|
-
@username = options[
|
22
|
-
@password = options[
|
23
|
-
|
24
|
-
@adapter = HttpAdapter.new :hostname => options['hostname']
|
25
|
-
|
24
|
+
@username = options[:username]
|
25
|
+
@password = options[:password]
|
26
|
+
@adapter = HttpAdapter.new :hostname => "https://#{options[:hostname]}", :username => @username, :password => @password
|
26
27
|
@load_balancing = LoadBalancing.new self
|
27
|
-
@
|
28
|
+
@service = Service.new self
|
29
|
+
@servicegroups = ServiceGroup.new self
|
28
30
|
@servers = Server.new self
|
29
31
|
end
|
30
32
|
|
@@ -36,8 +38,12 @@ module Netscaler
|
|
36
38
|
@adapter=value
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
40
|
-
return @
|
41
|
+
def service
|
42
|
+
return @service
|
43
|
+
end
|
44
|
+
|
45
|
+
def servicegroups
|
46
|
+
return @servicegroups
|
41
47
|
end
|
42
48
|
|
43
49
|
def load_balancing
|
@@ -5,13 +5,13 @@ 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], args[:username], args[:password]
|
9
9
|
end
|
10
10
|
|
11
11
|
def post_no_body(part, data, args={})
|
12
12
|
url = get_uri(part)
|
13
13
|
options = prepare_options(args)
|
14
|
-
options[:content_type] =
|
14
|
+
options[:content_type] = 'application/x-www-form-urlencoded'
|
15
15
|
|
16
16
|
post_data = prepare_payload(data)
|
17
17
|
@site[url].post post_data, options
|
@@ -20,7 +20,7 @@ module Netscaler
|
|
20
20
|
def post(part, data, args={})
|
21
21
|
url = get_uri(part)
|
22
22
|
options = prepare_options(args)
|
23
|
-
options[:content_type] =
|
23
|
+
options[:content_type] = 'application/x-www-form-urlencoded'
|
24
24
|
|
25
25
|
post_data = prepare_payload(data)
|
26
26
|
@site[url].post post_data, options do |response, request, result|
|
@@ -35,7 +35,16 @@ module Netscaler
|
|
35
35
|
@site[url].get options do |response, request, result|
|
36
36
|
return process_result(result, response)
|
37
37
|
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete(part, args={})
|
41
|
+
url = get_uri(part)
|
42
|
+
options = prepare_options(args)
|
38
43
|
|
44
|
+
@site[url].delete options do |response, request, result|
|
45
|
+
return process_result(result, response)
|
46
|
+
end
|
39
47
|
end
|
48
|
+
|
40
49
|
end
|
41
50
|
end
|
@@ -1,5 +1,7 @@
|
|
1
|
+
require 'netscaler/netscaler_service'
|
2
|
+
|
1
3
|
module Netscaler
|
2
|
-
class LoadBalancing
|
4
|
+
class LoadBalancing < NetscalerService
|
3
5
|
def initialize(netscaler)
|
4
6
|
@netscaler=netscaler
|
5
7
|
end
|
@@ -8,18 +10,30 @@ module Netscaler
|
|
8
10
|
return @netscaler.adapter.get("config/lbvserver/#{args[:name]}", args)
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
13
|
+
def get_lbvservers()
|
14
|
+
return @netscaler.adapter.get("config/lbvserver/")
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_lbvserver_binding(payload)
|
18
|
+
return @netscaler.adapter.get("config/lbvserver_binding/#{payload}")
|
14
19
|
end
|
15
20
|
|
16
21
|
def add_lbvserver(payload)
|
17
|
-
|
22
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
23
|
+
validate_payload(payload, %w(name serviceType ipv46 port))
|
24
|
+
return @netscaler.adapter.post_no_body('config/lbvserver/', {'lbvserver' => payload})
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_lbvserver_servicegroup_binding(payload)
|
28
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
29
|
+
validate_payload(payload, %w(name servicegroupname))
|
30
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_servicegroup_binding/#{payload['name']}?action=bind/", {'lbvserver_servicegroup_binding' => payload})
|
18
31
|
end
|
19
32
|
|
20
|
-
def
|
21
|
-
raise ArgumentError, '
|
22
|
-
|
33
|
+
def add_lbvserver_service_binding(payload)
|
34
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
35
|
+
validate_payload(payload, %w(name servicename))
|
36
|
+
return @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{payload['name']}?action=bind/", {'lbvserver_service_binding' => payload})
|
23
37
|
end
|
24
38
|
end
|
25
39
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'netscaler/adapter'
|
2
|
-
#require 'json'
|
3
2
|
module Netscaler
|
4
3
|
class MockAdapter < Adapter
|
5
4
|
|
@@ -26,13 +25,8 @@ module Netscaler
|
|
26
25
|
url = get_uri(part)
|
27
26
|
options = prepare_options(args)
|
28
27
|
options[:content_type] = :json#'application/json'
|
29
|
-
|
30
28
|
post_data = prepare_payload(data)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
puts "POST /#{url}\n#{JSON.pretty_generate(JSON.parse(post_data))}"
|
29
|
+
puts "POST /#{url}\n#{post_data}"
|
36
30
|
|
37
31
|
return process_result(@result, @response)
|
38
32
|
|
@@ -4,10 +4,13 @@ module Netscaler
|
|
4
4
|
raise ArgumentError, 'payload must be a hash.' unless payload.is_a?(Hash)
|
5
5
|
missing_args=[]
|
6
6
|
required_args.each do |arg|
|
7
|
-
missing_args << arg unless payload
|
7
|
+
missing_args << arg unless payload[arg] != nil
|
8
8
|
end
|
9
9
|
|
10
10
|
raise ArgumentError, "Missing required arguments. #{missing_args.join(', ')}" unless missing_args.length == 0;
|
11
11
|
end
|
12
|
+
|
13
|
+
|
14
|
+
|
12
15
|
end
|
13
16
|
end
|
data/lib/netscaler/server.rb
CHANGED
@@ -8,7 +8,13 @@ module Netscaler
|
|
8
8
|
|
9
9
|
def add_server(server)
|
10
10
|
raise ArgumentError, 'server cannot be null' if server.nil?
|
11
|
-
|
11
|
+
server = Netscaler.hash_hack(server)
|
12
|
+
if server[:ipaddress] != nil then
|
13
|
+
validate_payload(server, [:name, :ipaddress])
|
14
|
+
else
|
15
|
+
validate_payload(server, [:name, :domain])
|
16
|
+
end
|
17
|
+
|
12
18
|
return @netscaler.adapter.post_no_body('config/server/', {'server' => server})
|
13
19
|
end
|
14
20
|
end
|
data/lib/netscaler/service.rb
CHANGED
@@ -1,15 +1,57 @@
|
|
1
|
+
require 'netscaler/netscaler_service'
|
2
|
+
|
1
3
|
module Netscaler
|
2
|
-
class Service
|
4
|
+
class Service < NetscalerService
|
3
5
|
def initialize(netscaler)
|
4
6
|
@netscaler=netscaler
|
5
7
|
end
|
6
8
|
|
7
|
-
def add_service(
|
8
|
-
|
9
|
+
def add_service(payload)
|
10
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
11
|
+
payload = Netscaler.hash_hack(payload)
|
12
|
+
validate_payload(payload, [:name, :serverName, :serviceType, :port])
|
13
|
+
return @netscaler.adapter.post_no_body('config/service/', {'service' => payload})
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_service(payload)
|
17
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
18
|
+
payload = Netscaler.hash_hack(payload)
|
19
|
+
validate_payload(payload, [:serviceName])
|
20
|
+
return @netscaler.adapter.get("config/service/#{payload[:serviceName]}")
|
9
21
|
end
|
10
22
|
|
11
23
|
def get_services(args={})
|
12
|
-
return @netscaler.adapter.get(
|
24
|
+
return @netscaler.adapter.get('config/service/', args)
|
25
|
+
end
|
26
|
+
|
27
|
+
def enable_service(payload)
|
28
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
29
|
+
payload = Netscaler.hash_hack(payload)
|
30
|
+
validate_payload(payload, [:name])
|
31
|
+
return @netscaler.adapter.post_no_body('config/service/', {'params' => {'action' => 'enable'}, 'service' => payload})
|
32
|
+
end
|
33
|
+
|
34
|
+
def disable_service(payload)
|
35
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
36
|
+
payload = Netscaler.hash_hack(payload)
|
37
|
+
validate_payload(payload, [:name])
|
38
|
+
return @netscaler.adapter.post_no_body('config/service/', {'params' => {'action' => 'disable'}, 'service' => payload})
|
13
39
|
end
|
40
|
+
|
41
|
+
|
42
|
+
def lbmonitor_service_binding(payload)
|
43
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
44
|
+
payload = Netscaler.hash_hack(payload)
|
45
|
+
validate_payload(payload, [:serviceName, :monitorName])
|
46
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_service_binding/#{payload[:monitorName]}?action=bind", {'params' => {'action' => 'bind'}, 'lbmonitor_service_binding' => payload})
|
47
|
+
end
|
48
|
+
|
49
|
+
def lbmonitor_service_unbinding(payload)
|
50
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
51
|
+
payload = Netscaler.hash_hack(payload)
|
52
|
+
validate_payload(payload, [:serviceName, :monitorName])
|
53
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_service_binding/#{payload[:monitorName]}?action=unbind", {'params' => {'action' => 'unbind'}, 'lbmonitor_service_binding' => payload})
|
54
|
+
end
|
55
|
+
|
14
56
|
end
|
15
57
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'netscaler/netscaler_service'
|
2
|
+
|
3
|
+
module Netscaler
|
4
|
+
class ServiceGroup < NetscalerService
|
5
|
+
def initialize(netscaler)
|
6
|
+
@netscaler=netscaler
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_servicegroup(payload)
|
10
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
11
|
+
payload = Netscaler.hash_hack(payload)
|
12
|
+
validate_payload(payload, [:serviceGroupName, :serviceType])
|
13
|
+
return @netscaler.adapter.post_no_body("config/servicegroup/", "servicegroup" => payload)
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove_servicegroup(payload)
|
17
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
18
|
+
payload = Netscaler.hash_hack(payload)
|
19
|
+
validate_payload(payload, [:serviceGroupName])
|
20
|
+
return @netscaler.adapter.delete("config/servicegroup/#{payload[:serviceGroupName]}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_servicegroup(payload)
|
24
|
+
raise ArgumentError, 'arg must contain name of servicegroup!' if payload.nil?
|
25
|
+
return @netscaler.adapter.get("config/servicegroup/#{payload}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_servicegroups(args={})
|
29
|
+
return @netscaler.adapter.get("config/servicegroup/", args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_servicegroup_servicegroupmember_bindings(payload)
|
33
|
+
return @netscaler.adapter.get("config/servicegroup_servicegroupmember_binding/#{payload}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def lbmonitor_servicegroup_binding(payload)
|
37
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
38
|
+
payload = Netscaler.hash_hack(payload)
|
39
|
+
validate_payload(payload, [:serviceGroupName, :monitorName])
|
40
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_servicegroup_binding/#{payload[:monitorName]}?action=bind", {'params' => {'action' => 'bind'}, 'lbmonitor_servicegroup_binding' => payload})
|
41
|
+
end
|
42
|
+
|
43
|
+
def lbmonitor_servicegroup_unbinding(payload)
|
44
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
45
|
+
payload = Netscaler.hash_hack(payload)
|
46
|
+
validate_payload(payload, [:serviceGroupName, :monitorName])
|
47
|
+
return @netscaler.adapter.post_no_body("config/lbmonitor_servicegroup_binding/#{payload[:monitorName]}?action=unbind", {'params' => {'action' => 'unbind'}, 'lbmonitor_servicegroup_binding' => payload})
|
48
|
+
end
|
49
|
+
|
50
|
+
def bind_servicegroup_servicegroupmember(payload)
|
51
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
52
|
+
payload = Netscaler.hash_hack(payload)
|
53
|
+
validate_payload(payload, [:serviceGroupName, :port, :serverName])
|
54
|
+
return @netscaler.adapter.post_no_body("config/servicegroup_servicegroupmember_binding/#{payload['serviceGroupName']}?action=bind", {'params' => {'action' => 'bind'}, 'servicegroup_servicegroupmember_binding' => payload})
|
55
|
+
end
|
56
|
+
|
57
|
+
def unbind_servicegroup_servicegroupmember(payload)
|
58
|
+
raise ArgumentError, 'payload cannot be null' if payload.nil?
|
59
|
+
payload = Netscaler.hash_hack(payload)
|
60
|
+
validate_payload(payload, [:serviceGroupName, :port, :serverName])
|
61
|
+
return @netscaler.adapter.post_no_body("config/servicegroup_servicegroupmember_binding/#{payload['serviceGroupName']}?action=unbind", {'params' => {'action' => 'unbind'}, 'servicegroup_servicegroupmember_binding' => payload})
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
data/spec/netscaler_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe Netscaler do
|
|
24
24
|
context 'when logging in' do
|
25
25
|
it 'returns a session' do
|
26
26
|
netscaler = Netscaler::Connection.new 'username'=> 'foo', 'hostname' => 'bar', 'password' => 'asdf'
|
27
|
-
netscaler.adapter = Netscaler::MockAdapter.new :body => '{ "errorcode": 0, "message": "Done", "
|
27
|
+
netscaler.adapter = Netscaler::MockAdapter.new :body => '{ "errorcode": 0, "message": "Done", "sessionid": "##074E17E8CD4C9E95A206C2A5E543D82BCDA57F16A7BE74F985733D6C241B" }'
|
28
28
|
result = netscaler.login
|
29
29
|
result.should be_a_kind_of(String)
|
30
30
|
result.should == "##074E17E8CD4C9E95A206C2A5E543D82BCDA57F16A7BE74F985733D6C241B"
|
data/spec/server_spec.rb
CHANGED
@@ -14,10 +14,10 @@ describe Netscaler::Server do
|
|
14
14
|
}.should raise_error(ArgumentError, /name/)
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'a
|
17
|
+
it 'a domain is required' do
|
18
18
|
expect {
|
19
19
|
connection.servers.add_server({'name'=>'hostname'})
|
20
|
-
}.should raise_error(ArgumentError, /
|
20
|
+
}.should raise_error(ArgumentError, /domain/)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'netscaler'
|
3
|
+
require 'netscaler/mock_adapter'
|
4
|
+
|
5
|
+
describe Netscaler::ServiceGroup do
|
6
|
+
|
7
|
+
connection = Netscaler::Connection.new 'hostname' => 'foo', 'password' => 'bar', 'username' => 'bar'
|
8
|
+
|
9
|
+
context 'when adding a new servicegroup' do
|
10
|
+
|
11
|
+
it 'a name is required' do
|
12
|
+
#netscaler.adapter = Netscaler::MockAdapter.new :status_code=>400, :body => '{ "errorcode": 1095, "message": "Required argument missing [name]", "severity": "ERROR" }',
|
13
|
+
|
14
|
+
expect {
|
15
|
+
connection.servicegroups.add_servicegroup({ 'serviceType' => 'tcp' })
|
16
|
+
}.should raise_error(ArgumentError, /serviceGroupName/)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'a service type is required' do
|
20
|
+
expect {
|
21
|
+
connection.servicegroups.add_servicegroup({ 'serviceGroupName' => 'test-serviceGroup' })
|
22
|
+
}.should raise_error(ArgumentError, /serviceType/)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when binding a new lbmonitor to servicegroup' do
|
28
|
+
|
29
|
+
it 'a Service group name is required' do
|
30
|
+
expect {
|
31
|
+
connection.servicegroups.lbmonitor_servicegroup_binding({ 'monitorName' => 'TCP' })
|
32
|
+
}.should raise_error(ArgumentError, /serviceGroupName/)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'a lbmonitor name is required' do
|
36
|
+
expect {
|
37
|
+
connection.servicegroups.lbmonitor_servicegroup_binding({ 'serviceGroupName' => 'test-serviceGroup' })
|
38
|
+
}.should raise_error(ArgumentError, /monitorName/)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when unbinding a lbmonitor from servicegroup' do
|
44
|
+
|
45
|
+
it 'a Service group name is required' do
|
46
|
+
expect {
|
47
|
+
connection.servicegroups.lbmonitor_servicegroup_binding({ 'monitorName' => 'TCP' })
|
48
|
+
}.should raise_error(ArgumentError, /serviceGroupName/)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'a lbmonitor name is required' do
|
52
|
+
expect {
|
53
|
+
connection.servicegroups.lbmonitor_servicegroup_binding({ 'serviceGroupName' => 'test-serviceGroup' })
|
54
|
+
}.should raise_error(ArgumentError, /monitorName/)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when binding a new server to servicegroup' do
|
60
|
+
|
61
|
+
it 'a Service group name is required' do
|
62
|
+
expect {
|
63
|
+
connection.servicegroups.bind_servicegroup_servicegroupmember({ 'port'=> '8080', 'ip' => '199.199.199.199' })
|
64
|
+
}.should raise_error(ArgumentError, /serviceGroupName/)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'a server entity is required' do
|
68
|
+
expect {
|
69
|
+
connection.servicegroups.bind_servicegroup_servicegroupmember({ 'serviceGroupName' => 'test-serviceGroup', 'port' => '8080' })
|
70
|
+
}.should raise_error(ArgumentError, /serverName/)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'a port is required' do
|
74
|
+
expect {
|
75
|
+
connection.servicegroups.bind_servicegroup_servicegroupmember({ 'serviceGroupName' => 'test-serviceGroup', 'ip' => '199.199.199.199' })
|
76
|
+
}.should raise_error(ArgumentError, /port/)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when unbinding a server from servicegroup' do
|
82
|
+
|
83
|
+
it 'a Service group name is required' do
|
84
|
+
expect {
|
85
|
+
connection.servicegroups.unbind_servicegroup_servicegroupmember({ 'port' => '8080', 'ip' => '199.199.199.199' })
|
86
|
+
}.should raise_error(ArgumentError, /serviceGroupName/)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'a server entity is required' do
|
90
|
+
expect {
|
91
|
+
connection.servicegroups.unbind_servicegroup_servicegroupmember({ 'serviceGroupName' => 'test-serviceGroup', 'port' => '8080' })
|
92
|
+
}.should raise_error(ArgumentError, /serverName/)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'a port is required' do
|
96
|
+
expect {
|
97
|
+
connection.servicegroups.unbind_servicegroup_servicegroupmember({ 'serviceGroupName' => 'test-serviceGroup', 'ip' => '199.199.199.199' })
|
98
|
+
}.should raise_error(ArgumentError, /port/)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netscaler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jeremy Custenborder
|
8
|
+
- David Andrew
|
9
|
+
- Jarrett Irons
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2014-02-02 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rest-client
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
@@ -22,7 +22,6 @@ dependencies:
|
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
25
|
requirements:
|
27
26
|
- - ! '>='
|
28
27
|
- !ruby/object:Gem::Version
|
@@ -30,7 +29,6 @@ dependencies:
|
|
30
29
|
- !ruby/object:Gem::Dependency
|
31
30
|
name: json
|
32
31
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
32
|
requirements:
|
35
33
|
- - ! '>='
|
36
34
|
- !ruby/object:Gem::Version
|
@@ -38,7 +36,6 @@ dependencies:
|
|
38
36
|
type: :runtime
|
39
37
|
prerelease: false
|
40
38
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
39
|
requirements:
|
43
40
|
- - ! '>='
|
44
41
|
- !ruby/object:Gem::Version
|
@@ -46,7 +43,6 @@ dependencies:
|
|
46
43
|
- !ruby/object:Gem::Dependency
|
47
44
|
name: rspec
|
48
45
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
46
|
requirements:
|
51
47
|
- - ~>
|
52
48
|
- !ruby/object:Gem::Version
|
@@ -54,7 +50,6 @@ dependencies:
|
|
54
50
|
type: :development
|
55
51
|
prerelease: false
|
56
52
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
53
|
requirements:
|
59
54
|
- - ~>
|
60
55
|
- !ruby/object:Gem::Version
|
@@ -62,7 +57,6 @@ dependencies:
|
|
62
57
|
- !ruby/object:Gem::Dependency
|
63
58
|
name: rdoc
|
64
59
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
60
|
requirements:
|
67
61
|
- - ~>
|
68
62
|
- !ruby/object:Gem::Version
|
@@ -70,7 +64,6 @@ dependencies:
|
|
70
64
|
type: :development
|
71
65
|
prerelease: false
|
72
66
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
67
|
requirements:
|
75
68
|
- - ~>
|
76
69
|
- !ruby/object:Gem::Version
|
@@ -78,7 +71,6 @@ dependencies:
|
|
78
71
|
- !ruby/object:Gem::Dependency
|
79
72
|
name: bundler
|
80
73
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
74
|
requirements:
|
83
75
|
- - ! '>='
|
84
76
|
- !ruby/object:Gem::Version
|
@@ -86,7 +78,6 @@ dependencies:
|
|
86
78
|
type: :development
|
87
79
|
prerelease: false
|
88
80
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
81
|
requirements:
|
91
82
|
- - ! '>='
|
92
83
|
- !ruby/object:Gem::Version
|
@@ -94,53 +85,24 @@ dependencies:
|
|
94
85
|
- !ruby/object:Gem::Dependency
|
95
86
|
name: jeweler
|
96
87
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
88
|
requirements:
|
99
|
-
- -
|
89
|
+
- - ~>
|
100
90
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
91
|
+
version: 1.8.8
|
102
92
|
type: :development
|
103
93
|
prerelease: false
|
104
94
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: json
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
95
|
requirements:
|
123
|
-
- -
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: rest-client
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :runtime
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
96
|
+
- - ~>
|
140
97
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
142
|
-
description: Netscaler api working against the Citrix Nitro api.
|
143
|
-
|
98
|
+
version: 1.8.8
|
99
|
+
description: Netscaler api working against the Citrix Nitro api. Currently supports
|
100
|
+
Nitro 9.3. Hope to add support for 10.X. Currently has support for som basics
|
101
|
+
such as adding servers/services/servicegroups.
|
102
|
+
email:
|
103
|
+
- jeremy@scarcemedia.com
|
104
|
+
- david.andrew@webtrends.com
|
105
|
+
- jarrett.irons@gmail.com
|
144
106
|
executables: []
|
145
107
|
extensions: []
|
146
108
|
extra_rdoc_files:
|
@@ -161,38 +123,37 @@ files:
|
|
161
123
|
- lib/netscaler/http_adapter.rb
|
162
124
|
- lib/netscaler/load_balancing.rb
|
163
125
|
- lib/netscaler/mock_adapter.rb
|
126
|
+
- lib/netscaler/monkey_patches.rb
|
164
127
|
- lib/netscaler/netscaler_service.rb
|
165
128
|
- lib/netscaler/server.rb
|
166
129
|
- lib/netscaler/service.rb
|
130
|
+
- lib/netscaler/servicegroup.rb
|
167
131
|
- spec/netscaler_spec.rb
|
168
132
|
- spec/server_spec.rb
|
133
|
+
- spec/servicegroup_spec.rb
|
169
134
|
- spec/spec_helper.rb
|
170
|
-
homepage: http://github.com/
|
135
|
+
homepage: http://github.com/GravityLabs/netscaler
|
171
136
|
licenses:
|
172
137
|
- MIT
|
138
|
+
metadata: {}
|
173
139
|
post_install_message:
|
174
140
|
rdoc_options: []
|
175
141
|
require_paths:
|
176
142
|
- lib
|
177
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
178
|
-
none: false
|
179
144
|
requirements:
|
180
145
|
- - ! '>='
|
181
146
|
- !ruby/object:Gem::Version
|
182
147
|
version: '0'
|
183
|
-
segments:
|
184
|
-
- 0
|
185
|
-
hash: -4555572499781104702
|
186
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
-
none: false
|
188
149
|
requirements:
|
189
150
|
- - ! '>='
|
190
151
|
- !ruby/object:Gem::Version
|
191
152
|
version: '0'
|
192
153
|
requirements: []
|
193
154
|
rubyforge_project:
|
194
|
-
rubygems_version: 1.
|
155
|
+
rubygems_version: 2.1.11
|
195
156
|
signing_key:
|
196
|
-
specification_version:
|
157
|
+
specification_version: 4
|
197
158
|
summary: Netscaler api working against the Citrix Nitro api.
|
198
159
|
test_files: []
|