brightbox-cli 3.3.0 → 4.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/ruby.yml +1 -1
  4. data/.gitignore +1 -1
  5. data/.rubocop.yml +70 -0
  6. data/CHANGELOG.md +52 -0
  7. data/Gemfile.lock +66 -39
  8. data/README +11 -16
  9. data/README.rdoc +1 -1
  10. data/brightbox-cli.gemspec +20 -33
  11. data/lib/brightbox-cli/accounts.rb +9 -11
  12. data/lib/brightbox-cli/api.rb +38 -36
  13. data/lib/brightbox-cli/cloud_ips.rb +8 -8
  14. data/lib/brightbox-cli/collaborating_account.rb +5 -5
  15. data/lib/brightbox-cli/collaboration.rb +1 -1
  16. data/lib/brightbox-cli/commands/accounts/{accept-invite.rb → accept_invite.rb} +2 -6
  17. data/lib/brightbox-cli/commands/accounts/default.rb +1 -2
  18. data/lib/brightbox-cli/commands/accounts/list.rb +6 -8
  19. data/lib/brightbox-cli/commands/accounts/remove.rb +2 -6
  20. data/lib/brightbox-cli/commands/accounts/{reset-ftp-password.rb → reset_ftp_password.rb} +6 -9
  21. data/lib/brightbox-cli/commands/accounts/show.rb +10 -13
  22. data/lib/brightbox-cli/commands/cloudips/create.rb +2 -5
  23. data/lib/brightbox-cli/commands/cloudips/destroy.rb +10 -14
  24. data/lib/brightbox-cli/commands/cloudips/list.rb +0 -2
  25. data/lib/brightbox-cli/commands/cloudips/map.rb +10 -13
  26. data/lib/brightbox-cli/commands/cloudips/show.rb +11 -14
  27. data/lib/brightbox-cli/commands/cloudips/unmap.rb +2 -4
  28. data/lib/brightbox-cli/commands/cloudips/update.rb +2 -4
  29. data/lib/brightbox-cli/commands/collaborations.rb +2 -3
  30. data/lib/brightbox-cli/commands/config/{client-add.rb → client_add.rb} +0 -3
  31. data/lib/brightbox-cli/commands/config/client_default.rb +18 -0
  32. data/lib/brightbox-cli/commands/config/{client-list.rb → client_list.rb} +1 -4
  33. data/lib/brightbox-cli/commands/config/{client-remove.rb → client_remove.rb} +0 -3
  34. data/lib/brightbox-cli/commands/config/{user-add.rb → user_add.rb} +1 -4
  35. data/lib/brightbox-cli/commands/firewall/{policies-apply.rb → policies_apply.rb} +2 -2
  36. data/lib/brightbox-cli/commands/firewall/{policies-create.rb → policies_create.rb} +2 -4
  37. data/lib/brightbox-cli/commands/firewall/{policies-destroy.rb → policies_destroy.rb} +0 -3
  38. data/lib/brightbox-cli/commands/firewall/{policies-list.rb → policies_list.rb} +0 -2
  39. data/lib/brightbox-cli/commands/firewall/{policies-remove.rb → policies_remove.rb} +2 -2
  40. data/lib/brightbox-cli/commands/firewall/{policies-show.rb → policies_show.rb} +6 -8
  41. data/lib/brightbox-cli/commands/firewall/{policies-update.rb → policies_update.rb} +2 -4
  42. data/lib/brightbox-cli/commands/firewall/{rules-create.rb → rules_create.rb} +6 -8
  43. data/lib/brightbox-cli/commands/firewall/{rules-destroy.rb → rules_destroy.rb} +0 -2
  44. data/lib/brightbox-cli/commands/firewall/{rules-list.rb → rules_list.rb} +0 -2
  45. data/lib/brightbox-cli/commands/firewall/{rules-show.rb → rules_show.rb} +7 -9
  46. data/lib/brightbox-cli/commands/firewall/{rules-update.rb → rules_update.rb} +7 -8
  47. data/lib/brightbox-cli/commands/groups/{add-server.rb → add_server.rb} +0 -2
  48. data/lib/brightbox-cli/commands/groups/create.rb +2 -3
  49. data/lib/brightbox-cli/commands/groups/destroy.rb +0 -2
  50. data/lib/brightbox-cli/commands/groups/list.rb +0 -1
  51. data/lib/brightbox-cli/commands/groups/move_servers.rb +2 -3
  52. data/lib/brightbox-cli/commands/groups/{remove-servers.rb → remove_servers.rb} +2 -4
  53. data/lib/brightbox-cli/commands/groups/show.rb +0 -2
  54. data/lib/brightbox-cli/commands/groups/update.rb +2 -3
  55. data/lib/brightbox-cli/commands/images/destroy.rb +0 -4
  56. data/lib/brightbox-cli/commands/images/list.rb +3 -5
  57. data/lib/brightbox-cli/commands/images/register.rb +9 -17
  58. data/lib/brightbox-cli/commands/images/show.rb +19 -20
  59. data/lib/brightbox-cli/commands/images/update.rb +12 -8
  60. data/lib/brightbox-cli/commands/lbs/{add-nodes.rb → add_nodes.rb} +0 -3
  61. data/lib/brightbox-cli/commands/lbs/create.rb +5 -7
  62. data/lib/brightbox-cli/commands/lbs/destroy.rb +0 -3
  63. data/lib/brightbox-cli/commands/lbs/list.rb +0 -1
  64. data/lib/brightbox-cli/commands/lbs/{remove-nodes.rb → remove_nodes.rb} +0 -3
  65. data/lib/brightbox-cli/commands/lbs/show.rb +20 -22
  66. data/lib/brightbox-cli/commands/lbs/update.rb +6 -9
  67. data/lib/brightbox-cli/commands/login.rb +13 -12
  68. data/lib/brightbox-cli/commands/servers/{activate-console.rb → activate_console.rb} +2 -5
  69. data/lib/brightbox-cli/commands/servers/create.rb +24 -25
  70. data/lib/brightbox-cli/commands/servers/destroy.rb +0 -3
  71. data/lib/brightbox-cli/commands/servers/list.rb +4 -5
  72. data/lib/brightbox-cli/commands/servers/show.rb +0 -2
  73. data/lib/brightbox-cli/commands/servers/shutdown.rb +0 -3
  74. data/lib/brightbox-cli/commands/servers/snapshot.rb +0 -4
  75. data/lib/brightbox-cli/commands/servers/start.rb +0 -4
  76. data/lib/brightbox-cli/commands/servers/stop.rb +0 -3
  77. data/lib/brightbox-cli/commands/servers/update.rb +5 -5
  78. data/lib/brightbox-cli/commands/sql/instances_create.rb +3 -6
  79. data/lib/brightbox-cli/commands/sql/instances_destroy.rb +0 -2
  80. data/lib/brightbox-cli/commands/sql/instances_list.rb +7 -9
  81. data/lib/brightbox-cli/commands/sql/instances_reset_password.rb +0 -1
  82. data/lib/brightbox-cli/commands/sql/instances_show.rb +0 -3
  83. data/lib/brightbox-cli/commands/sql/instances_snapshot.rb +0 -3
  84. data/lib/brightbox-cli/commands/sql/instances_update.rb +1 -3
  85. data/lib/brightbox-cli/commands/sql/snapshots_destroy.rb +0 -3
  86. data/lib/brightbox-cli/commands/sql/snapshots_list.rb +7 -9
  87. data/lib/brightbox-cli/commands/sql/snapshots_show.rb +12 -15
  88. data/lib/brightbox-cli/commands/sql/snapshots_update.rb +1 -3
  89. data/lib/brightbox-cli/commands/sql/types.rb +8 -15
  90. data/lib/brightbox-cli/commands/token.rb +0 -1
  91. data/lib/brightbox-cli/commands/types.rb +8 -14
  92. data/lib/brightbox-cli/commands/{user-collaborations.rb → user_collaborations.rb} +7 -8
  93. data/lib/brightbox-cli/commands/users/list.rb +0 -2
  94. data/lib/brightbox-cli/commands/users/show.rb +1 -3
  95. data/lib/brightbox-cli/commands/users/update.rb +3 -6
  96. data/lib/brightbox-cli/commands/zones.rb +7 -10
  97. data/lib/brightbox-cli/config/accounts.rb +18 -26
  98. data/lib/brightbox-cli/config/api_client.rb +12 -16
  99. data/lib/brightbox-cli/config/authentication_tokens.rb +39 -42
  100. data/lib/brightbox-cli/config/cache.rb +1 -0
  101. data/lib/brightbox-cli/config/clients.rb +8 -8
  102. data/lib/brightbox-cli/config/gpg_encrypted_passwords.rb +6 -8
  103. data/lib/brightbox-cli/config/password_helper.rb +33 -8
  104. data/lib/brightbox-cli/config/sections.rb +45 -29
  105. data/lib/brightbox-cli/config/two_factor_auth.rb +12 -14
  106. data/lib/brightbox-cli/config/two_factor_helper.rb +5 -7
  107. data/lib/brightbox-cli/config/user_application.rb +18 -18
  108. data/lib/brightbox-cli/config.rb +26 -23
  109. data/lib/brightbox-cli/connection_manager.rb +4 -2
  110. data/lib/brightbox-cli/database_server.rb +28 -29
  111. data/lib/brightbox-cli/database_snapshot.rb +1 -1
  112. data/lib/brightbox-cli/database_type.rb +6 -6
  113. data/lib/brightbox-cli/detailed_server.rb +43 -43
  114. data/lib/brightbox-cli/detailed_server_group.rb +1 -1
  115. data/lib/brightbox-cli/error_parser.rb +9 -9
  116. data/lib/brightbox-cli/firewall_policy.rb +2 -1
  117. data/lib/brightbox-cli/firewall_rule.rb +3 -3
  118. data/lib/brightbox-cli/firewall_rules.rb +3 -3
  119. data/lib/brightbox-cli/gli_global_hooks.rb +25 -27
  120. data/lib/brightbox-cli/images.rb +14 -12
  121. data/lib/brightbox-cli/load_balancers.rb +3 -6
  122. data/lib/brightbox-cli/logging.rb +14 -14
  123. data/lib/brightbox-cli/nilable_hash.rb +1 -1
  124. data/lib/brightbox-cli/ruby_core_ext.rb +3 -3
  125. data/lib/brightbox-cli/server_groups.rb +2 -2
  126. data/lib/brightbox-cli/servers.rb +6 -6
  127. data/lib/brightbox-cli/tables.rb +13 -15
  128. data/lib/brightbox-cli/types.rb +6 -6
  129. data/lib/brightbox-cli/user_collaboration.rb +5 -7
  130. data/lib/brightbox-cli/users.rb +1 -1
  131. data/lib/brightbox-cli/version.rb +1 -1
  132. data/lib/brightbox-cli/zones.rb +1 -1
  133. data/lib/brightbox_cli.rb +33 -33
  134. data/spec/brightbox_spec.rb +0 -1
  135. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_application/returns_a_collection_of_Accounts.yml +5 -5
  136. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_application/returns_resources_on_the_same_connection.yml +2 -2
  137. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_client/returns_a_collection_of_Accounts.yml +4 -4
  138. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_client/returns_resources_on_the_same_connection.yml +2 -2
  139. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_false/does_not_update_the_config_file.yml +12 -12
  140. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_true/does_not_update_the_config_file.yml +12 -12
  141. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_changes_to_the_config_file.yml +2 -2
  142. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_the_default_account.yml +2 -2
  143. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_the_new_client_as_the_default.yml +2 -2
  144. data/spec/cassettes/Brightbox_BBConfig/_find_or_set_default_account/when_client_is_not_authenticated/does_not_raise_an_error.yml +8 -8
  145. data/spec/cassettes/Brightbox_BBConfig/_find_or_set_default_account/when_client_may_access_one_account/updates_the_setting.yml +8 -8
  146. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_config_in_use_is_not_the_default/uses_correct_credentials.yml +1 -1
  147. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_a_cached_refresh_token/caches_the_new_tokens.yml +1 -1
  148. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_an_expired_refresh_token/caches_the_new_tokens.yml +2 -2
  149. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_no_tokens/caches_the_new_tokens.yml +1 -1
  150. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_no_tokens/prompts_user_to_retry_command.yml +1 -1
  151. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_an_API_client_with_no_tokens/caches_a_new_access_token.yml +1 -1
  152. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/does_not_alter_the_configuration.yml +6 -6
  153. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_access_token.yml +6 -6
  154. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_refresh_token.yml +6 -6
  155. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/does_not_alter_the_configuration.yml +6 -6
  156. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_access_token.yml +6 -6
  157. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_refresh_token.yml +6 -6
  158. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/does_not_alter_the_configuration.yml +9 -9
  159. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_access_token.yml +9 -9
  160. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_refresh_token.yml +9 -9
  161. data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/creates_the_configuration.yml +6 -6
  162. data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/refreshed_tokens.yml +6 -6
  163. data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/creates_the_configuration.yml +6 -6
  164. data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/refreshed_tokens.yml +6 -6
  165. data/spec/cassettes/Brightbox_CloudIP/_find_all_/when_a_Cloud_IP_exists/returns_a_suitable.yml +15 -15
  166. data/spec/cassettes/Brightbox_FirewallPolicy/_apply_to/should_apply_firewall_policy.yml +14 -14
  167. data/spec/cassettes/Brightbox_FirewallPolicy/_create/should_create_firewall_policy.yml +14 -14
  168. data/spec/cassettes/Brightbox_FirewallPolicy/_destroy/should_destroy_firewall_policy.yml +16 -16
  169. data/spec/cassettes/Brightbox_FirewallPolicy/_find_all_/when_a_policy_exists/should_list_firewall_policy.yml +13 -13
  170. data/spec/cassettes/Brightbox_FirewallPolicy/_find_or_call/when_a_policy_exists/should_show_firewall_policy.yml +11 -11
  171. data/spec/cassettes/Brightbox_FirewallRule/_create/when_policy_exists/creates_the_rule_successfully.yml +14 -14
  172. data/spec/cassettes/Brightbox_FirewallRule/_destroy/when_rule_exists/destroys_a_rule.yml +12 -12
  173. data/spec/cassettes/Brightbox_FirewallRule/_find/when_rule_exists/can_display_the_result.yml +14 -14
  174. data/spec/cassettes/Brightbox_FirewallRule/_from_policy/when_policy_exists_with_a_rule/lists_all_rules.yml +19 -19
  175. data/spec/cassettes/Brightbox_Server/_destroy/when_server_exists/should_work.yml +12 -12
  176. data/spec/cassettes/Brightbox_Server/_find_all_/when_a_server_exists/should_print_server_list.yml +15 -15
  177. data/spec/cassettes/Brightbox_Server/_show/when_server_exists/shows_detailed_attributes_of_a_server.yml +18 -18
  178. data/spec/cassettes/Brightbox_Server/_shutdown/should_work.yml +18 -18
  179. data/spec/cassettes/Brightbox_Server/_start/should_work.yml +24 -24
  180. data/spec/cassettes/Brightbox_Server/_stop/should_work.yml +18 -18
  181. data/spec/cassettes/Brightbox_Server/_update/when_passing_new_group_membership/should_update_with_group.yml +22 -22
  182. data/spec/cassettes/Brightbox_ServerGroup/_find_all_/when_a_group_exists/list_server_groups.yml +13 -13
  183. data/spec/cassettes/Firewall_policies/update/when_the_policy_does_not_exist/prints_error_to_STDERR.yml +3 -3
  184. data/spec/cassettes/brightbox_accounts/list/_when_access_token_expired_/does_not_report_invalid_token_errors.yml +30 -30
  185. data/spec/cassettes/brightbox_accounts/list/_when_both_tokens_expired_/does_not_report_invalid_token_errors.yml +9 -9
  186. data/spec/cassettes/brightbox_accounts/list/_when_invalid_tokens_/does_not_report_invalid_token_errors.yml +9 -9
  187. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_/does_not_report_invalid_token_errors.yml +27 -27
  188. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_/reports_they_were_updated.yml +7 -7
  189. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_and_password_incorrect_/does_not_report_invalid_token_errors.yml +7 -7
  190. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_and_password_incorrect_/reports_unable_to_authenticate.yml +6 -6
  191. data/spec/cassettes/brightbox_accounts/list/does_not_error.yml +3 -3
  192. data/spec/cassettes/brightbox_cloudips/map/when_destination_is_a_server_ID/passes_the_interface_identifier_to_the_API.yml +12 -12
  193. data/spec/cassettes/brightbox_cloudips/map/when_destination_is_another_value/passes_the_identifier_to_the_API.yml +7 -7
  194. data/spec/cassettes/brightbox_config/client_add/when_adding_a_new_client/does_not_error.yml +7 -7
  195. data/spec/cassettes/brightbox_config/client_add/when_adding_a_new_client/sets_up_the_config.yml +7 -7
  196. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/does_not_change_the_default_client.yml +7 -7
  197. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/does_not_error.yml +7 -7
  198. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/sets_this_as_the_default_client.yml +7 -7
  199. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/sets_up_the_config.yml +7 -7
  200. data/spec/cassettes/brightbox_config/user_add/when_NO_config_file_on_disk/sets_up_the_config.yml +5 -5
  201. data/spec/cassettes/brightbox_config/user_add/when_a_default_client_is_already_set/does_not_change_the_default_client.yml +2 -2
  202. data/spec/cassettes/brightbox_config/user_add/when_application_details_in_config/does_not_error.yml +2 -2
  203. data/spec/cassettes/brightbox_config/user_add/when_application_details_in_config/sets_up_the_config.yml +2 -2
  204. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/display_an_warning_about_preselected_default.yml +2 -2
  205. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/does_not_error.yml +2 -2
  206. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/selects_the_active_account_for_the_default.yml +2 -2
  207. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/sets_up_the_config.yml +2 -2
  208. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/display_an_warning_about_preselected_default.yml +2 -2
  209. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/does_not_error.yml +2 -2
  210. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/sets_up_the_config.yml +2 -2
  211. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/does_not_error.yml +2 -2
  212. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/does_not_prompt_to_rerun_the_command.yml +2 -2
  213. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/requests_access_tokens.yml +2 -2
  214. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/sets_this_as_the_default_client.yml +2 -2
  215. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/sets_up_the_config.yml +5 -5
  216. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/does_not_error.yml +2 -2
  217. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/does_not_prompt_to_rerun_the_command.yml +2 -2
  218. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/requests_access_tokens.yml +2 -2
  219. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/sets_up_the_config.yml +3 -3
  220. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/does_not_error.yml +2 -2
  221. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/requests_access_tokens.yml +2 -2
  222. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/sets_up_the_config.yml +2 -2
  223. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_error.yml +6 -6
  224. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  225. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/prompts_for_the_password.yml +6 -6
  226. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/requests_access_tokens.yml +6 -6
  227. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/sets_up_the_config.yml +6 -6
  228. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_error.yml +6 -6
  229. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  230. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/prompts_for_the_password.yml +6 -6
  231. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/requests_access_tokens.yml +6 -6
  232. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/sets_up_the_config.yml +6 -6
  233. data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_error.yml +3 -3
  234. data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_prompt_to_rerun_the_command.yml +3 -3
  235. data/spec/cassettes/brightbox_login/when_default_account_is_passed/prompts_for_the_password.yml +3 -3
  236. data/spec/cassettes/brightbox_login/when_default_account_is_passed/requests_access_tokens.yml +3 -3
  237. data/spec/cassettes/brightbox_login/when_default_account_is_passed/sets_up_the_config.yml +3 -3
  238. data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_error.yml +6 -6
  239. data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_prompt_to_rerun_the_command.yml +6 -6
  240. data/spec/cassettes/brightbox_login/when_no_config_is_present/requests_access_tokens.yml +6 -6
  241. data/spec/cassettes/brightbox_login/when_no_config_is_present/sets_up_the_config.yml +6 -6
  242. data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_error.yml +6 -6
  243. data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  244. data/spec/cassettes/brightbox_login/when_no_password_is_given/prompts_for_the_password.yml +6 -6
  245. data/spec/cassettes/brightbox_login/when_no_password_is_given/requests_access_tokens.yml +6 -6
  246. data/spec/cassettes/brightbox_login/when_no_password_is_given/sets_up_the_config.yml +6 -6
  247. data/spec/cassettes/brightbox_sql_instances/create/--allow-access_10_0_0_0/correctly_sends_API_parameters.yml +313 -26
  248. data/spec/cassettes/brightbox_sql_instances/create/--allow-access_srv-12345_grp-12345/correctly_sends_API_parameters.yml +1204 -38
  249. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql/correctly_sends_API_parameters.yml +596 -26
  250. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql_--engine-version_5_6/correctly_sends_API_parameters.yml +63 -9
  251. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql_--engine-version_8_0/correctly_sends_API_parameters.yml +393 -0
  252. data/spec/cassettes/brightbox_sql_instances/create/--maintenance-weekday_5_--maintenance_hour_11/correctly_sends_API_parameters.yml +393 -0
  253. data/spec/cassettes/brightbox_sql_instances/create/--maintenance-weekday_thursday/correctly_sends_API_parameters.yml +393 -0
  254. data/spec/cassettes/brightbox_sql_instances/create/--snapshot_dbi-12345/includes_schedule_fields_in_response.yml +1466 -0
  255. data/spec/cassettes/brightbox_sql_instances/create/--snapshots-schedule_0_12_4_/includes_schedule_fields_in_response.yml +342 -0
  256. data/spec/cassettes/brightbox_sql_instances/create/without_arguments/reports_the_new_admin_password.yml +541 -26
  257. data/spec/cassettes/brightbox_sql_instances/create/without_arguments/reports_the_new_admin_username.yml +484 -26
  258. data/spec/cassettes/brightbox_sql_instances/snapshot/when_database_server_active/correctly_sends_API_parameters.yml +4 -4
  259. data/spec/cassettes/brightbox_sql_instances/snapshot/when_database_server_can_not_be_snapshotted/reports_an_error_to_the_user.yml +2 -2
  260. data/spec/cassettes/brightbox_sql_snapshots/list/when_resources_are_available/does_not_output_to_stderr.yml +2 -2
  261. data/spec/cassettes/brightbox_sql_snapshots/list/when_resources_are_available/outputs_table_details_to_stdout.yml +2 -2
  262. data/spec/cassettes/brightbox_sql_snapshots/show/when_resource_exists/does_not_output_to_stderr.yml +2 -2
  263. data/spec/commands/accounts/default_spec.rb +1 -2
  264. data/spec/commands/accounts/list_spec.rb +7 -8
  265. data/spec/commands/accounts/reset_ftp_password_spec.rb +1 -2
  266. data/spec/commands/accounts/show_spec.rb +1 -2
  267. data/spec/commands/cloudips/create_spec.rb +1 -2
  268. data/spec/commands/cloudips/destroy_spec.rb +1 -2
  269. data/spec/commands/cloudips/list_spec.rb +1 -2
  270. data/spec/commands/cloudips/map_spec.rb +2 -3
  271. data/spec/commands/cloudips/show_spec.rb +1 -2
  272. data/spec/commands/cloudips/unmap_spec.rb +1 -2
  273. data/spec/commands/cloudips/update_spec.rb +7 -8
  274. data/spec/commands/config/client_add_spec.rb +2 -3
  275. data/spec/commands/config/client_default_spec.rb +1 -2
  276. data/spec/commands/config/client_list_spec.rb +1 -2
  277. data/spec/commands/config/client_remove_spec.rb +1 -2
  278. data/spec/commands/config/user_add_spec.rb +3 -4
  279. data/spec/commands/firewall_policies/update_spec.rb +3 -3
  280. data/spec/commands/groups/add_server_spec.rb +1 -2
  281. data/spec/commands/groups/create_spec.rb +1 -2
  282. data/spec/commands/groups/destroy_spec.rb +1 -2
  283. data/spec/commands/groups/list_spec.rb +1 -2
  284. data/spec/commands/groups/move_servers_spec.rb +1 -2
  285. data/spec/commands/groups/remove_servers_spec.rb +1 -2
  286. data/spec/commands/groups/show_spec.rb +1 -2
  287. data/spec/commands/groups/update_spec.rb +1 -2
  288. data/spec/commands/images/destroy_spec.rb +1 -2
  289. data/spec/commands/images/list_spec.rb +62 -63
  290. data/spec/commands/images/locking_spec.rb +4 -4
  291. data/spec/commands/images/register_spec.rb +89 -3
  292. data/spec/commands/images/show_spec.rb +56 -4
  293. data/spec/commands/images/update_spec.rb +53 -3
  294. data/spec/commands/lbs/add_nodes_spec.rb +1 -2
  295. data/spec/commands/lbs/create_spec.rb +2 -3
  296. data/spec/commands/lbs/destroy_spec.rb +1 -2
  297. data/spec/commands/lbs/list_spec.rb +1 -2
  298. data/spec/commands/lbs/locking_spec.rb +4 -4
  299. data/spec/commands/lbs/remove_nodes_spec.rb +1 -2
  300. data/spec/commands/lbs/show_spec.rb +1 -2
  301. data/spec/commands/lbs/update_spec.rb +3 -4
  302. data/spec/commands/login_spec.rb +134 -30
  303. data/spec/commands/policies/apply_spec.rb +1 -2
  304. data/spec/commands/policies/create_spec.rb +1 -2
  305. data/spec/commands/policies/destroy_spec.rb +1 -2
  306. data/spec/commands/policies/list_spec.rb +1 -2
  307. data/spec/commands/policies/remove_spec.rb +1 -2
  308. data/spec/commands/policies/show_spec.rb +1 -2
  309. data/spec/commands/policies/update_spec.rb +1 -2
  310. data/spec/commands/rules/create_spec.rb +1 -2
  311. data/spec/commands/rules/destroy_spec.rb +1 -2
  312. data/spec/commands/rules/list_spec.rb +1 -2
  313. data/spec/commands/rules/show_spec.rb +1 -2
  314. data/spec/commands/rules/update_spec.rb +1 -2
  315. data/spec/commands/servers/activate_console_spec.rb +1 -2
  316. data/spec/commands/servers/create_spec.rb +10 -10
  317. data/spec/commands/servers/destroy_spec.rb +1 -2
  318. data/spec/commands/servers/list_spec.rb +1 -2
  319. data/spec/commands/servers/locking_spec.rb +4 -4
  320. data/spec/commands/servers/reboot_spec.rb +3 -4
  321. data/spec/commands/servers/reset_spec.rb +3 -4
  322. data/spec/commands/servers/show_spec.rb +1 -2
  323. data/spec/commands/servers/shutdown_spec.rb +1 -2
  324. data/spec/commands/servers/snapshot_spec.rb +1 -2
  325. data/spec/commands/servers/start_spec.rb +1 -2
  326. data/spec/commands/servers/stop_spec.rb +1 -2
  327. data/spec/commands/servers/update_spec.rb +1 -2
  328. data/spec/commands/sql/instances/create_spec.rb +58 -75
  329. data/spec/commands/sql/instances/locking_spec.rb +4 -4
  330. data/spec/commands/sql/instances/show_spec.rb +7 -7
  331. data/spec/commands/sql/instances/snapshot_spec.rb +2 -2
  332. data/spec/commands/sql/instances/update_spec.rb +8 -8
  333. data/spec/commands/sql/snapshots/list_spec.rb +1 -1
  334. data/spec/commands/sql/snapshots/locking_spec.rb +4 -4
  335. data/spec/commands/sql/snapshots/show_spec.rb +1 -1
  336. data/spec/commands/sql/types/list_spec.rb +1 -2
  337. data/spec/commands/types/list_spec.rb +1 -2
  338. data/spec/commands/users/list_spec.rb +1 -2
  339. data/spec/commands/users/show_spec.rb +1 -2
  340. data/spec/commands/users/update_spec.rb +1 -2
  341. data/spec/commands/zones/list_spec.rb +1 -2
  342. data/spec/configs/api_client.ini +1 -1
  343. data/spec/configs/user_app.ini +2 -2
  344. data/spec/spec_helper.rb +16 -3
  345. data/spec/support/authentication_helpers.rb +98 -0
  346. data/spec/support/config_helpers.rb +2 -4
  347. data/spec/support/password_prompt_helpers.rb +22 -1
  348. data/spec/support/server_helper.rb +5 -5
  349. data/spec/support/tmp_config.rb +1 -1
  350. data/spec/support/token_helpers.rb +2 -2
  351. data/spec/support/vcr.rb +3 -22
  352. data/spec/unit/brightbox/api/created_on_spec.rb +2 -2
  353. data/spec/unit/brightbox/api/fog_model_spec.rb +13 -13
  354. data/spec/unit/brightbox/api/klass_name_spec.rb +0 -1
  355. data/spec/unit/brightbox/api/method_missing_spec.rb +64 -0
  356. data/spec/unit/brightbox/api/require_account_spec.rb +0 -1
  357. data/spec/unit/brightbox/api/respond_to_spec.rb +71 -0
  358. data/spec/unit/brightbox/bb_config/access_token_filename_spec.rb +0 -1
  359. data/spec/unit/brightbox/bb_config/account_spec.rb +0 -1
  360. data/spec/unit/brightbox/bb_config/add_login_spec.rb +27 -28
  361. data/spec/unit/brightbox/bb_config/add_section_spec.rb +1 -2
  362. data/spec/unit/brightbox/bb_config/clear_default_client_spec.rb +0 -1
  363. data/spec/unit/brightbox/bb_config/client_id_spec.rb +0 -1
  364. data/spec/unit/brightbox/bb_config/client_name_spec.rb +0 -1
  365. data/spec/unit/brightbox/bb_config/config_directory_exists_spec.rb +0 -1
  366. data/spec/unit/brightbox/bb_config/config_directory_spec.rb +0 -1
  367. data/spec/unit/brightbox/bb_config/config_spec.rb +2 -3
  368. data/spec/unit/brightbox/bb_config/default_account_spec.rb +0 -1
  369. data/spec/unit/brightbox/bb_config/default_client_spec.rb +0 -1
  370. data/spec/unit/brightbox/bb_config/delete_section_spec.rb +0 -1
  371. data/spec/unit/brightbox/bb_config/find_or_set_default_account_spec.rb +4 -4
  372. data/spec/unit/brightbox/bb_config/refresh_token_filename_spec.rb +0 -1
  373. data/spec/unit/brightbox/bb_config/renew_tokens_spec.rb +3 -4
  374. data/spec/unit/brightbox/bb_config/save_default_account_spec.rb +0 -1
  375. data/spec/unit/brightbox/bb_config/save_spec.rb +0 -1
  376. data/spec/unit/brightbox/bb_config/section_names_spec.rb +1 -1
  377. data/spec/unit/brightbox/bb_config/to_fog_spec.rb +2 -2
  378. data/spec/unit/brightbox/collaborating_account/to_row_spec.rb +3 -3
  379. data/spec/unit/brightbox/config/api_client/to_fog_spec.rb +8 -8
  380. data/spec/unit/brightbox/config/api_client/valid_spec.rb +4 -4
  381. data/spec/unit/brightbox/config/discover_two_factor_pin_spec.rb +87 -0
  382. data/spec/unit/brightbox/config/section_name_deduplicator_spec.rb +1 -1
  383. data/spec/unit/brightbox/config/user_application/to_fog_spec.rb +10 -10
  384. data/spec/unit/brightbox/config/user_application/valid_spec.rb +3 -3
  385. data/spec/unit/brightbox/connection_manager/fetch_connection_spec.rb +1 -1
  386. data/spec/unit/brightbox/database_server/clean_arguments_spec.rb +1 -2
  387. data/spec/unit/brightbox/database_server/maintenance_window_spec.rb +0 -1
  388. data/spec/unit/brightbox/error_parser/pretty_print_spec.rb +0 -1
  389. data/spec/unit/brightbox/firewall_policy/apply_to_spec.rb +0 -1
  390. data/spec/unit/brightbox/firewall_policy/create_spec.rb +0 -1
  391. data/spec/unit/brightbox/firewall_policy/find_or_call_spec.rb +0 -1
  392. data/spec/unit/brightbox/firewall_policy/find_spec.rb +0 -1
  393. data/spec/unit/brightbox/firewall_rule/find_spec.rb +9 -9
  394. data/spec/unit/brightbox/firewall_rule/from_policy_spec.rb +4 -4
  395. data/spec/unit/brightbox/legacy/args_adjuster_spec.rb +20 -21
  396. data/spec/unit/brightbox/server/create_spec.rb +1 -2
  397. data/spec/unit/brightbox/server/start_spec.rb +2 -2
  398. data/spec/unit/brightbox/server/update_spec.rb +0 -1
  399. data/spec/unit/brightbox/user_collaboration/remove_spec.rb +0 -1
  400. data/spec/unit/nilable_hash_spec.rb +5 -5
  401. data/spec/unit/ruby_core_ext_spec.rb +3 -4
  402. data/spec/unit/temporary_home_spec.rb +1 -1
  403. data/spec/unit/tmp_config_spec.rb +0 -1
  404. metadata +133 -101
  405. data/bin/brightbox-accounts +0 -13
  406. data/bin/brightbox-cloudips +0 -13
  407. data/bin/brightbox-config +0 -13
  408. data/bin/brightbox-firewall-policies +0 -13
  409. data/bin/brightbox-firewall-rules +0 -13
  410. data/bin/brightbox-groups +0 -13
  411. data/bin/brightbox-images +0 -13
  412. data/bin/brightbox-lbs +0 -13
  413. data/bin/brightbox-servers +0 -13
  414. data/bin/brightbox-types +0 -13
  415. data/bin/brightbox-users +0 -13
  416. data/bin/brightbox-zones +0 -13
  417. data/lib/brightbox-cli/commands/config/client-default.rb +0 -26
