cloudcontrol_sdk 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 589fa5ceedb8772df6be667c83a8e9b9dbd59a87f84b7bdf6f2c00ab4602bde7
4
+ data.tar.gz: e44127510cd833d8b72e9b874a50795814d0dca11fdb55b0f955e6bd0ca2a176
5
+ SHA512:
6
+ metadata.gz: d146dc22a04375aea377c08491446f08406b8f0944e0197d7863021075bce3b819b9104f788fb658def3dfc9dbf79f77786a1f0d57bfdce3be9b6f17fbda83f3
7
+ data.tar.gz: 88c0e99bea294228c5e700037e8811ae34bcf7a31f9670294d6110ff49c3229c12b365640cb0a9fa717a9492e1fa7795b9900dd9c564bb29f50b17278dc2797c
@@ -0,0 +1,5 @@
1
+ Gemfile.lock
2
+ *.swp
3
+ *.gem
4
+ credentials.rb
5
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in opsource.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 tintoy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ ## Cloud Control Ruby gem
2
+
3
+ Cloud Control Cloud API gem designed for easy extensibility.
4
+ Note: This gem at present ONLY provides read functionality across the API. This is so that the Chef Inspec plugin written for Cloud Control can operate successfully. All the existing gems for this are 6 years old and appear abandoned, so I'm not sure there is much of a demand for this. There is also a lot of work to change the API calls to leverage MCP 2.0 apis.
5
+
6
+
7
+
8
+ ### Install
9
+
10
+ either install as a gem via Bundler
11
+ ```
12
+ gem install cloudcontrol_sdk
13
+ ```
14
+
15
+
16
+
17
+ ### Usage
18
+
19
+ ```
20
+ require "cloudcontrol_sdk"
21
+ api_base = CloudControl::Client::API_URL[:au]
22
+ dev_org_id = 'my-super-secret-org-numbersandletters'
23
+ dev_user = 'me'
24
+ dev_password = 'very secret'
25
+
26
+ c = CloudControl::Client.new(api_base, dev_org_id, dev_user, dev_password)
27
+
28
+ server = c.server.list(name: 'myfavoritevm')
29
+ ```
30
+
31
+
32
+
33
+ Based on : https://github.com/udayakiran/opsource.
34
+
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "cloudcontrol/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "cloudcontrol_sdk"
7
+ s.version = CloudControl::VERSION
8
+ s.authors = ["Nigel Wright"]
9
+ s.email = ["nigel.wright@global.ntt"]
10
+ s.licenses = ['MIT']
11
+ s.homepage = ""
12
+ s.summary = %q{NTT Cloud Control REST API client gem}
13
+ s.description = %q{SDK to access NTT Cloud Control api'}
14
+
15
+ s.rubyforge_project = "cloudcontrol"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency 'i18n'
23
+ s.add_dependency 'activesupport'
24
+ s.add_dependency 'typhoeus'
25
+ s.add_dependency 'xml-simple'
26
+ s.add_dependency 'hashie'
27
+ s.add_dependency 'colorize'
28
+ end
@@ -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 'cloudcontrol/version.rb'
8
+ require 'cloudcontrol/exceptions.rb'
9
+
10
+ require 'cloudcontrol/connection.rb'
11
+ require 'cloudcontrol/params.rb'
12
+ # require 'cloudcontrol/xml.rb'
13
+ require 'cloudcontrol/client.rb'
14
+
15
+ require 'cloudcontrol/api/core.rb'
16
+ # require 'cloudcontrol/api/directory.rb'
17
+ require 'cloudcontrol/api/image.rb'
18
+ require 'cloudcontrol/api/network.rb'
19
+ require 'cloudcontrol/api/server.rb'
20
+ require 'cloudcontrol/api/vip.rb'
21
+ require 'cloudcontrol/api/account.rb'
22
+ require 'cloudcontrol/api/report.rb'
@@ -0,0 +1,13 @@
1
+ module CloudControl::API
2
+ class Account < Core
3
+ def myaccount()
4
+ endpoint "/myaccount"
5
+ get
6
+ end
7
+
8
+ def list()
9
+ org_endpoint "/account"
10
+ get
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,127 @@
1
+ module CloudControl::API
2
+ class Core
3
+ attr_reader :client
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+
9
+ ### client methods
10
+
11
+ def log(*args)
12
+ @client.log(*args)
13
+ end
14
+
15
+ def org_id
16
+ @client.org_id
17
+ end
18
+
19
+
20
+ ### request options
21
+
22
+ def endpoint(e)
23
+ @endpoint = e
24
+ end
25
+
26
+ def org_endpoint(e)
27
+ endpoint("/#{org_id}" + e)
28
+ end
29
+
30
+ def query_params(q)
31
+ @query_params = q
32
+ end
33
+
34
+ def xml_params(x)
35
+ @xml_params = x
36
+ end
37
+
38
+ def simple_params(x)
39
+ @simple_params = x
40
+ end
41
+
42
+ ### perform request
43
+
44
+ def get
45
+ perform :get
46
+ end
47
+
48
+ def post
49
+ perform :post
50
+ end
51
+
52
+ def get_simple
53
+ perform :get, true
54
+ end
55
+
56
+ def post_simple
57
+ perform :post, true
58
+ end
59
+
60
+ #do not parse response if simple
61
+ #if simple, post body is also simple...
62
+ def perform(method, simple=false)
63
+ if simple
64
+ request = @client.build_request(method, @endpoint, request_query_string, request_simple_body, false)
65
+ else
66
+ request = @client.build_request(method, @endpoint, request_query_string, request_xml_body)
67
+ end
68
+ response = @client.perform_request(request)
69
+
70
+ @client.log_response(request, response)
71
+
72
+ # return parsed object if it's good
73
+ if response.success?
74
+ if simple
75
+ result = response.body
76
+ else
77
+ result = @client.parse_response_xml_body(response.body)
78
+ if result['total_count']
79
+ log "#{result['total_count']} total", :yellow, :bold
80
+ result.delete('page_size')
81
+ result.delete('total_count')
82
+ result.delete('page_count')
83
+ result.delete('page_number')
84
+ end
85
+ # unwind some arrays of elements
86
+ result.values.count == 1 ? result.values.first : result
87
+ end
88
+ else
89
+ {}
90
+ end
91
+ end
92
+
93
+ def single(results)
94
+ if results.is_a? Array
95
+ results.first
96
+ else
97
+ results
98
+ end
99
+ end
100
+
101
+
102
+ ### build request
103
+
104
+ def request_query_string
105
+ fparams = @client.filter_params || {}
106
+ qparams = @query_params || {}
107
+ params = fparams.merge(qparams)
108
+ @client.url_query(params) if params.present?
109
+ end
110
+
111
+ def request_xml_body
112
+ return if @xml_params.blank?
113
+ schema = @xml_params.delete(:schema)
114
+ tag = @xml_params.delete(:tag)
115
+
116
+ body = @client.build_request_xml_body(schema, tag, @xml_params)
117
+ log(body, :green)
118
+ body
119
+ end
120
+ def request_simple_body
121
+ return if @simple_params.blank?
122
+ body = @client.build_request_simple_body(@simple_params)
123
+ log(body, :green)
124
+ body
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,24 @@
1
+ module CloudControl::API
2
+ class Image < Core
3
+ def server_list
4
+ endpoint '/base/image'
5
+ get
6
+ end
7
+
8
+ def deployed_list(options = {})
9
+ endpoint "/#{org_id}/image/deployed"
10
+ query_params options
11
+ get
12
+ end
13
+
14
+ def show_by_name(name, options = {})
15
+ options[:name] = name
16
+ single(deployed_list(options))
17
+ end
18
+
19
+ def show(image_id)
20
+ endpoint "/#{org_id}/image/#{image_id}"
21
+ get
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module CloudControl::API
2
+ class Infrastructure < Core
3
+ def list_regions(options = {})
4
+ endpoint "/#{org_id}/infrastructure/geographicRegion"
5
+ query_params options
6
+ get
7
+ end
8
+
9
+ def list_datacenters(options = {})
10
+ endpoint "/#{org_id}/infrastructure/datacenter"
11
+ query_params options
12
+ get
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,65 @@
1
+ module CloudControl::API
2
+ class Network < Core
3
+ def list
4
+ org_endpoint '/network'
5
+ get
6
+ end
7
+
8
+ def create(name, description="", datacenter=@client.datacenter)
9
+ org_endpoint "/networkWithLocation"
10
+ xml_params(schema: "network", tag: "NewNetworkWithLocation", name: name, description: description, location: datacenter)
11
+ post
12
+ end
13
+
14
+ def list_with_location
15
+ org_endpoint "/networkWithLocation"
16
+ get
17
+ end
18
+
19
+ def list_in_location(location_id)
20
+ org_endpoint "/networkWithLocation/#{location_id}"
21
+ get
22
+ end
23
+
24
+ def show(network_id)
25
+ list_with_location.find {|n| n.id == network_id}
26
+ end
27
+
28
+ def show_by_name(name)
29
+ list_with_location.find {|n| n.name == name}
30
+ end
31
+
32
+ def natrule_list(network_id)
33
+ org_endpoint "/network/#{network_id}/natrule"
34
+ get
35
+ end
36
+
37
+ # name = "10.147.15.11", source_ip = "10.147.15.11"
38
+ def natrule_create(network_id, name, source_ip)
39
+ org_endpoint "/network/#{network_id}/natrule"
40
+ xml_params(schema: "network", tag: "NatRule", name: name, source_ip: source_ip)
41
+ post
42
+ end
43
+
44
+ def natrule_delete(network_id, natrule_id)
45
+ org_endpoint "/network/#{network_id}/natrule/#{natrule_id}?delete"
46
+ get
47
+ end
48
+
49
+ def aclrule_list(network_id)
50
+ org_endpoint "/network/#{network_id}/aclrule"
51
+ get
52
+ end
53
+
54
+ def aclrule_delete(network_id, aclrule_id)
55
+ org_endpoint "/network/#{network_id}/aclrule/#{aclrule_id}?delete"
56
+ get
57
+ end
58
+
59
+ def aclrule_create(network_id, name, position, inbound, protocol, port, allow)
60
+ org_endpoint "/network/#{network_id}/aclrule"
61
+ xml_params(schema: "network", tag: "AclRule", name: name, position: position, action: (allow ? "PERMIT" : "DENY"), protocol: protocol, source_ip_range: {}, destination_ip_range: {}, port_range: {type: "EQUAL_TO", port1: port}, type: (inbound ? "OUTSIDE_ACL" : "INSIDE_ACL"))
62
+ post
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,24 @@
1
+ module CloudControl::API
2
+ class Report < Core
3
+ def auditlog(start_date, end_date)
4
+ start = start_date.strftime("%Y-%m-%d")
5
+ stop = end_date.strftime("%Y-%m-%d")
6
+ org_endpoint "/auditlog?startDate=#{start}&endDate=#{stop}"
7
+ get_simple
8
+ end
9
+
10
+ def summary_usage(start_date, end_date)
11
+ start = start_date.strftime("%Y-%m-%d")
12
+ stop = end_date.strftime("%Y-%m-%d")
13
+ org_endpoint "/report/usage?startDate=#{start}&endDate=#{stop}"
14
+ get_simple
15
+ end
16
+
17
+ def detailed_usage(start_date, end_date)
18
+ start = start_date.strftime("%Y-%m-%d")
19
+ stop = end_date.strftime("%Y-%m-%d")
20
+ org_endpoint "/report/usageDetailed?startDate=#{start}&endDate=#{stop}"
21
+ get_simple
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,118 @@
1
+ module CloudControl::API
2
+ class Server < Core
3
+
4
+
5
+ def list(options = {})
6
+ endpoint "/#{org_id}/server/server"
7
+ query_params options
8
+ get
9
+ end
10
+
11
+ def show(server_id, options = {})
12
+ endpoint "/#{org_id}/server/server/#{server_id}"
13
+ get
14
+ end
15
+
16
+ def show_by_name(name, options = {})
17
+ options[:name] = name
18
+ single(list(options))
19
+ end
20
+
21
+ def show_by_id(id, options = {})
22
+ options[:id] = id
23
+ single(list(options))
24
+ end
25
+
26
+
27
+ def list_nics(vlan_id, options = {})
28
+ endpoint "/#{org_id}/server/nic"
29
+ get
30
+ end
31
+
32
+ def list_anti_affinity(target_id, options = {})
33
+ endpoint "/#{org_id}/server/nic"
34
+ get
35
+ end
36
+
37
+ def show_by_ip(ip, options = {})
38
+ options[:private_ip] = ip
39
+ single(list(options))
40
+ end
41
+
42
+ # def create(name,
43
+ # description,
44
+ # network_id,
45
+ # image_id,
46
+ # administrator_password=@client.default_password)
47
+ # org_endpoint "/server"
48
+
49
+ # xml_params(
50
+ # tag: "Server",
51
+ # schema: "server",
52
+ # name: name,
53
+ # description: description,
54
+ # vlan_resource_path: "/oec/#{org_id}/network/#{network_id}",
55
+ # image_resource_path: "/oec/base/image/#{image_id}",
56
+ # is_started: 'true',
57
+ # administrator_password: administrator_password
58
+ # )
59
+ # post
60
+ # end
61
+
62
+ # def delete(server_id)
63
+ # org_endpoint "/server/#{server_id}?delete"
64
+ # get
65
+ # end
66
+
67
+ # # memory in MB, ust be multiple of 1024
68
+ # def modify(server_id, name = nil, description = nil, cpu_count = nil, memory = nil)
69
+ # query_params(
70
+ # name: name,
71
+ # description: description,
72
+ # cpu_count: cpu_count,
73
+ # memory: memory
74
+ # )
75
+ # org_endpoint "/server/#{server_id}"
76
+ # post
77
+ # end
78
+
79
+ # def start(server_id)
80
+ # org_endpoint "/server/#{server_id}?start"
81
+ # get
82
+ # end
83
+
84
+ # def shutdown(server_id)
85
+ # org_endpoint "/server/#{server_id}?shutdown"
86
+ # get
87
+ # end
88
+
89
+ # def poweroff(server_id)
90
+ # org_endpoint "/server/#{server_id}?poweroff"
91
+ # get
92
+ # end
93
+
94
+ # def reboot(server_id)
95
+ # org_endpoint "/server/#{server_id}?reboot"
96
+ # get
97
+ # end
98
+
99
+ # def reset(server_id)
100
+ # org_endpoint "/server/#{server_id}?reset"
101
+ # get
102
+ # end
103
+
104
+ # # amount is # of GBs
105
+ # def add_storage(server_id, amount)
106
+ # org_endpoint "/server/#{server_id}?addLocalStorage"
107
+ # query_params(amount: amount)
108
+ # get
109
+ # end
110
+
111
+ # def remove_storage(server_id, disk_id)
112
+ # org_endpoint "/server/#{server_id}/disk/#{disk_id}?delete"
113
+ # get
114
+ # end
115
+
116
+ end
117
+ end
118
+
@@ -0,0 +1,125 @@
1
+ module CloudControl::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,97 @@
1
+ module CloudControl
2
+ class Client
3
+ include CloudControl::Connection
4
+ include CloudControl::Params
5
+ # include CloudControl::XML
6
+
7
+ attr_reader :api_base, :org_id, :username, :password
8
+ attr_reader :image, :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
+ IMAGES = {suse_ent_64: "d4edfe22-e2f0-11e2-84e5-180373fb68df", ubuntu_14_04: "abef3a94-3361-4ce4-a937-5e587042586a", ubuntu_12_04: "d4ed6d40-e2f0-11e2-84e5-180373fb68df", ubuntu_10_04: "d4edba02-e2f0-11e2-84e5-180373fb68df"}
20
+ API_URL = {na: "https://api-na.dimensiondata.com/caas/2.8",
21
+ eu: "https://api-eu.dimensiondata.com/caas/2.8",
22
+ au: "https://api-au.dimensiondata.com/caas/2.8",
23
+ mea: "https://api-mea.dimensiondata.com/caas/2.8",
24
+ ap: "https://api-ap.dimensiondata.com/caas/2.8"}
25
+
26
+
27
+ def initialize(api_base, org_id, username, password, colors = true, silent = true)
28
+ @api_base = api_base
29
+ @org_id = org_id
30
+ @username = username
31
+ @password = password
32
+ @colors = colors
33
+ @silent = silent
34
+
35
+ if @colors
36
+ require 'colorize'
37
+ end
38
+ end
39
+
40
+ # def directory
41
+ # CloudControl::API::Directory.new(self)
42
+ # end
43
+
44
+ def image
45
+ CloudControl::API::Image.new(self)
46
+ end
47
+
48
+ def network
49
+ CloudControl::API::Network.new(self)
50
+ end
51
+
52
+ def server
53
+ CloudControl::API::Server.new(self)
54
+ end
55
+
56
+ def account
57
+ CloudControl::API::Account.new(self)
58
+ end
59
+
60
+ def report
61
+ CloudControl::API::Report.new(self)
62
+ end
63
+
64
+ def vip
65
+ CloudControl::API::VIP.new(self)
66
+ end
67
+
68
+ def filter_params
69
+ params = {}
70
+ params[:page_size] = @page_size if @page_size.present?
71
+ params[:page_number] = @page_number if @page_number.present?
72
+ params[:order_by] = @order_by if @order_by.present?
73
+
74
+ if @filter_with.present?
75
+ @filter_with.each do |k, val|
76
+ params[k.to_sym] = val
77
+ end
78
+ end
79
+ params
80
+ end
81
+
82
+ # mode: bold, underscore, default
83
+ def log_error(message, color=nil, mode=nil)
84
+ log message, color, mode, true
85
+ end
86
+ def log(message, color = nil, mode = nil, error=nil)
87
+ return if (@silent && (not error))
88
+ if @colors
89
+ color = color.to_sym if color
90
+ mode = mode.to_sym if mode
91
+ puts message.colorize(:color => color, :mode => mode)
92
+ else
93
+ puts message
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,59 @@
1
+ module CloudControl
2
+ module Connection
3
+ def build_request(type, endpoint, query = nil, body = nil, xml=true)
4
+ uri = api_base + endpoint
5
+ append_query(uri, query) if query
6
+
7
+ if xml
8
+ request = Typhoeus::Request.new(
9
+ uri,
10
+ method: type,
11
+ body: body,
12
+ userpwd: "#{@username}:#{@password}",
13
+ headers: { 'Content-Type' =>'text/xml', 'User-Agent' => 'ACP Ruby SDK' }
14
+ )
15
+ else
16
+ request = Typhoeus::Request.new(
17
+ uri,
18
+ method: type,
19
+ body: body,
20
+ userpwd: "#{@username}:#{@password}",
21
+ headers: { 'User-Agent' => 'ACP Ruby SDK' }
22
+ )
23
+ end
24
+ end
25
+
26
+ def append_query(uri, query)
27
+ if uri.include?('?')
28
+ uri << '&'
29
+ else
30
+ uri << '?'
31
+ end
32
+ uri << query
33
+ end
34
+
35
+
36
+ def perform_request(request)
37
+ log "\nrequesting #{request.url}...", :yellow
38
+ request.run
39
+ end
40
+
41
+ def log_response(request, response)
42
+ if response.success?
43
+ log "...........success!", :yellow
44
+ elsif response.timed_out?
45
+ log_error "ERROR\n-----", :red
46
+ log_error "got a time out"
47
+ elsif response.code == 0
48
+ # Could not get an http response, something's wrong.
49
+ log_error "ERROR\n-----", :red
50
+ log_error response.return_message
51
+ else
52
+ # Received a non-successful http response.
53
+ log_error "ERROR\n-----", :red
54
+ log_error "HTTP request failed: " + response.code.to_s, :red
55
+ log_error response.body, :yellow
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,14 @@
1
+ module CloudControl
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 CloudControl
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,4 @@
1
+ module CloudControl
2
+ VERSION = "0.3.5"
3
+
4
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudcontrol_sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.5
5
+ platform: ruby
6
+ authors:
7
+ - Nigel Wright
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-11-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: typhoeus
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: xml-simple
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: hashie
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: colorize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: SDK to access NTT Cloud Control api'
98
+ email:
99
+ - nigel.wright@global.ntt
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - Gemfile
106
+ - LICENSE
107
+ - README.md
108
+ - cloudcontrol.gemspec
109
+ - lib/cloudcontrol.rb
110
+ - lib/cloudcontrol/api/account.rb
111
+ - lib/cloudcontrol/api/core.rb
112
+ - lib/cloudcontrol/api/image.rb
113
+ - lib/cloudcontrol/api/infrastructure.rb
114
+ - lib/cloudcontrol/api/network.rb
115
+ - lib/cloudcontrol/api/report.rb
116
+ - lib/cloudcontrol/api/server.rb
117
+ - lib/cloudcontrol/api/vip.rb
118
+ - lib/cloudcontrol/client.rb
119
+ - lib/cloudcontrol/connection.rb
120
+ - lib/cloudcontrol/exceptions.rb
121
+ - lib/cloudcontrol/params.rb
122
+ - lib/cloudcontrol/version.rb
123
+ homepage: ''
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubygems_version: 3.0.6
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: NTT Cloud Control REST API client gem
146
+ test_files: []