netscaler 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -9,8 +9,8 @@ group :development do
9
9
  gem "rspec", "~> 2.8.0"
10
10
  gem "rdoc", "~> 3.12"
11
11
  gem "bundler"
12
- gem "jeweler"
12
+ gem "jeweler", "~> 1.8.8"
13
13
  end
14
14
 
15
15
  gem 'rest-client'
16
- gem 'json'
16
+ gem 'json'
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
- git (1.2.5)
6
- jeweler (1.8.4)
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
- rake (10.0.2)
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
- = netscaler
1
+ = Netscaler Gem
2
2
 
3
- Description goes here.
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
- == Contributing to netscaler
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 = "netscaler"
18
- gem.homepage = "http://github.com/jcustenborder/netscaler"
19
- gem.license = "MIT"
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 = "jeremy@scarcemedia.com"
23
- gem.authors = ["Jeremy Custenborder"]
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.9
1
+ 0.1.0
data/lib/netscaler.rb CHANGED
@@ -2,4 +2,5 @@ module Netscaler
2
2
 
3
3
  end
4
4
 
5
+ require 'netscaler/monkey_patches'
5
6
  require 'netscaler/connection'
@@ -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['severity'] =~ /error/i
36
- raise ArgumentError, "ErrorCode #{payload['errorcode']} Severity #{payload['severity']} -> #{payload['message']}"
35
+ if payload['errorcode'] != 0
36
+ raise Exception, "ErrorCode #{payload['errorcode']} -> #{payload['message']}"
37
37
  end
38
38
  end
39
39
 
@@ -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
- %w(username password hostname).each do |required_option|
16
- missing_options << required_option unless options.has_key?(required_option)
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['username']
22
- @password = options['password']
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
- @services = Service.new self
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 services
40
- return @services
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(args[:hostname])
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] = :json#'application/json'
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] = :json#'application/json'
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 get_lbvserver_binding(args={})
12
- raise ArgumentError, ':name is requred' unless args.has_key?(:name)
13
- return @netscaler.adapter.get("config/lbgroup_lbvserver_binding/#{args[:name]}", args)
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
- @netscaler.adapter.post_no_body('config/lbvserver/', {'lbvserver' => payload})
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 add_lbvserver_binding(payload, args={})
21
- raise ArgumentError, 'args must have :name' unless args.has_key?(:name)
22
- @netscaler.adapter.post_no_body("config/lbvserver_service_binding/#{args[:name]}?action=bind/", {'lbvserver_service_binding' => payload})
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
 
@@ -0,0 +1,8 @@
1
+ module Netscaler
2
+
3
+ def self.hash_hack(hash)
4
+ hash.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil}
5
+ return hash
6
+ end
7
+
8
+ end
@@ -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.has_key?(arg)
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
@@ -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
- validate_payload(server, %w(name ipaddress))
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
@@ -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(service)
8
- return @netscaler.adapter.post_no_body('config/service/', {'service' => service})
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("config/service/#{args[:name]}", args)
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
@@ -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", "severity": "NONE", "sessionid": "##074E17E8CD4C9E95A206C2A5E543D82BCDA57F16A7BE74F985733D6C241B" }'
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 ipaddress is required' do
17
+ it 'a domain is required' do
18
18
  expect {
19
19
  connection.servers.add_server({'name'=>'hostname'})
20
- }.should raise_error(ArgumentError, /ipaddress/)
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.9
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: 2012-12-05 00:00:00.000000000 Z
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: '0'
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: '0'
142
- description: Netscaler api working against the Citrix Nitro api.
143
- email: jeremy@scarcemedia.com
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/jcustenborder/netscaler
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.8.24
155
+ rubygems_version: 2.1.11
195
156
  signing_key:
196
- specification_version: 3
157
+ specification_version: 4
197
158
  summary: Netscaler api working against the Citrix Nitro api.
198
159
  test_files: []