@@ -1,7 +1,7 @@
1
1
  module Brightbox
2
2
  module Config
3
3
  module GpgEncryptedPasswords
4
- attr_accessor :gpg_password
4
+ attr_writer :gpg_password
5
5
 
6
6
  def gpg_encrypted_password_filename
7
7
  file_name = "#{client_name}.password.gpg"
@@ -13,11 +13,10 @@ module Brightbox
13
13
  if defined?(@gpg_password) && !@gpg_password.nil?
14
14
  return @gpg_password
15
15
  end
16
- if File.exist?(gpg_encrypted_password_filename)
17
- @gpg_password = gpg_decrypt_password
18
- else
19
- @gpg_password = nil
20
- end
16
+
17
+ @gpg_password = if File.exist?(gpg_encrypted_password_filename)
18
+ gpg_decrypt_password
19
+ end
21
20
  end
22
21
 
23
22
  private
@@ -26,14 +25,13 @@ module Brightbox
26
25
  def gpg_decrypt_password
27
26
  info "INFO: Decrypting #{gpg_encrypted_password_filename} to obtain password"
28
27
  begin
29
- IO::popen(["gpg", "--decrypt", gpg_encrypted_password_filename], "r") do |io|
28
+ IO.popen(["gpg", "--decrypt", gpg_encrypted_password_filename], "r") do |io|
30
29
  io.read.chomp
