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,93 @@
1
+ require_relative 'common'
2
+
3
+ module Kontena::Cli::Stacks
4
+ class MonitorCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+ include Common
8
+
9
+ banner "Monitor services in a stack"
10
+
11
+ parameter "NAME", "Stack name"
12
+ parameter "[SERVICES] ...", "Stack services to monitor", attribute_name: 'selected_services'
13
+
14
+ requires_current_master
15
+ requires_current_master_token
16
+
17
+ def execute
18
+ response = client.get("grids/#{current_grid}/services?stack=#{name}")
19
+ services = response['services']
20
+ if selected_services.size > 0
21
+ services.delete_if{ |s| !selected_services.include?(s['name'])}
22
+ end
23
+ show_monitor(services)
24
+ end
25
+
26
+ # @param [Array<Hash>]
27
+ def show_monitor(services)
28
+ loop do
29
+ nodes = {}
30
+ services.each do |service|
31
+ result = client.get("services/#{service['id']}/containers") rescue nil
32
+ service['instances'] = 0
33
+ if result
34
+ service['instances'] = result['containers'].size
35
+ result['containers'].each do |container|
36
+ container['service'] = service['name']
37
+ nodes[container['node']['name']] ||= []
38
+ nodes[container['node']['name']] << container
39
+ end
40
+ end
41
+ end
42
+ clear_terminal
43
+ puts "grid: #{current_grid}"
44
+ puts "stack: #{name}"
45
+ puts "services:"
46
+ services.each do |service|
47
+ color = color_for_service(service['name'])
48
+ puts " #{pastel.send(color, "■")} #{service['name']} (#{service['instances']} instances)"
49
+ end
50
+ puts "nodes:"
51
+ node_names = nodes.keys.sort
52
+ node_names.each do |name|
53
+ containers = nodes[name]
54
+ puts " #{name} (#{containers.size} instances)"
55
+ print " "
56
+ containers.each do |container|
57
+ icon = "■"
58
+ if container['status'] != 'running'
59
+ icon = "□"
60
+ end
61
+ color = color_for_service(container['service'])
62
+ print pastel.send(color, icon)
63
+ end
64
+ puts ''
65
+ end
66
+ sleep 1
67
+ end
68
+ end
69
+
70
+ def color_for_service(service)
71
+ color_maps[service] = colors.shift unless color_maps[service]
72
+ color_maps[service].to_sym
73
+ end
74
+
75
+ def color_maps
76
+ @color_maps ||= {}
77
+ end
78
+
79
+ def colors
80
+ if(@colors.nil? || @colors.size == 0)
81
+ @colors = %i(
82
+ red green yellow blue magenta cyan bright_red bright_green
83
+ bright_yellow bright_blue bright_magenta bright_cyan
84
+ )
85
+ end
86
+ @colors
87
+ end
88
+
89
+ def clear_terminal
90
+ print "\e[H\e[2J"
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class CreateCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Creates a new Stack to Kontena Stack Registry"
10
+
11
+ option '--private', :flag, "Create as private", attribute_name: :is_private
12
+
13
+ requires_current_account_token
14
+
15
+ def execute
16
+ exit_with_error "Can't create a stack with a version number" unless stack_name.version.nil?
17
+ spinner "Creating #{is_private? ? pastel.yellow('private') : 'public'} stack #{pastel.cyan(stack_name)} in Kontena Stack Registry" do
18
+ stacks_client.create(stack_name, is_private: is_private?)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+
@@ -0,0 +1,24 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class MakePrivateCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Changes Stack visibility private in the Kontena Cloud Stack Registry"
10
+
11
+ option '--force', :flag, "Don't ask for confirmation"
12
+
13
+ requires_current_account_token
14
+
15
+ def execute
16
+ unless force?
17
+ confirm("Change stack #{pastel.cyan(stack_name)} visibility to private?")
18
+ end
19
+ spinner "Updating Stack #{pastel.cyan(stack_name)} visibility to private" do
20
+ stacks_client.make_private(stack_name)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class MakePublicCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Changes Stack visibility private in the Kontena Cloud Stack Registry"
10
+
11
+ option '--force', :flag, "Don't ask for confirmation"
12
+
13
+ requires_current_account_token
14
+
15
+ def execute
16
+ unless force?
17
+ confirm("Change stack #{pastel.cyan(stack_name)} visibility to public?")
18
+ end
19
+ spinner "Updating Stack #{pastel.cyan(stack_name)} visibility to public" do
20
+ stacks_client.make_public(stack_name)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class PullCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Pulls / downloads a stack from the stack registry"
10
+
11
+ option ['-F', '--file'], '[FILENAME]', "Write to file (default STDOUT)"
12
+ option '--no-cache', :flag, "Don't use local cache"
13
+ option '--return', :flag, 'Return the result', hidden: true
14
+
15
+ def execute
16
+ target = no_cache? ? stacks_client : Kontena::StacksCache
17
+ content = target.pull(stack_name)
18
+ if return?
19
+ return content
20
+ elsif file
21
+ File.write(file, content)
22
+ puts pastel.green("Wrote #{content.bytesize} bytes to #{file}")
23
+ else
24
+ puts content
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class PushCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+
8
+ banner "Pushes (uploads) a stack to the stack registry"
9
+
10
+ parameter "[FILE]", "Kontena stack file path", default: "kontena.yml", attribute_name: :source
11
+
12
+ requires_current_account_token
13
+
14
+ option '--dry-run', :flag, "Do not perform any uploading", hidden: true
15
+
16
+ def includes_local_dependencies?(dependencies = loader.dependencies)
17
+ return false if dependencies.nil?
18
+ dependencies.any? { |dep| Kontena::Cli::Stacks::YAML::StackFileLoader.for(dep['stack']).origin == 'file' || includes_local_dependencies(dep['depends']) }
19
+ end
20
+
21
+ def includes_local_extends?
22
+ loader.yaml.fetch('services', {}).any? { |_, svc| svc.key?('extends') && svc['extends'].key?('file') }
23
+ end
24
+
25
+ def execute
26
+ exit_with_error "Can only perform push from local files" unless loader.origin == "file"
27
+ exit_with_error "Stack file contains dependencies to local files" if includes_local_dependencies?
28
+ exit_with_error "Stack file has services that extend from local files" if includes_local_extends?
29
+
30
+ spinner("Pushing #{pastel.cyan(source)} to stack registry as #{loader.stack_name}") do
31
+ unless dry_run?
32
+ stacks_client.push(
33
+ loader.stack_name,
34
+ loader.content
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class RemoveCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Removes a stack (or version) from the stack registry. Use user/stack_name or user/stack_name:version."
10
+
11
+ option ['-f', '--force'], :flag, "Force delete"
12
+
13
+ requires_current_account_token
14
+
15
+ def execute
16
+ unless force?
17
+ if stack_name.version
18
+ puts "About to delete #{pastel.cyan("#{stack_name}")} from the stacks registry"
19
+ confirm
20
+ else
21
+ puts "About to delete an entire stack and all of its versions from the stacks registry"
22
+ confirm_command(stack_name)
23
+ end
24
+ end
25
+ spinner "Removing #{pastel.cyan(stack_name)} from the registry" do
26
+ stacks_client.destroy(stack_name)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class SearchCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::TableGenerator::Helper
8
+
9
+ banner "Search for stacks on the stack registry"
10
+
11
+ parameter "[QUERY]", "Query string"
12
+
13
+ option ['--[no-]pre'], :flag, "Include pre-release versions", default: true
14
+ option ['--[no-]private'], :flag, "Include private stacks", default: true, attribute_name: :priv
15
+
16
+ option ['--tag', '-t'], '[TAG]', "Search by tags", multivalued: true
17
+
18
+ option ['-q', '--quiet'], :flag, "Output the identifying column only"
19
+
20
+ def fields
21
+ quiet? ? ['name'] : %w(name version pulls description)
22
+ end
23
+
24
+ def execute
25
+ results = stacks_client.search(query.to_s, tags: tag_list, include_prerelease: pre?, include_private: priv?)
26
+ exit_with_error 'Nothing found' if results.empty?
27
+ print_table(results.map { |r| r['attributes'] }) do |row|
28
+ next if quiet?
29
+ row['name'] = '%s/%s' % [row['organization-id'], row['name']]
30
+ row['name'] = pastel.yellow(row['name']) if row['is-private']
31
+ if row['latest-version'] && row['latest-version']['version']
32
+ row['version'] = row['latest-version']['version']
33
+ row['description'] = row['latest-version']['description']
34
+ else
35
+ row['version'] = '?'
36
+ end
37
+
38
+ row['description'] = '-' if row['description'].to_s.empty?
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,65 @@
1
+ require_relative '../common'
2
+
3
+ module Kontena::Cli::Stacks::Registry
4
+ class ShowCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::Stacks::Common
7
+ include Kontena::Cli::Stacks::Common::RegistryNameParam
8
+
9
+ banner "Shows information about a stack on the stacks registry"
10
+
11
+ option ['-v', '--versions'], :flag, "Only list available versions"
12
+
13
+ requires_current_account_token
14
+
15
+ def execute
16
+ versions = stacks_client.versions(stack_name)
17
+
18
+ if versions?
19
+ stacks_client.versions(stack_name).each do |version|
20
+ puts version['attributes']['version']
21
+ end
22
+ else
23
+ data = stacks_client.show(stack_name).dig('data', 'attributes')
24
+ puts "#{data['organization-id']}/#{data['name']}:"
25
+ puts " description: #{data.dig('latest-version', 'description') || '-'}"
26
+ puts " latest_version: #{data.dig('latest-version', 'version') || '-'}"
27
+ puts " created_at: #{data.dig('created-at')}"
28
+ puts " pulls: #{data.dig('pulls')}"
29
+ puts " private: #{data.dig('is-private')}"
30
+ meta = data.dig('latest-version', 'meta')
31
+ if meta
32
+ puts " meta:"
33
+ readme = meta.delete('readme')
34
+ meta_lines = YAML.dump(meta).split(/[\r\n]/)
35
+ meta_lines.shift
36
+ meta_lines.each do |meta_line|
37
+ puts " %s" % meta_line
38
+ end
39
+ if readme
40
+ if readme =~ /^http\S+$/
41
+ puts " readme: readme"
42
+ else
43
+ puts " readme: |"
44
+ readme.gsub!(/(\S{#{70}})(?=\S)/, '\1 ')
45
+ readme.gsub!(/(.{1,#{70}})(?:\s+|$)/, "\\1\n")
46
+ readme.gsub!(/^/, ' ')
47
+ puts readme
48
+ end
49
+ end
50
+ else
51
+ puts " meta: -"
52
+ end
53
+
54
+ if versions.empty?
55
+ puts " versions: -"
56
+ else
57
+ puts " versions:"
58
+ versions.each do |version|
59
+ puts " - #{version['attributes']['version']} (#{version['attributes']['created-at']})"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,12 @@
1
+ module Kontena::Cli::Stacks
2
+ class RegistryCommand < Kontena::Command
3
+ subcommand "push", "Push a stack into the stacks registry", load_subcommand('stacks/registry/push_command')
4
+ subcommand "pull", "Pull a stack from the stacks registry", load_subcommand('stacks/registry/pull_command')
5
+ subcommand ["search"], "Search for stacks in the stacks registry", load_subcommand('stacks/registry/search_command')
6
+ subcommand "show", "Show info about a stack in the stacks registry", load_subcommand('stacks/registry/show_command')
7
+ subcommand ["remove", "rm"], "Remove a stack (or version) from the stacks registry", load_subcommand('stacks/registry/remove_command')
8
+ subcommand "create", "Create a stack in the registry", load_subcommand('stacks/registry/create_command')
9
+ subcommand "make-private", "Change Stack visibility to private", load_subcommand('stacks/registry/make_private_command')
10
+ subcommand "make-public", "Change Stack visibility to public", load_subcommand('stacks/registry/make_public_command')
11
+ end
12
+ end
@@ -0,0 +1,80 @@
1
+ require_relative 'common'
2
+
3
+ module Kontena::Cli::Stacks
4
+ class RemoveCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+ include Common
8
+
9
+ banner "Removes a stack in a grid on Kontena Master"
10
+
11
+ parameter "NAME ...", "Stack name", attribute_name: :names
12
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
13
+ option "--keep-dependencies", :flag, "Do not remove dependencies"
14
+
15
+ requires_current_master
16
+ requires_current_master_token
17
+
18
+ def execute
19
+ names.each do |name|
20
+ stack = fetch_stack(name)
21
+ confirm_remove(stack, name) unless forced?
22
+ unless keep_dependencies?
23
+ stack.fetch('children', Hash.new).each do |child_stack|
24
+ caret"Removing dependency #{pastel.cyan(child_stack['name'])}"
25
+ Kontena.run!(['stack', 'remove', '--force', child_stack['name']])
26
+ end
27
+ end
28
+
29
+ spinner "Removing stack #{pastel.cyan(name)} " do
30
+ remove_stack(name)
31
+ wait_stack_removal(name)
32
+ end
33
+ end
34
+ end
35
+
36
+ # @param stack [Hash]
37
+ # @param name [String]
38
+ def confirm_remove(stack, name)
39
+ if stack['parent']
40
+ puts "#{pastel.yellow('Warning:')} The stack #{pastel.cyan(stack['parent']['name'])} depends on stack #{name}"
41
+ end
42
+ if !keep_dependencies? && stack['children'] && !stack['children'].empty?
43
+ puts "#{pastel.yellow('Warning:')} The stack #{pastel.cyan(name)} has dependencies that will be removed:"
44
+ stack['children'].each do |child|
45
+ puts "- #{pastel.yellow(child['name'])}"
46
+ end
47
+ end
48
+ confirm_command(name)
49
+ end
50
+
51
+ # @param name [String]
52
+ # @return [Hash]
53
+ def fetch_stack(name)
54
+ client.get("stacks/#{current_grid}/#{name}")
55
+ end
56
+
57
+ # @param name [String]
58
+ # @return [Hash]
59
+ def remove_stack(name)
60
+ client.delete("stacks/#{current_grid}/#{name}")
61
+ end
62
+
63
+ # @param name [String]
64
+ def wait_stack_removal(name)
65
+ removed = false
66
+ until removed == true
67
+ begin
68
+ client.get("stacks/#{current_grid}/#{name}")
69
+ sleep 1
70
+ rescue Kontena::Errors::StandardError => exc
71
+ if exc.status == 404
72
+ removed = true
73
+ else
74
+ raise exc
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,24 @@
1
+ require_relative 'common'
2
+
3
+ module Kontena::Cli::Stacks
4
+ class RestartCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+ include Common
8
+
9
+ banner "Restarts all services of a stack that has been installed in a grid on Kontena Master"
10
+
11
+ parameter "NAME ...", "Stack name", attribute_name: :names
12
+
13
+ requires_current_master
14
+ requires_current_master_token
15
+
16
+ def execute
17
+ names.each do |name|
18
+ spinner "Sending restart signal for stack #{name} services" do
19
+ client.post("stacks/#{current_grid}/#{name}/restart", {})
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,131 @@
1
+ require 'yaml'
2
+ require 'shellwords'
3
+ require_relative '../services/services_helper'
4
+
5
+ module Kontena::Cli::Stacks
6
+ class ServiceGenerator
7
+ include Kontena::Cli::Services::ServicesHelper
8
+
9
+ attr_reader :service_config
10
+
11
+ def initialize(service_config)
12
+ @service_config = service_config
13
+ end
14
+
15
+ ##
16
+ # @return [Hash]
17
+ def generate
18
+ parse_data(service_config)
19
+ end
20
+
21
+ private
22
+
23
+ ##
24
+ # @param [Hash] options
25
+ # @return [Hash]
26
+ def parse_data(options)
27
+ data = {}
28
+ data['instances'] = options['instances']
29
+ data['image'] = parse_image(options['image'])
30
+ data['env'] = options['environment'] || options['env']
31
+ data['links'] = parse_links(options['links'] || [])
32
+ data['external_links'] = parse_links(options['external_links'] || [])
33
+ data['ports'] = parse_stringified_ports(options['ports'] || [])
34
+ data['memory'] = parse_memory(options['mem_limit'].to_s) if options['mem_limit']
35
+ data['memory_swap'] = parse_memory(options['memswap_limit'].to_s) if options['memswap_limit']
36
+ data['shm_size'] = parse_memory(options['shm_size'].to_s) if options['shm_size']
37
+ data['cpus'] = options['cpus'] if options['cpus']
38
+ data['cpu_shares'] = options['cpu_shares'] if options['cpu_shares']
39
+ data['volumes'] = options['volumes'] || []
40
+ data['volumes_from'] = options['volumes_from'] || []
41
+ data['cmd'] = Shellwords.split(options['command']) if options['command']
42
+ data['affinity'] = options['affinity'] || []
43
+ data['user'] = options['user'] if options['user']
44
+ data['stateful'] = options['stateful'] == true
45
+ data['privileged'] = options['privileged'] unless options['privileged'].nil?
46
+ data['cap_add'] = options['cap_add'] if options['cap_add']
47
+ data['cap_drop'] = options['cap_drop'] if options['cap_drop']
48
+ data['net'] = options['net'] if options['net']
49
+ data['pid'] = options['pid'] if options['pid']
50
+ data['log_driver'] = options['log_driver'] if options['log_driver']
51
+ data['log_opts'] = options['log_opt'] if options['log_opt'] && !options['log_opt'].empty?
52
+ deploy_opts = options['deploy'] || {}
53
+ data['strategy'] = deploy_opts['strategy'] if deploy_opts['strategy']
54
+ deploy = {
55
+ 'wait_for_port' => deploy_opts['wait_for_port'],
56
+ 'min_health' => deploy_opts['min_health']
57
+ }
58
+ if deploy_opts.has_key?('interval')
59
+ deploy['interval'] = parse_relative_time(deploy_opts['interval'])
60
+ else
61
+ deploy['interval'] = nil
62
+ end
63
+ data['deploy_opts'] = deploy
64
+ data['hooks'] = options['hooks'] || {}
65
+ data['secrets'] = options['secrets'] if options['secrets']
66
+ data['certificates'] = options['certificates'] if options['certificates']
67
+ data['build'] = parse_build_options(options) if options['build']
68
+ data['health_check'] = parse_health_check(options)
69
+ data['stop_signal'] = options['stop_signal'] if options['stop_signal']
70
+ data['stop_grace_period'] = options['stop_grace_period'] if options['stop_grace_period']
71
+ data['read_only'] = options['read_only'] || false
72
+ data['entrypoint'] = options['entrypoint'] if options['entrypoint']
73
+ data
74
+ end
75
+
76
+ # @param [Array<String>] port_options
77
+ # @return [Array<Hash>]
78
+ def parse_stringified_ports(port_options)
79
+ parse_ports(port_options).map {|p|
80
+ {
81
+ 'ip' => p[:ip],
82
+ 'container_port' => p[:container_port],
83
+ 'node_port' => p[:node_port],
84
+ 'protocol' => p[:protocol]
85
+ }
86
+ }
87
+ end
88
+
89
+ # @param [Array<String>] link_options
90
+ # @return [Array<Hash>]
91
+ def parse_links(link_options)
92
+ link_options.map{|l|
93
+ if l.kind_of?(String)
94
+ service_name, alias_name = l.split(':')
95
+ elsif l.kind_of?(Hash)
96
+ service_name = l['name']
97
+ alias_name = l['alias']
98
+ else
99
+ raise TypeError, "Invalid link type #{l.class.name}, expecting String or Hash"
100
+ end
101
+ if service_name.nil?
102
+ raise ArgumentError.new("Invalid link value #{l}")
103
+ end
104
+ alias_name = service_name if alias_name.nil?
105
+ {
106
+ 'name' => service_name,
107
+ 'alias' => alias_name
108
+ }
109
+ }
110
+ end
111
+
112
+ # @param [Hash] options
113
+ # @return [Hash]
114
+ def parse_build_options(options)
115
+ build = {}
116
+ build['context'] = options['build'] if options['build']
117
+ build['dockerfile'] = options['dockerfile'] if options['dockerfile']
118
+ build
119
+ end
120
+
121
+ # @param [Hash] options
122
+ # @return [Hash]
123
+ def parse_health_check(options)
124
+ health_check = {}
125
+ %w(port protocol uri timeout interval initial_delay).each do |k|
126
+ health_check[k] = options.dig('health_check', k)
127
+ end
128
+ health_check
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,27 @@
1
+ require 'yaml'
2
+ require_relative 'service_generator'
3
+
4
+ module Kontena::Cli::Stacks
5
+ class ServiceGeneratorV2 < ServiceGenerator
6
+
7
+ def parse_data(options)
8
+ data = super(options)
9
+ data['net'] = options['network_mode'] if options['network_mode']
10
+ data['log_driver'] = options.dig('logging', 'driver')
11
+ data['log_opts'] = options.dig('logging', 'options')
12
+ if options['depends_on']
13
+ data['links'] ||= []
14
+ data['links'] = (data['links'] + parse_links(options['depends_on'])).uniq
15
+ end
16
+ data
17
+ end
18
+
19
+ def parse_build_options(options)
20
+ unless options['build'].is_a?(Hash)
21
+ options['build'] = { 'context' => options['build']}
22
+ end
23
+ options['build']['args'] = parse_build_args(options['build']['args']) if options['build']['args']
24
+ options['build']
25
+ end
26
+ end
27
+ end