ibm-cloud-sdk 0.1.2 → 0.1.7

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/Gemfile +2 -0
  4. data/ibm-cloud-sdk.gemspec +3 -1
  5. data/lib/ibm/cloud/sdk.rb +3 -0
  6. data/lib/ibm/cloud/sdk/logging.rb +21 -0
  7. data/lib/ibm/cloud/sdk/null_logger.rb +19 -0
  8. data/lib/ibm/cloud/sdk/power_iaas.rb +181 -4
  9. data/lib/ibm/cloud/sdk/resource_controller.rb +2 -8
  10. data/lib/ibm/cloud/sdk/version.rb +1 -1
  11. data/lib/ibm/cloud/sdk/vpc.rb +133 -0
  12. data/lib/ibm/cloud/sdk/vpc/base_collection.rb +108 -0
  13. data/lib/ibm/cloud/sdk/vpc/base_instance.rb +23 -0
  14. data/lib/ibm/cloud/sdk/vpc/base_vpc.rb +61 -0
  15. data/lib/ibm/cloud/sdk/vpc/cloud_sdk.rb +33 -0
  16. data/lib/ibm/cloud/sdk/vpc/exceptions.rb +33 -0
  17. data/lib/ibm/cloud/sdk/vpc/floatingips.rb +20 -0
  18. data/lib/ibm/cloud/sdk/vpc/flowlogcollectors.rb +20 -0
  19. data/lib/ibm/cloud/sdk/vpc/helpers/connection.rb +96 -0
  20. data/lib/ibm/cloud/sdk/vpc/helpers/response.rb +134 -0
  21. data/lib/ibm/cloud/sdk/vpc/ike_policies.rb +24 -0
  22. data/lib/ibm/cloud/sdk/vpc/images.rb +21 -0
  23. data/lib/ibm/cloud/sdk/vpc/instance/actions.rb +19 -0
  24. data/lib/ibm/cloud/sdk/vpc/instance/floating_ips.rb +23 -0
  25. data/lib/ibm/cloud/sdk/vpc/instance/network_interfaces.rb +28 -0
  26. data/lib/ibm/cloud/sdk/vpc/instance/volume_attachments.rb +23 -0
  27. data/lib/ibm/cloud/sdk/vpc/instance_profiles.rb +21 -0
  28. data/lib/ibm/cloud/sdk/vpc/instances.rb +64 -0
  29. data/lib/ibm/cloud/sdk/vpc/ipsec_policies.rb +24 -0
  30. data/lib/ibm/cloud/sdk/vpc/keys.rb +43 -0
  31. data/lib/ibm/cloud/sdk/vpc/load_balancer.rb +23 -0
  32. data/lib/ibm/cloud/sdk/vpc/load_balancer/listeners.rb +30 -0
  33. data/lib/ibm/cloud/sdk/vpc/load_balancer/members.rb +23 -0
  34. data/lib/ibm/cloud/sdk/vpc/load_balancer/policies.rb +30 -0
  35. data/lib/ibm/cloud/sdk/vpc/load_balancer/pools.rb +28 -0
  36. data/lib/ibm/cloud/sdk/vpc/load_balancer/rules.rb +25 -0
  37. data/lib/ibm/cloud/sdk/vpc/load_balancers.rb +19 -0
  38. data/lib/ibm/cloud/sdk/vpc/network_acls.rb +39 -0
  39. data/lib/ibm/cloud/sdk/vpc/operating_systems.rb +21 -0
  40. data/lib/ibm/cloud/sdk/vpc/public_gateways.rb +21 -0
  41. data/lib/ibm/cloud/sdk/vpc/regions.rb +35 -0
  42. data/lib/ibm/cloud/sdk/vpc/security_groups.rb +48 -0
  43. data/lib/ibm/cloud/sdk/vpc/subnets.rb +21 -0
  44. data/lib/ibm/cloud/sdk/vpc/volume_profiles.rb +21 -0
  45. data/lib/ibm/cloud/sdk/vpc/volumes.rb +21 -0
  46. data/lib/ibm/cloud/sdk/vpc/vpcs.rb +60 -0
  47. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/connections.rb +35 -0
  48. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/local_cidrs.rb +32 -0
  49. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/peer_cidrs.rb +32 -0
  50. data/lib/ibm/cloud/sdk/vpc/vpn_gateways.rb +25 -0
  51. metadata +60 -2
