didata_cloud_sdk 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,125 @@
1
+ module Opsource::API
2
+ class VIP < Core
3
+
4
+ # Real Server section
5
+ def real_servers_list (network_id)
6
+ org_endpoint "/network/#{network_id}/realServer"
7
+ get
8
+ end
9
+
10
+ # Examples name = RealServer1, server_id = "415a7f70-1008-42a3-8375-5dcf52636cc5", in_service = true/false
11
+ def real_server_create (network_id, name, server_id, in_service)
12
+ org_endpoint "/network/#{network_id}/realServer"
13
+ xml_params(tag: "NewRealServer", schema: "vip", name: name, server_id: server_id, in_service: in_service)
14
+ post
15
+ end
16
+
17
+
18
+ def real_server_delete (network_id, rserver_id)
19
+ org_endpoint "/network/#{network_id}/realServer/#{rserver_id}?delete"
20
+ get
21
+ end
22
+
23
+
24
+ def real_server_modify (network_id, rserver_id, in_service)
25
+ org_endpoint "/network/#{network_id}/realServer/#{rserver_id}"
26
+ xml_params(in_service: in_service)
27
+ post
28
+ end
29
+
30
+ # Probe section
31
+ def probe_list (network_id)
32
+ org_endpoint "/network/#{network_id}/probe"
33
+ get
34
+ end
35
+
36
+ # Note this is for TCP, UDP & ICMP only additional xml fields need to be added to be complete
37
+ # Examples name = Probe1, type = TCP, probeIntervalSeconds = "60", errorCountBeforeServerFail = "5" maxReplyWaitSeconds = "10"
38
+ def probe_create
39
+ org_endpoint "/network/#{network_id}/probe"
40
+ xml_params(name: name, type: type, probeIntervalSeconds: probeIntervalSeconds, errorCountBeforeServerFail: errorCountBeforeServerFail, successCountBeforeServerEnable: successCountBeforeServerEnable, failedProbeIntervalSeconds: failedProbeIntervalSeconds, maxReplyWaitSeconds: maxReplyWaitSeconds)
41
+ post
42
+ end
43
+
44
+
45
+ def probe_delete (network_id, probe_id)
46
+ org_endpoint "/network/#{network_id}/probe/{probe_id}?delete"
47
+ get
48
+ end
49
+
50
+
51
+ # Server Farm Section
52
+ def server_farm_list (network_id)
53
+ org_endpoint "/network/#{network_id}/serverFarm"
54
+ get
55
+ end
56
+
57
+ def server_farm_details (network_id, server_farm_id)
58
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}"
59
+ get
60
+ end
61
+
62
+ def server_farm_create (network_id, name, real_server_id, port, predictor)
63
+ if ["ROUND_ROBIN", "LEAST_CONNECTIONS"].include? predictor
64
+ org_endpoint "/network/#{network_id}/serverFarm"
65
+ xml_params(schema: "vip", tag: "NewServerFarm", name: name, predictor: predictor, real_server: {id: real_server_id, port: port})
66
+ post
67
+ else
68
+ raise "Unknown predictor: #{predictor}"
69
+ end
70
+ end
71
+
72
+ def server_farm_delete (network_id, server_farm_id)
73
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}?delete"
74
+ get
75
+ end
76
+
77
+ # Examples realServerId = "RealServer1", realSeverPort = "80"
78
+ def real_server_to_server_farm (network_id, server_farm_id, real_server_id, real_server_port)
79
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}/addRealServer"
80
+ simple_params(real_server_id: real_server_id, real_server_port: real_server_port)
81
+ post_simple
82
+ end
83
+
84
+ # Examples realServerId = "RealServer1", realSeverPort = "80"
85
+ def real_server_from_server_farm (network_id, server_farm_id, real_server_id, real_server_port)
86
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}/removeRealServer"
87
+ simple_params(real_server_id: real_server_id, real_server_port: real_server_port)
88
+ post_simple
89
+ end
90
+
91
+
92
+ # Examples probe_id = TCP1
93
+ def probe_to_server_farm (network_id, server_farm_id, probe_id)
94
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}/addProbe"
95
+ xml_params(probe_id: probe_id)
96
+ post
97
+ end
98
+
99
+ # Examples probe_id = TCP1
100
+ def probe_from_server_farm (network_id, server_farm_id, probe_id)
101
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}/removeProbe"
102
+ xml_params(probe_id: probe_id)
103
+ post
104
+ end
105
+
106
+ # Examples predictor= LEAST_CONNECTIONS | ROUND_ROBIN
107
+ def server_farm_predictor(network_id, server_farm_id, predictor)
108
+ org_endpoint "/network/#{network_id}/serverFarm/#{server_farm_id}"
109
+ xml_params(predictor: predictor)
110
+ post
111
+ end
112
+
113
+ def vip_list(network_id)
114
+ org_endpoint "/network/#{network_id}/vip"
115
+ get
116
+ end
117
+
118
+ def vip_create(network_id, name, port, protocol, server_farm_id)
119
+ org_endpoint "/network/#{network_id}/vip"
120
+ xml_params(schema: "vip", tag: "NewVip", name: name, port: port, protocol: protocol, vip_target_type: "SERVER_FARM", vip_target_id: server_farm_id, reply_to_icmp: true, in_service: true)
121
+ post
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,91 @@
1
+ module Opsource
2
+ class Client
3
+ include Opsource::Connection
4
+ include Opsource::Params
5
+ include Opsource::XML
6
+
7
+ attr_reader :api_base, :org_id, :username, :password
8
+ attr_reader :image, :directory, :network, :server, :account, :report
9
+ attr_reader :datacenter, :default_password
10
+
11
+ ### FILTERS
12
+ # client.page_size = 10
13
+ # client.page_number = 1
14
+ # client.order_by = 'location,created.DESCENDING'
15
+ # client.filter_with = {location: %w(NA1 NA2), key: 'value'}
16
+ attr_accessor :silent, :colors # log setting
17
+ attr_accessor :page_size, :page_number, :order_by, :filter_with
18
+
19
+
20
+
21
+ def initialize(api_base, org_id, username, password, default_password="verysecurepassword", datacenter="EU1", colors = true, silent = false)
22
+ @api_base = api_base
23
+ @org_id = org_id
24
+ @username = username
25
+ @password = password
26
+ @datacenter = datacenter
27
+ @default_password = default_password
28
+
29
+ @colors = colors
30
+ @silent = silent
31
+
32
+ if @colors
33
+ require 'colorize'
34
+ end
35
+ end
36
+
37
+ def directory
38
+ Opsource::API::Directory.new(self)
39
+ end
40
+
41
+ def image
42
+ Opsource::API::Image.new(self)
43
+ end
44
+
45
+ def network
46
+ Opsource::API::Network.new(self)
47
+ end
48
+
49
+ def server
50
+ Opsource::API::Server.new(self)
51
+ end
52
+
53
+ def account
54
+ Opsource::API::Account.new(self)
55
+ end
56
+
57
+ def report
58
+ Opsource::API::Report.new(self)
59
+ end
60
+
61
+ def vip
62
+ Opsource::API::VIP.new(self)
63
+ end
64
+
65
+ def filter_params
66
+ params = {}
67
+ params[:page_size] = @page_size if @page_size.present?
68
+ params[:page_number] = @page_number if @page_number.present?
69
+ params[:order_by] = @order_by if @order_by.present?
70
+
71
+ if @filter_with.present?
72
+ @filter_with.each do |k, val|
73
+ params[k.to_sym] = val
74
+ end
75
+ end
76
+ params
77
+ end
78
+
79
+ # mode: bold, underscore, default
80
+ def log(message, color = nil, mode = nil)
81
+ return if @silent
82
+ if @colors
83
+ color = color.to_sym if color
84
+ mode = mode.to_sym if mode
85
+ puts message.colorize(:color => color, :mode => mode)
86
+ else
87
+ puts message
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,60 @@
1
+ module Opsource
2
+ module Connection
3
+ def build_request(type, endpoint, query = nil, body = nil, xml=true)
4
+ # url = "https://cloudapi.nttamerica.com/oec/0.9" + "/server"
5
+ uri = api_base + endpoint
6
+ append_query(uri, query) if query
7
+
8
+ if xml
9
+ request = Typhoeus::Request.new(
10
+ uri,
11
+ method: type,
12
+ body: body,
13
+ userpwd: "#{@username}:#{@password}",
14
+ headers: { 'Content-Type' =>'text/xml', 'User-Agent' => 'ACP Ruby SDK' }
15
+ )
16
+ else
17
+ request = Typhoeus::Request.new(
18
+ uri,
19
+ method: type,
20
+ body: body,
21
+ userpwd: "#{@username}:#{@password}",
22
+ headers: { 'User-Agent' => 'ACP Ruby SDK' }
23
+ )
24
+ end
25
+ end
26
+
27
+ def append_query(uri, query)
28
+ if uri.include?('?')
29
+ uri << '&'
30
+ else
31
+ uri << '?'
32
+ end
33
+ uri << query
34
+ end
35
+
36
+
37
+ def perform_request(request)
38
+ log "\nrequesting #{request.url}...", :yellow
39
+ request.run
40
+ end
41
+
42
+ def log_response(request, response)
43
+ if response.success?
44
+ log "...........success!", :yellow
45
+ elsif response.timed_out?
46
+ log "ERROR\n-----", :red
47
+ log "got a time out"
48
+ elsif response.code == 0
49
+ # Could not get an http response, something's wrong.
50
+ log "ERROR\n-----", :red
51
+ log response.return_message
52
+ else
53
+ # Received a non-successful http response.
54
+ log "ERROR\n-----", :red
55
+ log "HTTP request failed: " + response.code.to_s, :red
56
+ log response.body, :yellow
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,14 @@
1
+ module Opsource
2
+ module Exceptions
3
+ CODES = {
4
+ "REASON_10" => "Failure at network",
5
+ "REASON_20" => "Unrecoverable failure cause by a timeout.",
6
+ "REASON_250" => "Network does not exist for this organization.",
7
+ "REASON_320" => "Invalid Input Data - SourceIP must be a valid IPv4 address."
8
+ }
9
+
10
+ class ApiError < StandardError; end
11
+ class ConnectionError < StandardError; end
12
+ class RequestError < StandardError; end
13
+ end
14
+ end
@@ -0,0 +1,62 @@
1
+ module Opsource
2
+ module Params
3
+ def url_query(params)
4
+ params = camelize_keys(params)
5
+ qitems = []
6
+ params.each do |k, vs|
7
+ vs = [vs].flatten.compact # remove nil values
8
+ vs.each {|v| qitems << "#{k}=#{v}"}
9
+ end
10
+ qitems.join('&')
11
+ end
12
+
13
+ def symbolize_keys(arg)
14
+ case arg
15
+ when Array
16
+ arg.map { |elem| symbolize_keys elem }
17
+ when Hash
18
+ Hash[
19
+ arg.map { |key, value|
20
+ k = key.is_a?(String) ? key.to_sym : key
21
+ v = symbolize_keys value
22
+ [k,v]
23
+ }]
24
+ else
25
+ arg
26
+ end
27
+ end
28
+
29
+ def underscore_keys(arg)
30
+ case arg
31
+ when Array
32
+ arg.map { |elem| underscore_keys elem }
33
+ when Hash
34
+ Hash[
35
+ arg.map { |key, value|
36
+ k = key.is_a?(String) ? key.underscore : key
37
+ v = underscore_keys value
38
+ [k,v]
39
+ }]
40
+ else
41
+ arg
42
+ end
43
+ end
44
+
45
+ def camelize_keys(arg)
46
+ case arg
47
+ when Array
48
+ arg.map { |elem| camelize_keys elem }
49
+ when Hash
50
+ Hash[
51
+ arg.map { |key, value|
52
+ k = key.is_a?(String) ? key.camelize(:lower) : key
53
+ k = key.is_a?(Symbol) ? key.to_s.camelize(:lower).to_sym : key
54
+ v = camelize_keys value
55
+ [k,v]
56
+ }]
57
+ else
58
+ arg
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ module Opsource
2
+ VERSION = "0.3.1"
3
+
4
+ {"xmlns:ns3"=>"http://oec.api.opsource.net/schemas/organization",
5
+ "xmlns:ns4"=>"http://oec.api.opsource.net/schemas/network",
6
+ "xmlns:ns2"=>"http://oec.api.opsource.net/schemas/directory",
7
+ "xmlns:ns8"=>"http://oec.api.opsource.net/schemas/general",
8
+ "xmlns:ns7"=>"http://oec.api.opsource.net/schemas/datacenter",
9
+ "xmlns:ns6"=>"http://oec.api.opsource.net/schemas/whitelabel",
10
+ "xmlns:ns5"=>"http://oec.api.opsource.net/schemas/vip",
11
+ "xmlns:ns9"=>"http://oec.api.opsource.net/schemas/admin",
12
+ "natIp"=>["207.20.54.2"],
13
+ "xmlns"=>"http://oec.api.opsource.net/schemas/server",
14
+ "sourceIp"=>["10.166.152.201"],
15
+ "id"=>["ac371318-f755-4dc1-bbc3-51a1522ca2fe"],
16
+ "name"=>["10.166.152.201"],
17
+ "xmlns:ns11"=>"http://oec.api.opsource.net/schemas/reset",
18
+ "xmlns:ns10"=>"http://oec.api.opsource.net/schemas/multigeo",
19
+ "xmlns:ns13"=>"http://oec.api.opsource.net/schemas/storage",
20
+ "xmlns:ns12"=>"http://oec.api.opsource.net/schemas/support",
21
+ "xmlns:ns14"=>"http://oec.api.opsource.net/schemas/manualimport"}
22
+ end
@@ -0,0 +1,53 @@
1
+ module Opsource
2
+ module XML
3
+ def xml_header
4
+ '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' "\n"
5
+ end
6
+
7
+ def parse_response_xml_body(body)
8
+ # we'll not use 'KeyToSymbol' because it doesn't symbolize the keys for node attributes
9
+ opts = { 'ForceArray' => false, 'ForceContent' => false }
10
+ hash = XmlSimple.xml_in(body, opts)
11
+ hash.delete_if {|k, v| k =~ /(xmlns|xmlns:ns)/ } # removing the namespaces from response
12
+ Hashie::Mash.new(underscore_keys(hash))
13
+ rescue Exception => e
14
+ log "Impossible to convert XML to hash. Error: #{e.message}", :red
15
+ raise e
16
+ end
17
+
18
+ def build_request_simple_body(params)
19
+ params = camelize_keys(params)
20
+ #simple construction of post body...
21
+ body = params.map { |k, v| "#{k}=#{v}&" }
22
+ body.join
23
+ end
24
+
25
+ def build_request_xml_body(schema, tag, params)
26
+ params = camelize_keys(params)
27
+ schema_url = "http://oec.api.opsource.net/schemas/#{schema}"
28
+
29
+ xml = xml_header
30
+ xml += "<#{tag} xmlns=\"#{schema_url}\">\n"
31
+ params.each do |k, value|
32
+
33
+ xml += build_xml_helper(k, value)
34
+ xml += "\n"
35
+ end
36
+ xml += "</#{tag}>\n"
37
+ end
38
+
39
+ def build_xml_helper(key, value)
40
+ result = "<#{key}>"
41
+ if value.is_a?(Hash)
42
+ value.each do |k, v|
43
+ result += build_xml_helper(k,v)
44
+ end
45
+ else
46
+ result += "#{value}"
47
+ end
48
+ result += "</#{key}>"
49
+ result
50
+ end
51
+
52
+ end
53
+ end
data/lib/opsource.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'active_support/core_ext/object'
2
+ require 'active_support/core_ext/string'
3
+ require 'typhoeus'
4
+ require 'xmlsimple'
5
+ require 'hashie'
6
+
7
+ require './opsource/version.rb'
8
+ require './opsource/exceptions.rb'
9
+
10
+ require './opsource/connection.rb'
11
+ require './opsource/params.rb'
12
+ require './opsource/xml.rb'
13
+ require './opsource/client.rb'
14
+
15
+ require './opsource/api/core.rb'
16
+ require './opsource/api/directory.rb'
17
+ require './opsource/api/image.rb'
18
+ require './opsource/api/network.rb'
19
+ require './opsource/api/server.rb'
20
+ require './opsource/api/vip.rb'
21
+ require './opsource/api/account.rb'
22
+ require './opsource/api/report.rb'
data/opsource.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "opsource/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "didata_cloud_sdk"
7
+ s.version = Opsource::VERSION
8
+ s.authors = ["Juozas Gaigalas", "Tim Wade", "Stijn Muylle"]
9
+ s.email = ["juozasgaigalas@gmail.com", "pimpingeezer@gmail.com", "stijnmuylle@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Dimension Data REST API client gem}
12
+ s.description = %q{SDK to access Dimension Data Cloud api'}
13
+
14
+ s.rubyforge_project = "opsource"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'i18n'
22
+ s.add_dependency 'activesupport'
23
+ s.add_dependency 'typhoeus'
24
+ s.add_dependency 'xml-simple'
25
+ s.add_dependency 'hashie'
26
+ s.add_dependency 'colorize'
27
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: didata_cloud_sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Juozas Gaigalas
8
+ - Tim Wade
9
+ - Stijn Muylle
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-12-03 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: i18n
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: activesupport
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: typhoeus
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: xml-simple
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: hashie
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: colorize
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ description: SDK to access Dimension Data Cloud api'
100
+ email:
101
+ - juozasgaigalas@gmail.com
102
+ - pimpingeezer@gmail.com
103
+ - stijnmuylle@gmail.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - .gitignore
109
+ - Gemfile
110
+ - README.md
111
+ - doc/Cloud-REST-API-v09-121313.pdf
112
+ - doc/deprecated_sections.txt
113
+ - doc/doc.txt
114
+ - doc/pagination-and-filtering.txt
115
+ - doc/schemas.txt
116
+ - doc/sections.txt
117
+ - doc/urls.txt
118
+ - lib/opsource.rb
119
+ - lib/opsource/api/account.rb
120
+ - lib/opsource/api/core.rb
121
+ - lib/opsource/api/directory.rb
122
+ - lib/opsource/api/image.rb
123
+ - lib/opsource/api/network.rb
124
+ - lib/opsource/api/report.rb
125
+ - lib/opsource/api/server.rb
126
+ - lib/opsource/api/vip.rb
127
+ - lib/opsource/client.rb
128
+ - lib/opsource/connection.rb
129
+ - lib/opsource/exceptions.rb
130
+ - lib/opsource/params.rb
131
+ - lib/opsource/version.rb
132
+ - lib/opsource/xml.rb
133
+ - opsource.gemspec
134
+ homepage: ''
135
+ licenses: []
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project: opsource
153
+ rubygems_version: 2.4.5
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: Dimension Data REST API client gem
157
+ test_files: []