ibm-cloud-sdk 0.1.6 → 0.1.11

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -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 +117 -9
  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 +28 -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 +77 -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 +3 -3
  27. data/lib/ibm/cloud/sdk/vpc/instance/volume_attachments.rb +3 -3
  28. data/lib/ibm/cloud/sdk/vpc/instance_profiles.rb +3 -3
  29. data/lib/ibm/cloud/sdk/vpc/instances.rb +99 -6
  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 +3 -3
  50. data/lib/ibm/cloud/sdk/vpc/vpn_gateway/peer_cidrs.rb +3 -3
  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 +120 -0
  55. data/lib/ibm/cloud/sdk_http/base_instance.rb +55 -0
  56. data/lib/ibm/cloud/sdk_http/connection.rb +38 -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 -10
  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
@@ -5,16 +5,16 @@ module IBM
5
5
  module Cloud
6
6
  module SDK
7
7
  module VPC
8
- module INSTANCES
8
+ module INSTANCE
9
9
  # Get a Floating IP.
10
- class FloatingIps < BaseCollection
10
+ class FloatingIps < VPCCollection
11
11
  def initialize(parent)
12
12
  super(parent, 'floating_ips', child_class: FloatingIp)
13
13
  end
14
14
  end
15
15
 
16
16
  # Get a single floating IP.
17
- class FloatingIp < BaseInstance
17
+ class FloatingIp < VPCInstance
18
18
  end
19
19
  end
20
20
  end
@@ -7,16 +7,16 @@ module IBM
7
7
  module Cloud
8
8
  module SDK
9
9
  module VPC
10
- module INSTANCES
10
+ module INSTANCE
11
11
  # All netowrk interfaces.
12
- class NetworkInterfaces < BaseCollection
12
+ class NetworkInterfaces < VPCCollection
13
13
  def initialize(parent)
14
14
  super(parent, 'network_interfaces', child_class: NetworkInterface)
15
15
  end
16
16
  end
17
17
 
18
18
  # A single network insterface.
19
- class NetworkInterface < BaseInstance
19
+ class NetworkInterface < VPCInstance
20
20
  def floating_ips
21
21
  FloatingIps.new(self)
22
22
  end
@@ -5,16 +5,16 @@ module IBM
5
5
  module Cloud
6
6
  module SDK
7
7
  module VPC
8
- module INSTANCES
8
+ module INSTANCE
9
9
  # Get all attached volumes.
10
- class VolumeAttachments < BaseCollection
10
+ class VolumeAttachments < VPCCollection
11
11
  def initialize(parent)
12
12
  super(parent, 'volume_attachments', child_class: VolumeAttachment)
13
13
  end
14
14
  end
15
15
 
16
16
  # A single attached volume.
17
- class VolumeAttachment < BaseInstance
17
+ class VolumeAttachment < VPCInstance
18
18
  end
19
19
  end
20
20
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # Work with multiple profiles.
9
- class InstanceProfiles < BaseCollection
9
+ class InstanceProfiles < VPCCollection
10
10
  def initialize(parent)
11
- super(parent, 'instance/profiles', child_class: Profile, array_key: 'profiles')
11
+ super(parent, 'instance/profiles', child_class: InstanceProfile, array_key: 'profiles')
12
12
  end
13
13
  end
14
14
 
15
15
  # Get a single profile.
16
- class Profile < BaseInstance
16
+ class InstanceProfile < VPCInstance
17
17
  end
18
18
  end
19
19
  end
@@ -11,7 +11,7 @@ module IBM
11
11
  # Work with VPC instances.
12
12
  module VPC
13
13
  # Work with multiple VM instances.
14
- class Instances < BaseCollection
14
+ class Instances < VPCCollection
15
15
  def initialize(parent)
16
16
  super(parent, 'instances', child_class: Instance)
17
17
  end
@@ -37,26 +37,119 @@ module IBM
37
37
  end
