brightbox-cli 2.2.0 → 2.3.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/Gemfile.lock +5 -2
- data/brightbox-cli.gemspec +1 -1
- data/lib/brightbox/cli/config.rb +19 -0
- data/lib/brightbox-cli/accounts.rb +2 -2
- data/lib/brightbox-cli/api.rb +4 -4
- data/lib/brightbox-cli/commands/accounts/default.rb +1 -1
- data/lib/brightbox-cli/commands/accounts/list.rb +1 -1
- data/lib/brightbox-cli/commands/config/client-add.rb +2 -2
- data/lib/brightbox-cli/commands/config/client-default.rb +3 -3
- data/lib/brightbox-cli/commands/config/client-list.rb +6 -6
- data/lib/brightbox-cli/commands/config/client-remove.rb +4 -4
- data/lib/brightbox-cli/commands/config/user-add.rb +2 -2
- data/lib/brightbox-cli/commands/login.rb +53 -0
- data/lib/brightbox-cli/config/accounts.rb +5 -0
- data/lib/brightbox-cli/config/authentication_tokens.rb +10 -3
- data/lib/brightbox-cli/config/cache.rb +8 -12
- data/lib/brightbox-cli/config/clients.rb +14 -38
- data/lib/brightbox-cli/config/sections.rb +70 -13
- data/lib/brightbox-cli/config/user_application.rb +13 -5
- data/lib/brightbox-cli/config.rb +22 -14
- data/lib/brightbox-cli/connection_manager.rb +2 -2
- data/lib/brightbox-cli/gli_global_hooks.rb +25 -28
- data/lib/brightbox-cli/version.rb +1 -1
- data/lib/brightbox_cli.rb +4 -0
- data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_false/does_not_update_the_config_file.yml +199 -0
- data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_true/does_not_update_the_config_file.yml +199 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/does_not_alter_the_configuration.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_access_token.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_refresh_token.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/does_not_alter_the_configuration.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_access_token.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_refresh_token.yml +99 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/does_not_alter_the_configuration.yml +149 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_access_token.yml +149 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_refresh_token.yml +149 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/creates_the_configuration.yml +101 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/refreshed_tokens.yml +101 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/creates_the_configuration.yml +101 -0
- data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/refreshed_tokens.yml +101 -0
- data/spec/cassettes/brightbox_accounts/list/_when_access_token_expired_/does_not_report_invalid_token_errors.yml +64 -18
- data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_/does_not_report_invalid_token_errors.yml +62 -16
- data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_error.yml +101 -0
- data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_prompt_to_rerun_the_command.yml +101 -0
- data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/prompts_for_the_password.yml +101 -0
- data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/requests_access_tokens.yml +101 -0
- data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/sets_up_the_config.yml +101 -0
- data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_error.yml +101 -0
- data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_prompt_to_rerun_the_command.yml +101 -0
- data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/prompts_for_the_password.yml +101 -0
- data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/requests_access_tokens.yml +101 -0
- data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/sets_up_the_config.yml +101 -0
- data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_error.yml +51 -0
- data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_prompt_to_rerun_the_command.yml +51 -0
- data/spec/cassettes/brightbox_login/when_default_account_is_passed/prompts_for_the_password.yml +51 -0
- data/spec/cassettes/brightbox_login/when_default_account_is_passed/requests_access_tokens.yml +51 -0
- data/spec/cassettes/brightbox_login/when_default_account_is_passed/sets_up_the_config.yml +51 -0
- data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_error.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_prompt_to_rerun_the_command.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_config_is_present/requests_access_tokens.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_config_is_present/sets_up_the_config.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_error.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_prompt_to_rerun_the_command.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_password_is_given/prompts_for_the_password.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_password_is_given/requests_access_tokens.yml +101 -0
- data/spec/cassettes/brightbox_login/when_no_password_is_given/sets_up_the_config.yml +101 -0
- data/spec/commands/accounts/list_spec.rb +1 -0
- data/spec/commands/login_spec.rb +239 -0
- data/spec/configs/user_app.ini +0 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/support/config_helpers.rb +5 -0
- data/spec/unit/brightbox/account/all_spec.rb +1 -3
- data/spec/unit/brightbox/api/conn_spec.rb +3 -0
- data/spec/unit/brightbox/api/find_spec.rb +3 -0
- data/spec/unit/brightbox/bb_config/account_spec.rb +2 -0
- data/spec/unit/brightbox/bb_config/add_login_spec.rb +222 -0
- data/spec/unit/brightbox/bb_config/client_name_spec.rb +4 -12
- data/spec/unit/brightbox/bb_config/client_named_spec.rb +1 -1
- data/spec/unit/brightbox/bb_config/config_directory_exists_spec.rb +5 -2
- data/spec/unit/brightbox/bb_config/config_directory_spec.rb +4 -2
- data/spec/unit/brightbox/bb_config/config_spec.rb +4 -8
- data/spec/unit/brightbox/bb_config/default_account_spec.rb +10 -6
- data/spec/unit/brightbox/bb_config/find_or_set_default_account_spec.rb +2 -0
- data/spec/unit/brightbox/bb_config/renew_tokens_spec.rb +3 -0
- data/spec/unit/brightbox/bb_config/section_names_spec.rb +46 -0
- data/spec/unit/brightbox/bb_config/using_client_spec.rb +12 -12
- data/spec/unit/brightbox/bb_config_spec.rb +0 -1
- data/spec/unit/brightbox/cloud_ip/find_spec.rb +3 -0
- data/spec/unit/brightbox/config/user_application/to_fog_spec.rb +33 -29
- data/spec/unit/brightbox/config/user_application/valid_spec.rb +0 -32
- data/spec/unit/brightbox/connection_manager/fetch_connection_spec.rb +7 -3
- data/spec/unit/brightbox/firewall_policy/apply_to_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_policy/create_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_policy/destroy_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_policy/find_or_call_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_policy/find_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_rule/create_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_rule/destroy_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_rule/find_spec.rb +3 -0
- data/spec/unit/brightbox/firewall_rule/from_policy_spec.rb +3 -0
- data/spec/unit/brightbox/server/destroy_spec.rb +4 -0
- data/spec/unit/brightbox/server/find_or_call_spec.rb +3 -0
- data/spec/unit/brightbox/server/find_spec.rb +4 -0
- data/spec/unit/brightbox/server/shutdown_spec.rb +4 -0
- data/spec/unit/brightbox/server/start_spec.rb +4 -0
- data/spec/unit/brightbox/server/stop_spec.rb +4 -0
- data/spec/unit/brightbox/server/update_spec.rb +4 -0
- data/spec/unit/brightbox/server_group/find_spec.rb +3 -0
- data/spec/unit/brightbox/user_collaboration/get_for_account_spec.rb +3 -0
- metadata +90 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 878ff7e5b319cc7c15095db32d0091a6e1d2988b
|
|
4
|
+
data.tar.gz: d5809b9c66921ea3820855723d871fb1eeeb99ec
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 95b4dce981e19ad00c6f79636cc4bd29c620eee0ca43eb5256be40c2a5c60be9de634348c861177a21f4d4d72720ed1b26b8c8efbb787c8948011bddc55d148b
|
|
7
|
+
data.tar.gz: e5f9235468da53a0f4635665376dae4f9f35d4d43612c144ef36bc343342f03496cf1eb415fa682217fd101b09bd1ac06222f6f58b28d5987fb3ca12cf53765e
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
### v2.3.0 / 2015-10-23
|
|
2
|
+
|
|
3
|
+
[Full Changelog](https://github.com/brightbox/brightbox-cli/compare/v2.2.0...v2.3.0)
|
|
4
|
+
|
|
5
|
+
Enhancements:
|
|
6
|
+
|
|
7
|
+
* Adds embedded client that is used when a user has not setup their own
|
|
8
|
+
application.
|
|
9
|
+
* Adds `brightbox login` command which allows a simplified login for users with
|
|
10
|
+
just their email address and password (prompted).
|
|
11
|
+
|
|
12
|
+
brightbox login user@example.com
|
|
13
|
+
|
|
14
|
+
This uses the embedded application to save extra steps setting up.
|
|
15
|
+
|
|
16
|
+
Bug fixes:
|
|
17
|
+
|
|
18
|
+
* Guard against errors when using `DEBUG=true` whilst configuration is not
|
|
19
|
+
selected triggering a `NoMethodError`
|
|
20
|
+
* Use `pry-remote` for debugging. `pry` runs in process and the IO is trapped
|
|
21
|
+
when testing and in some error cases making it unusable.
|
|
22
|
+
* Fix configuration code so it can initialise without network side effects when
|
|
23
|
+
reading client_name and other values.
|
|
24
|
+
|
|
1
25
|
### v2.2.0 / 2015-09-28
|
|
2
26
|
|
|
3
27
|
[Full Changelog](https://github.com/brightbox/brightbox-cli/compare/v2.1.2...v2.2.0)
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
brightbox-cli (2.
|
|
4
|
+
brightbox-cli (2.3.0)
|
|
5
5
|
fog-brightbox (>= 0.9.0)
|
|
6
6
|
gli (~> 2.12.0)
|
|
7
7
|
highline (~> 1.6.0)
|
|
@@ -50,6 +50,9 @@ GEM
|
|
|
50
50
|
coderay (~> 1.0.5)
|
|
51
51
|
method_source (~> 0.8)
|
|
52
52
|
slop (~> 3.4)
|
|
53
|
+
pry-remote (0.1.8)
|
|
54
|
+
pry (~> 0.9)
|
|
55
|
+
slop (~> 3.0)
|
|
53
56
|
rake (10.1.0)
|
|
54
57
|
rspec (2.99.0)
|
|
55
58
|
rspec-core (~> 2.99.0)
|
|
@@ -68,7 +71,7 @@ PLATFORMS
|
|
|
68
71
|
DEPENDENCIES
|
|
69
72
|
brightbox-cli!
|
|
70
73
|
mocha
|
|
71
|
-
pry
|
|
74
|
+
pry-remote
|
|
72
75
|
rake
|
|
73
76
|
rspec (~> 2.99)
|
|
74
77
|
vcr (~> 2.5)
|
data/brightbox-cli.gemspec
CHANGED
|
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
|
|
|
30
30
|
s.add_dependency "hirb", "~> 0.6"
|
|
31
31
|
|
|
32
32
|
s.add_development_dependency "mocha"
|
|
33
|
-
s.add_development_dependency "pry"
|
|
33
|
+
s.add_development_dependency "pry-remote"
|
|
34
34
|
s.add_development_dependency "rake"
|
|
35
35
|
s.add_development_dependency "rspec", "~> 2.99"
|
|
36
36
|
s.add_development_dependency "vcr", "~> 2.5"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "singleton"
|
|
2
|
+
|
|
3
|
+
module Brightbox
|
|
4
|
+
module CLI
|
|
5
|
+
class Config
|
|
6
|
+
include Singleton
|
|
7
|
+
|
|
8
|
+
attr_accessor :config
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.config
|
|
13
|
+
CLI::Config.instance.config
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.config=(replacement)
|
|
17
|
+
CLI::Config.instance.config = replacement
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -17,7 +17,7 @@ module Brightbox
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def self.all
|
|
20
|
-
if
|
|
20
|
+
if Brightbox.config.using_application?
|
|
21
21
|
conn.accounts.all
|
|
22
22
|
else
|
|
23
23
|
[conn.account]
|
|
@@ -25,7 +25,7 @@ module Brightbox
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def self.get(id)
|
|
28
|
-
if
|
|
28
|
+
if Brightbox.config.using_application?
|
|
29
29
|
a = conn.accounts.get(id)
|
|
30
30
|
else
|
|
31
31
|
a = conn.account
|
data/lib/brightbox-cli/api.rb
CHANGED
|
@@ -22,7 +22,7 @@ module Brightbox
|
|
|
22
22
|
if @@connection_manager
|
|
23
23
|
@@connection_manager.fetch_connection(require_account?)
|
|
24
24
|
else
|
|
25
|
-
@@connection_manager = Brightbox::ConnectionManager.new(
|
|
25
|
+
@@connection_manager = Brightbox::ConnectionManager.new(Brightbox.config.to_fog)
|
|
26
26
|
@@connection_manager.fetch_connection(require_account?)
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -52,7 +52,7 @@ module Brightbox
|
|
|
52
52
|
else
|
|
53
53
|
raise InvalidArguments, "Can't initialize #{self.class} with #{m.inspect}"
|
|
54
54
|
end
|
|
55
|
-
|
|
55
|
+
Brightbox.config.cache_id(@id) if Brightbox.config.respond_to?(:cache_id)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def fog_model
|
|
@@ -164,7 +164,7 @@ module Brightbox
|
|
|
164
164
|
if value
|
|
165
165
|
value
|
|
166
166
|
else
|
|
167
|
-
|
|
167
|
+
Brightbox.config.cache_id id
|
|
168
168
|
@cache[id] = get(id)
|
|
169
169
|
end
|
|
170
170
|
end
|
|
@@ -179,7 +179,7 @@ module Brightbox
|
|
|
179
179
|
@cache = {}
|
|
180
180
|
all.each do |f|
|
|
181
181
|
@cache[f.id] = f
|
|
182
|
-
|
|
182
|
+
Brightbox.config.cache_id f.id
|
|
183
183
|
end
|
|
184
184
|
end
|
|
185
185
|
|
|
@@ -8,7 +8,7 @@ module Brightbox
|
|
|
8
8
|
cmd.command [:list] do |c|
|
|
9
9
|
|
|
10
10
|
c.action do |global_options, _options, _args|
|
|
11
|
-
if
|
|
11
|
+
if Brightbox.config.using_application?
|
|
12
12
|
# Collaborating Accounts are combined from owned and collaborations
|
|
13
13
|
accounts = CollaboratingAccount.all
|
|
14
14
|
else
|
|
@@ -14,7 +14,7 @@ module Brightbox
|
|
|
14
14
|
|
|
15
15
|
c.action do |_global_options, options, args|
|
|
16
16
|
|
|
17
|
-
info "Using config file #{
|
|
17
|
+
info "Using config file #{Brightbox.config.config_filename}"
|
|
18
18
|
|
|
19
19
|
client_id = args.shift
|
|
20
20
|
secret = args.shift
|
|
@@ -39,7 +39,7 @@ module Brightbox
|
|
|
39
39
|
:api_url => api_url,
|
|
40
40
|
:auth_url => auth_url
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
Brightbox.config.add_section(calias, client_id, secret, options)
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -7,16 +7,16 @@ module Brightbox
|
|
|
7
7
|
|
|
8
8
|
c.action do |_global_options, _options, args|
|
|
9
9
|
|
|
10
|
-
info "Using config file #{
|
|
10
|
+
info "Using config file #{Brightbox.config.config_filename}"
|
|
11
11
|
calias = args.shift
|
|
12
12
|
|
|
13
13
|
if calias.nil?
|
|
14
14
|
raise "You must specify the api alias you want to set as the default"
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
if
|
|
17
|
+
if Brightbox.config.client_named?(calias)
|
|
18
18
|
info "Setting #{calias} as default api client"
|
|
19
|
-
|
|
19
|
+
Brightbox.config.set_default_client(calias)
|
|
20
20
|
else
|
|
21
21
|
raise "An api client with the alias #{calias} does not exist in the config"
|
|
22
22
|
end
|
|
@@ -8,21 +8,21 @@ module Brightbox
|
|
|
8
8
|
|
|
9
9
|
c.action do |global_options, _options, _args|
|
|
10
10
|
|
|
11
|
-
info "Using config file #{
|
|
11
|
+
info "Using config file #{Brightbox.config.config_filename}"
|
|
12
12
|
|
|
13
|
-
clients =
|
|
14
|
-
c =
|
|
13
|
+
clients = Brightbox.config.section_names.map do |cid|
|
|
14
|
+
c = Brightbox.config[cid]
|
|
15
15
|
calias = c["alias"] || cid
|
|
16
16
|
|
|
17
17
|
# Append a star for the configured default client
|
|
18
|
-
if
|
|
18
|
+
if Brightbox.config.default_client == cid && Brightbox.config.has_multiple_clients?
|
|
19
19
|
calias = "*#{calias}"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
{
|
|
23
23
|
:alias => calias,
|
|
24
|
-
:client_id => c["client_id"],
|
|
25
|
-
:secret => c["secret"],
|
|
24
|
+
:client_id => c["client_id"] || Brightbox::EMBEDDED_APP_ID,
|
|
25
|
+
:secret => c["secret"] || Brightbox::EMBEDDED_APP_SECRET,
|
|
26
26
|
:api_url => c["api_url"],
|
|
27
27
|
:auth_url => c["auth_url"] || c["api_url"]
|
|
28
28
|
}
|
|
@@ -7,7 +7,7 @@ module Brightbox
|
|
|
7
7
|
|
|
8
8
|
c.action do |_global_options, _options, args|
|
|
9
9
|
|
|
10
|
-
info "Using config file #{
|
|
10
|
+
info "Using config file #{Brightbox.config.config_filename}"
|
|
11
11
|
|
|
12
12
|
calias = args.shift
|
|
13
13
|
|
|
@@ -15,8 +15,8 @@ module Brightbox
|
|
|
15
15
|
raise "You must specify the api alias you want to remove"
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
client_config =
|
|
19
|
-
|
|
18
|
+
client_config = Brightbox.config.section_names.find do |config|
|
|
19
|
+
Brightbox.config[config]["alias"] == calias
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
if client_config.nil?
|
|
@@ -24,7 +24,7 @@ module Brightbox
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
info "Removing api client #{calias}"
|
|
27
|
-
|
|
27
|
+
Brightbox.config.delete_section client_config
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
end
|
|
@@ -15,7 +15,7 @@ module Brightbox
|
|
|
15
15
|
|
|
16
16
|
require 'highline'
|
|
17
17
|
|
|
18
|
-
info "Using config file #{
|
|
18
|
+
info "Using config file #{Brightbox.config.config_filename}"
|
|
19
19
|
|
|
20
20
|
email = args.shift
|
|
21
21
|
client_id = args.shift
|
|
@@ -57,7 +57,7 @@ module Brightbox
|
|
|
57
57
|
:api_url => api_url,
|
|
58
58
|
:auth_url => auth_url
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
Brightbox.config.add_section(calias, client_id, secret, options)
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Brightbox
|
|
2
|
+
command [:login] do |cmd|
|
|
3
|
+
cmd.desc I18n.t("login.desc")
|
|
4
|
+
cmd.arg_name "email"
|
|
5
|
+
|
|
6
|
+
cmd.desc "password, if not specified you will be prompted"
|
|
7
|
+
cmd.flag [:p, "password"]
|
|
8
|
+
|
|
9
|
+
cmd.desc "default account"
|
|
10
|
+
cmd.flag [:"default-account"]
|
|
11
|
+
|
|
12
|
+
cmd.flag [:"application-id"]
|
|
13
|
+
cmd.flag [:"application-secret"]
|
|
14
|
+
|
|
15
|
+
cmd.flag [:"api-url"]
|
|
16
|
+
cmd.flag [:"auth-url"]
|
|
17
|
+
|
|
18
|
+
cmd.action do |_global_options, options, args|
|
|
19
|
+
config_name = args.shift
|
|
20
|
+
email = config_name
|
|
21
|
+
|
|
22
|
+
raise "You must specify your email address" if email.nil?
|
|
23
|
+
|
|
24
|
+
password = options[:p]
|
|
25
|
+
password = Brightbox.config.gpg_password unless password
|
|
26
|
+
|
|
27
|
+
if !password || password.empty?
|
|
28
|
+
require "highline"
|
|
29
|
+
highline = HighLine.new
|
|
30
|
+
password = highline.ask("Enter your password : ") { |q| q.echo = false }
|
|
31
|
+
end
|
|
32
|
+
raise "You must specify your Brightbox password." if password.empty?
|
|
33
|
+
|
|
34
|
+
api_url = options[:"api-url"] || DEFAULT_API_ENDPOINT
|
|
35
|
+
auth_url = options[:"auth-url"] || api_url
|
|
36
|
+
|
|
37
|
+
section_options = {
|
|
38
|
+
:client_name => config_name,
|
|
39
|
+
:alias => config_name,
|
|
40
|
+
:username => email,
|
|
41
|
+
:password => password,
|
|
42
|
+
:api_url => api_url,
|
|
43
|
+
:auth_url => auth_url
|
|
44
|
+
}
|
|
45
|
+
section_options[:default_account] = options[:"default-account"] if options[:"default-account"]
|
|
46
|
+
|
|
47
|
+
section_options[:client_id] = options[:"application-id"] if options[:"application-id"]
|
|
48
|
+
section_options[:secret] = options[:"application-secret"] if options[:"application-secret"]
|
|
49
|
+
|
|
50
|
+
Brightbox.config.add_login(email, password, section_options)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -22,6 +22,11 @@ module Brightbox
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
def determine_account(preferred_account)
|
|
26
|
+
return preferred_account if preferred_account
|
|
27
|
+
return config[client_name]["default_account"] unless client_name.nil?
|
|
28
|
+
end
|
|
29
|
+
|
|
25
30
|
def account
|
|
26
31
|
if defined?(@account) && @account
|
|
27
32
|
@account
|
|
@@ -4,7 +4,7 @@ module Brightbox
|
|
|
4
4
|
attr_writer :access_token, :refresh_token
|
|
5
5
|
|
|
6
6
|
def access_token_filename
|
|
7
|
-
file_name = "#{
|
|
7
|
+
file_name = "#{base_token_name}.oauth_token"
|
|
8
8
|
@access_token_filename ||= File.join(config_directory, file_name)
|
|
9
9
|
end
|
|
10
10
|
|
|
@@ -20,7 +20,7 @@ module Brightbox
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def refresh_token_filename
|
|
23
|
-
file_name = "#{
|
|
23
|
+
file_name = "#{base_token_name}.refresh_token"
|
|
24
24
|
@refresh_token_filename ||= File.join(config_directory, file_name)
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -55,7 +55,7 @@ module Brightbox
|
|
|
55
55
|
# This attempts to renew access (and refresh) tokens for the current
|
|
56
56
|
# configuration based on the current connection.
|
|
57
57
|
#
|
|
58
|
-
# @note
|
|
58
|
+
# @note Brightbox.config and Api.conn are actually two different worlds and should
|
|
59
59
|
# be merged (so a configuration holds the current connection)
|
|
60
60
|
#
|
|
61
61
|
def renew_tokens(options = {})
|
|
@@ -234,6 +234,13 @@ module Brightbox
|
|
|
234
234
|
def cached_refresh_token
|
|
235
235
|
File.open(refresh_token_filename, "r") { |fl| fl.read.chomp }
|
|
236
236
|
end
|
|
237
|
+
|
|
238
|
+
private
|
|
239
|
+
|
|
240
|
+
def base_token_name
|
|
241
|
+
return nil if client_name.nil?
|
|
242
|
+
client_name.gsub("/", "_")
|
|
243
|
+
end
|
|
237
244
|
end
|
|
238
245
|
end
|
|
239
246
|
end
|
|
@@ -2,21 +2,17 @@ module Brightbox
|
|
|
2
2
|
module Config
|
|
3
3
|
module Cache
|
|
4
4
|
def cache_path
|
|
5
|
-
|
|
6
|
-
@cache_path
|
|
7
|
-
else
|
|
8
|
-
@cache_path = File.join(config_directory, 'cache')
|
|
9
|
-
unless File.exist? @cache_path
|
|
10
|
-
begin
|
|
11
|
-
FileUtils.mkpath @cache_path
|
|
12
|
-
rescue Errno::EEXIST
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
@cache_path
|
|
16
|
-
end
|
|
5
|
+
File.join(config_directory, "cache")
|
|
17
6
|
end
|
|
18
7
|
|
|
19
8
|
def cache_id(cid)
|
|
9
|
+
return if cid.nil?
|
|
10
|
+
unless File.exist?(cache_path)
|
|
11
|
+
begin
|
|
12
|
+
FileUtils.mkpath(cache_path)
|
|
13
|
+
rescue Errno::EEXIST
|
|
14
|
+
end
|
|
15
|
+
end
|
|
20
16
|
FileUtils.touch(File.join(cache_path, cid)) unless cid.nil?
|
|
21
17
|
end
|
|
22
18
|
end
|
|
@@ -8,12 +8,16 @@ module Brightbox
|
|
|
8
8
|
|
|
9
9
|
# Is the currently selected config using user application details?
|
|
10
10
|
def using_application?
|
|
11
|
-
|
|
11
|
+
if client_name
|
|
12
|
+
!config[client_name]["username"].nil?
|
|
13
|
+
else
|
|
14
|
+
raise NoSelectedClientError, NO_CLIENT_MESSAGE
|
|
15
|
+
end
|
|
12
16
|
end
|
|
13
17
|
|
|
14
18
|
# Does this config have multiple clients defined within?
|
|
15
19
|
def has_multiple_clients?
|
|
16
|
-
|
|
20
|
+
section_names.size > 1
|
|
17
21
|
end
|
|
18
22
|
|
|
19
23
|
# Does the currently selected client have an alias and a config section
|
|
@@ -32,44 +36,9 @@ module Brightbox
|
|
|
32
36
|
selected_config["alias"] || client_name
|
|
33
37
|
end
|
|
34
38
|
|
|
35
|
-
# Returns a client name or raises depending on a number of factors.
|
|
36
|
-
#
|
|
37
|
-
# FIXME: This combines too much decision making into what appears to be a
|
|
38
|
-
# getter.
|
|
39
|
-
#
|
|
40
|
-
# If a default_client is not set and there are more than one client it
|
|
41
|
-
# raises an error because it is ambiguous which to use.
|
|
42
|
-
#
|
|
43
|
-
# If +force_default_config+ is passed in as false (for +config+ commands)
|
|
44
|
-
# then it attempts to use the first config
|
|
45
|
-
#
|
|
46
|
-
# Calling +client_name+ within the +config+ command will break the config
|
|
47
|
-
# command because you can no longer manage your config (and set a default)
|
|
48
|
-
#
|
|
49
|
-
# This has been fixed by short circuiting to return +nil+ in that case which
|
|
50
|
-
# should never exist now.
|
|
51
|
-
#
|
|
52
|
-
def client_name
|
|
53
|
-
if @client_name
|
|
54
|
-
@client_name
|
|
55
|
-
else
|
|
56
|
-
# If we do not require a default client do not error if one is not set
|
|
57
|
-
# TODO: Remove when certain unused
|
|
58
|
-
if @options[:force_default_config] == false
|
|
59
|
-
@client_name = default_client
|
|
60
|
-
else
|
|
61
|
-
# Is client ambigious?
|
|
62
|
-
if default_client.nil? && clients.length > 1
|
|
63
|
-
raise AmbiguousClientError, AMBIGUOUS_CLIENT_ERROR
|
|
64
|
-
end
|
|
65
|
-
@client_name = default_client || clients.first
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
39
|
# Returns the actual client ID with no risk of an alias
|
|
71
40
|
def client_id
|
|
72
|
-
selected_config["client_id"]
|
|
41
|
+
selected_config["client_id"] || Brightbox::EMBEDDED_APP_ID
|
|
73
42
|
end
|
|
74
43
|
|
|
75
44
|
# @todo Account for "core" section
|
|
@@ -104,6 +73,13 @@ module Brightbox
|
|
|
104
73
|
@default_client = nil
|
|
105
74
|
end
|
|
106
75
|
|
|
76
|
+
def determine_client(preferred_client = nil)
|
|
77
|
+
return preferred_client unless preferred_client.nil?
|
|
78
|
+
return default_client unless default_client.nil?
|
|
79
|
+
section_names.first unless section_names.empty?
|
|
80
|
+
nil
|
|
81
|
+
end
|
|
82
|
+
|
|
107
83
|
private
|
|
108
84
|
|
|
109
85
|
# If the prefix is in the client ID (identifier not alias) be +true+
|
|
@@ -1,6 +1,63 @@
|
|
|
1
1
|
module Brightbox
|
|
2
2
|
module Config
|
|
3
3
|
module Sections
|
|
4
|
+
#
|
|
5
|
+
# @param [String] config_alias The section name usually `email` but `email/suffix` allowed.
|
|
6
|
+
# @param [String] password
|
|
7
|
+
# @param [Hash] options
|
|
8
|
+
# @option options [String] :api_url
|
|
9
|
+
# @option options [String] :auth_url
|
|
10
|
+
# @option options [String] :default_account
|
|
11
|
+
# @option options [String] :client_id
|
|
12
|
+
# @option options [String] :secret
|
|
13
|
+
#
|
|
14
|
+
def add_login(config_alias, password, options = {})
|
|
15
|
+
# If a custom alias is passed, used that for the config header, otherwise use email
|
|
16
|
+
email = config_alias.split("/").first
|
|
17
|
+
config_section = config[config_alias]
|
|
18
|
+
|
|
19
|
+
info "Creating new client config #{config_alias}" if config_section.empty?
|
|
20
|
+
|
|
21
|
+
config_section["username"] = email unless config_section["username"]
|
|
22
|
+
|
|
23
|
+
config_section["api_url"] = options[:api_url] if options.key?(:api_url)
|
|
24
|
+
config_section["api_url"] = DEFAULT_API_ENDPOINT unless config_section["api_url"]
|
|
25
|
+
|
|
26
|
+
config_section["auth_url"] = options[:auth_url] if options.key?(:auth_url)
|
|
27
|
+
config_section["auth_url"] = config_section["api_url"]
|
|
28
|
+
|
|
29
|
+
config_section["default_account"] = options[:default_account] if options.key?(:default_account)
|
|
30
|
+
|
|
31
|
+
config_section["client_id"] = options[:client_id] if options.key?(:client_id)
|
|
32
|
+
config_section["secret"] = options[:secret] if options.key?(:secret)
|
|
33
|
+
|
|
34
|
+
dirty!
|
|
35
|
+
|
|
36
|
+
self.client_name = client_alias
|
|
37
|
+
|
|
38
|
+
# Renew tokens via config...
|
|
39
|
+
#
|
|
40
|
+
# Part of the "login" behaviour is to always refresh them
|
|
41
|
+
#
|
|
42
|
+
begin
|
|
43
|
+
flush_access_token!
|
|
44
|
+
renew_tokens(:client_name => config_alias, :password => password)
|
|
45
|
+
rescue => e
|
|
46
|
+
error "Something went wrong trying to refresh new tokens #{e.message}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Try to determine a default account
|
|
50
|
+
unless default_account == find_or_set_default_account
|
|
51
|
+
info "The default account of #{default_account} has been selected"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# If only client then set it as the default
|
|
55
|
+
set_default_client(client_alias) unless default_client
|
|
56
|
+
|
|
57
|
+
# Ensure all our config changes are now saved
|
|
58
|
+
save
|
|
59
|
+
end
|
|
60
|
+
|
|
4
61
|
#
|
|
5
62
|
# @param [String] client_alias
|
|
6
63
|
# @param [String] client_id
|
|
@@ -12,26 +69,26 @@ module Brightbox
|
|
|
12
69
|
# @option options [String] :auth_url
|
|
13
70
|
#
|
|
14
71
|
def add_section(client_alias, client_id, secret, options)
|
|
15
|
-
|
|
16
|
-
if
|
|
72
|
+
config_section = config[client_alias]
|
|
73
|
+
if config_section.empty?
|
|
17
74
|
info "Creating new client config #{client_alias}"
|
|
18
75
|
else
|
|
19
76
|
old_calias = client_alias
|
|
20
77
|
|
|
21
|
-
deduplicator = Brightbox::Config::SectionNameDeduplicator.new(client_alias,
|
|
78
|
+
deduplicator = Brightbox::Config::SectionNameDeduplicator.new(client_alias, section_names)
|
|
22
79
|
client_alias = deduplicator.next
|
|
23
80
|
# Need to open the new config again
|
|
24
|
-
|
|
81
|
+
config_section = config[client_alias]
|
|
25
82
|
|
|
26
83
|
info "A client config named #{old_calias} already exists using #{client_alias} instead"
|
|
27
84
|
end
|
|
28
85
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
86
|
+
config_section["alias"] = client_alias
|
|
87
|
+
config_section["client_id"] = client_id
|
|
88
|
+
config_section["username"] = options[:username]
|
|
89
|
+
config_section["secret"] = secret
|
|
90
|
+
config_section["api_url"] = options[:api_url] || DEFAULT_API_ENDPOINT
|
|
91
|
+
config_section["auth_url"] = options[:auth_url] || config_section["api_url"]
|
|
35
92
|
|
|
36
93
|
dirty!
|
|
37
94
|
|
|
@@ -85,13 +142,13 @@ module Brightbox
|
|
|
85
142
|
config[section_name]
|
|
86
143
|
end
|
|
87
144
|
|
|
88
|
-
# Returns the
|
|
145
|
+
# Returns the section names in the config
|
|
89
146
|
#
|
|
90
147
|
# @return [Array<String>]
|
|
91
148
|
#
|
|
92
|
-
def
|
|
149
|
+
def section_names
|
|
93
150
|
# Exclude the global "core" section
|
|
94
|
-
config.sections.
|
|
151
|
+
config.sections.reject { |s| %w(core alias).include?(s) }
|
|
95
152
|
end
|
|
96
153
|
|
|
97
154
|
private
|
|
@@ -3,7 +3,7 @@ module Brightbox
|
|
|
3
3
|
class UserApplication
|
|
4
4
|
# FIXME: api_url should use fog's underlying default
|
|
5
5
|
#
|
|
6
|
-
NON_BLANK_KEYS = %w(api_url
|
|
6
|
+
NON_BLANK_KEYS = %w(api_url username)
|
|
7
7
|
|
|
8
8
|
attr_accessor :selected_config, :client_name
|
|
9
9
|
|
|
@@ -19,8 +19,8 @@ module Brightbox
|
|
|
19
19
|
:provider => 'Brightbox',
|
|
20
20
|
:brightbox_api_url => selected_config['api_url'],
|
|
21
21
|
:brightbox_auth_url => selected_config['auth_url'] || selected_config['api_url'],
|
|
22
|
-
:brightbox_client_id =>
|
|
23
|
-
:brightbox_secret =>
|
|
22
|
+
:brightbox_client_id => client_id,
|
|
23
|
+
:brightbox_secret => client_secret,
|
|
24
24
|
:persistent => persistent?
|
|
25
25
|
}
|
|
26
26
|
end
|
|
@@ -55,6 +55,14 @@ module Brightbox
|
|
|
55
55
|
|
|
56
56
|
private
|
|
57
57
|
|
|
58
|
+
def client_id
|
|
59
|
+
selected_config["client_id"] || Brightbox::EMBEDDED_APP_ID
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def client_secret
|
|
63
|
+
selected_config["secret"] || Brightbox::EMBEDDED_APP_SECRET
|
|
64
|
+
end
|
|
65
|
+
|
|
58
66
|
def persistent?
|
|
59
67
|
if selected_config["persistent"] == "false"
|
|
60
68
|
false
|
|
@@ -68,8 +76,8 @@ module Brightbox
|
|
|
68
76
|
:provider => 'Brightbox',
|
|
69
77
|
:brightbox_api_url => selected_config['api_url'],
|
|
70
78
|
:brightbox_auth_url => selected_config['auth_url'] || selected_config['api_url'],
|
|
71
|
-
:brightbox_client_id =>
|
|
72
|
-
:brightbox_secret =>
|
|
79
|
+
:brightbox_client_id => client_id,
|
|
80
|
+
:brightbox_secret => client_secret,
|
|
73
81
|
:brightbox_username => selected_config["username"],
|
|
74
82
|
:persistent => persistent?
|
|
75
83
|
}
|