ibm-cloud-sdk 0.1.5 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/Gemfile +2 -0
  4. data/ibm-cloud-sdk.gemspec +1 -1
  5. data/lib/ibm/cloud/sdk.rb +3 -1
  6. data/lib/ibm/cloud/sdk/iam.rb +5 -0
  7. data/lib/ibm/cloud/sdk/logging.rb +21 -0
  8. data/lib/ibm/cloud/sdk/null_logger.rb +19 -0
  9. data/lib/ibm/cloud/sdk/power_iaas.rb +125 -10
  10. data/lib/ibm/cloud/sdk/resource_controller.rb +4 -0
  11. data/lib/ibm/cloud/sdk/tags.rb +28 -0
  12. data/lib/ibm/cloud/sdk/tags/http.rb +5 -0
  13. data/lib/ibm/cloud/sdk/tags/http/tag_collection.rb +99 -0
  14. data/lib/ibm/cloud/sdk/version.rb +1 -1
  15. data/lib/ibm/cloud/sdk/vpc.rb +8 -6
  16. data/lib/ibm/cloud/sdk/vpc/floatingips.rb +2 -2
  17. data/lib/ibm/cloud/sdk/vpc/flowlogcollectors.rb +2 -2
  18. data/lib/ibm/cloud/sdk/vpc/http.rb +7 -0
  19. data/lib/ibm/cloud/sdk/vpc/http/vpc_collection.rb +82 -0
  20. data/lib/ibm/cloud/sdk/vpc/http/vpc_http.rb +29 -0
  21. data/lib/ibm/cloud/sdk/vpc/http/vpc_instance.rb +30 -0
  22. data/lib/ibm/cloud/sdk/vpc/ike_policies.rb +2 -2
  23. data/lib/ibm/cloud/sdk/vpc/images.rb +2 -2
  24. data/lib/ibm/cloud/sdk/vpc/instance/actions.rb +2 -2
  25. data/lib/ibm/cloud/sdk/vpc/instance/floating_ips.rb +3 -3
  26. data/lib/ibm/cloud/sdk/vpc/instance/network_interfaces.rb +4 -29
  27. data/lib/ibm/cloud/sdk/vpc/instance/volume_attachments.rb +4 -27
  28. data/lib/ibm/cloud/sdk/vpc/instance_profiles.rb +3 -3
  29. data/lib/ibm/cloud/sdk/vpc/instances.rb +43 -3
  30. data/lib/ibm/cloud/sdk/vpc/ipsec_policies.rb +2 -2
  31. data/lib/ibm/cloud/sdk/vpc/keys.rb +2 -24
  32. data/lib/ibm/cloud/sdk/vpc/load_balancer.rb +1 -1
  33. data/lib/ibm/cloud/sdk/vpc/load_balancer/listeners.rb +2 -2
  34. data/lib/ibm/cloud/sdk/vpc/load_balancer/members.rb +2 -2
  35. data/lib/ibm/cloud/sdk/vpc/load_balancer/policies.rb +2 -2
  36. data/lib/ibm/cloud/sdk/vpc/load_balancer/pools.rb +2 -2
  37. data/lib/ibm/cloud/sdk/vpc/load_balancer/rules.rb +2 -2
  38. data/lib/ibm/cloud/sdk/vpc/load_balancers.rb +1 -1
  39. data/lib/ibm/cloud/sdk/vpc/network_acls.rb +4 -4
  40. data/lib/ibm/cloud/sdk/vpc/operating_systems.rb +2 -2
  41. data/lib/ibm/cloud/sdk/vpc/public_gateways.rb +2 -2
  42. data/lib/ibm/cloud/sdk/vpc/regions.rb +4 -4
  43. data/lib/ibm/cloud/sdk/vpc/security_groups.rb +6 -6
  44. data/lib/ibm/cloud/sdk/vpc/subnets.rb +2 -2
  45. data/lib/ibm/cloud/sdk/vpc/volume_profiles.rb +2 -2
  46. data/lib/ibm/cloud/sdk/vpc/volumes.rb +2 -2
  47. data/lib/ibm/cloud/sdk/vpc/vpcs.rb +6 -6
  48. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/connections.rb +2 -2
  49. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/local_cidrs.rb +2 -2
  50. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/peer_cidrs.rb +2 -2
  51. data/lib/ibm/cloud/sdk/vpc/vpn_gateways.rb +2 -2
  52. data/lib/ibm/cloud/sdk_http.rb +16 -0
  53. data/lib/ibm/cloud/sdk_http/base_collection.rb +121 -0
  54. data/lib/ibm/cloud/sdk_http/base_http_mixin.rb +63 -0
  55. data/lib/ibm/cloud/sdk_http/base_instance.rb +55 -0
  56. data/lib/ibm/cloud/sdk_http/connection.rb +32 -0
  57. data/lib/ibm/cloud/sdk_http/exceptions.rb +31 -0
  58. data/lib/ibm/cloud/sdk_http/has_child.rb +23 -0
  59. data/lib/ibm/cloud/sdk_http/iam_token.rb +53 -0
  60. data/lib/ibm/cloud/sdk_http/sdk_response.rb +132 -0
  61. data/lib/ibm/cloud_sdk.rb +39 -0
  62. metadata +23 -11
  63. data/lib/ibm/cloud/sdk/vpc/base_collection.rb +0 -108
  64. data/lib/ibm/cloud/sdk/vpc/base_instance.rb +0 -23
  65. data/lib/ibm/cloud/sdk/vpc/base_vpc.rb +0 -61
  66. data/lib/ibm/cloud/sdk/vpc/cloud_sdk.rb +0 -33
  67. data/lib/ibm/cloud/sdk/vpc/helpers/connection.rb +0 -66
  68. data/lib/ibm/cloud/sdk/vpc/helpers/response.rb +0 -92
  69. data/lib/ibm/cloud/sdk/vpc/instance.rb +0 -35
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # Work with Volume Profiles.
9
- class VolumeProfiles < BaseCollection
9
+ class VolumeProfiles < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'volume/profiles', child_class: VolumeProfile, array_key: 'profiles')
12
12
  end
