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,34 @@
1
+ require_relative 'common'
2
+
3
+ module Kontena::Cli::Master::Token
4
+ class ShowCommand < Kontena::Command
5
+
6
+ parameter "TOKEN_OR_ID", "Access token or access token id"
7
+
8
+ include Kontena::Cli::Common
9
+ include Common
10
+
11
+ requires_current_master
12
+ requires_current_master_token
13
+
14
+ option '--id', :flag, "Only output access token id", hidden: true
15
+
16
+ def execute
17
+ data = client.get("/oauth2/tokens/#{token_or_id}")
18
+ output = token_data_to_hash(data)
19
+
20
+ if id?
21
+ puts output[:id]
22
+ return
23
+ end
24
+
25
+ id = output.delete(:id)
26
+ puts '%s:' % id
27
+ output.each do |key, value|
28
+ puts " %s: %s" % [key, value.nil? ? '-' : value]
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+
@@ -0,0 +1,13 @@
1
+
2
+ module Kontena::Cli::Master
3
+ class TokenCommand < Kontena::Command
4
+ subcommand ["list", "ls"], "List access tokens", load_subcommand('master/token/list_command')
5
+ subcommand ["rm", "remove"], "Remove / revoke an access token", load_subcommand('master/token/remove_command')
6
+ subcommand "show", "Display access token", load_subcommand('master/token/show_command')
7
+ subcommand "current", "Display current access token", load_subcommand('master/token/current_command')
8
+ subcommand "create", "Generate an access token", load_subcommand('master/token/create_command')
9
+
10
+ def execute
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module Kontena::Cli::Master
2
+ class UseCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "[NAME]", "Master name to use"
6
+
7
+ option '--clear', :flag, "Clear current master setting"
8
+
9
+ def execute
10
+ if clear?
11
+ config.current_master = nil
12
+ config.write
13
+ exit 0
14
+ elsif name.nil?
15
+ signal_usage_error Clamp.message(:parameter_argument_error, :param => 'NAME', :message => "missing")
16
+ exit 1
17
+ end
18
+
19
+ master = config.find_server(name)
20
+ if master.nil?
21
+ exit_with_error "Could not resolve master by name '#{name}'. For a list of known masters please run: kontena master list"
22
+ else
23
+ config.current_master = master['name']
24
+ config.write
25
+ puts "Using master: #{pastel.cyan(master['name'])} (#{master['url']})"
26
+ puts "Using grid: #{current_grid ? pastel.cyan(current_grid) : "<none>"}"
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../common'
2
+ require_relative 'role/add_command'
3
+
4
+ module Kontena::Cli::Master::User
5
+ class InviteCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+
8
+ parameter "EMAIL ...", "List of emails"
9
+
10
+ option ['-r', '--roles'], '[ROLES]', 'Comma separated list of roles to assign to the invited users'
11
+ option ['-c', '--code'], :flag, 'Only output the invite code'
12
+ option '--external-id', '[EXTERNAL ID]', 'Assign external id to user', hidden: true
13
+ option '--return', :flag, 'Return the code', hidden: true
14
+
15
+ requires_current_master
16
+ requires_current_master_token
17
+
18
+ def execute
19
+ if self.roles
20
+ roles = self.roles.split(',')
21
+ else
22
+ roles = []
23
+ end
24
+ external_id = nil
25
+ if email_list.size == 1 && self.external_id
26
+ external_id = self.external_id
27
+ end
28
+ email_list.each do |email|
29
+ begin
30
+ data = { email: email, external_id: external_id, response_type: 'invite' }
31
+ response = client.post('/oauth2/authorize', data)
32
+ if self.code?
33
+ puts response['invite_code']
34
+ elsif self.return?
35
+ return response
36
+ else
37
+ puts pastel.green("Invitation created for #{response['email']}")
38
+ puts " * code: #{response['invite_code']}"
39
+ puts " * command: kontena master join #{current_master.url} #{response['invite_code']}"
40
+ end
41
+ roles.each do |role|
42
+ raise "Failed to add role" unless Kontena.run(["master", "user", "role", "add", role, email])
43
+ end
44
+ rescue => ex
45
+ logger.error(ex)
46
+ exit_with_error "Failed to invite #{email} : #{ex.message}"
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../common'
2
+
3
+ module Kontena::Cli::Master::User
4
+ class ListCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::TableGenerator::Helper
7
+
8
+ requires_current_master
9
+ requires_current_master_token
10
+
11
+ def fields
12
+ quiet? ? ['id'] : { email: 'email', roles: 'role_list' }
13
+ end
14
+
15
+ def execute
16
+ response = spin_if(!quiet? && $stdout.tty?, "Retrieving user list from Kontena Master") do
17
+ client.get('users')['users']
18
+ end
19
+
20
+ print_table(response) do |row|
21
+ if row['roles'].empty?
22
+ row['role_list'] = ''
23
+ else
24
+ row['role_list'] = row['roles'].map { |r| r['name'] }.join(',')
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../../common'
2
+
3
+ module Kontena::Cli::Master::User
4
+ class RemoveCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+
7
+ parameter "EMAIL ...", "List of emails"
8
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
9
+
10
+ def execute
11
+ require_api_url
12
+ token = require_token
13
+ confirm unless forced?
14
+
15
+ email_list.each do |email|
16
+ begin
17
+ client(token).delete("users/#{email}")
18
+ rescue => ex
19
+ $stderr.puts pastel.red("Failed to remove user #{email} : #{ex.message}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../../common'
2
+
3
+ module Kontena::Cli::Master::User
4
+ module Role
5
+ class AddCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+
8
+ parameter "ROLE", "Role name"
9
+ parameter "USER ...", "List of users"
10
+
11
+ option '--silent', :flag, 'Reduce output verbosity'
12
+
13
+ def execute
14
+ require_api_url
15
+ token = require_token
16
+ data = { role: role }
17
+
18
+ user_list.each do |email|
19
+ begin
20
+ response = client(token).post("users/#{email}/roles", data)
21
+ puts "Added role #{role} to #{email}" unless running_silent?
22
+ rescue => ex
23
+ abort pastel.red("Failed to add role #{role} to #{email} : #{ex.message}")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../../common'
2
+
3
+ module Kontena::Cli::Master::User::Role
4
+ class RemoveCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+
7
+ parameter "ROLE", "Role name"
8
+ parameter "USER ...", "List of users"
9
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
10
+
11
+
12
+ def execute
13
+ require_api_url
14
+ token = require_token
15
+ confirm unless forced?
16
+
17
+ user_list.each do |email|
18
+ begin
19
+ response = client(token).delete("users/#{email}/roles/#{role}")
20
+ puts "Removed role #{role} from #{email}" if response
21
+ rescue => ex
22
+ $stderr.puts pastel.red("Failed to remove role #{role} from #{email} : #{ex.message}")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,6 @@
1
+ module Kontena::Cli::Master::User
2
+ class RoleCommand < Kontena::Command
3
+ subcommand "add", "Add role to user", load_subcommand('master/user/role/add_command')
4
+ subcommand ["remove", "rm"], "Remove role from user", load_subcommand('master/user/role/remove_command')
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ module Kontena::Cli::Master
2
+ class UserCommand < Kontena::Command
3
+ subcommand "invite", "Invite user to Kontena Master", load_subcommand('master/user/invite_command')
4
+ subcommand ["remove", "rm"], "Remove user from Kontena Master", load_subcommand('master/user/remove_command')
5
+ subcommand ["list", "ls"], "List users", load_subcommand('master/user/list_command')
6
+ subcommand "role", "User role specific commands", load_subcommand('master/user/role_command')
7
+ end
8
+ end
9
+
@@ -0,0 +1,21 @@
1
+ class Kontena::Cli::MasterCommand < Kontena::Command
2
+ include Kontena::Util
3
+
4
+ subcommand ["list", "ls"], "List masters where client has logged in", load_subcommand('master/list_command')
5
+ subcommand ["remove", "rm"], "Remove a master from configuration", load_subcommand('master/remove_command')
6
+ subcommand ["config", "cfg"], "Configure master settings", load_subcommand('master/config_command')
7
+ subcommand "use", "Switch to use selected master", load_subcommand('master/use_command')
8
+ subcommand "user", "User specific commands", load_subcommand('master/user_command')
9
+ subcommand "current", "Show current master details", load_subcommand('master/current_command')
10
+ subcommand "login", "Authenticate to Kontena Master", load_subcommand('master/login_command')
11
+ subcommand "logout", "Log out of Kontena Master", load_subcommand('master/logout_command')
12
+ subcommand "token", "Manage Kontena Master access tokens", load_subcommand('master/token_command')
13
+ subcommand "join", "Join Kontena Master using an invitation code", load_subcommand('master/join_command')
14
+ subcommand "audit-log", "Show master audit logs", load_subcommand('master/audit_log_command')
15
+ subcommand "create", "Install a new Kontena Master", load_subcommand('master/create_command') if experimental?
16
+ subcommand "init-cloud", "Configure current master to use Kontena Cloud services", load_subcommand('master/init_cloud_command')
17
+ subcommand "ssh", "Connect to the master via SSH", load_subcommand('master/ssh_command')
18
+
19
+ def execute
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ class Kontena::Cli::NodeCommand < Kontena::Command
2
+
3
+ subcommand ["list","ls"], "List grid nodes", load_subcommand('nodes/list_command')
4
+ subcommand "show", "Show node", load_subcommand('nodes/show_command')
5
+ subcommand "ssh", "Ssh into node", load_subcommand('nodes/ssh_command')
6
+ subcommand "create", "Create node", load_subcommand('nodes/create_command')
7
+ subcommand "update", "Update node", load_subcommand('nodes/update_command')
8
+ subcommand "reset-token", "Reset node token for agent websocket connection", load_subcommand('nodes/reset_token_command')
9
+ subcommand ["remove","rm"], "Remove node", load_subcommand('nodes/remove_command')
10
+ subcommand "label", "Node label specific commands", load_subcommand('nodes/label_command')
11
+ subcommand "health", "Check node health", load_subcommand('nodes/health_command')
12
+ subcommand "env", "Generate kontena-agent.env configuration", load_subcommand('nodes/env_command')
13
+
14
+
15
+ def execute
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ module Kontena::Cli::Nodes
2
+ class CreateCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
5
+
6
+ requires_current_master
7
+ requires_current_master_token
8
+ requires_current_grid
9
+
10
+ parameter "NAME", "Node name"
11
+ option ["--token"], "TOKEN", "Node token"
12
+ option ["-l", "--label"], "LABEL", "Node label", multivalued: true
13
+
14
+ def execute
15
+ data = { name: name }
16
+
17
+ data[:token] = token if token
18
+ data[:labels] = label_list
19
+
20
+ spinner "Creating #{pastel.cyan(name)} node " do
21
+ client.post("grids/#{current_grid}/nodes", data)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ module Kontena::Cli::Nodes
2
+ class EnvCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
5
+
6
+ requires_current_master
7
+ requires_current_master_token
8
+ requires_current_grid
9
+
10
+ parameter "NAME", "Node name"
11
+ option ['--token'], :flag, 'Only show token', default: false
12
+
13
+ def grid_uri
14
+ grid_uri = self.current_master['url'].sub('http', 'ws')
15
+ end
16
+
17
+ def get_node_token
18
+ return client.get("nodes/#{current_grid}/#{name}/token")
19
+ rescue Kontena::Errors::StandardError => exc
20
+ raise unless exc.status == 404
21
+ return nil
22
+ end
23
+
24
+ def execute
25
+ unless token_node = get_node_token()
26
+ exit_with_error "Node #{name} was not created with a node token. Use `kontena grid env` instead"
27
+ end
28
+
29
+ if self.token?
30
+ puts token_node['token']
31
+ else
32
+ puts "KONTENA_URI=#{grid_uri}"
33
+ puts "KONTENA_NODE_TOKEN=#{token_node['token']}"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ require 'kontena/cli/helpers/health_helper'
2
+ require 'kontena/cli/helpers/time_helper'
3
+
4
+ module Kontena::Cli::Nodes
5
+ class HealthCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Cli::GridOptions
8
+ include Kontena::Cli::Helpers::HealthHelper
9
+ include Kontena::Cli::Helpers::TimeHelper
10
+
11
+ parameter "NODE", "Node name"
12
+
13
+ requires_current_master
14
+ requires_current_grid
15
+
16
+ def execute
17
+ return show_node_health("#{current_grid}/#{self.node}")
18
+ end
19
+
20
+ # @param id [String] :grid/:node
21
+ # @return [Boolean] true if healthy
22
+ def show_node_health(id)
23
+ node_health = client.get("nodes/#{id}/health")
24
+
25
+ if node_health['status'] == 'online'
26
+ puts "#{health_icon(:ok)} Node is online for #{time_since(node_health['connected_at'])}"
27
+ else
28
+ puts "#{health_icon(:warning)} Node is #{node_health['status']}"
29
+ end
30
+
31
+ etcd_health, etcd_status = node_etcd_health(node_health['etcd_health'])
32
+
33
+ puts "#{health_icon etcd_health} Node #{node_health['name']} etcd is #{etcd_status}"
34
+
35
+ return etcd_health == :ok
36
+
37
+ rescue Kontena::Errors::StandardErrorHash => exc
38
+ raise unless exc.status == 422
39
+
40
+ exc.errors.each do |what, error|
41
+ puts "#{health_icon :offline} Node #{id} #{what} error: #{error}"
42
+ end
43
+
44
+ return false
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,10 @@
1
+ module Kontena::Cli::Nodes
2
+ class LabelCommand < Kontena::Command
3
+ subcommand ["list", "ls"], "List node labels", load_subcommand('nodes/labels/list_command')
4
+ subcommand "add", "Add label to node", load_subcommand('nodes/labels/add_command')
5
+ subcommand ["remove", "rm"], "Remove label from node", load_subcommand('nodes/labels/remove_command')
6
+
7
+ def execute
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ module Kontena::Cli::Nodes::Labels
2
+ class AddCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NODE", "Node name"
6
+ parameter "LABEL ...", "Labels"
7
+
8
+ requires_current_master
9
+ requires_current_master_token
10
+ requires_current_grid
11
+
12
+ def execute
13
+ node = client.get("nodes/#{current_grid}/#{self.node}")
14
+ data = { labels: (Array(node['labels']) + label_list).uniq }
15
+ client.put("nodes/#{node['id']}", data)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Kontena::Cli::Nodes::Labels
2
+ class ListCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NODE", "Node name"
6
+
7
+ # the command outputs id info only anyway, this is here strictly for ignoring purposes
8
+ option ['-q', '--quiet'], :flag, "Output the identifying column only", hidden: true
9
+
10
+ requires_current_master
11
+ requires_current_master_token
12
+ requires_current_grid
13
+
14
+ def execute
15
+ node = client.get("nodes/#{current_grid}/#{self.node}")
16
+ puts Array(node['labels']).join("\n")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module Kontena::Cli::Nodes::Labels
2
+ class RemoveCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NODE", "Node name"
6
+ parameter "LABEL ...", "Labels"
7
+
8
+ option '--force', :flag, "Do not abort if items in label list are not found"
9
+
10
+ requires_current_master
11
+ requires_current_master_token
12
+ requires_current_grid
13
+
14
+ def execute
15
+ node_data = client.get("nodes/#{current_grid}/#{self.node}")
16
+
17
+ node_data['labels'] ||= []
18
+
19
+ found_labels = label_list.uniq & node_data['labels']
20
+
21
+ if !force? && found_labels.size != label_list.uniq.size
22
+ missing = label_list - found_labels
23
+ exit_with_error "Label#{'s' if missing.size > 1} #{pastel.cyan(missing.join(', '))} not found on node #{pastel.cyan(node)}"
24
+ end
25
+
26
+ return nil if found_labels.empty?
27
+
28
+ data = { labels: node_data['labels'] - found_labels }
29
+ client.put("nodes/#{node_data['id']}", data)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,97 @@
1
+ require_relative '../helpers/health_helper'
2
+ require_relative '../helpers/time_helper'
3
+
4
+ module Kontena::Cli::Nodes
5
+ class ListCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Cli::GridOptions
8
+ include Kontena::Cli::Helpers::HealthHelper
9
+ include Kontena::Cli::Helpers::TimeHelper
10
+ include Kontena::Cli::TableGenerator::Helper
11
+
12
+ option ['-a', '--all'], :flag, 'List nodes for all grids', default: false
13
+
14
+ requires_current_master
15
+ requires_current_master_token
16
+ requires_current_grid
17
+
18
+ def node_name(node, grid)
19
+ return node['name'] unless all?
20
+ "#{grid['name']}/#{node['name']}"
21
+ end
22
+
23
+ def node_status(node)
24
+ case node_status = node['status']
25
+ when 'created'
26
+ "#{pastel.dark('created')} #{time_since(node['created_at'], terse: true)}"
27
+ when 'connecting'
28
+ "#{pastel.cyan('connecting')} #{time_since(node['connected_at'], terse: true)}"
29
+ when 'online'
30
+ "#{pastel.green('online')} #{time_since(node['connected_at'], terse: true)}"
31
+ when 'drain'
32
+ "#{pastel.yellow('drain')}"
33
+ when 'offline'
34
+ "#{pastel.red('offline')} #{time_since(node['disconnected_at'], terse: true)}"
35
+ else
36
+ pastel.white(node_status.to_s)
37
+ end
38
+ end
39
+
40
+ def node_initial(node, grid)
41
+ return '-' unless node['initial_member']
42
+ "#{node['node_number']} / #{grid['initial_size']}"
43
+ end
44
+
45
+ def node_labels(node)
46
+ (node['labels'] || ['-']).join(',')
47
+ end
48
+
49
+ def fields
50
+ return ['name'] if quiet?
51
+ {
52
+ name: 'name',
53
+ version: 'agent_version',
54
+ status: 'status',
55
+ initial: 'initial',
56
+ labels: 'labels',
57
+ }
58
+ end
59
+
60
+ def grids
61
+ all? ? client.get("grids")['grids'] : [client.get("grids/#{current_grid}")]
62
+ end
63
+
64
+ def grid_nodes(grid_name)
65
+ client.get("grids/#{grid_name}/nodes")['nodes']
66
+ end
67
+
68
+ def node_data
69
+ grids.flat_map do |grid|
70
+ grid_nodes = []
71
+
72
+ grid_nodes(grid['id']).each do |node|
73
+ node['name'] = node_name(node, grid)
74
+ grid_nodes << node
75
+ next if quiet?
76
+ node['agent_version'] ||= '-'
77
+ node['initial'] = node_initial(node, grid)
78
+ node['status'] = node_status(node)
79
+ node['labels'] = node_labels(node)
80
+ end
81
+
82
+ unless quiet?
83
+ grid_health = grid_health(grid, grid_nodes)
84
+ grid_nodes.each do |node|
85
+ node['name'] = health_icon(node_health(node, grid_health)) + " " + (node['name'] || node['node_id'])
86
+ end
87
+ end
88
+
89
+ grid_nodes.sort_by { |n| n['node_number'] }
90
+ end
91
+ end
92
+
93
+ def execute
94
+ print_table(node_data)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,34 @@
1
+ module Kontena::Cli::Nodes
2
+ class RemoveCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
5
+
6
+ parameter "NODE ...", "Node name", attribute_name: :nodes
7
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
8
+
9
+ def execute
10
+ require_api_url
11
+ require_current_grid
12
+ token = require_token
13
+
14
+ nodes.each do |node_name|
15
+ node = client(token).get("nodes/#{current_grid}/#{node_name}")
16
+ provider = Array(node["labels"]).find{ |l| l.start_with?('provider=')}.to_s.split('=').last
17
+ if node['connected'] && provider
18
+ plugin = provider == 'kontena' ? 'cloud' : provider
19
+ exit_with_error "Node #{node['name']} is still connected. You should terminate the node instead: kontena #{plugin} node terminate #{node['name']}"
20
+ elsif node['connected']
21
+ exit_with_error "Node #{node['name']} is still connected. You must terminate the node before removing it"
22
+ else
23
+ warning "Removing a node from the grid does not terminate the host machine from any cloud provider, so your cloud provider may continue to bill you for the machine until you terminate it"
24
+ end
25
+
26
+ confirm_command(node_name) unless forced?
27
+
28
+ spinner "Removing #{pastel.cyan(node_name)} node from #{pastel.cyan(current_grid)} grid " do
29
+ client(token).delete("nodes/#{node['id']}")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module Kontena::Cli::Nodes
2
+ class ResetTokenCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
5
+
6
+ requires_current_master
7
+ requires_current_master_token
8
+ requires_current_grid
9
+
10
+ parameter "NODE", "Node name"
11
+
12
+ option ["--token"], "TOKEN", "Use given node token instead of generating a random token"
13
+ option ["--clear-token"], :flag, "Clear node token, reverting to grid token"
14
+ option "--[no-]reset-connection", :flag, "Reset agent websocket connection", default: true
15
+ option "--force", :flag, "Force token update"
16
+
17
+ def execute
18
+ confirm("Resetting the node token will disconnect the agent (unless using --no-reset-connection), and require you to reconfigure the kontena-agent using the new `kontena node env` values before it will be able to reconnect. Are you sure?")
19
+
20
+ spinner "Resetting node #{pastel.cyan(self.node)} websocket connection token" do
21
+ if self.clear_token?
22
+ client.delete("nodes/#{current_grid}/#{self.node}/token",
23
+ reset_connection: self.reset_connection?,
24
+ )
25
+ else
26
+ client.put("nodes/#{current_grid}/#{self.node}/token",
27
+ token: self.token,
28
+ reset_connection: self.reset_connection?,
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end