31
30
  end
32
31
  rescue Errno::ENOENT
33
32
  nil
34
33
  end
35
34
  end
36
-
37
35
  end
38
36
  end
39
37
  end
@@ -1,7 +1,26 @@
1
1
  module Brightbox
2
2
  module Config
3
3
  module PasswordHelper
4
- attr_accessor :password_helper_password
4
+ ENTER_PASSWORD_PROMPT = "Enter your password : ".freeze
5
+ EXPIRED_TOKEN_PROMPT = "Your API credentials have expired, enter your password to update them.".freeze
6
+
7
+ attr_writer :password_helper_password
8
+
9
+ # {discover_password} will return the first password that can be
10
+ # recovered from either the passed input, encrypted storage, a
11
+ # helper application (if configured) or finally promping.
12
+ #
13
+ # @param password [String] a password given to the method
14
+ # @param expired [Boolean] should the prompt explain tokens have expired?
15
+ # @return [String] the password
16
+ #
17
+ def discover_password(password: nil, expired: false)
18
+ password ||= gpg_password
19
+ password ||= password_helper_password
20
+ password ||= prompt_for_password(expired)
21
+ end
22
+
23
+ private
5
24
 
6
25
  def password_helper_command
7
26
  return config[client_name]["password_helper_command"] unless client_name.nil?
