krates 1.6.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.
Files changed (293) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +212 -0
  3. data/LOGO +10 -0
  4. data/VERSION +1 -0
  5. data/bin/krates +23 -0
  6. data/lib/kontena/autoload_core.rb +19 -0
  7. data/lib/kontena/callback.rb +60 -0
  8. data/lib/kontena/callbacks/.gitkeep +0 -0
  9. data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +26 -0
  10. data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +19 -0
  11. data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +14 -0
  12. data/lib/kontena/callbacks/master/deploy/04_default_master_version.rb +18 -0
  13. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +105 -0
  14. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
  15. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +66 -0
  16. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +21 -0
  17. data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +24 -0
  18. data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +31 -0
  19. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +95 -0
  20. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +33 -0
  21. data/lib/kontena/cli/browser_launcher.rb +61 -0
  22. data/lib/kontena/cli/bytes_helper.rb +40 -0
  23. data/lib/kontena/cli/certificate/authorize_command.rb +107 -0
  24. data/lib/kontena/cli/certificate/common.rb +16 -0
  25. data/lib/kontena/cli/certificate/domain_authorization/list_command.rb +24 -0
  26. data/lib/kontena/cli/certificate/domain_authorization/remove_authorization_command.rb +25 -0
  27. data/lib/kontena/cli/certificate/domain_authorize_command.rb +7 -0
  28. data/lib/kontena/cli/certificate/export_command.rb +28 -0
  29. data/lib/kontena/cli/certificate/get_command.rb +33 -0
  30. data/lib/kontena/cli/certificate/import_command.rb +61 -0
  31. data/lib/kontena/cli/certificate/list_command.rb +75 -0
  32. data/lib/kontena/cli/certificate/register_command.rb +30 -0
  33. data/lib/kontena/cli/certificate/remove_command.rb +23 -0
  34. data/lib/kontena/cli/certificate/request_command.rb +20 -0
  35. data/lib/kontena/cli/certificate/show_command.rb +22 -0
  36. data/lib/kontena/cli/certificate_command.rb +18 -0
  37. data/lib/kontena/cli/cloud/login_command.rb +186 -0
  38. data/lib/kontena/cli/cloud/logout_command.rb +14 -0
  39. data/lib/kontena/cli/cloud/master/add_command.rb +156 -0
  40. data/lib/kontena/cli/cloud/master/list_command.rb +35 -0
  41. data/lib/kontena/cli/cloud/master/remove_command.rb +68 -0
  42. data/lib/kontena/cli/cloud/master/show_command.rb +21 -0
  43. data/lib/kontena/cli/cloud/master/update_command.rb +52 -0
  44. data/lib/kontena/cli/cloud/master_command.rb +14 -0
  45. data/lib/kontena/cli/cloud_command.rb +13 -0
  46. data/lib/kontena/cli/common.rb +360 -0
  47. data/lib/kontena/cli/config.rb +662 -0
  48. data/lib/kontena/cli/container_command.rb +10 -0
  49. data/lib/kontena/cli/containers/exec_command.rb +31 -0
  50. data/lib/kontena/cli/containers/inspect_command.rb +16 -0
  51. data/lib/kontena/cli/containers/list_command.rb +51 -0
  52. data/lib/kontena/cli/containers/logs_command.rb +19 -0
  53. data/lib/kontena/cli/etcd/common.rb +8 -0
  54. data/lib/kontena/cli/etcd/get_command.rb +26 -0
  55. data/lib/kontena/cli/etcd/health_command.rb +53 -0
  56. data/lib/kontena/cli/etcd/list_command.rb +36 -0
  57. data/lib/kontena/cli/etcd/mkdir_command.rb +23 -0
  58. data/lib/kontena/cli/etcd/remove_command.rb +29 -0
  59. data/lib/kontena/cli/etcd/set_command.rb +24 -0
  60. data/lib/kontena/cli/etcd_command.rb +12 -0
  61. data/lib/kontena/cli/external_registries/add_command.rb +25 -0
  62. data/lib/kontena/cli/external_registries/list_command.rb +23 -0
  63. data/lib/kontena/cli/external_registries/remove_command.rb +17 -0
  64. data/lib/kontena/cli/external_registry_command.rb +9 -0
  65. data/lib/kontena/cli/grid_command.rb +21 -0
  66. data/lib/kontena/cli/grid_options.rb +12 -0
  67. data/lib/kontena/cli/grids/audit_log_command.rb +22 -0
  68. data/lib/kontena/cli/grids/cloud_config_command.rb +53 -0
  69. data/lib/kontena/cli/grids/common.rb +182 -0
  70. data/lib/kontena/cli/grids/create_command.rb +48 -0
  71. data/lib/kontena/cli/grids/current_command.rb +25 -0
  72. data/lib/kontena/cli/grids/env_command.rb +32 -0
  73. data/lib/kontena/cli/grids/events_command.rb +50 -0
  74. data/lib/kontena/cli/grids/health_command.rb +69 -0
  75. data/lib/kontena/cli/grids/list_command.rb +59 -0
  76. data/lib/kontena/cli/grids/logs_command.rb +35 -0
  77. data/lib/kontena/cli/grids/remove_command.rb +31 -0
  78. data/lib/kontena/cli/grids/show_command.rb +25 -0
  79. data/lib/kontena/cli/grids/trusted_subnet_command.rb +10 -0
  80. data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +18 -0
  81. data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +18 -0
  82. data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +26 -0
  83. data/lib/kontena/cli/grids/update_command.rb +35 -0
  84. data/lib/kontena/cli/grids/use_command.rb +26 -0
  85. data/lib/kontena/cli/grids/user_command.rb +9 -0
  86. data/lib/kontena/cli/grids/users/add_command.rb +18 -0
  87. data/lib/kontena/cli/grids/users/list_command.rb +20 -0
  88. data/lib/kontena/cli/grids/users/remove_command.rb +20 -0
  89. data/lib/kontena/cli/helpers/exec_helper.rb +209 -0
  90. data/lib/kontena/cli/helpers/health_helper.rb +65 -0
  91. data/lib/kontena/cli/helpers/log_helper.rb +113 -0
  92. data/lib/kontena/cli/helpers/time_helper.rb +29 -0
  93. data/lib/kontena/cli/localhost_web_server.rb +113 -0
  94. data/lib/kontena/cli/log_formatters/compact.rb +65 -0
  95. data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
  96. data/lib/kontena/cli/logout_command.rb +10 -0
  97. data/lib/kontena/cli/master/audit_log_command.rb +19 -0
  98. data/lib/kontena/cli/master/config/export_command.rb +46 -0
  99. data/lib/kontena/cli/master/config/get_command.rb +26 -0
  100. data/lib/kontena/cli/master/config/import_command.rb +67 -0
  101. data/lib/kontena/cli/master/config/set_command.rb +19 -0
  102. data/lib/kontena/cli/master/config/unset_command.rb +20 -0
  103. data/lib/kontena/cli/master/config_command.rb +17 -0
  104. data/lib/kontena/cli/master/create_command.rb +74 -0
  105. data/lib/kontena/cli/master/current_command.rb +25 -0
  106. data/lib/kontena/cli/master/init_cloud_command.rb +45 -0
  107. data/lib/kontena/cli/master/join_command.rb +22 -0
  108. data/lib/kontena/cli/master/list_command.rb +24 -0
  109. data/lib/kontena/cli/master/login_command.rb +331 -0
  110. data/lib/kontena/cli/master/logout_command.rb +25 -0
  111. data/lib/kontena/cli/master/remove_command.rb +55 -0
  112. data/lib/kontena/cli/master/ssh_command.rb +72 -0
  113. data/lib/kontena/cli/master/token/common.rb +29 -0
  114. data/lib/kontena/cli/master/token/create_command.rb +50 -0
  115. data/lib/kontena/cli/master/token/current_command.rb +45 -0
  116. data/lib/kontena/cli/master/token/list_command.rb +39 -0
  117. data/lib/kontena/cli/master/token/remove_command.rb +19 -0
  118. data/lib/kontena/cli/master/token/show_command.rb +34 -0
  119. data/lib/kontena/cli/master/token_command.rb +13 -0
  120. data/lib/kontena/cli/master/use_command.rb +31 -0
  121. data/lib/kontena/cli/master/user/invite_command.rb +51 -0
  122. data/lib/kontena/cli/master/user/list_command.rb +29 -0
  123. data/lib/kontena/cli/master/user/remove_command.rb +24 -0
  124. data/lib/kontena/cli/master/user/role/add_command.rb +29 -0
  125. data/lib/kontena/cli/master/user/role/remove_command.rb +27 -0
  126. data/lib/kontena/cli/master/user/role_command.rb +6 -0
  127. data/lib/kontena/cli/master/user_command.rb +9 -0
  128. data/lib/kontena/cli/master_command.rb +21 -0
  129. data/lib/kontena/cli/node_command.rb +17 -0
  130. data/lib/kontena/cli/nodes/create_command.rb +25 -0
  131. data/lib/kontena/cli/nodes/env_command.rb +37 -0
  132. data/lib/kontena/cli/nodes/health_command.rb +47 -0
  133. data/lib/kontena/cli/nodes/label_command.rb +10 -0
  134. data/lib/kontena/cli/nodes/labels/add_command.rb +18 -0
  135. data/lib/kontena/cli/nodes/labels/list_command.rb +19 -0
  136. data/lib/kontena/cli/nodes/labels/remove_command.rb +32 -0
  137. data/lib/kontena/cli/nodes/list_command.rb +97 -0
  138. data/lib/kontena/cli/nodes/remove_command.rb +34 -0
  139. data/lib/kontena/cli/nodes/reset_token_command.rb +34 -0
  140. data/lib/kontena/cli/nodes/show_command.rb +56 -0
  141. data/lib/kontena/cli/nodes/ssh_command.rb +63 -0
  142. data/lib/kontena/cli/nodes/update_command.rb +31 -0
  143. data/lib/kontena/cli/plugin_command.rb +12 -0
  144. data/lib/kontena/cli/plugins/common.rb +8 -0
  145. data/lib/kontena/cli/plugins/install_command.rb +42 -0
  146. data/lib/kontena/cli/plugins/list_command.rb +31 -0
  147. data/lib/kontena/cli/plugins/search_command.rb +25 -0
  148. data/lib/kontena/cli/plugins/show_command.rb +17 -0
  149. data/lib/kontena/cli/plugins/uninstall_command.rb +31 -0
  150. data/lib/kontena/cli/plugins/upgrade_command.rb +60 -0
  151. data/lib/kontena/cli/registry/create_command.rb +151 -0
  152. data/lib/kontena/cli/registry/remove_command.rb +21 -0
  153. data/lib/kontena/cli/registry_command.rb +8 -0
  154. data/lib/kontena/cli/service_command.rb +28 -0
  155. data/lib/kontena/cli/services/container_command.rb +8 -0
  156. data/lib/kontena/cli/services/containers_command.rb +39 -0
  157. data/lib/kontena/cli/services/create_command.rb +105 -0
  158. data/lib/kontena/cli/services/deploy_command.rb +25 -0
  159. data/lib/kontena/cli/services/env_command.rb +9 -0
  160. data/lib/kontena/cli/services/envs/add_command.rb +21 -0
  161. data/lib/kontena/cli/services/envs/list_command.rb +22 -0
  162. data/lib/kontena/cli/services/envs/remove_command.rb +22 -0
  163. data/lib/kontena/cli/services/events_command.rb +36 -0
  164. data/lib/kontena/cli/services/exec_command.rb +107 -0
  165. data/lib/kontena/cli/services/link_command.rb +35 -0
  166. data/lib/kontena/cli/services/list_command.rb +66 -0
  167. data/lib/kontena/cli/services/logs_command.rb +33 -0
  168. data/lib/kontena/cli/services/monitor_command.rb +58 -0
  169. data/lib/kontena/cli/services/remove_command.rb +60 -0
  170. data/lib/kontena/cli/services/restart_command.rb +19 -0
  171. data/lib/kontena/cli/services/scale_command.rb +21 -0
  172. data/lib/kontena/cli/services/secret_command.rb +8 -0
  173. data/lib/kontena/cli/services/secrets/link_command.rb +26 -0
  174. data/lib/kontena/cli/services/secrets/unlink_command.rb +28 -0
  175. data/lib/kontena/cli/services/services_helper.rb +579 -0
  176. data/lib/kontena/cli/services/show_command.rb +26 -0
  177. data/lib/kontena/cli/services/start_command.rb +21 -0
  178. data/lib/kontena/cli/services/stats_command.rb +87 -0
  179. data/lib/kontena/cli/services/stop_command.rb +21 -0
  180. data/lib/kontena/cli/services/unlink_command.rb +30 -0
  181. data/lib/kontena/cli/services/update_command.rb +94 -0
  182. data/lib/kontena/cli/spinner.rb +205 -0
  183. data/lib/kontena/cli/stack_command.rb +21 -0
  184. data/lib/kontena/cli/stacks/build_command.rb +125 -0
  185. data/lib/kontena/cli/stacks/common.rb +209 -0
  186. data/lib/kontena/cli/stacks/deploy_command.rb +37 -0
  187. data/lib/kontena/cli/stacks/events_command.rb +33 -0
  188. data/lib/kontena/cli/stacks/inspect_command.rb +17 -0
  189. data/lib/kontena/cli/stacks/install_command.rb +95 -0
  190. data/lib/kontena/cli/stacks/label_command.rb +10 -0
  191. data/lib/kontena/cli/stacks/labels/add_command.rb +21 -0
  192. data/lib/kontena/cli/stacks/labels/common.rb +19 -0
  193. data/lib/kontena/cli/stacks/labels/list_command.rb +21 -0
  194. data/lib/kontena/cli/stacks/labels/remove_command.rb +21 -0
  195. data/lib/kontena/cli/stacks/list_command.rb +154 -0
  196. data/lib/kontena/cli/stacks/logs_command.rb +35 -0
  197. data/lib/kontena/cli/stacks/monitor_command.rb +93 -0
  198. data/lib/kontena/cli/stacks/registry/create_command.rb +24 -0
  199. data/lib/kontena/cli/stacks/registry/make_private_command.rb +24 -0
  200. data/lib/kontena/cli/stacks/registry/make_public_command.rb +24 -0
  201. data/lib/kontena/cli/stacks/registry/pull_command.rb +28 -0
  202. data/lib/kontena/cli/stacks/registry/push_command.rb +40 -0
  203. data/lib/kontena/cli/stacks/registry/remove_command.rb +30 -0
  204. data/lib/kontena/cli/stacks/registry/search_command.rb +42 -0
  205. data/lib/kontena/cli/stacks/registry/show_command.rb +65 -0
  206. data/lib/kontena/cli/stacks/registry_command.rb +12 -0
  207. data/lib/kontena/cli/stacks/remove_command.rb +80 -0
  208. data/lib/kontena/cli/stacks/restart_command.rb +24 -0
  209. data/lib/kontena/cli/stacks/service_generator.rb +131 -0
  210. data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
  211. data/lib/kontena/cli/stacks/show_command.rb +168 -0
  212. data/lib/kontena/cli/stacks/stack_name.rb +71 -0
  213. data/lib/kontena/cli/stacks/stacks_helper.rb +83 -0
  214. data/lib/kontena/cli/stacks/stop_command.rb +24 -0
  215. data/lib/kontena/cli/stacks/upgrade_command.rb +264 -0
  216. data/lib/kontena/cli/stacks/validate_command.rb +75 -0
  217. data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
  218. data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
  219. data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
  220. data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +22 -0
  221. data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +102 -0
  222. data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
  223. data/lib/kontena/cli/stacks/yaml/opto/certificates_resolver.rb +37 -0
  224. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +78 -0
  225. data/lib/kontena/cli/stacks/yaml/opto/service_instances_resolver.rb +25 -0
  226. data/lib/kontena/cli/stacks/yaml/opto/service_link_resolver.rb +80 -0
  227. data/lib/kontena/cli/stacks/yaml/opto/vault_cert_prompt_resolver.rb +39 -0
  228. data/lib/kontena/cli/stacks/yaml/opto/vault_resolver.rb +13 -0
  229. data/lib/kontena/cli/stacks/yaml/opto/vault_setter.rb +12 -0
  230. data/lib/kontena/cli/stacks/yaml/opto.rb +16 -0
  231. data/lib/kontena/cli/stacks/yaml/reader.rb +525 -0
  232. data/lib/kontena/cli/stacks/yaml/service_extender.rb +65 -0
  233. data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
  234. data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
  235. data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
  236. data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +152 -0
  237. data/lib/kontena/cli/stacks/yaml/validations.rb +119 -0
  238. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +164 -0
  239. data/lib/kontena/cli/subcommand_loader.rb +83 -0
  240. data/lib/kontena/cli/table_generator.rb +128 -0
  241. data/lib/kontena/cli/vault/export_command.rb +24 -0
  242. data/lib/kontena/cli/vault/import_command.rb +75 -0
  243. data/lib/kontena/cli/vault/list_command.rb +37 -0
  244. data/lib/kontena/cli/vault/read_command.rb +27 -0
  245. data/lib/kontena/cli/vault/remove_command.rb +23 -0
  246. data/lib/kontena/cli/vault/update_command.rb +24 -0
  247. data/lib/kontena/cli/vault/write_command.rb +23 -0
  248. data/lib/kontena/cli/vault_command.rb +13 -0
  249. data/lib/kontena/cli/version.rb +10 -0
  250. data/lib/kontena/cli/version_command.rb +20 -0
  251. data/lib/kontena/cli/volume_command.rb +9 -0
  252. data/lib/kontena/cli/volumes/create_command.rb +42 -0
  253. data/lib/kontena/cli/volumes/list_command.rb +29 -0
  254. data/lib/kontena/cli/volumes/remove_command.rb +29 -0
  255. data/lib/kontena/cli/volumes/show_command.rb +38 -0
  256. data/lib/kontena/cli/vpn/config_command.rb +27 -0
  257. data/lib/kontena/cli/vpn/create_command.rb +99 -0
  258. data/lib/kontena/cli/vpn/remove_command.rb +22 -0
  259. data/lib/kontena/cli/vpn_command.rb +9 -0
  260. data/lib/kontena/cli/whoami_command.rb +38 -0
  261. data/lib/kontena/client.rb +574 -0
  262. data/lib/kontena/command.rb +251 -0
  263. data/lib/kontena/debug_instrumentor.rb +80 -0
  264. data/lib/kontena/errors.rb +50 -0
  265. data/lib/kontena/light_prompt.rb +103 -0
  266. data/lib/kontena/machine/cert_helper.rb +43 -0
  267. data/lib/kontena/machine/cloud_config/cloudinit.yml +82 -0
  268. data/lib/kontena/machine/cloud_config/node_generator.rb +28 -0
  269. data/lib/kontena/machine/common.rb +17 -0
  270. data/lib/kontena/machine/random_name.rb +42 -0
  271. data/lib/kontena/main_command.rb +66 -0
  272. data/lib/kontena/plugin_manager/cleaner.rb +33 -0
  273. data/lib/kontena/plugin_manager/common.rb +89 -0
  274. data/lib/kontena/plugin_manager/installer.rb +78 -0
  275. data/lib/kontena/plugin_manager/loader.rb +93 -0
  276. data/lib/kontena/plugin_manager/rubygems_client.rb +59 -0
  277. data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
  278. data/lib/kontena/plugin_manager.rb +26 -0
  279. data/lib/kontena/presets/github_auth_provider.yml +11 -0
  280. data/lib/kontena/presets/kontena_auth_provider.yml +11 -0
  281. data/lib/kontena/scripts/completer +9 -0
  282. data/lib/kontena/scripts/completer.rb +334 -0
  283. data/lib/kontena/scripts/init +18 -0
  284. data/lib/kontena/scripts/kontena.zsh +11 -0
  285. data/lib/kontena/scripts/krates.bash +8 -0
  286. data/lib/kontena/stacks/change_resolver.rb +118 -0
  287. data/lib/kontena/stacks/stack_data.rb +58 -0
  288. data/lib/kontena/stacks/stack_data_set.rb +51 -0
  289. data/lib/kontena/stacks_cache.rb +110 -0
  290. data/lib/kontena/stacks_client.rb +177 -0
  291. data/lib/kontena/util.rb +116 -0
  292. data/lib/kontena_cli.rb +190 -0
  293. metadata +518 -0