@@ -0,0 +1,96 @@
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
+ # The Connection object to be used for all HTTP requests.
12
+ # @param api_key [String] The API Key to be used for this account.
13
+ # @param logger [Logger] An instantiated logger instance.
14
+ # @param client [HTTP::Client] An instantiated HTTP client.
15
+ class Connection
16
+ def initialize(api_key, logger: nil, client: nil)
17
+ @api_key = api_key
18
+ @logger = logger
19
+ @client = client
20
+ @token = Token.new(api_key, logger: logger, client: client)
21
+ end
22
+
23
+ attr_reader :client
24
+
25
+ # Send a HTTP request. Checks the validity of the response.
26
+ # @param verb [String] THe HTTP verb to use for this request.
27
+ # @param uri [String] The Full URL to send.
28
+ # @option opts [Hash] :params Parameters for URL encoding parameters.
29
+ # @option opts [Hash] :json Used when sending a hash as application/json content type.
30
+ # @option opts [Hash] :form Used when sending a hash as a form.
31
+ # @option opts [Hash] :headers Used to modify headers for request.
32
+ # @return [IBM::Cloud::SDK::VPC::Response] Wrapped response to query.
33
+ # @raise [IBM::Cloud::SDK::VPC::Exceptions::HttpStatusError] Response code is not either in 200-series or 404.
34
+ def adhoc(verb, uri, opts = {})
35
+ unverified_request(verb, uri, opts).raise_for_status?
36
+ end
37
+
38
+ # Send a HTTP request. Don't do any validation checks.
39
+ # @see :adhoc for options.
40
+ def unverified_request(verb, uri, opts = {})
41
+ response = @client.auth(@token.authorization_header).request(verb.to_s.downcase.to_sym, uri, opts)
42
+ Response.new(response)
43
+ end
44
+
45
+ # Get bearer token string for clients not using the adhoc method.
46
+ def authorization_header
47
+ @token.authorization_header
48
+ end
49
+ end
50
+
51
+ # The IAM token manager.
52
+ # @param api_key [String] The API Key to be used for this account.
53
+ # @param logger [Logger] An instantiated logger instance.
54
+ # @param client [HTTP::Client] An instantiated HTTP client.
55
+ class Token
56
+ def initialize(api_key, logger: nil, client: nil)
57
+ @api_key = api_key
58
+ @logger = logger
59
+ @client = client
60
+ @data = fetch
61
+ end
62
+
63
+ # Retrieve a new access_token from IAM.
64
+ # @return [IBM::Cloud::SDK::VPC::Response] Wrapped response to query.
65
+ # @raise [IBM::Cloud::SDK::VPC::Exceptions::HttpStatusError] Response code is not either in 200-series or 404.
66
+ def fetch
67
+ payload = {
68
+ form: {
69
+ grant_type: 'urn:ibm:params:oauth:grant-type:apikey',
70
+ apikey: @api_key
71
+ }
72
+ }
73
+ response = HTTP.post('https://iam.cloud.ibm.com/identity/token', payload)
74
+ @data = Response.new(response).raise_for_status?.json
75
+ end
76
+
77
+ # Check to see if the access_token is expired. Fetch a new token if none exists.
78
+ # @return [IBM::Cloud::SDK::VPC::Response] Wrapped response to query.
79
+ # @raise [IBM::Cloud::SDK::VPC::Exceptions::HttpStatusError] Response code is not either in 200-series or 404.
80
+ def expired?
81
+ fetch unless @data
82
+ @data.fetch(:expiration).to_i <= Time.now.to_i + 600
83
+ end
84
+
85
+ # Get a Bearer token string. Before returning check to see if token is expired.
86
+ # @return [String] The Bearer token header used in subsequent requests.
87
+ # @raise [IBM::Cloud::SDK::VPC::Exceptions::HttpStatusError] Response code is not either in 200-series or 404.
88
+ def authorization_header
89
+ fetch if expired?
90
+ "#{@data.fetch(:token_type)} #{@data.fetch(:access_token)}"
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,134 @@
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
+ # @param response [HTTP::Response] The HTTP response object.
12
+ class Response
13
+ def initialize(response)
14
+ @response = response
15
+ end
16
+
17
+ # The raw HTTP response.
18
+ # @return [HTTP::Response]
19
+ attr_reader :response
20
+
21
+ # Return the response in a hash or array.
22
+ # @return [Hash] When response is a hash.
23
+ # @return [Array] When response is an array.
24
+ # @raise [Exceptions::ExceptionWithResponse] Contents of body is not properly formatted json.
25
+ def json
26
+ JSON.parse(body, symbolize_names: true)
27
+ rescue StandardError
28
+ raise Exceptions::ExceptionWithResponse.new(self, "#{url} Error while parsing response body. #{response.body}")
29
+ end
30
+
31
+ # Return the raw response string.
32
+ # @return [String]
33
+ # @return [nil] Response does not have body method.
34
+ def body
35
+ response&.body.to_s
36
+ end
37
+
38
+ # Return the response code.
39
+ # @return [Integer] Response has code method.
40
+ # @return [nil] Response does not have code method.
41
+ def code
42
+ response&.code
43
+ end
44
+
45
+ alias status code
46
+
47
+ # Return the raw connection object.
48
+ # @return [HTTP::Connection]
49
+ # @return [nil] Response does not have a connection method.
50
+ def connection
51
+ response&.connection
52
+ end
53
+
54
+ # Chainable method to verify the status code. Raise an exception for non 200-series or 404 status codes.
55
+ # @return [Response] Allows for method to be chainable.
56
+ # @raise [Exceptions::HttpStatusError] Raise if status checks failed.
57
+ def raise_for_status?
58
+ return self if (200..299).include?(code)
59
+ return self if code == 404
60
+
61
+ raise Exceptions::HttpStatusError.new(self)
62
+ end
63
+
64
+ # Return the content type of the response.
65
+ # @return [String] The mimetype of the response.
66
+ # @return [nil] Response does not have response method that responds to mime_type.
67
+ def content_type
68
+ response&.response&.mime_type
69
+ end
70
+
71
+ # Return the textual reason.
72
+ # @return [String] HTTP Reason
73
+ # @return [nil] Response does not have reaspn method that responds.
74
+ def reason
75
+ response&.reason
76
+ end
77
+
78
+ # Return the sent url as a string.
79
+ # @return [String] Full URL sent
80
+ # @return [nil] Response does not have response method that responds to mime_type.
81
+ def url
82
+ response&.uri.to_s
83
+ end
84
+
85
+ # Return the sent url as a URI class.
86
+ # @see https://github.com/httprb/http/blob/master/lib/http/uri.rb URI Class doc.
87
+ # @return [HTTP::URI]
88
+ # @return [nil] Response does not have response method that responds to mime_type.
89
+ def uri
90
+ response&.uri
91
+ end
92
+
93
+ # Verify that the json response is a hash.
94
+ # @return [Hash] Response from JSON
95
+ # @raise [RuntimeError] JSON object is not a Hash.
96
+ def hash_response
97
+ check_object(Hash)
98
+ end
99
+
100
+ # Verify that the json response is an array.
101
+ # @return [Array] Response from JSON
102
+ # @raise [RuntimeError] JSON object is not a Array.
103
+ def array_response
104
+ check_object(Array)
105
+ end
106
+
107
+ # Find a subkey within the returned response.
108
+ # @param key [String] Name of a first level key.
109
+ # @return [Any] Response from JSON
110
+ # @raise [RuntimeError] JSON object is not a Array.
111
+ def subkey(key)
112
+ ret = hash_response
113
+ sym_key = key.to_sym
114
+ return ret.fetch(sym_key) if ret.key?(sym_key)
115
+
116
+ msg = "Key #{key} not found in #{ret}."
117
+ raise Exceptions::ExceptionWithResponse.new(self, msg)
118
+ end
119
+
120
+ # Check to see if the returned object is the expected object.
121
+ # @param obj [Object] The object to test the response against.
122
+ # @raise [Exceptions::ExceptionWithResponse] Parsed JSON is not the expecte class.
123
+ def check_object(obj)
124
+ ret = json
125
+ return ret if ret.instance_of?(obj)
126
+
127
+ msg = "Expected #{obj} in response for #{url}. The returned object is a #{ret.class}."
128
+ raise Exceptions::ExceptionWithResponse.new(self, msg)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ 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
@@ -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 all attached volumes.
10
+ class VolumeAttachments < BaseCollection
11
+ def initialize(parent)
12
+ super(parent, 'volume_attachments', child_class: VolumeAttachment)
13
+ end
14
+ end
15
+
16
+ # A single attached volume.
17
+ class VolumeAttachment < BaseInstance
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ 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 profiles.
9
+ class InstanceProfiles < BaseCollection
10
+ def initialize(parent)
11
+ super(parent, 'instance/profiles', child_class: Profile, array_key: 'profiles')
12
+ end
13
+ end
14
+
15
+ # Get a single profile.
16
+ class Profile < BaseInstance
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require_relative 'instance/actions'
5
+ require_relative 'instance/network_interfaces'
6
+ require_relative 'instance/volume_attachments'
7
+
8
+ module IBM
9
+ module Cloud
10
+ module SDK
11
+ # Work with VPC instances.
12
+ module VPC
13
+ # Work with multiple VM instances.
14
+ class Instances < BaseCollection
15
+ def initialize(parent)
16
+ super(parent, 'instances', child_class: Instance)
17
+ end
18
+
19
+ # A chainable method to set query filters on the collection.
20
+ # @example vpc.images.params(limit: 1).all
21
+ #
22
+ # @param start [String] A server-supplied token determining what resource to start the page on.
23
+ # @param limit [Integer] The number of resources to return on a page allowed values are between 1 and 100
24
+ # @param name [String] Filters the collection to resources with the exact specified name
25
+ # @param vpc_id [String] Filters the collection to resources in the VPC with the specified identifier
26
+ # @param vpc_crn [String] Filters the collection to resources in the VPC with the specified CRN
27
+ # @param vpc_name [String] Filters the collection to resources in the VPC with the exact specified name
28
+ # @return [BaseCollection] This class with the param instance variable set.
29
+ def params(start: nil, limit: nil, name: nil, vpc_id: nil, vpc_crn: nil, vpc_name: nil)
30
+ super(start: start, limit: limit)
31
+ @params['name'] = name if name
32
+ @params['vpc.id'] = vpc_id if vpc_id
33
+ @params['vpc.crn'] = vpc_crn if vpc_crn
34
+ @params['vpc.name'] = vpc_name if vpc_name
35
+ self
36
+ end
37
+ end
38
+
39
+ # Work with a single instance.
40
+ class Instance < BaseInstance
41
+ def actions
42
+ INSTANCE::Actions.new(self)
43
+ end
44
+
45
+ def network_interfaces
46
+ INSTANCE::NetworkInterfaces.new(self)
47
+ end
48
+
49
+ def volume_attachments
50
+ INSTANCE::VolumeAttachments.new(self)
51
+ end
52
+
53
+ def profiles
54
+ INSTANCE::Profiles.new(self)
55
+ end
56
+
57
+ def initialization
58
+ adhoc(method: 'get', path: 'initialization').json
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end