13
13
  end
14
14
 
15
15
  # Work with a single volume profile.
16
- class VolumeProfile < BaseInstance
16
+ class VolumeProfile < VPCInstance
17
17
  end
18
18
  end
19
19
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # Work with a collection of volumes.
9
- class Volumes < BaseCollection
9
+ class Volumes < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'volumes', child_class: Volume)
12
12
  end
13
13
  end
14
14
 
15
15
  # Work with a single volume.
16
- class Volume < BaseInstance
16
+ class Volume < VPCInstance
17
17
  end
18
18
  end
19
19
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of Vpc
9
- class Vpcs < BaseCollection
9
+ class Vpcs < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'vpcs', child_class: VpcInstance)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single Vpc
16
- class VpcInstance < BaseInstance
16
+ class VpcInstance < VPCInstance
17
17
  def default_network_acl
18
18
  get('default_network_acl')
19
19
  end
@@ -33,25 +33,25 @@ module IBM
33
33
 
34
34
  module VPCS
35
35
  # A list of Vpc
36
- class AddressPrefixes < BaseCollection
36
+ class AddressPrefixes < VPCCollection
37
37
  def initialize(parent)
38
38
  super(parent, 'address_prefixes', child_class: AddressPrefix)
39
39
  end
40
40
  end
41
41
 
42
42
  # A single Vpc
43
- class AddressPrefix < BaseInstance
43
+ class AddressPrefix < VPCInstance
44
44
  end
45
45
 
46
46
  # A list of Vpc
47
- class Routes < BaseCollection
47
+ class Routes < VPCCollection
48
48
  def initialize(parent)
49
49
  super(parent, 'routes', child_class: Route)
50
50
  end
51
51
  end
52
52
 
