fog-brightbox 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/fog-brightbox.gemspec +28 -0
- data/lib/fog/brightbox/compute/image_selector.rb +45 -0
- data/lib/fog/brightbox/compute/shared.rb +230 -0
- data/lib/fog/brightbox/compute.rb +305 -0
- data/lib/fog/brightbox/core.rb +11 -0
- data/lib/fog/brightbox/models/compute/account.rb +69 -0
- data/lib/fog/brightbox/models/compute/accounts.rb +29 -0
- data/lib/fog/brightbox/models/compute/api_client.rb +37 -0
- data/lib/fog/brightbox/models/compute/api_clients.rb +24 -0
- data/lib/fog/brightbox/models/compute/application.rb +24 -0
- data/lib/fog/brightbox/models/compute/applications.rb +28 -0
- data/lib/fog/brightbox/models/compute/cloud_ip.rb +68 -0
- data/lib/fog/brightbox/models/compute/cloud_ips.rb +34 -0
- data/lib/fog/brightbox/models/compute/collaboration.rb +49 -0
- data/lib/fog/brightbox/models/compute/collaborations.rb +47 -0
- data/lib/fog/brightbox/models/compute/database_server.rb +97 -0
- data/lib/fog/brightbox/models/compute/database_servers.rb +28 -0
- data/lib/fog/brightbox/models/compute/database_snapshot.rb +52 -0
- data/lib/fog/brightbox/models/compute/database_snapshots.rb +24 -0
- data/lib/fog/brightbox/models/compute/database_type.rb +19 -0
- data/lib/fog/brightbox/models/compute/database_types.rb +26 -0
- data/lib/fog/brightbox/models/compute/firewall_policies.rb +29 -0
- data/lib/fog/brightbox/models/compute/firewall_policy.rb +63 -0
- data/lib/fog/brightbox/models/compute/firewall_rule.rb +54 -0
- data/lib/fog/brightbox/models/compute/firewall_rules.rb +24 -0
- data/lib/fog/brightbox/models/compute/flavor.rb +32 -0
- data/lib/fog/brightbox/models/compute/flavors.rb +28 -0
- data/lib/fog/brightbox/models/compute/image.rb +64 -0
- data/lib/fog/brightbox/models/compute/images.rb +28 -0
- data/lib/fog/brightbox/models/compute/load_balancer.rb +107 -0
- data/lib/fog/brightbox/models/compute/load_balancers.rb +28 -0
- data/lib/fog/brightbox/models/compute/server.rb +217 -0
- data/lib/fog/brightbox/models/compute/server_group.rb +94 -0
- data/lib/fog/brightbox/models/compute/server_groups.rb +29 -0
- data/lib/fog/brightbox/models/compute/servers.rb +61 -0
- data/lib/fog/brightbox/models/compute/user.rb +43 -0
- data/lib/fog/brightbox/models/compute/user_collaboration.rb +44 -0
- data/lib/fog/brightbox/models/compute/user_collaborations.rb +31 -0
- data/lib/fog/brightbox/models/compute/users.rb +27 -0
- data/lib/fog/brightbox/models/compute/zone.rb +22 -0
- data/lib/fog/brightbox/models/compute/zones.rb +29 -0
- data/lib/fog/brightbox/oauth2.rb +166 -0
- data/lib/fog/brightbox/requests/compute/accept_user_collaboration.rb +21 -0
- data/lib/fog/brightbox/requests/compute/activate_console_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/add_listeners_load_balancer.rb +24 -0
- data/lib/fog/brightbox/requests/compute/add_nodes_load_balancer.rb +24 -0
- data/lib/fog/brightbox/requests/compute/add_servers_server_group.rb +34 -0
- data/lib/fog/brightbox/requests/compute/apply_to_firewall_policy.rb +24 -0
- data/lib/fog/brightbox/requests/compute/create_api_client.rb +23 -0
- data/lib/fog/brightbox/requests/compute/create_application.rb +23 -0
- data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +24 -0
- data/lib/fog/brightbox/requests/compute/create_collaboration.rb +23 -0
- data/lib/fog/brightbox/requests/compute/create_database_server.rb +25 -0
- data/lib/fog/brightbox/requests/compute/create_firewall_policy.rb +26 -0
- data/lib/fog/brightbox/requests/compute/create_firewall_rule.rb +29 -0
- data/lib/fog/brightbox/requests/compute/create_image.rb +30 -0
- data/lib/fog/brightbox/requests/compute/create_load_balancer.rb +26 -0
- data/lib/fog/brightbox/requests/compute/create_server.rb +29 -0
- data/lib/fog/brightbox/requests/compute/create_server_group.rb +23 -0
- data/lib/fog/brightbox/requests/compute/delete_api_client.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_application.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_cloud_ip.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_collaboration.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_database_server.rb +26 -0
- data/lib/fog/brightbox/requests/compute/delete_database_snapshot.rb +26 -0
- data/lib/fog/brightbox/requests/compute/delete_firewall_policy.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_firewall_rule.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_image.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_load_balancer.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_server.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_server_group.rb +28 -0
- data/lib/fog/brightbox/requests/compute/delete_user_collaboration.rb +28 -0
- data/lib/fog/brightbox/requests/compute/get_account.rb +29 -0
- data/lib/fog/brightbox/requests/compute/get_api_client.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_application.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_authenticated_user.rb +17 -0
- data/lib/fog/brightbox/requests/compute/get_cloud_ip.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_collaboration.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_database_server.rb +19 -0
- data/lib/fog/brightbox/requests/compute/get_database_snapshot.rb +19 -0
- data/lib/fog/brightbox/requests/compute/get_database_type.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_firewall_policy.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_firewall_rule.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_image.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_interface.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_load_balancer.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_scoped_account.rb +15 -0
- data/lib/fog/brightbox/requests/compute/get_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_server_group.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_server_type.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_user.rb +29 -0
- data/lib/fog/brightbox/requests/compute/get_user_collaboration.rb +21 -0
- data/lib/fog/brightbox/requests/compute/get_zone.rb +21 -0
- data/lib/fog/brightbox/requests/compute/list_accounts.rb +17 -0
- data/lib/fog/brightbox/requests/compute/list_api_clients.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_applications.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_cloud_ips.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_collaborations.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_database_servers.rb +17 -0
- data/lib/fog/brightbox/requests/compute/list_database_snapshots.rb +17 -0
- data/lib/fog/brightbox/requests/compute/list_database_types.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_firewall_policies.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_images.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_load_balancers.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_server_groups.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_server_types.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_servers.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_user_collaborations.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_users.rb +19 -0
- data/lib/fog/brightbox/requests/compute/list_zones.rb +19 -0
- data/lib/fog/brightbox/requests/compute/map_cloud_ip.rb +24 -0
- data/lib/fog/brightbox/requests/compute/move_servers_server_group.rb +36 -0
- data/lib/fog/brightbox/requests/compute/reject_user_collaboration.rb +21 -0
- data/lib/fog/brightbox/requests/compute/remove_firewall_policy.rb +24 -0
- data/lib/fog/brightbox/requests/compute/remove_listeners_load_balancer.rb +24 -0
- data/lib/fog/brightbox/requests/compute/remove_nodes_load_balancer.rb +24 -0
- data/lib/fog/brightbox/requests/compute/remove_servers_server_group.rb +34 -0
- data/lib/fog/brightbox/requests/compute/resend_collaboration.rb +21 -0
- data/lib/fog/brightbox/requests/compute/reset_ftp_password_account.rb +32 -0
- data/lib/fog/brightbox/requests/compute/reset_ftp_password_scoped_account.rb +18 -0
- data/lib/fog/brightbox/requests/compute/reset_password_database_server.rb +19 -0
- data/lib/fog/brightbox/requests/compute/reset_secret_api_client.rb +25 -0
- data/lib/fog/brightbox/requests/compute/reset_secret_application.rb +21 -0
- data/lib/fog/brightbox/requests/compute/shutdown_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/snapshot_database_server.rb +19 -0
- data/lib/fog/brightbox/requests/compute/snapshot_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/start_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/stop_server.rb +21 -0
- data/lib/fog/brightbox/requests/compute/unmap_cloud_ip.rb +21 -0
- data/lib/fog/brightbox/requests/compute/update_account.rb +61 -0
- data/lib/fog/brightbox/requests/compute/update_api_client.rb +26 -0
- data/lib/fog/brightbox/requests/compute/update_application.rb +26 -0
- data/lib/fog/brightbox/requests/compute/update_cloud_ip.rb +27 -0
- data/lib/fog/brightbox/requests/compute/update_database_server.rb +25 -0
- data/lib/fog/brightbox/requests/compute/update_database_snapshot.rb +26 -0
- data/lib/fog/brightbox/requests/compute/update_firewall_policy.rb +26 -0
- data/lib/fog/brightbox/requests/compute/update_firewall_rule.rb +31 -0
- data/lib/fog/brightbox/requests/compute/update_image.rb +31 -0
- data/lib/fog/brightbox/requests/compute/update_load_balancer.rb +29 -0
- data/lib/fog/brightbox/requests/compute/update_scoped_account.rb +31 -0
- data/lib/fog/brightbox/requests/compute/update_server.rb +28 -0
- data/lib/fog/brightbox/requests/compute/update_server_group.rb +26 -0
- data/lib/fog/brightbox/requests/compute/update_user.rb +29 -0
- data/lib/fog/brightbox/version.rb +5 -0
- data/lib/fog/brightbox.rb +1 -0
- metadata +261 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6e8e0a4337ce1090b15746deb6601ce046ab5a16
|
4
|
+
data.tar.gz: 6f1ed505b468ae1651713ef96e1d269583669501
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f834becf04d20fae09bb5492978320d47f5d67512ea8a8a6554c90943ba2bd7a7f102998cd473175da2ad310d3ca97ce28302e4be559fe7ad310ea502a8e6352
|
7
|
+
data.tar.gz: 35c867371334ce552d61429b20075cac591e87dcbb5a2b2819a6b8c87b51e10bae4d87dc37441dd5cb05084fc6eab562ae26546f4c151dd5571895888b8adfdf
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fog/brightbox/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "fog-brightbox"
|
8
|
+
spec.version = Fog::Brightbox::VERSION
|
9
|
+
spec.authors = ["Paul Thornthwaite"]
|
10
|
+
spec.email = ["tokengeek@gmail.com"]
|
11
|
+
spec.description = %q{Module for the 'fog' gem to support Brightbox Cloud}
|
12
|
+
spec.summary = %q{This library can be used as a module for `fog` or as standalone provider
|
13
|
+
to use the Brightbox Cloud in applications}
|
14
|
+
spec.homepage = ""
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($/)
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency "fog-core"
|
23
|
+
spec.add_dependency "fog-json"
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency "shindo"
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Fog
|
2
|
+
module Brightbox
|
3
|
+
module Compute
|
4
|
+
#
|
5
|
+
# This selects the preferred image to use based on a number of
|
6
|
+
# conditions
|
7
|
+
#
|
8
|
+
class ImageSelector
|
9
|
+
# Prepares a selector with the API output
|
10
|
+
#
|
11
|
+
# @param [Array<Hash>] images hash matching API output for {Fog::Compute::Brightbox#list_images}
|
12
|
+
#
|
13
|
+
def initialize(images)
|
14
|
+
@images = images
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns current identifier of the latest version of Ubuntu
|
18
|
+
#
|
19
|
+
# The order of preference is:
|
20
|
+
# * Only Official Brightbox images
|
21
|
+
# * Only Ubuntu images
|
22
|
+
# * Latest by name (alphanumeric sort)
|
23
|
+
# * Latest by creation date
|
24
|
+
#
|
25
|
+
# @note This performs a live query against the API
|
26
|
+
#
|
27
|
+
# @return [String] if image matches containing the identifier
|
28
|
+
# @return [NilClass] if no image matches
|
29
|
+
#
|
30
|
+
def latest_ubuntu
|
31
|
+
@images.select do |img|
|
32
|
+
img["official"] == true &&
|
33
|
+
img["arch"] == "i686" &&
|
34
|
+
img["name"] =~ /ubuntu/i
|
35
|
+
end.sort do |a, b|
|
36
|
+
# Reverse sort so "raring" > "precise" and "13.10" > "13.04"
|
37
|
+
b["name"].downcase <=> a["name"].downcase
|
38
|
+
end.first["id"]
|
39
|
+
rescue
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require "fog/brightbox/oauth2"
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Brightbox
|
5
|
+
module Compute
|
6
|
+
|
7
|
+
# The Shared module consists of code that was duplicated between the Real
|
8
|
+
# and Mock implementations.
|
9
|
+
#
|
10
|
+
module Shared
|
11
|
+
include Fog::Brightbox::OAuth2
|
12
|
+
|
13
|
+
API_URL = "https://api.gb1.brightbox.com/"
|
14
|
+
|
15
|
+
# Creates a new instance of the Brightbox Compute service
|
16
|
+
#
|
17
|
+
# @note If you create service using just a refresh token when it
|
18
|
+
# expires the service will no longer be able to authenticate.
|
19
|
+
#
|
20
|
+
# @param [Hash] options
|
21
|
+
# @option options [String] :brightbox_api_url
|
22
|
+
# Override the default (or configured) API endpoint
|
23
|
+
# @option options [String] :brightbox_auth_url
|
24
|
+
# Override the default (or configured) API authentication endpoint
|
25
|
+
# @option options [String] :brightbox_client_id
|
26
|
+
# Client identifier to authenticate with (overrides configured)
|
27
|
+
# @option options [String] :brightbox_secret
|
28
|
+
# Client secret to authenticate with (overrides configured)
|
29
|
+
# @option options [String] :brightbox_username
|
30
|
+
# Email or user identifier for user based authentication
|
31
|
+
# @option options [String] :brightbox_password
|
32
|
+
# Password for user based authentication
|
33
|
+
# @option options [String] :brightbox_account
|
34
|
+
# Account identifier to scope this connection to
|
35
|
+
# @option options [String] :connection_options
|
36
|
+
# Settings to pass to underlying {Fog::Core::Connection}
|
37
|
+
# @option options [Boolean] :persistent
|
38
|
+
# Sets a persistent HTTP {Fog::Core::Connection}
|
39
|
+
# @option options [String] :brightbox_access_token
|
40
|
+
# Sets the OAuth access token to use rather than requesting a new token
|
41
|
+
# @option options [String] :brightbox_refresh_token
|
42
|
+
# Sets the refresh token to use when requesting a newer access token
|
43
|
+
# @option options [String] (true) :brightbox_token_management
|
44
|
+
# Overide the existing behaviour to request access tokens if expired
|
45
|
+
#
|
46
|
+
def initialize(options)
|
47
|
+
# Currently authentication and api endpoints are the same but may change
|
48
|
+
@auth_url = options[:brightbox_auth_url] || Fog.credentials[:brightbox_auth_url] || API_URL
|
49
|
+
@auth_connection = Fog::Core::Connection.new(@auth_url)
|
50
|
+
|
51
|
+
@api_url = options[:brightbox_api_url] || Fog.credentials[:brightbox_api_url] || API_URL
|
52
|
+
@connection_options = options[:connection_options] || {}
|
53
|
+
@persistent = options[:persistent] || false
|
54
|
+
@connection = Fog::Core::Connection.new(@api_url, @persistent, @connection_options)
|
55
|
+
|
56
|
+
# Authentication options
|
57
|
+
client_id = options[:brightbox_client_id] || Fog.credentials[:brightbox_client_id]
|
58
|
+
client_secret = options[:brightbox_secret] || Fog.credentials[:brightbox_secret]
|
59
|
+
|
60
|
+
username = options[:brightbox_username] || Fog.credentials[:brightbox_username]
|
61
|
+
password = options[:brightbox_password] || Fog.credentials[:brightbox_password]
|
62
|
+
@configured_account = options[:brightbox_account] || Fog.credentials[:brightbox_account]
|
63
|
+
# Request account can be changed at anytime and changes behaviour of future requests
|
64
|
+
@scoped_account = @configured_account
|
65
|
+
|
66
|
+
credential_options = { :username => username, :password => password }
|
67
|
+
@credentials = CredentialSet.new(client_id, client_secret, credential_options)
|
68
|
+
|
69
|
+
# If existing tokens have been cached, allow continued use of them in the service
|
70
|
+
@credentials.update_tokens(options[:brightbox_access_token], options[:brightbox_refresh_token])
|
71
|
+
|
72
|
+
@token_management = options.fetch(:brightbox_token_management, true)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Sets the scoped account for future requests
|
76
|
+
# @param [String] scoped_account Identifier of the account to scope request to
|
77
|
+
def scoped_account=(scoped_account)
|
78
|
+
@scoped_account = scoped_account
|
79
|
+
end
|
80
|
+
|
81
|
+
# This returns the account identifier that the request should be scoped by
|
82
|
+
# based on the options passed to the request and current configuration
|
83
|
+
#
|
84
|
+
# @param [String] options_account Any identifier passed into the request
|
85
|
+
#
|
86
|
+
# @return [String, nil] The account identifier to scope the request to or nil
|
87
|
+
def scoped_account(options_account = nil)
|
88
|
+
[options_account, @scoped_account].compact.first
|
89
|
+
end
|
90
|
+
|
91
|
+
# Resets the scoped account back to intially configured one
|
92
|
+
def scoped_account_reset
|
93
|
+
@scoped_account = @configured_account
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns the scoped account being used for requests
|
97
|
+
#
|
98
|
+
# * For API clients this is the owning account
|
99
|
+
# * For User applications this is the account specified by either +account_id+
|
100
|
+
# option on the service or the +brightbox_account+ setting in your configuration
|
101
|
+
#
|
102
|
+
# @return [Fog::Compute::Brightbox::Account]
|
103
|
+
#
|
104
|
+
def account
|
105
|
+
account_data = get_scoped_account.merge(:service => self)
|
106
|
+
Fog::Compute::Brightbox::Account.new(account_data)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns true if authentication is being performed as a user
|
110
|
+
# @return [Boolean]
|
111
|
+
def authenticating_as_user?
|
112
|
+
@credentials.user_details?
|
113
|
+
end
|
114
|
+
|
115
|
+
# Returns true if an access token is set
|
116
|
+
# @return [Boolean]
|
117
|
+
def access_token_available?
|
118
|
+
!! @credentials.access_token
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns the current access token or nil
|
122
|
+
# @return [String,nil]
|
123
|
+
def access_token
|
124
|
+
@credentials.access_token
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns the current refresh token or nil
|
128
|
+
# @return [String,nil]
|
129
|
+
def refresh_token
|
130
|
+
@credentials.refresh_token
|
131
|
+
end
|
132
|
+
|
133
|
+
# Returns the current token expiry time in seconds or nil
|
134
|
+
# @return [Number,nil]
|
135
|
+
def expires_in
|
136
|
+
@credentials.expires_in
|
137
|
+
end
|
138
|
+
|
139
|
+
# Requests a new access token
|
140
|
+
#
|
141
|
+
# @return [String] New access token
|
142
|
+
def get_access_token
|
143
|
+
begin
|
144
|
+
get_access_token!
|
145
|
+
rescue Excon::Errors::Unauthorized, Excon::Errors::BadRequest
|
146
|
+
@credentials.update_tokens(nil, nil)
|
147
|
+
end
|
148
|
+
@credentials.access_token
|
149
|
+
end
|
150
|
+
|
151
|
+
# Requests a new access token and raises if there is a problem
|
152
|
+
#
|
153
|
+
# @return [String] New access token
|
154
|
+
# @raise [Excon::Errors::BadRequest] The credentials are expired or incorrect
|
155
|
+
#
|
156
|
+
def get_access_token!
|
157
|
+
response = request_access_token(@auth_connection, @credentials)
|
158
|
+
update_credentials_from_response(@credentials, response)
|
159
|
+
@credentials.access_token
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns an identifier for the default image for use
|
163
|
+
#
|
164
|
+
# Currently tries to find the latest version of Ubuntu (i686) from
|
165
|
+
# Brightbox.
|
166
|
+
#
|
167
|
+
# Highly recommended that you actually select the image you want to run
|
168
|
+
# on your servers yourself!
|
169
|
+
#
|
170
|
+
# @return [String] if image is found, returns the identifier
|
171
|
+
# @return [NilClass] if no image is found or an error occurs
|
172
|
+
#
|
173
|
+
def default_image
|
174
|
+
return @default_image_id unless @default_image_id.nil?
|
175
|
+
@default_image_id = Fog.credentials[:brightbox_default_image] || select_default_image
|
176
|
+
end
|
177
|
+
|
178
|
+
private
|
179
|
+
|
180
|
+
# This makes a request of the API based on the configured setting for
|
181
|
+
# token management.
|
182
|
+
#
|
183
|
+
# @param [Hash] options Excon compatible options
|
184
|
+
# @see https://github.com/geemus/excon/blob/master/lib/excon/connection.rb
|
185
|
+
#
|
186
|
+
# @return [Hash] Data of response body
|
187
|
+
#
|
188
|
+
def make_request(options)
|
189
|
+
if @token_management
|
190
|
+
managed_token_request(options)
|
191
|
+
else
|
192
|
+
authenticated_request(options)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
# This request checks for access tokens and will ask for a new one if
|
197
|
+
# it receives Unauthorized from the API before repeating the request
|
198
|
+
#
|
199
|
+
# @param [Hash] options Excon compatible options
|
200
|
+
#
|
201
|
+
# @return [Excon::Response]
|
202
|
+
def managed_token_request(options)
|
203
|
+
get_access_token unless access_token_available?
|
204
|
+
authenticated_request(options)
|
205
|
+
rescue Excon::Errors::Unauthorized
|
206
|
+
get_access_token
|
207
|
+
authenticated_request(options)
|
208
|
+
end
|
209
|
+
|
210
|
+
# This request makes an authenticated request of the API using currently
|
211
|
+
# setup credentials.
|
212
|
+
#
|
213
|
+
# @param [Hash] options Excon compatible options
|
214
|
+
#
|
215
|
+
# @see https://github.com/geemus/excon/blob/master/lib/excon/connection.rb
|
216
|
+
#
|
217
|
+
# @return [Excon::Response]
|
218
|
+
def authenticated_request(options)
|
219
|
+
headers = options[:headers] || {}
|
220
|
+
headers.merge!("Authorization" => "OAuth #{@credentials.access_token}", "Content-Type" => "application/json")
|
221
|
+
options[:headers] = headers
|
222
|
+
# TODO: This is just a wrapper around a call to Excon::Connection#request
|
223
|
+
# so can be extracted from Compute by passing in the connection,
|
224
|
+
# credentials and options
|
225
|
+
@connection.request(options)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1,305 @@
|
|
1
|
+
require 'fog/brightbox/core'
|
2
|
+
require 'fog/brightbox/compute/shared'
|
3
|
+
require 'fog/brightbox/compute/image_selector'
|
4
|
+
|
5
|
+
module Fog
|
6
|
+
module Compute
|
7
|
+
class Brightbox < Fog::Service
|
8
|
+
|
9
|
+
# Client credentials
|
10
|
+
requires :brightbox_client_id, :brightbox_secret
|
11
|
+
|
12
|
+
# API endpoint settings
|
13
|
+
recognizes :brightbox_auth_url, :brightbox_api_url
|
14
|
+
|
15
|
+
# User credentials (still requires client details)
|
16
|
+
recognizes :brightbox_username, :brightbox_password, :brightbox_account
|
17
|
+
|
18
|
+
# Cached tokens
|
19
|
+
recognizes :brightbox_access_token, :brightbox_refresh_token
|
20
|
+
|
21
|
+
# Automatic token management
|
22
|
+
recognizes :brightbox_token_management
|
23
|
+
|
24
|
+
# Excon connection settings
|
25
|
+
recognizes :persistent
|
26
|
+
|
27
|
+
model_path 'fog/brightbox/models/compute'
|
28
|
+
collection :accounts
|
29
|
+
model :account
|
30
|
+
collection :applications
|
31
|
+
model :application
|
32
|
+
collection :api_clients
|
33
|
+
model :api_client
|
34
|
+
collection :collaborations
|
35
|
+
model :collaboration
|
36
|
+
collection :servers
|
37
|
+
model :server
|
38
|
+
collection :server_groups
|
39
|
+
model :server_group
|
40
|
+
collection :firewall_policies
|
41
|
+
model :firewall_policy
|
42
|
+
collection :firewall_rules
|
43
|
+
model :firewall_rule
|
44
|
+
collection :flavors
|
45
|
+
model :flavor
|
46
|
+
collection :images
|
47
|
+
model :image
|
48
|
+
collection :load_balancers
|
49
|
+
model :load_balancer
|
50
|
+
collection :database_servers
|
51
|
+
model :database_server
|
52
|
+
collection :database_snapshots
|
53
|
+
model :database_snapshot
|
54
|
+
collection :database_types
|
55
|
+
model :database_type
|
56
|
+
collection :zones
|
57
|
+
model :zone
|
58
|
+
collection :cloud_ips
|
59
|
+
model :cloud_ip
|
60
|
+
collection :users
|
61
|
+
model :user
|
62
|
+
collection :user_collaborations
|
63
|
+
model :user_collaboration
|
64
|
+
|
65
|
+
request_path 'fog/brightbox/requests/compute'
|
66
|
+
request :accept_user_collaboration
|
67
|
+
request :activate_console_server
|
68
|
+
request :add_listeners_load_balancer
|
69
|
+
request :add_nodes_load_balancer
|
70
|
+
request :add_servers_server_group
|
71
|
+
request :apply_to_firewall_policy
|
72
|
+
request :accept_user_collaboration
|
73
|
+
request :remove_firewall_policy
|
74
|
+
request :create_api_client
|
75
|
+
request :create_application
|
76
|
+
request :create_cloud_ip
|
77
|
+
request :create_collaboration
|
78
|
+
request :create_firewall_policy
|
79
|
+
request :create_firewall_rule
|
80
|
+
request :create_image
|
81
|
+
request :create_load_balancer
|
82
|
+
request :create_database_server
|
83
|
+
request :create_server
|
84
|
+
request :create_server_group
|
85
|
+
request :delete_api_client
|
86
|
+
request :delete_application
|
87
|
+
request :delete_cloud_ip
|
88
|
+
request :delete_collaboration
|
89
|
+
request :delete_firewall_policy
|
90
|
+
request :delete_firewall_rule
|
91
|
+
request :delete_image
|
92
|
+
request :delete_load_balancer
|
93
|
+
request :delete_database_server
|
94
|
+
request :delete_database_snapshot
|
95
|
+
request :delete_server
|
96
|
+
request :delete_server_group
|
97
|
+
request :delete_user_collaboration
|
98
|
+
request :get_account
|
99
|
+
request :get_api_client
|
100
|
+
request :get_application
|
101
|
+
request :get_authenticated_user
|
102
|
+
request :get_cloud_ip
|
103
|
+
request :get_collaboration
|
104
|
+
request :get_firewall_policy
|
105
|
+
request :get_firewall_rule
|
106
|
+
request :get_image
|
107
|
+
request :get_interface
|
108
|
+
request :get_load_balancer
|
109
|
+
request :get_database_server
|
110
|
+
request :get_database_snapshot
|
111
|
+
request :get_database_type
|
112
|
+
request :get_scoped_account
|
113
|
+
request :get_server
|
114
|
+
request :get_server_group
|
115
|
+
request :get_server_type
|
116
|
+
request :get_user
|
117
|
+
request :get_user_collaboration
|
118
|
+
request :get_zone
|
119
|
+
request :list_accounts
|
120
|
+
request :list_api_clients
|
121
|
+
request :list_applications
|
122
|
+
request :list_cloud_ips
|
123
|
+
request :list_collaborations
|
124
|
+
request :list_firewall_policies
|
125
|
+
request :list_images
|
126
|
+
request :list_load_balancers
|
127
|
+
request :list_database_servers
|
128
|
+
request :list_database_snapshots
|
129
|
+
request :list_database_types
|
130
|
+
request :list_server_groups
|
131
|
+
request :list_server_types
|
132
|
+
request :list_servers
|
133
|
+
request :list_users
|
134
|
+
request :list_user_collaborations
|
135
|
+
request :list_zones
|
136
|
+
request :map_cloud_ip
|
137
|
+
request :move_servers_server_group
|
138
|
+
request :reject_user_collaboration
|
139
|
+
request :remove_listeners_load_balancer
|
140
|
+
request :remove_nodes_load_balancer
|
141
|
+
request :remove_servers_server_group
|
142
|
+
request :resend_collaboration
|
143
|
+
request :reset_ftp_password_account
|
144
|
+
request :reset_ftp_password_scoped_account
|
145
|
+
request :reset_password_database_server
|
146
|
+
request :reset_secret_api_client
|
147
|
+
request :reset_secret_application
|
148
|
+
request :resend_collaboration
|
149
|
+
request :reject_user_collaboration
|
150
|
+
request :shutdown_server
|
151
|
+
request :snapshot_database_server
|
152
|
+
request :snapshot_server
|
153
|
+
request :start_server
|
154
|
+
request :stop_server
|
155
|
+
request :unmap_cloud_ip
|
156
|
+
request :update_account
|
157
|
+
request :update_api_client
|
158
|
+
request :update_application
|
159
|
+
request :update_cloud_ip
|
160
|
+
request :update_firewall_policy
|
161
|
+
request :update_firewall_rule
|
162
|
+
request :update_image
|
163
|
+
request :update_load_balancer
|
164
|
+
request :update_database_server
|
165
|
+
request :update_database_snapshot
|
166
|
+
request :update_scoped_account
|
167
|
+
request :update_server
|
168
|
+
request :update_server_group
|
169
|
+
request :update_user
|
170
|
+
|
171
|
+
# The Mock Service allows you to run a fake instance of the Service
|
172
|
+
# which makes no real connections.
|
173
|
+
#
|
174
|
+
# @todo Implement
|
175
|
+
#
|
176
|
+
class Mock
|
177
|
+
include Fog::Brightbox::Compute::Shared
|
178
|
+
|
179
|
+
def request(method, path, expected_responses, parameters = {})
|
180
|
+
_request
|
181
|
+
end
|
182
|
+
|
183
|
+
def request_access_token(connection, credentials)
|
184
|
+
_request
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
def _request
|
190
|
+
raise Fog::Errors::MockNotImplemented
|
191
|
+
end
|
192
|
+
|
193
|
+
def select_default_image
|
194
|
+
"img-mockd"
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# The Real Service actually makes real connections to the Brightbox
|
199
|
+
# service.
|
200
|
+
#
|
201
|
+
class Real
|
202
|
+
include Fog::Brightbox::Compute::Shared
|
203
|
+
|
204
|
+
# Makes an API request to the given path using passed options or those
|
205
|
+
# set with the service setup
|
206
|
+
#
|
207
|
+
# @todo Standard Fog behaviour is to return the Excon::Response but
|
208
|
+
# this was unintentionally changed to be the Hash version of the
|
209
|
+
# data in the body. This loses access to some details and should
|
210
|
+
# be corrected in a backwards compatible manner
|
211
|
+
#
|
212
|
+
# @overload request(params)
|
213
|
+
# @param [Hash] params Excon compatible options
|
214
|
+
# @option params [String] :body text to be sent over a socket
|
215
|
+
# @option params [Hash<Symbol, String>] :headers The default headers to supply in a request
|
216
|
+
# @option params [String] :host The destination host's reachable DNS name or IP, in the form of a String
|
217
|
+
# @option params [String] :path appears after 'scheme://host:port/'
|
218
|
+
# @option params [Fixnum] :port The port on which to connect, to the destination host
|
219
|
+
# @option params [Hash] :query appended to the 'scheme://host:port/path/' in the form of '?key=value'
|
220
|
+
# @option params [String] :scheme The protocol; 'https' causes OpenSSL to be used
|
221
|
+
# @return [Excon::Response]
|
222
|
+
# @see https://github.com/geemus/excon/blob/master/lib/excon/connection.rb
|
223
|
+
#
|
224
|
+
# @overload request(method, path, expected_responses, params = {})
|
225
|
+
# @param [String] method HTTP method to use for the request
|
226
|
+
# @param [String] path The absolute path for the request
|
227
|
+
# @param [Array<Fixnum>] expected_responses HTTP response codes that have been successful
|
228
|
+
# @param [Hash] params Keys and values for JSON
|
229
|
+
# @option params [String] :account_id The scoping account if required
|
230
|
+
# @deprecated #request with multiple arguments is deprecated
|
231
|
+
# since it is inconsistent with original fog version.
|
232
|
+
# @return [Hash]
|
233
|
+
def request(*args)
|
234
|
+
if args.size == 1
|
235
|
+
authenticated_request(*args)
|
236
|
+
else
|
237
|
+
Fog::Logger.deprecation("#request with multiple parameters is deprecated, use #wrapped_request instead [light_black](#{caller.first})[/]")
|
238
|
+
wrapped_request(*args)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Makes a request but with seperated arguments and parses the response to a hash
|
243
|
+
#
|
244
|
+
# @note #wrapped_request is the non-standard form of request introduced by mistake
|
245
|
+
#
|
246
|
+
# @param [String] method HTTP method to use for the request
|
247
|
+
# @param [String] path The absolute path for the request
|
248
|
+
# @param [Array<Fixnum>] expected_responses HTTP response codes that have been successful
|
249
|
+
# @param [Hash] parameters Keys and values for JSON
|
250
|
+
# @option parameters [String] :account_id The scoping account if required
|
251
|
+
#
|
252
|
+
# @return [Hash]
|
253
|
+
def wrapped_request(method, path, expected_responses, parameters = {})
|
254
|
+
_wrapped_request(method, path, expected_responses, parameters)
|
255
|
+
end
|
256
|
+
|
257
|
+
private
|
258
|
+
|
259
|
+
# Wrapped request is the non-standard form of request introduced by mistake
|
260
|
+
#
|
261
|
+
# @param [String] method HTTP method to use for the request
|
262
|
+
# @param [String] path The absolute path for the request
|
263
|
+
# @param [Array<Fixnum>] expected_responses HTTP response codes that have been successful
|
264
|
+
# @param [Hash] parameters Keys and values for JSON
|
265
|
+
# @option parameters [String] :account_id The scoping account if required
|
266
|
+
#
|
267
|
+
# @return [Hash]
|
268
|
+
def _wrapped_request(method, path, expected_responses, parameters = {})
|
269
|
+
request_options = {
|
270
|
+
:method => method.to_s.upcase,
|
271
|
+
:path => path,
|
272
|
+
:expects => expected_responses
|
273
|
+
}
|
274
|
+
|
275
|
+
# Select the account to scope for this request
|
276
|
+
account = scoped_account(parameters.fetch(:account_id, nil))
|
277
|
+
request_options[:query] = { :account_id => account } if account
|
278
|
+
|
279
|
+
request_options[:body] = Fog::JSON.encode(parameters) unless parameters.empty?
|
280
|
+
|
281
|
+
response = make_request(request_options)
|
282
|
+
|
283
|
+
# FIXME: We should revert to returning the Excon::Request after a suitable
|
284
|
+
# configuration option is in place to switch back to this incorrect behaviour
|
285
|
+
if response.body.empty?
|
286
|
+
response
|
287
|
+
else
|
288
|
+
Fog::JSON.decode(response.body)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Queries the API and tries to select the most suitable official Image
|
293
|
+
# to use if the user chooses not to select their own.
|
294
|
+
#
|
295
|
+
# @return [String] if image is found, the image's identifier
|
296
|
+
# @return [NilClass] if no image found or an error occured
|
297
|
+
#
|
298
|
+
def select_default_image
|
299
|
+
Fog::Brightbox::Compute::ImageSelector.new(list_images).latest_ubuntu
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|