@@ -0,0 +1,13 @@
1
+
2
+ class Kontena::Cli::CloudCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ subcommand "login", "Authenticate to Kontena Cloud", load_subcommand('cloud/login_command')
6
+ subcommand "logout", "Logout from Kontena Cloud", load_subcommand('cloud/logout_command')
7
+ subcommand "master", "Master specific commands", load_subcommand('cloud/master_command')
8
+
9
+ def subcommand_missing(name)
10
+ return super(name) unless %w(platform node org organization image-repository ir region token).include?(name)
11
+ exit_with_error "The #{pastel.cyan('cloud')} plugin has not been installed. Use: #{pastel.cyan('kontena plugin install cloud')}"
12
+ end
13
+ end
@@ -0,0 +1,360 @@
1
+ require 'forwardable'
2
+ require 'kontena_cli'
3
+
4
+ module Kontena
5
+ autoload :Client, 'kontena/client'
6
+
7
+ module Cli
8
+ autoload :ShellSpinner, 'kontena/cli/spinner'
9
+ autoload :Spinner, 'kontena/cli/spinner'
10
+ autoload :Config, 'kontena/cli/config'
11
+
12
+ module Common
13
+ extend Forwardable
14
+
15
+ def_delegators :prompt, :ask, :yes?
16
+ def_delegators :config,
17
+ :current_grid=, :require_current_grid, :current_master,
18
+ :current_master=, :require_current_master, :require_current_account,
19
+ :current_account
20
+ def_delegator :config, :config_filename, :settings_filename
21
+ def_delegator :client, :server_version, :api_url_version
22
+
23
+ def logger
24
+ Kontena.logger
25
+ end
26
+
27
+ def prompt
28
+ Kontena.prompt
29
+ end
30
+
31
+ def pastel
32
+ Kontena.pastel
33
+ end
34
+
35
+ def spinner(msg, &block)
36
+ Kontena::Cli::Spinner.spin(msg, &block)
37
+ end
38
+
39
+ def config
40
+ Kontena::Cli::Config.instance
41
+ end
42
+
43
+ def debug?
44
+ Kontena.debug?
45
+ end
46
+
47
+ # Read from STDIN. If stdin is a console, use prompt to ask.
48
+ # @param [String] message
49
+ # @param [Symbol] mode (prompt method: :ask, :multiline, etc)
50
+ def stdin_input(message = nil, mode = :ask)
51
+ if $stdin.tty?
52
+ Array(prompt.send(mode, message)).join.chomp
53
+ elsif !$stdin.eof?
54
+ $stdin.read.chomp
55
+ else
56
+ exit_with_error 'Missing input'
57
+ end
58
+ end
59
+
60
+ def running_silent?
61
+ self.respond_to?(:silent?) && self.silent?
62
+ end
63
+
64
+ def running_verbose?
65
+ self.respond_to?(:verbose?) && self.verbose?
66
+ end
67
+
68
+ def running_quiet?
69
+ self.respond_to?(:quiet?) && self.quiet?
70
+ end
71
+
72
+ # Puts that puts even when self.silent?
73
+ def sputs(*msgs)
74
+ ::Kernel.puts(*msgs)
75
+ end
76
+
77
+ # Print that prints even when self.silent?
78
+ def sprint(*msgs)
79
+ ::Kernel.print(*msgs)
80
+ end
81
+
82
+ # Print that doesn't print if self.silent?
83
+ def print(*msgs)
84
+ if running_silent?
85
+ logger.debug(msgs.join)
86
+ else
87
+ super(*msgs)
88
+ end
89
+ end
90
+
91
+ # Puts that doesn't puts if self.silent?
92
+ def puts(*msgs)
93
+ if running_silent?
94
+ msgs.compact.each { |msg| logger.debug(msg) }
95
+ elsif Thread.main['spinners'] && !Thread.main['spinners'].empty?
96
+ Thread.main['spinner_msgs'] ||= []
97
+ msgs.each { |msg| Thread.main['spinner_msgs'] << msg }
98
+ else
99
+ super(*msgs)
100
+ end
101
+ end
102
+
103
+ # Only output message if in verbose mode
104
+ def vputs(msg = nil)
105
+ if running_verbose?
106
+ puts msg
107
+ elsif debug? && msg
108
+ logger.debug msg
109
+ end
110
+ end
111
+
112
+ # Only show spinner when in verbose mode
113
+ def vspinner(msg, &block)
114
+ return vfakespinner(msg) unless block_given?
115
+
116
+ if running_verbose? && $stdout.tty?
117
+ spinner(msg, &block)
118
+ else
119
+ logger.debug { msg }
120
+ yield
121
+ end
122
+ end
123
+
124
+ # Output a message like: "> Reading foofoo .."
125
+ # @param message [String] the message to display
126
+ # @param dots [TrueClass,FalseClass] set to false if you don't want to add ".." after the message
127
+ def caret(msg, dots: true)
128
+ puts "#{pastel.green('>')} #{msg}#{" #{pastel.green('..')}" if dots}"
129
+ end
130
+
131
+ # Run a spinner with a message for the block if a truthy value or a proc returns true.
132
+ # @example
133
+ # spin_if(proc { prompt.yes?("for real?") }, "Doing as requested") do
134
+ # # doing stuff
135
+ # end
136
+ # spin_if(a == 1, "Value of 'a' is 1, so let's do this") do
137
+ # # doing stuff
138
+ # end
139
+ # @param obj_or_proc [Object,Proc] something that responds to .call or is truthy/falsey
140
+ # @param message [String] the message to display
141
+ # @return anything the block returns
142
+ def spin_if(obj_or_proc, message, &block)
143
+ if (obj_or_proc.respond_to?(:call) && obj_or_proc.call) || obj_or_proc
144
+ spinner(message, &block)
145
+ else
146
+ logger.debug { message }
147
+ yield
148
+ end
149
+ end
150
+
151
+ # Like vspinner but without actually running any block
152
+ def vfakespinner(msg, success: true)
153
+ if !running_verbose?
154
+ logger.debug { msg }
155
+ return
156
+ end
157
+ puts " [#{ success ? pastel.green('done') : pastel.red('fail')}] #{msg}"
158
+ end
159
+
160
+ def warning(msg)
161
+ warning = pastel.yellow('warn')
162
+ $stderr.puts " [#{warning}] #{msg}"
163
+ end
164
+
165
+ def exit_with_error(msg, code = 1)
166
+ error = pastel.red('error')
167
+ $stderr.puts " [#{error}] #{msg}"
168
+ exit code
169
+ end
170
+ module_function :exit_with_error
171
+
172
+ def require_api_url
173
+ config.require_current_master.url
174
+ end
175
+
176
+ def require_token
177
+ retried ||= false
178
+ config.require_current_master_token
179
+ rescue Kontena::Cli::Config::TokenExpiredError
180
+ if retried
181
+ raise ArgumentError, "Current master access token has expired and refresh failed."
182
+ else
183
+ logger.debug "Access token expired, trying to refresh"
184
+ retried = true
185
+ client.refresh_token && retry
186
+ end
187
+ end
188
+
189
+ ## Invalidate refresh_token
190
+ # @param [Kontena::Cli::Config::Server] server
191
+ def use_refresh_token(server)
192
+ return unless server.token
193
+ return unless server.token.refresh_token
194
+ return if server.token.expired?
195
+ client = Kontena::Client.new(server.url, server.token,
196
+ ssl_cert_path: server.ssl_cert_path,
197
+ ssl_subject_cn: server.ssl_subject_cn,
198
+ )
199
+ logger.debug "Trying to invalidate refresh token on #{server.name}"
200
+ client.refresh_token
201
+ rescue => ex
202
+ logger.debug "Refreshing failed: #{ex.class.name} : #{ex.message}"
203
+ end
204
+
205
+ def kontena_account
206
+ @kontena_account ||= config.current_account
207
+ end
208
+
209
+ def cloud_auth?
210
+ return false unless kontena_account
211
+ return false unless kontena_account.token
212
+ return false unless kontena_account.token.access_token
213
+ true
214
+ end
215
+
216
+ def cloud_client
217
+ @cloud_client ||= Kontena::Client.new(kontena_account.url, kontena_account.token, prefix: '/')
218
+ end
219
+
220
+ def reset_cloud_client
221
+ @cloud_client = nil
222
+ end
223
+
224
+ def client(token = nil, api_url = nil)
225
+ return @client if @client
226
+
227
+ if token.kind_of?(String)
228
+ token = Kontena::Cli::Config::Token.new(access_token: token)
229
+ end
230
+
231
+ @client = Kontena::Client.new(
232
+ api_url || require_current_master.url,
233
+ token || require_current_master.token,
234
+ ssl_cert_path: require_current_master.ssl_cert_path,
235
+ ssl_subject_cn: require_current_master.ssl_subject_cn,
236
+ )
237
+ end
238
+
239
+ def reset_client
240
+ @client = nil
241
+ end
242
+
243
+ def api_url
244
+ config.require_current_master.url
245
+ end
246
+
247
+ def clear_current_grid
248
+ current_master.delete_field(:grid) if require_current_master.respond_to?(:grid)
249
+ config.write
250
+ end
251
+
252
+ def current_grid
253
+ (self.respond_to?(:grid) ? self.grid : nil) || config.current_grid
254
+ end
255
+
256
+ def current_master_index
257
+ config.find_server_index(require_current_master.name)
258
+ end
259
+
260
+ def error(message = "Error")
261
+ prompt.error(message)
262
+ exit(1)
263
+ end
264
+
265
+ def confirm_command(name, message = nil)
266
+ if self.respond_to?(:force?) && self.force?
267
+ return
268
+ end
269
+ puts message if message
270
+ exit_with_error 'Command requires --force' unless $stdout.tty? && $stdin.tty?
271
+ puts "Destructive command. To proceed, type \"#{name}\" or re-run this command with --force option."
272
+
273
+ ask("Enter '#{name}' to confirm: ") == name.to_s || error("Confirmation did not match #{name}. Aborted command.")
274
+ end
275
+
276
+ def confirm(message = 'Destructive command. You can skip this prompt by running this command with --force option. Are you sure?')
277
+ if self.respond_to?(:force?) && self.force?
278
+ return
279
+ end
280
+ exit_with_error 'Command requires --force' unless $stdout.tty? && $stdin.tty?
281
+ prompt.yes?(message) || error('Aborted command.')
282
+ end
283
+
284
+ def api_url=(api_url)
285
+ config.current_master.url = api_url
286
+ config.write
287
+ end
288
+
289
+ def access_token=(token)
290
+ require_current_master.token.access_token = token
291
+ config.write
292
+ end
293
+
294
+ def add_master(server_name, master_info)
295
+ config.add_server(master_info.merge('name' => server_name))
296
+ end
297
+
298
+ def any_key_to_continue_with_timeout(timeout=9)
299
+ return nil if running_silent?
300
+ return nil unless $stdout.tty?
301
+ prompt.keypress("Press any key to continue or ctrl-c to cancel (Automatically continuing in :countdown seconds) ...", timeout: timeout)
302
+ end
303
+
304
+ def any_key_to_continue(timeout = nil)
305
+ return nil if running_silent?
306
+ return nil unless $stdout.tty?
307
+ return any_key_to_continue_with_timeout(timeout) if timeout
308
+ prompt.keypress("Press any key to continue or ctrl-c to cancel.. ")
309
+ end
310
+
311
+ def display_account_login_info
312
+ if kontena_account
313
+ if kontena_account.token && kontena_account.token.access_token
314
+ begin
315
+ puts [
316
+ pastel.green("Authenticated to Kontena Cloud at"),
317
+ pastel.yellow(kontena_account.url),
318
+ pastel.green("as"),
319
+ pastel.yellow(kontena_account.username)
320
+ ].join(' ')
321
+ rescue
322
+ end
323
+ else
324
+ puts pastel.cyan("Not authenticated to Kontena Cloud")
325
+ end
326
+ end
327
+ end
328
+
329
+ def display_master_login_info
330
+ server = config.current_master
331
+ if server
332
+ if server.token && server.token.access_token
333
+ puts [
334
+ pastel.green('Authenticated to Kontena Master'),
335
+ pastel.yellow(server.name),
336
+ pastel.green('at'),
337
+ pastel.yellow(server.url),
338
+ pastel.green('as'),
339
+ pastel.yellow(server.token.username || server.username)
340
+ ].join(' ')
341
+ else
342
+ puts pastel.cyan("Not authenticated to current master #{server.name}")
343
+ end
344
+ else
345
+ puts pastel.cyan("Current master not selected")
346
+ end
347
+ end
348
+
349
+ def display_login_info(only: nil)
350
+ display_master_login_info unless only == :account
351
+ display_account_login_info unless only == :master
352
+ end
353
+
354
+ def display_logo
355
+ puts File.read(File.expand_path('../../../../LOGO', __FILE__))
356
+ end
357
+ module_function :display_logo
358
+ end
359
+ end
360
+ end