ibm-cloud-sdk 0.1.1 → 0.1.6

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/README.md +1 -1
  4. data/ibm-cloud-sdk.gemspec +3 -1
  5. data/lib/ibm/cloud/sdk.rb +2 -0
  6. data/lib/ibm/cloud/sdk/power_iaas.rb +70 -1
  7. data/lib/ibm/cloud/sdk/resource_controller.rb +2 -8
  8. data/lib/ibm/cloud/sdk/version.rb +1 -1
  9. data/lib/ibm/cloud/sdk/vpc.rb +132 -0
  10. data/lib/ibm/cloud/sdk/vpc/base_collection.rb +108 -0
  11. data/lib/ibm/cloud/sdk/vpc/base_instance.rb +23 -0
  12. data/lib/ibm/cloud/sdk/vpc/base_vpc.rb +61 -0
  13. data/lib/ibm/cloud/sdk/vpc/cloud_sdk.rb +33 -0
  14. data/lib/ibm/cloud/sdk/vpc/floatingips.rb +20 -0
  15. data/lib/ibm/cloud/sdk/vpc/flowlogcollectors.rb +20 -0
  16. data/lib/ibm/cloud/sdk/vpc/helpers/connection.rb +66 -0
  17. data/lib/ibm/cloud/sdk/vpc/helpers/response.rb +92 -0
  18. data/lib/ibm/cloud/sdk/vpc/ike_policies.rb +24 -0
  19. data/lib/ibm/cloud/sdk/vpc/images.rb +21 -0
  20. data/lib/ibm/cloud/sdk/vpc/instance/actions.rb +19 -0
  21. data/lib/ibm/cloud/sdk/vpc/instance/floating_ips.rb +23 -0
  22. data/lib/ibm/cloud/sdk/vpc/instance/network_interfaces.rb +28 -0
  23. data/lib/ibm/cloud/sdk/vpc/instance/volume_attachments.rb +23 -0
  24. data/lib/ibm/cloud/sdk/vpc/instance_profiles.rb +21 -0
  25. data/lib/ibm/cloud/sdk/vpc/instances.rb +64 -0
  26. data/lib/ibm/cloud/sdk/vpc/ipsec_policies.rb +24 -0
  27. data/lib/ibm/cloud/sdk/vpc/keys.rb +43 -0
  28. data/lib/ibm/cloud/sdk/vpc/load_balancer.rb +23 -0
  29. data/lib/ibm/cloud/sdk/vpc/load_balancer/listeners.rb +30 -0
  30. data/lib/ibm/cloud/sdk/vpc/load_balancer/members.rb +23 -0
  31. data/lib/ibm/cloud/sdk/vpc/load_balancer/policies.rb +30 -0
  32. data/lib/ibm/cloud/sdk/vpc/load_balancer/pools.rb +28 -0
  33. data/lib/ibm/cloud/sdk/vpc/load_balancer/rules.rb +25 -0
  34. data/lib/ibm/cloud/sdk/vpc/load_balancers.rb +19 -0
  35. data/lib/ibm/cloud/sdk/vpc/network_acls.rb +39 -0
  36. data/lib/ibm/cloud/sdk/vpc/operating_systems.rb +21 -0
  37. data/lib/ibm/cloud/sdk/vpc/public_gateways.rb +21 -0
  38. data/lib/ibm/cloud/sdk/vpc/regions.rb +35 -0
  39. data/lib/ibm/cloud/sdk/vpc/security_groups.rb +48 -0
  40. data/lib/ibm/cloud/sdk/vpc/subnets.rb +21 -0
  41. data/lib/ibm/cloud/sdk/vpc/volume_profiles.rb +21 -0
  42. data/lib/ibm/cloud/sdk/vpc/volumes.rb +21 -0
  43. data/lib/ibm/cloud/sdk/vpc/vpcs.rb +60 -0
  44. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/connections.rb +35 -0
  45. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/local_cidrs.rb +32 -0
  46. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/peer_cidrs.rb +32 -0
  47. data/lib/ibm/cloud/sdk/vpc/vpn_gateways.rb +25 -0
  48. metadata +57 -2
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ # Container that encapsulates the VPC API.
8
+ class BaseInstance < BaseVPC
9
+ def details
10
+ get.hash_response
11
+ end
12
+
13
+ def update(payload)
14
+ patch(payload)
15
+ end
16
+
17
+ def remove
18
+ delete
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ # Container that encapsulates the VPC API.
8
+ class BaseVPC
9
+ def initialize(parent, endpoint = nil)
10
+ @endpoint = parent.url(endpoint)
11
+ @connection = parent.connection
12
+ @logger = parent.logger
13
+ end
14
+
15
+ attr_reader :endpoint, :connection, :logger
16
+
17
+ def adhoc(method: 'get', path: nil, params: {}, payload_type: 'json', payload: {})
18
+ @connection.adhoc(method.to_sym, url(path), metadata(params, payload_type, payload))
19
+ end
20
+
21
+ def get(path: nil, params: {})
22
+ adhoc(method: 'get', path: path, params: params)
23
+ end
24
+
25
+ def post(payload = {}, path: nil, params: {}, type: 'json')
26
+ adhoc(method: 'post', path: path, params: params, payload: payload, payload_type: type)
27
+ end
28
+
29
+ def put(payload = {}, path: nil, params: {})
30
+ adhoc(method: 'put', path: path, params: params, payload: payload)
31
+ end
32
+
33
+ def patch(payload = {}, path: nil, params: {})
34
+ adhoc(method: 'patch', path: path, params: params, payload: payload)
35
+ end
36
+
37
+ def delete(path: nil, params: {})
38
+ adhoc(method: 'delete', path: path, params: params)
39
+ end
40
+
41
+ def url(path = nil)
42
+ return endpoint unless path
43
+
44
+ "#{endpoint}/#{path}"
45
+ end
46
+
47
+ private
48
+
49
+ def metadata(params = {}, payload_type = 'json', payload = {})
50
+ params ||= {}
51
+ pt = {
52
+ params: { version: '2020-08-01', generation: 2 }.merge(params)
53
+ }
54
+
55
+ pt[payload_type.to_sym] = payload unless payload.empty?
56
+ pt
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'http'
4
+ require 'ibm/cloud/sdk/vpc/helpers/connection'
5
+ require 'ibm/cloud/sdk/vpc'
6
+
7
+ module IBM
8
+ # Holds the SDK pieces.
9
+ class CloudSDK
10
+ def initialize(api_key, logger: nil, options: {})
11
+ @logger = logger
12
+ @logger ||= Logger.new($stdout, level: :warn)
13
+
14
+ @client = HTTP.use(http_options(options))
15
+ @connection = IBM::Cloud::SDK::VPC::Connection.new(api_key, logger: @logger, client: @client)
16
+ end
17
+
18
+ def http_options(options = {})
19
+ options.merge(
20
+ {
21
+ logging: { logger: @logger },
22
+ auto_deflate: {}
23
+ }
24
+ )
25
+ end
26
+
27
+ attr_reader :logger, :connection
28
+
29
+ def vpc(region = 'us-east')
30
+ IBM::Cloud::SDK::Vpc.new(region, @connection, logger: @logger)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ # Class that deals with groups of floating IPs.
9
+ class FloatingIPs < BaseCollection
10
+ def initialize(parent)
11
+ super(parent, 'floating_ips', child_class: FloatingIP)
12
+ end
13
+ end
14
+
15
+ # Class that deals with a single floating IP.
16
+ class FloatingIP < BaseInstance; end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ # A list of subnets
9
+ class FlowLogCollectors < BaseCollection
10
+ def initialize(parent)
11
+ super(parent, 'flow_log_collectors', child_class: FlowLogCollectors)
12
+ end
13
+ end
14
+
15
+ # A single subnet
16
+ class FlowLogCollector < BaseInstance; end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'http'
5
+ require_relative 'response'
6
+
7
+ module IBM
8
+ module Cloud
9
+ module SDK
10
+ module VPC
11
+
12
+ # Contols tokens.
13
+ class Connection
14
+ def initialize(api_key, logger: nil, client: nil)
15
+ @api_key = api_key
16
+ @logger = logger
17
+ @client = client
18
+ @token = Token.new(api_key, logger: logger, client: client)
19
+ end
20
+
21
+ attr_reader :client
22
+
23
+ def adhoc(verb, uri, opts = {})
24
+ response = @client.auth(@token.authorization_header).request(verb.to_sym, uri, opts)
25
+ Response.new(response)
26
+ end
27
+
28
+ def authorization_header
29
+ @token.authorization_header
30
+ end
31
+ end
32
+
33
+ # Get a token.
34
+ class Token
35
+ def initialize(api_key, logger: nil, client: nil)
36
+ @api_key = api_key
37
+ @logger = logger
38
+ @client = client
39
+ @data = fetch
40
+ end
41
+
42
+ def fetch
43
+ payload = {
44
+ form: {
45
+ grant_type: 'urn:ibm:params:oauth:grant-type:apikey',
46
+ apikey: @api_key
47
+ }
48
+ }
49
+ response = HTTP.post('https://iam.cloud.ibm.com/identity/token', payload)
50
+ @data = Response.new(response).json
51
+ end
52
+
53
+ def expired?
54
+ fetch unless @data
55
+ @data.fetch(:expiration).to_i <= Time.now.to_i + 600
56
+ end
57
+
58
+ def authorization_header
59
+ fetch if expired?
60
+ "#{@data.fetch(:token_type)} #{@data.fetch(:access_token)}"
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'http'
5
+
6
+ module IBM
7
+ module Cloud
8
+ module SDK
9
+ module VPC
10
+ # Encapsulate the HTTP response.
11
+ class Response
12
+ def initialize(response)
13
+ @response = response
14
+ end
15
+
16
+ attr_reader :response
17
+
18
+ # Return the response in a hash or array.
19
+ def json
20
+ JSON.parse(body, symbolize_names: true)
21
+ rescue StandardError
22
+ raise "Error while parsing response body. #{response.body}"
23
+ end
24
+
25
+ # Return the raw response string.
26
+ def body
27
+ response.body.to_s
28
+ end
29
+
30
+ # Return the response code.
31
+ def code
32
+ response.code
33
+ end
34
+
35
+ alias_method :status, :code
36
+
37
+ # Return the raw connection object.
38
+ def connection
39
+ response.connection
40
+ end
41
+
42
+ # Return the content type of the response.
43
+ def content_type
44
+ response.response.mime_type
45
+ end
46
+
47
+ # Return the textual reason.
48
+ def reason
49
+ response.reason
50
+ end
51
+
52
+ # Return the sent url as a string.
53
+ def url
54
+ response.uri.to_s
55
+ end
56
+
57
+ # Return the sent url as a URI class.
58
+ def uri
59
+ response.uri
60
+ end
61
+
62
+ # Verify that the json response is a hash.
63
+ def hash_response
64
+ check_object(Hash)
65
+ end
66
+
67
+ # Verify that the json response is an array.
68
+ def array_response
69
+ check_object(Array)
70
+ end
71
+
72
+ # Find a subkey within the returned response.
73
+ def subkey(key)
74
+ ret = hash_response
75
+ sym_key = key.to_sym
76
+ return ret.fetch(sym_key) if ret.key?(sym_key)
77
+
78
+ raise "Key #{key} not found in #{ret}."
79
+ end
80
+
81
+ # Check to see if the returned object is the expected object.
82
+ def check_object(obj)
83
+ ret = json
84
+ return ret if ret.instance_of?(obj)
85
+
86
+ raise "Expected #{obj} in response for #{url}. The returned object is a #{ret.class}."
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,24 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ # A list of IKEPolicy
9
+ class IKEPolicies < BaseCollection
10
+ def initialize(parent)
11
+ super(parent, 'ike_policies', child_class: IKEPolicy)
12
+ end
13
+ end
14
+
15
+ # A single IKEPolicy
16
+ class IKEPolicy < BaseInstance
17
+ def connections
18
+ get('connections')
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ # Work with multiple images.
9
+ class Images < BaseCollection
10
+ def initialize(parent)
11
+ super(parent, 'images', child_class: Image)
12
+ end
13
+ end
14
+
15
+ # Work with a single image.
16
+ class Image < BaseInstance
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ module INSTANCES
9
+ # Actions for an instance.
10
+ class Actions < BaseCollection
11
+ def initialize(parent)
12
+ super(parent, 'actions')
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module IBM
5
+ module Cloud
6
+ module SDK
7
+ module VPC
8
+ module INSTANCES
9
+ # Get a Floating IP.
10
+ class FloatingIps < BaseCollection
11
+ def initialize(parent)
12
+ super(parent, 'floating_ips', child_class: FloatingIp)
13
+ end
14
+ end
15
+
16
+ # Get a single floating IP.
17
+ class FloatingIp < BaseInstance
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require_relative('floating_ips')
5
+
6
+ module IBM
7
+ module Cloud
8
+ module SDK
9
+ module VPC
10
+ module INSTANCES
11
+ # All netowrk interfaces.
12
+ class NetworkInterfaces < BaseCollection
13
+ def initialize(parent)
14
+ super(parent, 'network_interfaces', child_class: NetworkInterface)
15
+ end
16
+ end
17
+
18
+ # A single network insterface.
19
+ class NetworkInterface < BaseInstance
20
+ def floating_ips
21
+ FloatingIps.new(self)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end