@@ -13,15 +32,11 @@ module Brightbox
13
32
  return @password_helper_password
14
33
  end
15
34
 
16
- if password_helper_command
17
- @password_helper_password = password_helper_call
18
- else
19
- @password_helper_password = nil
20
- end
35
+ @password_helper_password = if password_helper_command
36
+ password_helper_call
37
+ end
21
38
  end
22
39
 
23
- private
24
-
25
40
  def password_helper_call
26
41
  info "INFO: Calling password helper to obtain password"
27
42
  begin
@@ -33,6 +48,16 @@ module Brightbox
33
48
  nil
34
49
  end
35
50
  end
51
+
52
+ # This asks the user to input their password
53
+ def prompt_for_password(expired)
54
+ require "highline"
55
+ highline = HighLine.new
56
+ highline.say(EXPIRED_TOKEN_PROMPT) if expired
57
+
58
+ # FIXME: Capture interupts if user aborts
59
+ highline.ask(ENTER_PASSWORD_PROMPT) { |q| q.echo = false }
60
+ end
36
61
  end
37
62
  end
38
63
  end
@@ -43,18 +43,27 @@ module Brightbox
43
43
  #
44
44
  begin
45
45
  remove_cached_tokens!
46
- renew_tokens(:client_name => config_alias, :password => password)
47
- rescue => e
48
- error "Something went wrong trying to refresh new tokens #{e.message}"
49
- end
46
+ begin
47
+ renew_tokens(client_name: config_alias,
48
+ password: password)
49
+ rescue Fog::Brightbox::OAuth2::TwoFactorMissingError
50
+ discover_two_factor_pin
51
+
52
+ renew_tokens(client_name: client_alias,
53
+ password: options[:password],
54
+ one_time_password: current_second_factor)
55
+ end
50
56
 
