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,334 @@
1
+ require 'kontena/cli/common'
2
+ require 'kontena/stacks_client'
3
+
4
+ class Helper
5
+ include Kontena::Cli::Common
6
+
7
+ def client_config
8
+ require 'json'
9
+ config_file = File.expand_path('~/.krates.json')
10
+ if(File.exist?(config_file))
11
+ JSON.parse(File.read(config_file))
12
+ else
13
+ {}
14
+ end
15
+ rescue => ex
16
+ logger.debug ex
17
+ {}
18
+ end
19
+
20
+ def current_grid
21
+ client_config['servers'].find { |s| s['name'] == client_config['current_server']}['grid']
22
+ rescue => ex
23
+ logger.debug ex
24
+ nil
25
+ end
26
+
27
+ def current_master_name
28
+ client_config['current_server']
29
+ end
30
+
31
+ def grids
32
+ client.get("grids")['grids'].map{|grid| grid['id']}
33
+ rescue => ex
34
+ logger.debug ex
35
+ []
36
+ end
37
+
38
+ def nodes
39
+ client.get("grids/#{current_grid}/nodes")['nodes'].map{|node| node['name']}
40
+ rescue
41
+ []
42
+ end
43
+
44
+ def stacks
45
+ stacks = client.get("grids/#{current_grid}/stacks")['stacks']
46
+ results = []
47
+ results.push stacks.map{|s| s['name']}
48
+ results.delete('null')
49
+ results
50
+ rescue => ex
51
+ logger.debug ex
52
+ []
53
+ end
54
+
55
+ def stack_registry_usable?
56
+ return false if current_account.nil? || current_account.stacks_url.nil?
57
+ return false if current_account.stacks_read_authentication && current_account.token.nil? || current_account.token.access_token.nil?
58
+ true
59
+ end
60
+
61
+ def stacks_client
62
+ Kontena::StacksClient.new(current_account.stacks_url, current_account.token, read_requires_token: current_account.stacks_read_authentication)
63
+ end
64
+
65
+ def registry_stacks(query = '')
66
+ return [] unless stack_registry_usable?
67
+ results = stacks_client.search(query).map { |s| s['stack'] }
68
+ if results.empty? && !query.empty? # this is here because old stack registry does not return anything for "org/"
69
+ results = stacks_client.search('').map { |s| s['stack'] }.select { |s| s.start_with?(query) }
70
+ end
71
+ results
72
+ rescue => ex
73
+ logger.debug ex
74
+ []
75
+ end
76
+
77
+ def registry_stack_versions(stackname)
78
+ return [] unless stack_registry_usable?
79
+ logger.debug stackname.inspect
80
+ stacks_client.versions(stackname).map { |v| [stackname, v['version']].join(':') }
81
+ rescue => ex
82
+ logger.debug ex
83
+ []
84
+ end
85
+
86
+ def services
87
+ services = client.get("grids/#{current_grid}/services")['services']
88
+ results = []
89
+ results.push services.map{ |s|
90
+ stack = s['stack']['id'].split('/').last
91
+ if stack != 'null'
92
+ "#{stack}/#{s['name']}"
93
+ else
94
+ s['name']
95
+ end
96
+ }
97
+ results
98
+ rescue => ex
99
+ logger.debug ex
100
+ []
101
+ end
102
+
103
+ def containers
104
+ results = []
105
+ client.get("grids/#{current_grid}/services")['services'].each do |service|
106
+ containers = client.get("services/#{service['id']}/containers")['containers']
107
+ results.push(containers.map{|c| c['name'] })
108
+ results.push(containers.map{|c| c['id'] })
109
+ end
110
+ results
111
+ rescue => ex
112
+ logger.debug ex
113
+ []
114
+ end
115
+
116
+ def yml_services
117
+ require 'yaml'
118
+ if File.exist?('kontena.yml')
119
+ yaml = YAML.safe_load(File.read('kontena.yml'), [], [], true, 'kontena.yml')
120
+ services = yaml['services']
121
+ services.keys
122
+ end
123
+ rescue => ex
124
+ logger.debug ex
125
+ []
126
+ end
127
+
128
+ def directories(word)
129
+ if word && File.directory?(word) && !word.end_with?('/')
130
+ ['%s/' % word]
131
+ else
132
+ Dir[File.join('.', '%s*' % word)].select { |file| File.directory?(file) }.map { |file| '%s/' % file.sub('./', '') }
133
+ end
134
+ end
135
+
136
+ def yml_files(word)
137
+ if word && File.directory?(word) && word.end_with?('/')
138
+ glob = File.join(word, '*.{yml,yaml}')
139
+ else
140
+ glob = File.join('.', '%s*.{yml,yaml}' % word)
141
+ end
142
+ Dir[glob].map { |file| file.sub('./', '') } + directories(word)
143
+ rescue => ex
144
+ logger.debug ex
145
+ []
146
+ end
147
+
148
+ def master_names
149
+ client_config['servers'].map{|s| s['name']}
150
+ rescue => ex
151
+ logger.debug ex
152
+ []
153
+ end
154
+
155
+ def subcommand_tree(cmd = nil, base = nil)
156
+ puts "#{cmd} ".strip
157
+ if base.has_subcommands?
158
+ base.recognised_subcommands.each do |sc|
159
+ subcommand_tree("#{cmd} #{sc.names.first}", sc.subcommand_class)
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ helper = Helper.new
166
+
167
+ words = ARGV
168
+
169
+ if words.first == '--subcommand-tree'
170
+ require 'kontena/main_command'
171
+ helper.subcommand_tree("kontena", Kontena::MainCommand)
172
+ exit 0
173
+ end
174
+
175
+ words.delete_at(0)
176
+
177
+ helper.logger.debug { "Completing #{words.inspect}" }
178
+
179
+ begin
180
+ completion = []
181
+ completion.push %w(cloud grid service stack vault certificate node master vpn registry container etcd external-registry whoami plugin version) if words.size < 2
182
+ if words.size > 0
183
+ case words[0]
184
+ when 'plugin'
185
+ completion.clear
186
+ sub_commands = %w(list search install uninstall)
187
+ if words[1]
188
+ completion.push(sub_commands) unless (sub_commands + %w(ls)).include?(words[1])
189
+ else
190
+ completion.push sub_commands
191
+ end
192
+ when 'etcd'
193
+ completion.clear
194
+ sub_commands = %w(get set mkdir list rm)
195
+ if words[1]
196
+ completion.push(sub_commands) unless (sub_commands + %w(ls)).include?(words[1])
197
+ else
198
+ completion.push sub_commands
199
+ end
200
+ when 'registry'
201
+ completion.clear
202
+ sub_commands = %w(create remove)
203
+ if words[1]
204
+ completion.push(sub_commands) unless (sub_commands + %w(rm)).include?(words[1])
205
+ else
206
+ completion.push sub_commands
207
+ end
208
+ when 'grid'
209
+ completion.clear
210
+ sub_commands = %w(add-user audit-log create current list user remove show use)
211
+ if words[1] && words[1] == 'use'
212
+ completion.push helper.grids.reject { |g| g == helper.current_grid }
213
+ elsif words[1] && %w(update show remove env cloud-config health).include?(words[1])
214
+ completion.push helper.grids
215
+ else
216
+ completion.push sub_commands
217
+ end
218
+ when 'node'
219
+ completion.clear
220
+ sub_commands = %w(list show remove)
221
+ if words[1] && sub_commands.include?(words[1])
222
+ completion.push helper.nodes
223
+ else
224
+ completion.push sub_commands
225
+ end
226
+ when 'master'
227
+ completion.clear
228
+ sub_commands = %w(list use user current remove config login logout token join audit-log init-cloud)
229
+ if words[1] && words[1] == 'use'
230
+ completion.push helper.master_names.reject { |n| n == helper.current_master_name }
231
+ elsif words[1] && %w(remove rm).include?(words[1])
232
+ completion.push helper.master_names
233
+ elsif words[1] && words[1] == 'user'
234
+ users_sub_commands = %w(invite list role)
235
+ if words[2] == 'role'
236
+ role_subcommands = %w(add remove)
237
+ if !words[3] || !(role_subcommands + %w(rm)).include?(words[3])
238
+ completion.push role_subcommands
239
+ end
240
+ else
241
+ completion.push users_sub_commands
242
+ end
243
+ elsif words[1] && ['config', 'cfg'].include?(words[1])
244
+ config_sub_commands = %(set get dump load import export unset)
245
+ completion.push config_sub_commands
246
+ elsif words[1] && words[1] == 'token'
247
+ token_sub_commands = %(list remove show current create)
248
+ completion.push token_sub_commands
249
+ elsif words[1]
250
+ completion.push(sub_commands) unless (sub_commands + %w(ls rm)).include?(words[1])
251
+ else
252
+ completion.push sub_commands
253
+ end
254
+ when 'cloud'
255
+ completion.clear
256
+ sub_commands = %w(login logout master)
257
+ if words[1] && words[1] == 'master'
258
+ cloud_master_sub_commands = %(list remove add show update)
259
+ completion.push cloud_master_sub_commands
260
+ elsif words[1]
261
+ completion.push(sub_commands) unless (sub_commands + %w(ls rm)).include?(words[1])
262
+ else
263
+ completion.push sub_commands
264
+ end
265
+ when 'service'
266
+ completion.clear
267
+ sub_commands = %w(containers create remove deploy list logs restart
268
+ scale show start stats stop update monitor env
269
+ secret link unlink)
270
+ if words[1] && sub_commands.include?(words[1])
271
+ completion.push helper.services
272
+ else
273
+ completion.push sub_commands
274
+ end
275
+ when 'container'
276
+ completion.clear
277
+ sub_commands = %w(exec inspect logs)
278
+ if words[1] && sub_commands.include?(words[1])
279
+ completion.push helper.containers
280
+ else
281
+ completion.push sub_commands
282
+ end
283
+ when 'vpn'
284
+ completion.clear
285
+ completion.push %w(config create remove)
286
+ when 'external-registry'
287
+ completion.clear
288
+ completion.push %w(add list remove)
289
+ when 'stack'
290
+ completion.clear
291
+ sub_commands = %w(build install upgrade deploy start stop remove restart list
292
+ logs monitor show registry inspect validate)
293
+ if words[1]
294
+ if words[1] == 'registry' || words[1] == 'reg'
295
+ registry_sub_commands = %(push pull search show remove make-public make-private create)
296
+ if words[2]
297
+ if words[2] == 'push'
298
+ completion.push helper.yml_files(words[3])
299
+ elsif %w(pull search show remove rm make-public make-private).include?(words[2]) && words[4].nil?
300
+ completion.push helper.registry_stacks(words[3].to_s)
301
+ else
302
+ completion.push registry_sub_commands
303
+ end
304
+ else
305
+ completion.push registry_sub_commands
306
+ end
307
+ elsif %w(install validate build).include?(words[1])
308
+ completion.push helper.yml_files(words[2])
309
+ if words[1] == 'install'
310
+ completion.push helper.registry_stacks(words[2].to_s)
311
+ end
312
+ elsif words[1] == 'upgrade'
313
+ if words[3]
314
+ completion.push helper.yml_files(words[4])
315
+ completion.push helper.registry_stacks(words[4].to_s)
316
+ else
317
+ completion.push helper.stacks
318
+ end
319
+ elsif %w(deploy start stop remove rm restart logs monitor show inspect).include?(words[1])
320
+ completion.push helper.stacks
321
+ else
322
+ completion.push(sub_commands) unless (sub_commands + %w(rm ls)).include?(words[1])
323
+ end
324
+ else
325
+ completion.push sub_commands
326
+ end
327
+ end
328
+ end
329
+ rescue => ex
330
+ helper.logger.debug ex
331
+ end
332
+ helper.logger.debug { "Returning completions: #{completion.inspect}" }
333
+
334
+ puts completion
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This file exists mostly for backwards dependency to
4
+ # allow the old "which kontena && . foofoo/init"
5
+ # completion loading
6
+ _kontena_complete() {
7
+ COMPREPLY=()
8
+ local word="${COMP_WORDS[COMP_CWORD]}"
9
+ local completions="$(kontena complete ${COMP_WORDS[*]})"
10
+ COMPREPLY=( $(compgen -W "$completions" -- "$word") )
11
+ }
12
+
13
+ if [ "$ZSH_VERSION" != "" ]; then
14
+ autoload -U +X compinit && compinit
15
+ autoload -U +X bashcompinit && bashcompinit
16
+ fi
17
+
18
+ which kontena > /dev/null && complete -F _kontena_complete kontena
@@ -0,0 +1,11 @@
1
+ #compdef kontena
2
+ #autoload
3
+
4
+ _kontena() {
5
+ local -a compreply
6
+ compreply=($(kontena complete ${words[*]}))
7
+ _describe -t kontena 'kontena' compreply
8
+ return 0
9
+ }
10
+
11
+ _kontena
@@ -0,0 +1,8 @@
1
+ _krates_complete() {
2
+ COMPREPLY=()
3
+ local word="${COMP_WORDS[COMP_CWORD]}"
4
+ local completions="$(krates complete ${COMP_WORDS[*]})"
5
+ COMPREPLY=( $(compgen -W "$completions" -- "$word") )
6
+ }
7
+
8
+ which krates > /dev/null && complete -F _krates_complete krates
@@ -0,0 +1,118 @@
1
+ require_relative 'stack_data_set'
2
+
3
+ module Kontena::Stacks
4
+ class ChangeResolver
5
+
6
+ attr_reader :old_data, :new_data
7
+
8
+ # Creates a change analysis from two sets of stack data.
9
+ # The format is a flat hash of all related stacks.
10
+ #
11
+ # @param old_data [DataSet,Hash]
12
+ # @param new_data [DataSet,Hash]
13
+ def initialize(old_data, new_data)
14
+ @old_data = old_data.is_a?(StackDataSet) ? old_data : StackDataSet.new(old_data)
15
+ @new_data = new_data.is_a?(StackDataSet) ? new_data : StackDataSet.new(new_data)
16
+ analyze
17
+ end
18
+
19
+ # @return [Array<String>] an array of services that should be added
20
+ def added_services
21
+ @added_services ||= []
22
+ end
23
+
24
+ # @return [Array<String>] an array of services that should be removed
25
+ def removed_services
26
+ @removed_services ||= []
27
+ end
28
+
29
+ # @return [Array<String>] an array of services that should be upgraded
30
+ def upgraded_services
31
+ @upgraded_services ||= []
32
+ end
33
+
34
+ # @return [Array<String>] an array of stack installation names that should be removed
35
+ def removed_stacks
36
+ @removed_stacks ||= []
37
+ end
38
+
39
+ # @return [Array<String>] an array of stack installation names that should be removed
40
+ def added_stacks
41
+ @added_stacks ||= []
42
+ end
43
+
44
+ # @return [Array<String>] an array of stack installation names that should be upgraded
45
+ def upgraded_stacks
46
+ @upgraded_stacks ||= []
47
+ end
48
+
49
+ # @return [Hash] a hash of "installed-stack-name" => { :from => 'stackname', :to => 'new-stackname' }
50
+ def replaced_stacks
51
+ @replaced_stacks ||= {}
52
+ end
53
+
54
+ # @return [Array<String>] an array of installed stack names that should exist after upgrade
55
+ def remaining_stacks
56
+ @remaining_stacks ||= added_stacks + upgraded_stacks
57
+ end
58
+
59
+ # @return [Boolean]
60
+ def safe?
61
+ removed_stacks.empty? && replaced_stacks.empty? && removed_services.empty?
62
+ end
63
+
64
+ def analyze
65
+ old_names = old_data.stack_names
66
+ new_names = new_data.stack_names
67
+
68
+ removed_stacks.concat(old_names - new_names)
69
+ added_stacks.concat(new_names - old_names)
70
+ (new_names & old_names).each do |candidate|
71
+ upgraded_stacks << candidate if stack_upgraded?(candidate)
72
+ end
73
+
74
+ removed_stacks.each do |removed_stack|
75
+ removed_services.concat(
76
+ old_data.stack(removed_stack).service_names.map { |name| "#{removed_stack}/#{name}"}
77
+ )
78
+ end
79
+
80
+ added_stacks.each do |added_stack|
81
+ added_services.concat(
82
+ new_data.stack(added_stack).service_names.map { |name| "#{added_stack}/#{name}"}
83
+ )
84
+ end
85
+
86
+ upgraded_stacks.each do |upgraded_stack|
87
+ old_stack = old_data.stack(upgraded_stack).stack_name
88
+ new_stack = new_data.stack(upgraded_stack).stack_name
89
+
90
+ unless old_stack == new_stack
91
+ replaced_stacks[upgraded_stack] = { from: old_stack, to: new_stack }
92
+ end
93
+
94
+ old_services = old_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
95
+ new_services = new_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
96
+
97
+ removed_services.concat(old_services - new_services)
98
+ added_services.concat(new_services - old_services)
99
+ upgraded_services.concat(new_services & old_services)
100
+ end
101
+ end
102
+
103
+ # Stack is upgraded if version, stack name, variables change or stack is root
104
+ #
105
+ # @param name [String]
106
+ # @return [Boolean]
107
+ def stack_upgraded?(name)
108
+ old_stack = old_data.stack(name)
109
+ new_stack = new_data.stack(name)
110
+ return true if new_stack.root?
111
+ return true if old_stack.version != new_stack.version
112
+ return true if old_stack.stack_name != new_stack.stack_name
113
+ return true if old_stack.variables != new_stack.variables
114
+
115
+ false
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,58 @@
1
+ module Kontena::Stacks
2
+ class StackData
3
+
4
+ attr_reader :loader
5
+
6
+ # @param data [Hash]
7
+ # @param loader [StackFileLoader,NilClass]
8
+ def initialize(data, loader = nil)
9
+ @data = data
10
+ @loader = loader
11
+ end
12
+
13
+ # @return [String]
14
+ def name
15
+ @data['name']
16
+ end
17
+
18
+ # @return [String]
19
+ def stack_name
20
+ @data['stack']
21
+ end
22
+
23
+ # @return [String]
24
+ def version
25
+ @data['version']
26
+ end
27
+
28
+ # @return [Boolean]
29
+ def root?
30
+ parent.nil?
31
+ end
32
+
33
+ # @return [String]
34
+ def parent
35
+ @data.dig('parent', 'name')
36
+ end
37
+
38
+ # @return [Hash]
39
+ def variables
40
+ @data['variables']
41
+ end
42
+
43
+ # @return [Array<Hash>]
44
+ def services
45
+ @data['services']
46
+ end
47
+
48
+ # @return [Array<String>]
49
+ def service_names
50
+ @data['services'].map { |s| s['name']}
51
+ end
52
+
53
+ # @return [Hash]
54
+ def data
55
+ @data.dup
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'stack_data'
2
+
3
+ module Kontena::Stacks
4
+ class StackDataSet
5
+
6
+ # @param data [Hash]
7
+ def initialize(data)
8
+ @data = data
9
+ end
10
+
11
+ # @param name [String]
12
+ # @return [StackData,NilClass]
13
+ def stack(name)
14
+ data = @data[name]
15
+ StackData.new(data[:stack_data], data[:loader]) if data
16
+ end
17
+
18
+ alias_method :[], :stack
19
+
20
+ # @return [Array<StackData>]
21
+ def stacks
22
+ stack_names.map do |name|
23
+ stack(name)
24
+ end.compact
25
+ end
26
+
27
+ # @return [Array<String>]
28
+ def stack_names
29
+ @data.keys
30
+ end
31
+
32
+ # @return [Integer]
33
+ def size
34
+ @data.size
35
+ end
36
+
37
+ # @param name [String]
38
+ # @return [StackData,NilClass]
39
+ def delete(name)
40
+ data = @data.delete(name)
41
+ StackData.new(data[:stack_data], data[:loader]) if data
42
+ end
43
+
44
+ # @return [Array<StackData>]
45
+ def remove_dependencies
46
+ stacks.map do |stack|
47
+ delete(stack.name) unless stack.root?
48
+ end.compact
49
+ end
50
+ end
51
+ end