38
38
 
39
39
  # Work with a single instance.
40
- class Instance < BaseInstance
40
+ class Instance < VPCInstance
41
+ TRANSITIONAL_STATES = %w[pausing pending restarting resuming starting stopping].freeze
42
+ ERROR_STATE = 'failed'
43
+ RUNNING_STATE = 'running'
44
+ STOPPED_STATES = %w[stopped paused].freeze
45
+
46
+ # The id of this VM.
47
+ def id
48
+ @data[:id]
49
+ end
50
+
51
+ # The name of this VM.
52
+ def name
53
+ @data[:name]
54
+ end
55
+
56
+ # The status of the virtual server instance. Possible values: [failed,paused,pausing,pending,restarting,resuming,running,starting,stopped,stopping]
57
+ def status
58
+ @data[:status]
59
+ end
60
+
61
+ # Whether the state of the VM is in failed state.
62
+ # @return [Boolean]
63
+ def failed?
64
+ status == ERROR_STATE
65
+ end
66
+
67
+ # Whether the state of the VM is in the started state.
68
+ # @return [Boolean]
69
+ def started?
70
+ status == RUNNING_STATE
71
+ end
72
+
73
+ # Whether the state of the VM is in a stopped or paused state.
74
+ # @return [Boolean]
75
+ def stopped?
76
+ STOPPED_STATES.include?(status)
77
+ end
78
+
79
+ # Whether the state of the VM is in a transitional state.
80
+ # @return [Boolean]
81
+ def transitional?
82
+ TRANSITIONAL_STATES.include?(status)
83
+ end
84
+
85
+ # Interact with instance actions.
86
+ # @return [INSTANCE::Actions]
41
87
  def actions
42
88
  INSTANCE::Actions.new(self)
43
89
  end
44
90
 
91
+ # Interact with instance network interfaces.
92
+ # @return [INSTANCE::NetworkInterfaces]
45
93
  def network_interfaces
46
94
  INSTANCE::NetworkInterfaces.new(self)
47
95
  end
48
96
 
97
+ # Interact with instance volume attachements.
98
+ # @return [INSTANCE::VolumeAttachments]
49
99
  def volume_attachments
50
100
  INSTANCE::VolumeAttachments.new(self)
51
101
  end
52
102
 
53
- def profiles
54
- INSTANCE::Profiles.new(self)
55
- end
56
-
103
+ # Return the data used for initializing this VM.
57
104
  def initialization
58
105
  adhoc(method: 'get', path: 'initialization').json
59
106
  end
107
+
108
+ # Wait for the VM instance to be in a stable state.
109
+ # @param sleep_time [Integer] The time to sleep between refreshes.
110
+ # @param timeout [Integer] The number of seconds before raising an error.
111
+ # @param block [Proc] A block to test against. Must return a boolean.
112
+ # @raise [RuntimeError] Instance goes into failed state.
113
+ # @raise [RuntimeError] Timeout has been reached.
114
+ def wait_for!(sleep_time: 5, timeout: 600, &block)
115
+ @logger.info("Starting wait for instance #{id}. Starts in state #{status}.")
116
+ loop do
117
+ refresh
118
+ raise "VM #{id} is in a failed state." if failed?
119
+ break if block.call(self)
120
+
121
+ timeout = sleep_counter(sleep_time, timeout)
122
+ raise "Time out while waiting #{id} to be stable." if timeout <= 0
123
+ end
124
+ @logger.info("Finished wait for instance #{id}. Ends in state #{status}.")
125
+ end
126
+
127
+ # Wait for the VM instance to be have a started status.
128
+ # @param sleep_time [Integer] The time to sleep between refreshes.
129
+ # @param timeout [Integer] The number of seconds before raising an error.
130
+ # @raise [RuntimeError] Instance goes into failed state.
131
+ # @raise [RuntimeError] Timeout has been reached.
132
+ def wait_for_started!(sleep_time: 5, timeout: 600)
133
+ wait_for!(sleep_time: sleep_time, timeout: timeout, &:started?)
134
+ end
135
+
136
+ # Wait for the VM instance to be have a stopped status.
137
+ # @param sleep_time [Integer] The time to sleep between refreshes.
138
+ # @param timeout [Integer] The number of seconds before raising an error.
139
+ # @raise [RuntimeError] Instance goes into failed state.
140
+ # @raise [RuntimeError] Timeout has been reached.
141
+ def wait_for_stopped!(sleep_time: 5, timeout: 600)
142
+ wait_for!(sleep_time: sleep_time, timeout: timeout, &:stopped?)
143
+ end
144
+
145
+ private
146
+
147
+ # Sleep for the specificed time and decrement timout by that number.
148
+ # @return [Integer] The current timeout.
149
+ def sleep_counter(sleep_time, timeout)
150
+ sleep sleep_time
151
+ timeout - sleep_time
152
+ end
60
153
  end