51
- # Try to determine a default account
52
- unless default_account == find_or_set_default_account
53
- info "The default account of #{default_account} has been selected"
54
- end
57
+ # Try to determine a default account
58
+ unless default_account == find_or_set_default_account
59
+ info "The default account of #{default_account} has been selected"
60
+ end
55
61
 
56
- # If only client then set it as the default
57
- set_default_client(client_alias) unless default_client
62
+ # If only client then set it as the default
63
+ set_default_client(client_alias) unless default_client
64
+ rescue StandardError => e
65
+ error "Something went wrong trying to refresh new tokens #{e.message}"
66
+ end
58
67
 
59
68
  # Ensure all our config changes are now saved
60
69
  save
@@ -98,18 +107,25 @@ module Brightbox
98
107
 
99
108
  # Renew tokens via config...
100
109
  begin
101
- renew_tokens(:client_name => client_alias, :password => options[:password])
102
- rescue => e
103
- error "Something went wrong trying to refresh new tokens #{e.message}"
104
- end
110
+ begin
111
+ renew_tokens(client_name: client_alias,
112
+ password: options[:password])
113
+ rescue Fog::Brightbox::OAuth2::TwoFactorMissingError
114
+ renew_tokens(client_name: client_alias,
115
+ password: options[:password],
116
+ one_time_password: discover_two_factor_pin)
117
+ end
105
118
 