53
53
  # A single Vpc
54
- class Route < BaseInstance
54
+ class Route < VPCInstance
55
55
  end
56
56
  end
57
57
  end
@@ -10,7 +10,7 @@ module IBM
10
10
  module VPC
11
11
  module VPNGATEWAY
12
12
  # A list of Connection
13
- class Connections < BaseCollection
13
+ class Connections < VPCCollection
14
14
  def initialize(parent)
15
15
  @array_key = 'connections'
16
16
  @instance = Connection
@@ -19,7 +19,7 @@ module IBM
19
19
  end
20
20
 
21
21
  # A single Connection
22
- class Connection < BaseInstance
22
+ class Connection < VPCInstance
23
23
  def local_cidrs
24
24
  LocalCIDRs.new(self)
25
25
  end
@@ -7,7 +7,7 @@ module IBM
7
7
  module VPC
8
8
  module VPNGATEWAY
9
9
  # A list of Connection
10
- class LocalCIDRs < BaseCollection
10
+ class LocalCIDRs < VPCCollection
11
11
  def initialize(parent)
12
12
  @array_key = 'local_cidrs'
13
13
  @instance = Connection
@@ -20,7 +20,7 @@ module IBM
20
20
  end
21
21
 
22
22
  # A single Connection
23
- class LocalCIDR < BaseInstance
23
+ class LocalCIDR < VPCInstance
24
24
  def update(payload)
25
25
  put(payload)
26
26
  end
@@ -7,7 +7,7 @@ module IBM
7
7
  module VPC
8
8
  module VPNGATEWAY
9
9
  # A list of Connection
10
- class PeerCIDRs < BaseCollection
10
+ class PeerCIDRs < VPCCollection
11
11
  def initialize(parent)
12
12
  @array_key = 'peer_cidrs'
13
13
  @instance = Connection
@@ -20,7 +20,7 @@ module IBM
20
20
  end
21
21
 
22
22
  # A single Connection
23
- class PeerCIDR < BaseInstance
23
+ class PeerCIDR < VPCInstance
24
24
  def update(payload)
25
25
  put(payload)
26
26
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of VPNGateway
9
- class VPNGateways < BaseCollection
9
+ class VPNGateways < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'vpn_gateways', child_class: VPNGateway)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single VPNGateway
16
- class VPNGateway < BaseInstance
16
+ class VPNGateway < VPCInstance
17
17
  # Get a lisst of connections asssociated with this gateway.
18
18
  def connections
19
19
  VPNGATEWAY::Connections.new(self)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'sdk_http/connection'
