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 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: []