106
- # Try to determine a default account
107
- unless default_account == find_or_set_default_account
108
- info "The default account of #{default_account} has been selected"
109
- end
119
+ # Try to determine a default account
120
+ unless default_account == find_or_set_default_account
121
+ info "The default account of #{default_account} has been selected"
122
+ end
110
123
 
111
- # If only client then set it as the default
112
- set_default_client(client_alias) unless default_client
124
+ # If only client then set it as the default
125
+ set_default_client(client_alias) unless default_client
126
+ rescue StandardError => e
127
+ error "Something went wrong trying to refresh new tokens #{e.message}"
128
+ end
113
129
 
114
130
  # Ensure all our config changes are now saved
115
131
  save
@@ -119,16 +135,16 @@ module Brightbox
119
135
  # persisted to disk.
120
136
  #
121
137
  def delete_section(name)
122
- if client_named?(name)
123
- if default_client == name
124
- clear_default_client
125
- end
126
- # remove from the Ini object
127
- config.delete_section(name)
138
+ return unless client_named?(name)
128
139
 
129
- dirty! # to ensure save actually writes to disk
130
- save
140
+ if default_client == name
141
+ clear_default_client
131
142
  end
143
+ # remove from the Ini object
144
+ config.delete_section(name)
145
+
146
+ dirty! # to ensure save actually writes to disk
147
+ save
132
148
  end
133
149
 
134
150
  # Config data for a named section
@@ -150,7 +166,7 @@ module Brightbox
150
166
  #
151
167
  def section_names
152
168
  # Exclude the global "core" section
153
- config.sections.reject { |s| %w(core alias).include?(s) }
169
+ config.sections.reject { |s| %w[core alias].include?(s) }
154
170
  end
155
171
 
156
172
  private
@@ -1,33 +1,31 @@
1
1
  module Brightbox
2
2
  module Config