61
154
  end
62
155
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of IPSecPolicy
9
- class IPSecPolicies < BaseCollection
9
+ class IPSecPolicies < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'ike_policies', child_class: IPSecPolicy)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single IPSecPolicy
16
- class IPSecPolicy < BaseInstance
16
+ class IPSecPolicy < VPCInstance
17
17
  def connections
18
18
  get('connections')
19
19
  end
@@ -6,36 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A collection of SSH keys.
9
- class Keys < BaseCollection
9
+ class Keys < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'keys', child_class: Key)
12
12
  end
13
-
14
- def fetch(resource_id: nil)
15
- params = {}
16
- params['resource_group.id'] = resource_id if resource_id
17
- get(params: params)
18
- end
19
-
20
- def all(resource_id = nil)
21
- fetch(resource_id: resource_id).subkey(@array_key)
22
- end
23
-
24
- # :reek:FeatureEnvy
25
- def create(name, public_key, resource_group: nil, type: nil)
26
- payload = { name: name, public_key: public_key }
27
- payload[:resource_group] = resource_group if resource_group
28
- payload[:type] = type if type
29
- post(payload)
30
- end
31
-
32
- def key(id)
33
- Key.new(self, id)
34
- end
35
13
  end
36
14
 
37
15
  # A single key.
38
- class Key < BaseInstance
16
+ class Key < VPCInstance
39
17
  end
40
18
  end
41
19
  end
@@ -8,7 +8,7 @@ module IBM
8
8
  module SDK
9
9
  module VPC
10
10
  # A single LoadBalancer
11
- class LoadBalancer < BaseInstance
11
+ class LoadBalancer < VPCInstance
12
12
  def statistics
13
13
  get('statistics')
14
14
  end
@@ -9,7 +9,7 @@ module IBM
9
9
  module VPC
10
10
  module LOADBALANCER
11
11
  # A list of Listener
12
- class Listeners < BaseCollection
12
+ class Listeners < VPCCollection
13
13
  def initialize(parent)
14
14
  @array_key = 'listeners'
15
15
  @instance = Listener
@@ -18,7 +18,7 @@ module IBM
18
18
  end
19
19
 
20
20
  # A single Listener
21
- class Listener < BaseInstance
21
+ class Listener < VPCInstance
22
22
  def policies
23
23
  LOADBALANCER::Policies.new(self)
24
24
  end
@@ -6,7 +6,7 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of Member
9
- class Members < BaseCollection
9
+ class Members < VPCCollection
10
10
  def initialize(parent)
11
11
  @array_key = 'members'
12
12
  @instance = Member
@@ -15,7 +15,7 @@ module IBM
15
15
  end
16
16
 
17
17
  # A single Member
18
- class Member < BaseInstance
18
+ class Member < VPCInstance
19
19
  end
20
20
  end
21
21
  end
@@ -9,7 +9,7 @@ module IBM
9
9
  module VPC
