bmc-sdk-development 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/lib/bmc-sdk.rb +73 -0
  3. data/lib/commands.rb +283 -0
  4. data/lib/dtos.rb +108 -0
  5. metadata +87 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a9b8172a7e9be24285622b8edf0742b17dcb265cf03dbc6e51e1c70882458a73
4
+ data.tar.gz: a2d67cf55a12e57787e77a04d20fcbeffa565ea12b2f3f88a1c5eed5dd6ff4b8
5
+ SHA512:
6
+ metadata.gz: 2750dd847b8c823b51e52920672569b07fb74bb80c1c3e65de55b1aa8b00a32070e56252597e2e29c2acaedba529cb3a1d0a09380dbbd6fe157dfaa2d8b1d61a
7
+ data.tar.gz: 484864ec591398198d1b3ee2816ce4587f1ff18fd530a67202b09b747ad87981dcd9cb4a08523919ca9e8f2ec73db46caa9cb8777667b82bc2630ed9f52c0615
data/lib/bmc-sdk.rb ADDED
@@ -0,0 +1,73 @@
1
+ require 'os'
2
+ require 'oauth2'
3
+ require 'yaml'
4
+
5
+ module Bmc
6
+ end
7
+
8
+ ##
9
+ # This module provides commands and DTOs for working with the BMC API documented at https://developers.phoenixnap.com/docs/bmc/1/overview.
10
+ # Module functions provided here which load configuration assume that client credentials are located in a YAML file at $HOME/.pnap/config.
11
+ #
12
+
13
+ module Bmc::Sdk
14
+
15
+ ##
16
+ # The API entrypoint URL.
17
+ Entrypoint = "https://api-dev.phoenixnap.com/bmc/v1/"
18
+
19
+ ##
20
+ # The OIDC token URL
21
+ TokenURL = "https://auth-dev.phoenixnap.com/auth/realms/BMC/protocol/openid-connect/token"
22
+
23
+ ##
24
+ # The default configuration file location on POSIX systems
25
+ POSIXPath = "/.pnap/config"
26
+
27
+ ##
28
+ # The default configuration file location on Windows systems
29
+ WindowsPath = '\\AppData\\Roaming\\pnap\\config'
30
+
31
+ ##
32
+ # The computed configuration file location based on the current system
33
+ ConfigPath = OS.windows? ? Dir.home + WindowsPath : Dir.home + POSIXPath
34
+
35
+ require 'commands.rb'
36
+ require 'dtos.rb'
37
+
38
+ ##
39
+ # This function creates a new HTTP client with integrated OAuth2 with the provided configuration.
40
+ #
41
+
42
+ def new_client(config)
43
+ cfg = config.dup
44
+ client = OAuth2::Client.new(
45
+ cfg[:client_id],
46
+ cfg[:client_secret],
47
+ token_url: TokenURL)
48
+ return client.client_credentials.get_token
49
+ end
50
+ module_function :new_client
51
+
52
+ ##
53
+ # load_client is a shortcut function which loads configuration from the expected location and uses that configuration to produce a new client.
54
+ #
55
+
56
+ def load_client
57
+ cfg = load_config
58
+ return new_client({
59
+ client_id: cfg['client_id'],
60
+ client_secret: cfg['client_secret']
61
+ })
62
+ end
63
+ module_function :load_client
64
+
65
+ ##
66
+ # load_config loads a YAML file from the expected file path.
67
+
68
+ def load_config
69
+ return YAML.load_file(ConfigPath)
70
+ end
71
+ module_function :load_config
72
+
73
+ end
data/lib/commands.rb ADDED
@@ -0,0 +1,283 @@
1
+ require 'json'
2
+
3
+ module Bmc::Sdk
4
+
5
+ ##
6
+ # CreateServer command create (request) a new server for account. Server DNS will be configured to access Google's public DNS at 8.8.8.8.
7
+ #
8
+
9
+ class CreateServer
10
+ attr_accessor :server
11
+
12
+ # server is a ProvisionedServer
13
+ def initialize(client, server)
14
+ @client = client
15
+ @server = server
16
+ end
17
+
18
+ def execute
19
+ return @client.post(
20
+ "#{Entrypoint}servers",
21
+ headers: {'Content-Type': 'application/json'},
22
+ body: @server.to_json)
23
+ end
24
+ end
25
+
26
+ ##
27
+ # DeleteServer command will deprovision specific server with the given server ID.
28
+ #
29
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/delete
30
+
31
+ class DeleteServer
32
+ attr_accessor :serverID
33
+
34
+ def initialize(client, serverID)
35
+ @client = client
36
+ @serverID = serverID
37
+ end
38
+
39
+ def execute
40
+ return @client.delete(
41
+ "#{Entrypoint}servers/#{serverID}",
42
+ headers: {'Content-Type': 'application/json'})
43
+ end
44
+ end
45
+
46
+ ##
47
+ # GetServer command will get server properties for a given server ID.
48
+ #
49
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/get
50
+
51
+ class GetServer
52
+ attr_accessor :serverID
53
+
54
+ def initialize(client, serverID)
55
+ @client = client
56
+ @serverID = serverID
57
+ end
58
+
59
+ def execute
60
+ return @client.get(
61
+ "#{Entrypoint}servers/#{serverID}",
62
+ headers: {'Content-Type': 'application/json'})
63
+ end
64
+ end
65
+
66
+ ##
67
+ # GetServers command will get server properties for all servers in an account.
68
+ #
69
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/get
70
+
71
+ class GetServers
72
+ def initialize(client)
73
+ @client = client
74
+ end
75
+
76
+ def execute
77
+ return @client.get(
78
+ "#{Entrypoint}servers",
79
+ headers: {'Content-Type': 'application/json'})
80
+ end
81
+ end
82
+
83
+ ##
84
+ # PowerOff command will power off a specific server.
85
+ #
86
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/actions/power-off/post
87
+
88
+ class PowerOff
89
+ attr_accessor :serverID
90
+
91
+ def initialize(client, serverID)
92
+ @client = client
93
+ @serverID = serverID
94
+ end
95
+
96
+ def execute
97
+ return @client.post(
98
+ "#{Entrypoint}servers/#{serverID}/actions/power-off",
99
+ headers: {'Content-Type': 'application/json'})
100
+ end
101
+ end
102
+
103
+ ##
104
+ # PowerOn command will power on a specific server.
105
+ #
106
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/actions/power-on/post
107
+
108
+ class PowerOn
109
+ attr_accessor :serverID
110
+
111
+ def initialize(client, serverID)
112
+ @client = client
113
+ @serverID = serverID
114
+ end
115
+
116
+ def execute
117
+ return @client.post(
118
+ "#{Entrypoint}servers/#{serverID}/actions/power-on",
119
+ headers: {'Content-Type': 'application/json'})
120
+ end
121
+ end
122
+
123
+ ##
124
+ # Reboot command will reboot a specific server.
125
+ #
126
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/actions/reboot/post
127
+
128
+ class Reboot
129
+ attr_accessor :serverID
130
+
131
+ def initialize(client, serverID)
132
+ @client = client
133
+ @serverID = serverID
134
+ end
135
+
136
+ def execute
137
+ return @client.post(
138
+ "#{Entrypoint}servers/#{serverID}/actions/reboot",
139
+ headers: {'Content-Type': 'application/json'})
140
+ end
141
+ end
142
+
143
+ ##
144
+ # Reset command will reset the configuration for a specific server.
145
+ #
146
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/actions/reset/post
147
+
148
+ class Reset
149
+ attr_accessor :server
150
+
151
+ # server is a ProvisionedServer
152
+ def initialize(client, server)
153
+ @client = client
154
+ @server = server
155
+ end
156
+
157
+ def execute
158
+ return @client.post(
159
+ "#{Entrypoint}servers/#{@server.id}/actions/reset",
160
+ headers: {'Content-Type': 'application/json'},
161
+ body: @server.to_json)
162
+ end
163
+ end
164
+
165
+ ##
166
+ # Shutdown command will shutdown a specific server
167
+ #
168
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/servers/%7Bserver_id%7D/actions/shutdown/post
169
+
170
+ class Shutdown
171
+ attr_accessor :serverID
172
+
173
+ def initialize(client, serverID)
174
+ @client = client
175
+ @serverID = serverID
176
+ end
177
+
178
+ def execute
179
+ return @client.post(
180
+ "#{Entrypoint}servers/#{serverID}/actions/shutdown",
181
+ headers: {'Content-Type': 'application/json'})
182
+ end
183
+ end
184
+
185
+ ##
186
+ # GetSSHKeys command will list all SSH keys associated with an account
187
+ #
188
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/ssh-keys/get
189
+
190
+ class GetSSHKeys
191
+ def initialize(client)
192
+ @client = client
193
+ end
194
+
195
+ def execute
196
+ return @client.get(
197
+ "#{Entrypoint}ssh-keys",
198
+ headers: {'Content-Type': 'application/json'})
199
+ end
200
+ end
201
+
202
+ ##
203
+ # CreateSSHKey command will create a new SSH key with the provided properties.
204
+ #
205
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/ssh-keys/post
206
+
207
+ class CreateSSHKey
208
+ attr_accessor :sshKey
209
+
210
+ def initialize(client, sshKey)
211
+ @client = client
212
+ @sshKey = sshKey
213
+ end
214
+
215
+ def execute
216
+ return @client.post(
217
+ "#{Entrypoint}ssh-keys",
218
+ headers: {'Content-Type': 'application/json'},
219
+ body: @sshKey.to_json)
220
+ end
221
+ end
222
+
223
+ ##
224
+ # DeleteSSHKey command will delete the SSH key with the specified ID.
225
+ #
226
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/ssh-keys/%7Bssh_key_id%7D/delete
227
+
228
+ class DeleteSSHKey
229
+ attr_accessor :sshKeyID
230
+
231
+ def initialize(client, sshKeyID)
232
+ @client = client
233
+ @sshKeyID = sshKeyID
234
+ end
235
+
236
+ def execute
237
+ return @client.delete(
238
+ "#{Entrypoint}ssh-keys/#{sshKeyID}",
239
+ headers: {'Content-Type': 'application/json'})
240
+ end
241
+ end
242
+
243
+ ##
244
+ # GetSSHKey command will retrieve the SSH key with the specified ID.
245
+ #
246
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/ssh-keys/%7Bssh_key_id%7D/get
247
+
248
+ class GetSSHKey
249
+ attr_accessor :sshKeyID
250
+
251
+ def initialize(client, sshKeyID)
252
+ @client = client
253
+ @sshKeyID = sshKeyID
254
+ end
255
+
256
+ def execute
257
+ return @client.get(
258
+ "#{Entrypoint}ssh-keys/#{sshKeyID}",
259
+ headers: {'Content-Type': 'application/json'})
260
+ end
261
+ end
262
+
263
+ ##
264
+ # GetSSHKey command will update the SSH key with the specified ID.
265
+ #
266
+ # @see https://developers.phoenixnap.com/docs/bmc/1/routes/ssh-keys/%7Bssh_key_id%7D/put
267
+
268
+ class EditSSHKey
269
+ attr_accessor :sshKey
270
+
271
+ def initialize(client, sshKey)
272
+ @client = client
273
+ @sshKey = sshKey
274
+ end
275
+
276
+ def execute
277
+ return @client.put(
278
+ "#{Entrypoint}ssh-keys/#{@sshKey.id}",
279
+ headers: {'Content-Type': 'application/json'},
280
+ body: @sshKey.to_json)
281
+ end
282
+ end
283
+ end
data/lib/dtos.rb ADDED
@@ -0,0 +1,108 @@
1
+ module Bmc::Sdk
2
+
3
+ ##
4
+ # ErrorMessage is used to transmit details on error responses.
5
+ #
6
+ # @see https://developers.phoenixnap.com/docs/bmc/1/types/Error
7
+
8
+ class ErrorMessage
9
+ attr_accessor :message, :validationErrors
10
+ def initialize(message, validationErrors)
11
+ @message = message
12
+ @validationErrors = validationErrors
13
+ end
14
+ def to_json(*a)
15
+ {message: @message, validationErrors: @validationErrors}.to_json(*a)
16
+ end
17
+ end
18
+
19
+ ##
20
+ # LongServer is used to transmit details on fully specified server responses.
21
+ #
22
+ # @see https://developers.phoenixnap.com/docs/bmc/1/types/Server
23
+
24
+ class LongServer
25
+ attr_accessor :id, :status, :hostname, :description, :privateIPAddresses, :publicIPAddresses, :os, :type, :location, :cpu, :ram, :storage
26
+ def initialize(id, status, hostname, description, privateIPAddresses, publicIPAddresses, os, type, location, cpu, ram, storage)
27
+ @id = id
28
+ @status = status
29
+ @hostname = hostname
30
+ @description = description
31
+ @privateIPAddresses = privateIPAddresses
32
+ @publicIPAddresses = publicIPAddresses
33
+ @os = os
34
+ @type = type
35
+ @location = location
36
+ @cpu = cpu
37
+ @ram = ram
38
+ @storage = storage
39
+ end
40
+ def to_json(*a)
41
+ {id: @id, status: @status, hostname: @hostname, description: @description, privateIpAddresses: @privateIPAddresses,
42
+ publicIPAddresses: @publicIpAddresses, os: @os, type: @type, location: @location, cpu: @cpu, ram: @ram,
43
+ storage: @storage }.to_json(*a)
44
+ end
45
+ end
46
+
47
+ ##
48
+ # ProvisionedServer is used to transmit details on CreateServer commands.
49
+ #
50
+ # @see https://developers.phoenixnap.com/docs/bmc/1/types/ServerCreate
51
+
52
+ class ProvisionedServer
53
+ attr_accessor :id, :status, :hostname, :description, :os, :type, :location, :sshKeys, :sshKeyIds
54
+ def initialize(id, status, hostname, description, os, type, location, sshKeys, sshKeyIds)
55
+ @id = id
56
+ @status = status
57
+ @hostname = hostname
58
+ @description = description
59
+ @os = os
60
+ @type = type
61
+ @location = location
62
+ @sshKeys = sshKeys
63
+ @sshKeyIds = sshKeyIds
64
+ end
65
+ def to_json(*a)
66
+ {id: @id, status: @status, hostname: @hostname, description: @description, os: @os, type: @type, location: @location, sshKeys: @sshKeys, sshKeyIds: @sshKeyIds}.to_json(*a)
67
+ end
68
+ end
69
+
70
+ ##
71
+ # ServerResetSpec is used to transmit details on ServerReset commands.
72
+ #
73
+ # @see https://developers.phoenixnap.com/docs/bmc/1/types/ServerReset
74
+
75
+ class ServerResetSpec
76
+ attr_accessor :id, :sshKeys, :sshKeyIds, :installDefaultSshKeys
77
+ def initialize(id, sshKeys, sshKeyIds, installDefaultSshKeys)
78
+ @id = id
79
+ @sshKeys = sshKeys
80
+ @sshKeyIds = sshKeyIds
81
+ @installDefaultSshKeys = installDefaultSshKeys
82
+ end
83
+ def to_json(*a)
84
+ {id: @id, status: @status, sshKeys: @sshKeys, sshKeyIds: @sshKeyIds, installDefaultSshKeys: @installDefaultSshKeys}.to_json(*a)
85
+ end
86
+ end
87
+
88
+ ##
89
+ # SSHKeySpec is used to transmit details for BMC SSH Key objects.
90
+ #
91
+ # @see https://developers.phoenixnap.com/docs/bmc/1/types/SshKey
92
+
93
+ class SSHKeySpec
94
+ attr_accessor :id, :default, :name, :key, :fingerprint, :createdOn, :lastUpdatedOn
95
+ def initialize(id, default, name, key, fingerprint, createdOn, lastUpdatedOn)
96
+ @id = id
97
+ @default = default
98
+ @name = name
99
+ @key = key
100
+ @fingerprint = fingerprint
101
+ @createdOn = createdOn
102
+ @lastUpdatedOn = lastUpdatedOn
103
+ end
104
+ def to_json(*a)
105
+ {id: @id, default: @default, name: @name, key: @key, fingerprint: @fingerprint, createdOn: @createdOn, lastUpdatedOn: @lastUpdatedOn}.to_json(*a)
106
+ end
107
+ end
108
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bmc-sdk-development
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - PhoenixNAP
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: os
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: oauth2
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.4
55
+ description: An SDK for interacting with the BMC API. See https://developers.phoenixnap.com/docs/bmc/1/overview
56
+ email: support@phoenixnap.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/bmc-sdk.rb
62
+ - lib/commands.rb
63
+ - lib/dtos.rb
64
+ homepage: https://github.com/phoenixnap/bmc-sdk-ruby
65
+ licenses:
66
+ - MPL-2.0
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubygems_version: 3.2.3
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: An SDK for interacting with the BMC API.
87
+ test_files: []