3
3
  module TwoFactorAuth
4
+ ENTER_TWO_FACTOR_PROMPT = "Enter your two factor pin : ".freeze
4
5
 
5
- def extend_with_two_factor_pin(password)
6
- if two_factor_enabled
7
- suffix = "+" + two_factor_pin
8
- password += suffix unless password.end_with?(suffix)
9
- end
10
- password
6
+ attr_accessor :current_second_factor
7
+
8
+ def discover_two_factor_pin
9
+ @two_factor_pin ||= Brightbox.config.two_factor_helper_password
10
+ @two_factor_pin ||= prompt_for_two_factor_pin
11
+
12
+ self.current_second_factor = @two_factor_pin
11
13
  end
12
14
 
13
15
  private
14
16
 
15
17
  def two_factor_enabled
16
- return config[client_name]["two_factor"] == "true" unless client_name.nil?
17
- end
18
+ return false unless client_name.nil?
19
+ return true if config[client_name]["two_factor"] == "true"
18
20
 
19
- def two_factor_pin
20
- if two_factor_enabled
21
- @two_factor_pin ||= Brightbox.config.two_factor_helper_password
22
- @two_factor_pin ||= prompt_for_two_factor_pin
23
- end
21
+ false
24
22
  end
25
23
 
26
24
  def prompt_for_two_factor_pin
27
25
  require "highline"
28
26
  highline = HighLine.new
29
27
  # FIXME: Capture interupts if user aborts
30
- highline.ask("Enter your two factor pin : ")
28
+ highline.ask(ENTER_TWO_FACTOR_PROMPT)
31
29
  end
32
30
  end
33
31
  end
@@ -1,7 +1,7 @@
1
1
  module Brightbox
2
2
  module Config
3
3
  module TwoFactorHelper
4
- attr_accessor :two_factor_helper_password
4
+ attr_writer :two_factor_helper_password
5
5
 
6
6
  def two_factor_helper_command
7
7
  return config[client_name]["two_factor_helper_command"] unless client_name.nil?
@@ -13,11 +13,9 @@ module Brightbox
13
13
  return @two_factor_helper_password
14
14
  end
15
15
 
16
- if two_factor_helper_command
17
- @two_factor_helper_password = two_factor_helper_call
18
- else
19
- @two_factor_helper_password = nil
20
- end
16
+ @two_factor_helper_password = if two_factor_helper_command
17
+ two_factor_helper_call
18
+ end
21
19
  end
22
20
 
23
21
  private
@@ -29,7 +27,7 @@ module Brightbox
29
27
  IO.popen(cmd, "r") do |io|
30
28
  io.readline.chomp
31
29
  end
32
- rescue Errno::ENOENT
30
+ rescue ArgumentError, Errno::ENOENT
33
31
  nil
34
32
  end
35
33
  end
@@ -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 username)
6
+ NON_BLANK_KEYS = %w[api_url username].freeze
7
7
 
8
8
  attr_accessor :selected_config, :client_name
9
9
 
@@ -16,11 +16,12 @@ module Brightbox
16
16
  check_required_params
17
17
  # Note we have to merge in refresh token at the higher level
18
18
  {
19
- :provider => 'Brightbox',
20
- :brightbox_api_url => selected_config['api_url'],
21
- :brightbox_auth_url => selected_config['auth_url'] || selected_config['api_url'],
19
+ :provider => "Brightbox",
20
+ :brightbox_api_url => selected_config["api_url"],
21
+ :brightbox_auth_url => selected_config["auth_url"] || selected_config["api_url"],
22
22
  :brightbox_client_id => client_id,
23
23
  :brightbox_secret => client_secret,
24
+ :brightbox_support_two_factor => true,
24
25
  :persistent => persistent?
25
26
  }
26
27
  end
@@ -40,7 +41,9 @@ module Brightbox
40
41
  #
41
42
  def fetch_refresh_token(options)
42
43
  password_options = {
43
- :brightbox_password => options[:password]
44
+ :brightbox_password => options[:password],
45
+ :brightbox_support_two_factor => true,
46
+ :brightbox_one_time_password => options[:one_time_password]
44
47
  }
45
48
 
46
49
  default_fog_options = password_auth_params.merge(password_options)
@@ -64,31 +67,28 @@ module Brightbox
64
67
  end
65
68
 
66
69
  def persistent?
67
- if selected_config["persistent"] == "false"
68
- false
69
- else
70
- true
71
- end
70
+ selected_config["persistent"] != "false"
72
71
  end
73
72
 
74
73
  def password_auth_params
75
74
  {
76
- :provider => 'Brightbox',
77
- :brightbox_api_url => selected_config['api_url'],
78
- :brightbox_auth_url => selected_config['auth_url'] || selected_config['api_url'],
75
+ :provider => "Brightbox",
76
+ :brightbox_api_url => selected_config["api_url"],
77
+ :brightbox_auth_url => selected_config["auth_url"] || selected_config["api_url"],
79
78
  :brightbox_client_id => client_id,
80
79
  :brightbox_secret => client_secret,
81
80
  :brightbox_username => selected_config["username"],
81
+ :brightbox_support_two_factor => true,
82
82
  :persistent => persistent?
83
83
  }
84
84
  end
85
85
 
86
86
  def check_required_params
87
- unless valid?
88
- NON_BLANK_KEYS.each do |key|
89
- unless selected_config.key?(key) && !selected_config[key].to_s.empty?
90
- raise Brightbox::BBConfigError, "#{key} option missing from config in section #{client_name}"
91
- end
87
+ return if valid?
88
+
89
+ NON_BLANK_KEYS.each do |key|
90
+ unless selected_config.key?(key) && !selected_config[key].to_s.empty?
91
+ raise Brightbox::BBConfigError, "#{key} option missing from config in section #{client_name}"
92
92
  end
93
93
  end
94
94
  end
@@ -1,15 +1,15 @@
1
1
  module Brightbox
2
- class BBConfigError < StandardError ; end
2
+ class BBConfigError < StandardError; end
3
3
 
4
4
  class NoSelectedClientError < BBConfigError; end
5
- NO_CLIENT_MESSAGE = "You must specify client to use with --client or set default client"
5
+ NO_CLIENT_MESSAGE = "You must specify client to use with --client or set default client".freeze
6
6
 
7
7
  class AmbiguousClientError < BBConfigError; end
8
- AMBIGUOUS_CLIENT_ERROR = "You must specify a default client using brightbox config client_default"
8
+ AMBIGUOUS_CLIENT_ERROR = "You must specify a default client using brightbox config client_default".freeze
9
9
 
10
10
  class BBConfig
11
- require 'fileutils'
12
- require 'ini'
11
+ require "fileutils"
12
+ require "ini"
13
13
  include Brightbox::Logging
14
14
  include Brightbox::Config::Cache
15
15
  include Brightbox::Config::GpgEncryptedPasswords
@@ -49,6 +49,7 @@ module Brightbox
49
49
  # @return [String]
50
50
  def config_directory
51
51
  return @dir if @dir
