didata_cloud_sdk 0.3.1

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