fog-brightbox 1.5.0 → 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -0
- data/lib/fog/brightbox/compute/shared.rb +26 -10
- data/lib/fog/brightbox/compute.rb +11 -0
- data/lib/fog/brightbox/config.rb +12 -0
- data/lib/fog/brightbox/models/compute/account.rb +30 -18
- data/lib/fog/brightbox/models/compute/api_client.rb +10 -2
- data/lib/fog/brightbox/models/compute/application.rb +8 -0
- data/lib/fog/brightbox/models/compute/cloud_ip.rb +11 -11
- data/lib/fog/brightbox/models/compute/collaboration.rb +11 -0
- data/lib/fog/brightbox/models/compute/config_map.rb +14 -0
- data/lib/fog/brightbox/models/compute/config_maps.rb +22 -0
- data/lib/fog/brightbox/models/compute/database_server.rb +19 -15
- data/lib/fog/brightbox/models/compute/database_snapshot.rb +13 -6
- data/lib/fog/brightbox/models/compute/database_type.rb +6 -3
- data/lib/fog/brightbox/models/compute/event.rb +5 -4
- data/lib/fog/brightbox/models/compute/firewall_policy.rb +10 -4
- data/lib/fog/brightbox/models/compute/firewall_rule.rb +9 -6
- data/lib/fog/brightbox/models/compute/flavor.rb +3 -3
- data/lib/fog/brightbox/models/compute/image.rb +16 -14
- data/lib/fog/brightbox/models/compute/load_balancer.rb +12 -8
- data/lib/fog/brightbox/models/compute/server.rb +19 -17
- data/lib/fog/brightbox/models/compute/server_group.rb +13 -5
- data/lib/fog/brightbox/models/compute/user.rb +9 -4
- data/lib/fog/brightbox/models/compute/user_collaboration.rb +11 -0
- data/lib/fog/brightbox/models/compute/volume.rb +15 -14
- data/lib/fog/brightbox/models/compute/zone.rb +3 -4
- data/lib/fog/brightbox/models/storage/directory.rb +2 -2
- data/lib/fog/brightbox/oauth2.rb +47 -7
- data/lib/fog/brightbox/requests/compute/create_config_map.rb +22 -0
- data/lib/fog/brightbox/requests/compute/delete_config_map.rb +20 -0
- data/lib/fog/brightbox/requests/compute/get_config_map.rb +18 -0
- data/lib/fog/brightbox/requests/compute/list_config_maps.rb +18 -0
- data/lib/fog/brightbox/requests/compute/update_config_map.rb +22 -0
- data/lib/fog/brightbox/version.rb +1 -1
- data/spec/fog/brightbox/compute/credentials_spec.rb +41 -0
- data/spec/fog/brightbox/compute/get_access_token_spec.rb +305 -0
- data/spec/fog/brightbox/compute/two_factor_spec.rb +53 -0
- data/spec/fog/brightbox/oauth2/user_credentials_strategy_spec.rb +20 -0
- metadata +14 -1
@@ -5,32 +5,34 @@ module Fog
|
|
5
5
|
include Fog::Brightbox::Compute::ResourceLocking
|
6
6
|
|
7
7
|
identity :id
|
8
|
-
attribute :url
|
9
8
|
attribute :resource_type
|
9
|
+
attribute :url
|
10
10
|
|
11
11
|
attribute :name
|
12
|
-
attribute :username
|
13
12
|
attribute :status
|
14
13
|
attribute :description
|
15
14
|
|
16
|
-
attribute :source
|
17
|
-
attribute :source_type
|
18
15
|
attribute :arch
|
19
|
-
attribute :
|
20
|
-
attribute :disk_size
|
16
|
+
attribute :disk_size, type: :integer
|
21
17
|
attribute :licence_name
|
18
|
+
attribute :min_ram, type: :integer
|
19
|
+
attribute :source
|
20
|
+
attribute :source_trigger
|
21
|
+
attribute :source_type
|
22
|
+
attribute :username
|
23
|
+
attribute :virtual_size, type: :integer
|
22
24
|
|
23
25
|
# Boolean flags
|
24
|
-
attribute :
|
25
|
-
attribute :official
|
26
|
-
attribute :
|
26
|
+
attribute :compatibility_mode, type: :boolean
|
27
|
+
attribute :official, type: :boolean
|
28
|
+
attribute :public, type: :boolean
|
27
29
|
|
28
|
-
#
|
29
|
-
attribute :created_at, :
|
30
|
+
# Timestamps
|
31
|
+
attribute :created_at, type: :time
|
30
32
|
|
31
|
-
# Links
|
32
|
-
attribute :ancestor_id, :
|
33
|
-
attribute :owner_id, :
|
33
|
+
# Links
|
34
|
+
attribute :ancestor_id, aliases: "ancestor", squash: "id"
|
35
|
+
attribute :owner_id, aliases: "owner", squash: "id"
|
34
36
|
|
35
37
|
def ready?
|
36
38
|
status == "available"
|
@@ -5,13 +5,13 @@ module Fog
|
|
5
5
|
include Fog::Brightbox::Compute::ResourceLocking
|
6
6
|
|
7
7
|
identity :id
|
8
|
-
attribute :url
|
9
8
|
attribute :resource_type
|
9
|
+
attribute :url
|
10
10
|
|
11
11
|
attribute :name
|
12
12
|
attribute :status
|
13
13
|
|
14
|
-
attribute :buffer_size
|
14
|
+
attribute :buffer_size, type: :integer
|
15
15
|
|
16
16
|
attribute :policy
|
17
17
|
attribute :nodes
|
@@ -34,14 +34,18 @@ module Fog
|
|
34
34
|
# List of domains for ACME
|
35
35
|
attribute :domains
|
36
36
|
|
37
|
-
#
|
38
|
-
attribute :
|
39
|
-
|
37
|
+
# Booleans
|
38
|
+
attribute :https_redirect, type: :boolean
|
39
|
+
|
40
|
+
# Timestamps
|
41
|
+
attribute :created_at, type: :time
|
42
|
+
attribute :deleted_at, type: :time
|
40
43
|
|
41
|
-
# Links
|
44
|
+
# Links
|
42
45
|
attribute :account
|
43
|
-
|
44
|
-
attribute :
|
46
|
+
|
47
|
+
attribute :nodes
|
48
|
+
attribute :cloud_ips
|
45
49
|
|
46
50
|
def ready?
|
47
51
|
status == "active"
|
@@ -14,35 +14,37 @@ module Fog
|
|
14
14
|
attribute :url
|
15
15
|
|
16
16
|
attribute :name
|
17
|
-
attribute :state,
|
17
|
+
attribute :state, aliases: "status"
|
18
18
|
|
19
|
-
attribute :
|
20
|
-
attribute :fqdn
|
21
|
-
attribute :user_data
|
19
|
+
attribute :console_token
|
22
20
|
attribute :console_url
|
23
21
|
attribute :fqdn
|
24
|
-
attribute :
|
22
|
+
attribute :hostname
|
23
|
+
attribute :user_data
|
25
24
|
|
26
|
-
|
25
|
+
# Boolean flags
|
26
|
+
attribute :compatibility_mode, type: :boolean
|
27
|
+
attribute :disk_encrypted, type: :boolean
|
27
28
|
|
28
|
-
#
|
29
|
-
attribute :created_at, :
|
30
|
-
attribute :started_at, :
|
31
|
-
attribute :console_token_expires, :
|
32
|
-
attribute :deleted_at, :
|
29
|
+
# Timestamps
|
30
|
+
attribute :created_at, type: :time
|
31
|
+
attribute :started_at, type: :time
|
32
|
+
attribute :console_token_expires, type: :time
|
33
|
+
attribute :deleted_at, type: :time
|
33
34
|
|
34
|
-
# Links
|
35
|
-
attribute :account_id,
|
36
|
-
attribute :image_id,
|
35
|
+
# Links
|
36
|
+
attribute :account_id, aliases: "account", squash: "id"
|
37
|
+
attribute :image_id, aliases: "image", squash: "id"
|
37
38
|
|
38
|
-
attribute :
|
39
|
+
attribute :server_type
|
40
|
+
attribute :zone
|
39
41
|
attribute :cloud_ip # Creation option only
|
42
|
+
|
40
43
|
attribute :cloud_ips
|
41
44
|
attribute :interfaces
|
42
45
|
attribute :server_groups
|
46
|
+
attribute :snapshots
|
43
47
|
attribute :volumes
|
44
|
-
attribute :zone
|
45
|
-
attribute :server_type
|
46
48
|
|
47
49
|
def initialize(attributes = {})
|
48
50
|
# Call super first to initialize the service object for our default image
|
@@ -6,15 +6,23 @@ module Fog
|
|
6
6
|
# Certain actions can accept a server group and affect all members
|
7
7
|
class ServerGroup < Fog::Brightbox::Model
|
8
8
|
identity :id
|
9
|
-
|
10
|
-
attribute :url
|
11
9
|
attribute :resource_type
|
10
|
+
attribute :url
|
11
|
+
|
12
12
|
attribute :name
|
13
13
|
attribute :description
|
14
|
-
attribute :
|
15
|
-
|
14
|
+
attribute :fqdn
|
15
|
+
|
16
|
+
# Booleans
|
17
|
+
attribute :default, type: :boolean
|
18
|
+
|
19
|
+
# Timestamps
|
20
|
+
attribute :created_at, type: :time
|
16
21
|
|
17
|
-
|
22
|
+
# Links
|
23
|
+
attribute :account_id, aliases: "account", squash: "id"
|
24
|
+
attribute :firewall_policy_id, aliases: "firewall_policy", squash: "id"
|
25
|
+
attribute :server_ids, aliases: "servers"
|
18
26
|
|
19
27
|
def save
|
20
28
|
options = {
|
@@ -11,13 +11,18 @@ module Fog
|
|
11
11
|
attribute :ssh_key
|
12
12
|
|
13
13
|
# Boolean flags
|
14
|
-
attribute :email_verified
|
15
|
-
attribute :messaging_pref
|
14
|
+
attribute :email_verified, type: :boolean
|
16
15
|
|
17
|
-
#
|
18
|
-
attribute :
|
16
|
+
# Timestamps
|
17
|
+
attribute :created_at, type: :time
|
18
|
+
|
19
|
+
# Links
|
20
|
+
attribute :account_id, aliases: "default_account", squash: "id"
|
19
21
|
attribute :accounts
|
20
22
|
|
23
|
+
# Deprecated
|
24
|
+
attribute :messaging_pref, type: :boolean
|
25
|
+
|
21
26
|
def save
|
22
27
|
requires :identity
|
23
28
|
|
@@ -3,10 +3,21 @@ module Fog
|
|
3
3
|
class Compute
|
4
4
|
class UserCollaboration < Fog::Brightbox::Model
|
5
5
|
identity :id
|
6
|
+
# resource_type is buggy for this resource
|
7
|
+
attribute :url
|
8
|
+
|
6
9
|
attribute :status
|
10
|
+
|
7
11
|
attribute :email
|
8
12
|
attribute :role
|
9
13
|
attribute :role_label
|
14
|
+
|
15
|
+
# Timestamps
|
16
|
+
attribute :created_at, type: :time
|
17
|
+
attribute :started_at, type: :time
|
18
|
+
attribute :finished_at, type: :time
|
19
|
+
|
20
|
+
# Links
|
10
21
|
attribute :account
|
11
22
|
attribute :user
|
12
23
|
attribute :inviter
|
@@ -5,34 +5,35 @@ module Fog
|
|
5
5
|
include Fog::Brightbox::Compute::ResourceLocking
|
6
6
|
|
7
7
|
identity :id
|
8
|
-
attribute :url
|
9
8
|
attribute :resource_type
|
9
|
+
attribute :url
|
10
10
|
|
11
11
|
attribute :name
|
12
|
-
attribute :state, :
|
13
|
-
|
12
|
+
attribute :state, aliases: "status"
|
14
13
|
attribute :description
|
14
|
+
|
15
15
|
attribute :filesystem_label
|
16
16
|
attribute :filesystem_type
|
17
17
|
attribute :serial
|
18
|
-
attribute :size
|
18
|
+
attribute :size, type: :integer
|
19
19
|
attribute :source
|
20
20
|
attribute :source_type
|
21
21
|
attribute :storage_type
|
22
22
|
|
23
|
-
|
24
|
-
attribute :
|
25
|
-
attribute :
|
23
|
+
# Boolean flags
|
24
|
+
attribute :boot, type: :boolean
|
25
|
+
attribute :delete_with_server, type: :boolean
|
26
|
+
attribute :encrypted, type: :boolean
|
26
27
|
|
27
|
-
#
|
28
|
-
attribute :created_at, :
|
29
|
-
attribute :updated_at, :
|
30
|
-
attribute :deleted_at, :
|
28
|
+
# Timestamps
|
29
|
+
attribute :created_at, type: :time
|
30
|
+
attribute :updated_at, type: :time
|
31
|
+
attribute :deleted_at, type: :time
|
31
32
|
|
32
33
|
# Links
|
33
|
-
attribute :account_id, :
|
34
|
-
attribute :image_id, :
|
35
|
-
attribute :server_id, :
|
34
|
+
attribute :account_id, aliases: "account", squash: "id"
|
35
|
+
attribute :image_id, aliases: "image", squash: "id"
|
36
|
+
attribute :server_id, aliases: "server", squash: "id"
|
36
37
|
|
37
38
|
def attach(server)
|
38
39
|
requires :identity
|
@@ -3,13 +3,12 @@ module Fog
|
|
3
3
|
class Compute
|
4
4
|
class Zone < Fog::Brightbox::Model
|
5
5
|
identity :id
|
6
|
-
attribute :url
|
7
6
|
attribute :resource_type
|
8
|
-
|
9
|
-
attribute :status
|
10
|
-
attribute :handle
|
7
|
+
attribute :url
|
11
8
|
|
12
9
|
attribute :description
|
10
|
+
attribute :handle
|
11
|
+
attribute :status
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
data/lib/fog/brightbox/oauth2.rb
CHANGED
@@ -6,6 +6,10 @@ module Fog
|
|
6
6
|
# @see http://tools.ietf.org/html/draft-ietf-oauth-v2-10
|
7
7
|
#
|
8
8
|
module OAuth2
|
9
|
+
TWO_FACTOR_HEADER = "X-Brightbox-OTP".freeze
|
10
|
+
|
11
|
+
class TwoFactorMissingError < StandardError; end
|
12
|
+
|
9
13
|
# This builds the simplest form of requesting an access token
|
10
14
|
# based on the arguments passed in
|
11
15
|
#
|
@@ -13,16 +17,38 @@ module Fog
|
|
13
17
|
# @param [CredentialSet] credentials
|
14
18
|
#
|
15
19
|
# @return [Excon::Response]
|
20
|
+
# @raise [Excon::Errors::Unauthorized] if the credentials are rejected by the server
|
21
|
+
# @raise [Fog::Brightbox::OAuth2::TwoFactorMissingError] if opted in to 2FA and server reports header is required
|
16
22
|
def request_access_token(connection, credentials)
|
17
23
|
token_strategy = credentials.best_grant_strategy
|
18
24
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
if two_factor?
|
26
|
+
# When 2FA opt-in is set, we can expect 401 responses as well
|
27
|
+
response = connection.request(
|
28
|
+
:path => "/token",
|
29
|
+
:expects => [200, 401],
|
30
|
+
:headers => token_strategy.headers,
|
31
|
+
:method => "POST",
|
32
|
+
:body => Fog::JSON.encode(token_strategy.authorization_body_data)
|
33
|
+
)
|
34
|
+
|
35
|
+
if response.status == 401 && response.headers[Fog::Brightbox::OAuth2::TWO_FACTOR_HEADER] == "required"
|
36
|
+
raise TwoFactorMissingError
|
37
|
+
elsif response.status == 401
|
38
|
+
raise Excon::Errors.status_error({ expects: 200 }, status: 401)
|
39
|
+
else
|
40
|
+
response
|
41
|
+
end
|
42
|
+
else
|
43
|
+
# Use classic behaviour and return Excon::
|
44
|
+
connection.request(
|
45
|
+
:path => "/token",
|
46
|
+
:expects => 200,
|
47
|
+
:headers => token_strategy.headers,
|
48
|
+
:method => "POST",
|
49
|
+
:body => Fog::JSON.encode(token_strategy.authorization_body_data)
|
50
|
+
)
|
51
|
+
end
|
26
52
|
end
|
27
53
|
|
28
54
|
# Encapsulates credentials required to request access tokens from the
|
@@ -33,12 +59,14 @@ module Fog
|
|
33
59
|
class CredentialSet
|
34
60
|
attr_reader :client_id, :client_secret, :username, :password
|
35
61
|
attr_reader :access_token, :refresh_token, :expires_in
|
62
|
+
attr_reader :one_time_password
|
36
63
|
#
|
37
64
|
# @param [String] client_id
|
38
65
|
# @param [String] client_secret
|
39
66
|
# @param [Hash] options
|
40
67
|
# @option options [String] :username
|
41
68
|
# @option options [String] :password
|
69
|
+
# @option options [String] :one_time_password One Time Password for Two Factor authentication
|
42
70
|
#
|
43
71
|
def initialize(client_id, client_secret, options = {})
|
44
72
|
@client_id = client_id
|
@@ -48,6 +76,7 @@ module Fog
|
|
48
76
|
@access_token = options[:access_token]
|
49
77
|
@refresh_token = options[:refresh_token]
|
50
78
|
@expires_in = options[:expires_in]
|
79
|
+
@one_time_password = options[:one_time_password]
|
51
80
|
end
|
52
81
|
|
53
82
|
# Returns true if user details are available
|
@@ -142,6 +171,17 @@ module Fog
|
|
142
171
|
"password" => @credentials.password
|
143
172
|
}
|
144
173
|
end
|
174
|
+
|
175
|
+
def headers
|
176
|
+
{
|
177
|
+
"Authorization" => authorization_header,
|
178
|
+
"Content-Type" => "application/json"
|
179
|
+
}.tap do |headers|
|
180
|
+
if @credentials.one_time_password
|
181
|
+
headers[TWO_FACTOR_HEADER] = @credentials.one_time_password
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
145
185
|
end
|
146
186
|
|
147
187
|
# This strategy attempts to use a refresh_token gained during an earlier
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
# Create a new config map
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [String] :name to identify this config map
|
9
|
+
# @option options [Hash] :data key/values to expose in config map
|
10
|
+
# @option options [Boolean] :nested passed through with the API request. When true nested resources are expanded.
|
11
|
+
#
|
12
|
+
# @return [Hash] if successful Hash version of JSON object
|
13
|
+
# @return [NilClass] if no options were passed
|
14
|
+
#
|
15
|
+
def create_config_map(options)
|
16
|
+
return nil if options.empty? || options.nil?
|
17
|
+
wrapped_request("post", "/1.0/config_maps", [200], options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
# Destroy the config map
|
6
|
+
#
|
7
|
+
# @param [String] identifier Unique reference to identify the resource
|
8
|
+
# @param [Hash] options
|
9
|
+
# @option options [Boolean] :nested passed through with the API request. When true nested resources are expanded.
|
10
|
+
#
|
11
|
+
# @return [Hash] if successful Hash version of JSON object
|
12
|
+
#
|
13
|
+
def delete_config_map(identifier, options = {})
|
14
|
+
return nil if identifier.nil? || identifier == ""
|
15
|
+
wrapped_request("delete", "/1.0/config_maps/#{identifier}", [200], options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
# @param [String] identifier Unique reference to identify the resource
|
6
|
+
# @param [Hash] options
|
7
|
+
# @option options [Boolean] :nested passed through with the API request. When true nested resources are expanded.
|
8
|
+
#
|
9
|
+
# @return [Hash] if successful Hash version of JSON object
|
10
|
+
#
|
11
|
+
def get_config_map(identifier, options = {})
|
12
|
+
return nil if identifier.nil? || identifier == ""
|
13
|
+
wrapped_request("get", "/1.0/config_maps/#{identifier}", [200], options)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
# Lists summary details of config maps owned by the account.
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [Boolean] :nested passed through with the API request. When true nested resources are expanded.
|
9
|
+
#
|
10
|
+
# @return [Hash] if successful Hash version of JSON object
|
11
|
+
#
|
12
|
+
def list_config_maps(options = {})
|
13
|
+
wrapped_request("get", "/1.0/config_maps", [200], options)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
# @param [String] identifier Unique reference to identify the resource
|
6
|
+
# @param [Hash] options
|
7
|
+
# @option options [String] :name to identifier this config map
|
8
|
+
# @option options [Hash] :data key/values to expose in config map
|
9
|
+
# @option options [Boolean] :nested passed through with the API request. When true nested resources are expanded.
|
10
|
+
#
|
11
|
+
# @return [Hash] if successful Hash version of JSON object
|
12
|
+
# @return [NilClass] if no options were passed
|
13
|
+
#
|
14
|
+
def update_config_map(identifier, options)
|
15
|
+
return nil if identifier.nil? || identifier == ""
|
16
|
+
return nil if options.empty? || options.nil?
|
17
|
+
wrapped_request("put", "/1.0/config_maps/#{identifier}", [200], options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Fog::Brightbox::Compute, "#credentials" do
|
4
|
+
describe "when 2FA support is disabled" do
|
5
|
+
before do
|
6
|
+
@options = {
|
7
|
+
brightbox_client_id: "app-12345",
|
8
|
+
brightbox_secret: "1234567890",
|
9
|
+
brightbox_username: "jason.null@brightbox.com",
|
10
|
+
brightbox_password: "HR4life",
|
11
|
+
brightbox_one_time_password: "123456"
|
12
|
+
}
|
13
|
+
@service = Fog::Brightbox::Compute.new(@options)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "does not add passed OTP to credentials" do
|
17
|
+
assert_kind_of Fog::Brightbox::OAuth2::CredentialSet, @service.credentials
|
18
|
+
assert_nil @service.credentials.one_time_password
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "with 2FA support is enabled" do
|
23
|
+
before do
|
24
|
+
@expected_otp = "123456"
|
25
|
+
@options = {
|
26
|
+
brightbox_client_id: "app-12345",
|
27
|
+
brightbox_secret: "1234567890",
|
28
|
+
brightbox_username: "jason.null@brightbox.com",
|
29
|
+
brightbox_password: "HR4life",
|
30
|
+
brightbox_support_two_factor: true,
|
31
|
+
brightbox_one_time_password: @expected_otp
|
32
|
+
}
|
33
|
+
@service = Fog::Brightbox::Compute.new(@options)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "adds passed OTP to credentials" do
|
37
|
+
assert_kind_of Fog::Brightbox::OAuth2::CredentialSet, @service.credentials
|
38
|
+
assert @expected_otp, @service.credentials.one_time_password
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|