4
+ require_relative 'sdk_http/exceptions'
5
+ require_relative 'sdk_http/base_collection'
6
+ require_relative 'sdk_http/base_instance'
7
+ require_relative 'sdk_http/sdk_response'
8
+ require_relative 'sdk_http/iam_token'
9
+
10
+ module IBM
11
+ module Cloud
12
+ # Module holds basic HTTP functionality.
13
+ module SDKHTTP
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,121 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require_relative 'base_http_mixin'
5
+ require_relative 'has_child'
6
+
7
+ module IBM
8
+ module Cloud
9
+ module SDKHTTP
10
+ # Container that encapsulates the VPC API.
11
+ # This class is used as a base for collection APIs.
12
+ # @param parent [Object] The parent instance in the API chain.
13
+ # @param endpoint [string] A path from the parent to the desired endpoint. In most cases is should be 1 word.
14
+ # @param array_key [string] The key that the API response holds the endpoint data. When nil the endpoint will be used.
15
+ # @param child_class [Object] The Object to be used when instanciating the single instance for this class.
16
+ class BaseCollection
17
+ include BaseHTTPMixin
18
+
19
+ def initialize(parent, endpoint, array_key: nil, child_class: nil, child_id: 'id')
20
+ # Setup empty base instance variables.
21
+ @params = {}
22
+ @token = parent.token
23
+ array_key ||= endpoint
24
+
25
+ # Set the array key and child class.
26
+ @array_key ||= array_key
27
+
28
+ @instance ||= child_class
29
+ @instance_id ||= child_id
30
+
31
+ @connection = parent.connection
32
+
33
+ (class << self; include ChildMixin; end) if child_class
34
+
35
+ @endpoint = parent.url(endpoint)
36
+ @logger = parent.logger
37
+ end
38
+
39
+ attr_reader :logger, :endpoint, :token, :connection
40
+
41
+ # In a Child base class add the possible query parameters for the API and return self to make it chainable.
42
+ # When implemented usage would be Collection.params(limit: 2).get
43
+ # @return [BaseCollection] The instanticated class.
44
+ def params(limit: nil)
45
+ raise NotImplementedError('Sample only. The params method needs to be customized in child class.')
46
+ # rubocop:disable Lint/UnreachableCode
47
+ @params[:limit] = limit if limit
48
+ self
49
+ # rubocop:enable Lint/UnreachableCode
50
+ end
51
+
52
+ def reset_params
53
+ @params.clear
54
+ end
55
+
56
+ # Retrieve the collection from the cloud.
57
+ # @return [IBM::Cloud::SDK::VPC::Response] The http response object.
58
+ def fetch
59
+ @data ||= get
60
+ end
61
+
62
+ # Get an iterable for the resource collection.
63
+ # @return [Enumerator] Use standard each, next idioms.
64
+ def all
65
+ each_resource(url)
66
+ end
67
+
68
+ # Fetch all data and return in an array.
69
+ # @return [Array] Hashes of the returned data.
70
+ def data
71
+ all.to_a
72
+ end
73
+
74
+ # A generic post method to create a resource on the collection.
75
+ # @param payload [Hash] A hash of parameters to send to the server.
76
+ # @param payload_type [String] One of the following options json, form, or body.
77
+ # @return [IBM::Cloud::SDK::VPC::Response] The http response object.
78
+ def create(payload, payload_type = 'json')
79
+ adhoc(method: 'post', payload_type: payload_type, payload: payload)
80
+ end
81
+
82
+ private
83
+
84
+ # Return a wrapped instance if set.
85
+ # @param value [Hash] The hash returned from server.
86
+ def hash_instance(value)
87
+ return @instance.new(self, data: value, id_key: @instance_id) if @instance
88
+
89
+ value
90
+ end
91
+
92
+ # Create a generator that removes the need for pagination.
93
+ # @param url [String] Full URL to send to server.
94
+ # @return [Enumerator] Object to page through results.
95
+ # @yield [BaseInstance] An instance of the instance class.
96
+ # @yield [Hash] When no BaseInstance set.
97
+ def each_resource(url, &block)
98
+ raise NotImplementedError('Sample only. The each_resource method needs to be customized in child class.')
99
+ # rubocop:disable Lint/UnreachableCode
100
+ # Sample implementation based on VPC.
101
+ return enum_for(:each_resource, url) unless block_given?
102
+ return unless url
103
+
104
+ response = get(path: url)
105
+ resources = response.fetch(@array_key.to_sym)
106
+
107
+ resources&.each { |value| yield hash_instance(value) }
108
+ # VPC has a next key that holds the next URL.
109
+ return unless response.key?(:next)
110
+
111
+ # The next data structure is a hash with a href member.
112
+ next_url = response.dig(:next, :href)
113
+ return unless next_url
114
+
115
+ each_resource(next_url, &block)
116
+ # rubocop:enable Lint/UnreachableCode
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'sdk_response'
4
+
5
+ module IBM
6
+ module Cloud
7
+ # Module holds basic HTTP functionality.
8
+ module SDKHTTP
9
+ # Generic methods for accessing VPC.
10
+ module BaseHTTPMixin
11
+ @connection = nil
12
+
13
+ def adhoc(method: 'get', path: nil, params: {}, payload: {})
14
+ unchecked_response(method: method, path: path, params: params, payload: payload).raise_for_status!
15
+ end
16
+
17
+ def unchecked_response(method: 'get', path: nil, params: {}, payload: {})
18
+ @connection.request(method.to_sym, url(path), metadata(params, payload))
19
+ end
20
+
21
+ def get(path: nil, params: {})
22
+ adhoc(method: 'get', path: path, params: params)
23
+ end
24
+
25
+ attr_reader :endpoint
26
+
27
+ def post(payload = {}, path: nil, params: {})
28
+ adhoc(method: 'post', path: path, params: params, payload: payload)
29
+ end
30
+
31
+ def put(payload = {}, path: nil, params: {})
32
+ adhoc(method: 'put', path: path, params: params, payload: payload)
33
+ end
34
+
35
+ def patch(payload = {}, path: nil, params: {})
36
+ adhoc(method: 'patch', path: path, params: params, payload: payload)
37
+ end
38
+
39
+ def delete(path: nil, params: {})
40
+ adhoc(method: 'delete', path: path, params: params)
41
+ end
42
+
43
+ def metadata(query = nil, payload = nil)
44
+ @params ||= {}
45
+ query ||= {}
46
+ payload ||= {}
47
+ {
48
+ query: @params.merge(query),
49
+ body: payload,
50
+ headers: { "Authorization": @token.authorization_header }
51
+ }
52
+ end
53
+
54
+ def url(path = nil)
55
+ return endpoint unless path
56
+ return path if URI.parse(path).relative? == false
57
+
58
+ "#{endpoint}/#{path}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ require_relative 'base_http_mixin'
6
+
7
+ module IBM
8
+ module Cloud
9
+ # Module holds basic HTTP functionality.
10
+ module SDKHTTP
11
+ # Container that encapsulates the VPC API.
12
+ class BaseInstance
13
+ include BaseHTTPMixin
14
+
15
+ def initialize(parent, data: {}, id_key: 'id', endpoint: nil)
16
+ @data = data
17
+
18
+ endpoint ||= data[id_key.to_sym]
19
+ @connection = parent.connection
20
+ @token = parent.token
21
+ @endpoint = parent.url(endpoint)
22
+ @logger = parent.logger
23
+ end
24
+
25
+ attr_reader :logger, :endpoint, :token, :connection
26
+
27
+ # Fetch the instance details for this resource.
28
+ # @return [SDKResponse] The HTTP response object.
29
+ def details
30
+ get.hash_response
31
+ end
32
+
33
+ # Fetch the instance details from the server. Clear current data and save the results.
34
+ # @return [BaseInstance] This instance for chaining.
35
+ def refresh
36
+ @data.replace(details)
37
+ self
38
+ end
39
+
40
+ # Send an update to the server for this resource.
41
+ def update(payload)
42
+ patch(payload)
43
+ end
44
+
45
+ # Send a delete request to the server for this resource.
46
+ def remove
47
+ delete
48
+ end
49
+
50
+ extend Forwardable
51
+ def_delegators :@data, :[], :dig, :each, :each_pair, :fetch, :has_key?, :has_value?, :include?, :index, :inspect, :key?, :keys, :length, :merge, :merge!, :clear, :to_h, :value?, :values, :pretty_print
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'httparty'
4
+ require_relative 'sdk_response'
5
+
6
+ module IBM
7
+ module Cloud
8
+ module SDKHTTP
9
+ # Class to wrap the HTTP Provider implementation.
10
+ class HTTPConnection
11
+ include HTTParty
12
+
13
+ def initialize(logger)
14
+ self.class.logger(logger, :debug, :curl)
15
+ end
16
+
17
+ def default_options
18
+ self.class.default_options
19
+ end
20
+
21
+ def add_proxy(host, port, user, password)
22
+ self.class.http_proxy(host, port, user, password)
23
+ end
24
+
25
+ def request(method, path, params)
26
+ response = self.class.send(method.to_sym, path, params)
27
+ SDKResponse.new(response)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end