52
+
52
53
  path = @options[:directory] || default_config_dir
53
54
  @dir = File.expand_path(path)
54
55
  end
@@ -65,7 +66,8 @@ module Brightbox
65
66
  # @return [String]
66
67
  def config_filename
67
68
  return @config_filename if @config_filename
68
- @config_filename = File.join(config_directory, 'config')
69
+
70
+ @config_filename = File.join(config_directory, "config")
69
71
  end
70
72
 
71
73
  # The loads the configuration from disk or creates the directory if missing
@@ -78,22 +80,22 @@ module Brightbox
78
80
 
79
81
  # Write out the configuration file to disk
80
82
  def save
81
- if dirty? && config.respond_to?(:write)
82
- config.write
83
- clean_up
84
- end
83
+ return unless dirty? && config.respond_to?(:write)
84
+
85
+ config.write
86
+ clean_up
85
87
  end
86
88
 
87
89
  # Outputs to debug the current values of the config/client's tokens
88
90
  #
89
91
  def debug_tokens
90
- if ENV["DEBUG"]
91
- debug "Access token: #{access_token} (#{cached_access_token})"
92
- if using_application?
93
- debug "Refresh token: #{refresh_token} (#{cached_refresh_token}))"
94
- else
95
- debug "Refresh token: <NOT EXPECTED FOR CLIENT>"
96
- end
92
+ return unless ENV["DEBUG"]
93
+
94
+ debug "Access token: #{access_token} (#{cached_access_token})"
95
+ if using_application?
96
+ debug "Refresh token: #{refresh_token} (#{cached_refresh_token}))"
97
+ else
98
+ debug "Refresh token: <NOT EXPECTED FOR CLIENT>"
97
99
  end
98
100
  end
99
101
 
@@ -110,13 +112,14 @@ module Brightbox
110
112
  private
111
113
 
112
114
  def default_config_dir
113
- File.join(ENV['HOME'], '.brightbox')
115
+ File.join(ENV.fetch("HOME", nil), ".brightbox")
114
116
  end
115
117
 
116
118
  def configured?
117
119
  if client_name.nil? || config[client_name].nil?
118
120
  raise BBConfigError, "client id or alias #{client_name.inspect} not defined in config"
119
121
  end
122
+
120
123
  true
121
124
  end
122
125
 
@@ -124,11 +127,11 @@ module Brightbox
124
127
  # in
125
128
  #
126
129
  def create_directory
127
- unless File.exist? config_directory
128
- begin
129
- FileUtils.mkdir config_directory
130
- rescue Errno::EEXIST
131
- end
130
+ return if File.exist? config_directory
131
+
132
+ begin
133
+ FileUtils.mkdir config_directory
134
+ rescue Errno::EEXIST
132
135
  end
133
136
  end
134
137
 
@@ -27,11 +27,13 @@ module Brightbox
27
27
 
28
28
  def connection_options
29
29
  merged_options = @connection_options.dup
30
- if @connection && @connection.refresh_token
30
+ merged_options.update(:brightbox_support_two_factor => true)
31
+
32
+ if @connection&.refresh_token
31
33
  merged_options.update(:brightbox_refresh_token => @connection.refresh_token)
32
34
  end
33
35
 
34
- if @connection && @connection.access_token
36
+ if @connection&.access_token
35
37
  merged_options.update(:brightbox_access_token => @connection.access_token)
36
38
  end
37
39
  merged_options
@@ -33,44 +33,44 @@ module Brightbox
33
33
  end
34
34
 
35
35
  def self.default_field_order
36
- [
37
- :id,
38
- :status,
39
- :type,
40
- :db_engine,
41
- :zone,
42
- :created_on,
43
- :cloud_ip_ids,
44
- :name
36
+ %i[
37
+ id
38
+ status
39
+ type
40
+ db_engine
41
+ zone
42
+ created_on
43
+ cloud_ip_ids
44
+ name
45
45
  ]
46
46
  end
47
47
 
48
48
  # These are all the fields show in the longer table form
49
49
  def self.detailed_fields
50
- [
51
- :id, :name, :description, :status, :locked,
52
- :type, :engine, :version,
53
- :zone,
54
- :created_on,
55
- :admin_username, :admin_password,
56
- :maintenance_window,
57
- :snapshots_schedule,
58
- :snapshots_schedule_next_at,
59
- :allow_access,
60
- :cloud_ip_ids, :cloud_ips
50
+ %i[
51
+ id name description status locked
52
+ type engine version
53
+ zone
54
+ created_on
55
+ admin_username admin_password
56
+ maintenance_window
57
+ snapshots_schedule
58
+ snapshots_schedule_next_at
59
+ allow_access
60
+ cloud_ip_ids cloud_ips
61
61
  ]
62
62
  end
63
63
 
64
64
  def type_identifier
65
- if fog_model.attributes.key?("database_server_type")
66
- fog_model.attributes["database_server_type"]["id"]
67
- end
65
+ return unless fog_model.attributes.key?("database_server_type")
66
+
67
+ fog_model.attributes["database_server_type"]["id"]
68
68
  end
69
69
 
70
70
  def zone_handle
71
- if fog_model.attributes.key?("zone")
72
- fog_model.attributes["zone"]["handle"]
73
- end
71
+ return unless fog_model.attributes.key?("zone")
72
+
73
+ fog_model.attributes["zone"]["handle"]
74
74
  end
75
75
 
76
76
  def to_row
@@ -99,8 +99,9 @@ module Brightbox
99
99
  # A more humanised version of the maintenance window
100
100
  def maintenance_window
101
101
  return nil if maintenance_weekday.nil?
102
+
102
103
  weekday = Date::DAYNAMES[maintenance_weekday]
103
- sprintf("%s %02d:00 UTC", weekday, maintenance_hour)
104
+ format("%s %02d:00 UTC", weekday, maintenance_hour)
104
105
  end
105
106
 
106
107
  def cloud_ips
@@ -149,8 +150,6 @@ module Brightbox
149
150
  params
150
151
  end
151
152
 
152
- private
153
-
154
153
  # @param [String] user_input either a day or it's index ('sunday' or '0')
155
154
  # @returns [String] The index
156
155
  def self.weekday_index(user_input)
@@ -23,7 +23,7 @@ module Brightbox
23
23
  end
24
24
 
25
25
  def self.default_field_order
26
- [:id, :status, :created_on, :size, :name]
26
+ %i[id status created_on size name]
27
27
  end
28
28
 
29
29
  def to_row
@@ -30,15 +30,15 @@ module Brightbox
30
30
  end
31
31
 
32
32
  def self.default_field_order
33
- [:id, :name, :ram, :disk]
33
+ %i[id name ram disk]
34
34
  end
35
35
 
36
36
  def <=>(other)
37
- if other.is_a? DatabaseType
38
- ram <=> other.ram
39
- else
40
- ram <=> other
41
- end
37
+ ram <=> if other.is_a? DatabaseType
38
+ other.ram
39
+ else
40
+ other
41
+ end
42
42
  end
43
43
  end
44
44
  end