10
10
  module LOADBALANCER
11
11
  # A list of Policies
12
- class Policies < BaseCollection
12
+ class Policies < VPCCollection
13
13
  def initialize(parent)
14
14
  @array_key = 'policies'
15
15
  @instance = Policy
@@ -18,7 +18,7 @@ module IBM
18
18
  end
19
19
 
20
20
  # A single Policy
21
- class Policy < BaseInstance
21
+ class Policy < VPCInstance
22
22
  def rules
23
23
  Rules.new(self)
24
24
  end
@@ -8,7 +8,7 @@ module IBM
8
8
  module SDK
9
9
  module VPC
10
10
  # A list of Pool
11
- class Pools < BaseCollection
11
+ class Pools < VPCCollection
12
12
  def initialize(parent)
13
13
  @array_key = 'pools'
14
14
  @instance = Pool
@@ -17,7 +17,7 @@ module IBM
17
17
  end
18
18
 
19
19
  # A single Pool
20
- class Pool < BaseInstance
20
+ class Pool < VPCInstance
21
21
  def members
22
22
  Members.new(self)
23
23
  end
@@ -7,7 +7,7 @@ module IBM
7
7
  module VPC
8
8
  module LOADBALANCER
9
9
  # A list of Rule
10
- class Rules < BaseCollection
10
+ class Rules < VPCCollection
11
11
  def initialize(parent)
12
12
  @array_key = 'rules'
13
13
  @instance = Rule
@@ -16,7 +16,7 @@ module IBM
16
16
  end
17
17
 
18
18
  # A single Rule
19
- class Rule < BaseInstance
19
+ class Rule < VPCInstance
20
20
  end
21
21
  end
22
22
  end
@@ -8,7 +8,7 @@ module IBM
8
8
  module SDK
9
9
  module VPC
10
10
  # A list of LoadBalancer
11
- class LoadBalancers < BaseCollection
11
+ class LoadBalancers < VPCCollection
12
12
  def initialize(parent)
13
13
  super(parent, 'load_balancers', child_class: LoadBalancer)
14
14
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of NetworkACL
9
- class NetworkACLs < BaseCollection
9
+ class NetworkACLs < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'network_acls', child_class: NetworkACL)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single NetworkACL
16
- class NetworkACL < BaseInstance
16
+ class NetworkACL < VPCInstance
17
17
  def rules
18
18
  NETWORKACL::Rules.new(self)
19
19
  end
@@ -21,7 +21,7 @@ module IBM
21
21
 
22
22
  module NETWORKACL
23
23
  # A list of NetworkACL
24
- class Rules < BaseCollection
24
+ class Rules < VPCCollection
25
25
  def initialize(parent)
26
26
  @array_key = 'network_acls'
27
27
  @instance = NetworkACL
@@ -30,7 +30,7 @@ module IBM
30
30
  end
31
31
 
32
32
  # A single NetworkACL
33
- class Rule < BaseInstance
33
+ class Rule < VPCInstance
34
34
  end
35
35
  end
36
36
  end
@@ -6,14 +6,14 @@ module IBM
6
6
  module SDK
7
7
  module VPC
8
8
  # A list of OperatingSystem
9
- class OperatingSystems < BaseCollection
9
+ class OperatingSystems < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'operating_systems', child_class: OperatingSystem)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single OperatingSystem
16
- class OperatingSystem < BaseInstance
16
+ class OperatingSystem < 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 PublicGateway
9
- class PublicGateways < BaseCollection
9
+ class PublicGateways < VPCCollection
10
10
  def initialize(parent)
11
11
  super(parent, 'public_gateways', child_class: PublicGateway)
12
12
  end
13
13
  end
14
14
 
15
15
  # A single PublicGateway
16
- class PublicGateway < BaseInstance
16
+ class PublicGateway < VPCInstance
17
17
  end
18
18
  end
19
19
  end