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,56 @@
1
+ module Kontena::Cli::Nodes
2
+ class ShowCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
5
+ include Kontena::Cli::BytesHelper
6
+
7
+ parameter "NODE", "Node name"
8
+
9
+ def execute
10
+ require_api_url
11
+ require_current_grid
12
+ token = require_token
13
+
14
+ node = client(token).get("nodes/#{current_grid}/#{self.node}")
15
+ puts "#{node['id']}:"
16
+ puts " id: #{node['node_id']}"
17
+ puts " agent version: #{node['agent_version']}"
18
+ puts " docker version: #{node['docker_version']}"
19
+ puts " connected: #{node['connected'] ? 'yes': 'no'}"
20
+ puts " last connect: #{node['connected_at']}"
21
+ puts " last seen: #{node['last_seen_at']}"
22
+ puts " availability: #{node['availability']}"
23
+ puts " public ip: #{node['public_ip']}"
24
+ puts " private ip: #{node['private_ip']}"
25
+ puts " overlay ip: #{node['overlay_ip']}"
26
+ puts " os: #{node['os']}"
27
+ puts " kernel: #{node['kernel_version']}"
28
+ puts " drivers:"
29
+ puts " storage: #{node['driver']}"
30
+ puts " volume: #{node['volume_drivers'].to_a.map{|v| v['name']}.join(',')}"
31
+ puts " initial node: #{node['initial_member'] ? 'yes' : 'no'}"
32
+ puts " labels:"
33
+ if node['labels']
34
+ node['labels'].each{|l| puts " - #{l}"}
35
+ end
36
+ puts " stats:"
37
+ puts " cpus: #{node['cpus']}"
38
+ loads = node.dig('resource_usage', 'load')
39
+ if loads
40
+ puts " load: #{loads['1m'].round(2)} #{loads['5m'].round(2)} #{loads['15m'].round(2)}"
41
+ end
42
+ mem = node.dig('resource_usage', 'memory')
43
+ if mem
44
+ mem_used = mem['used'] - (mem['cached'] + mem['buffers'])
45
+ puts " memory: #{to_gigabytes(mem_used, 2)} of #{to_gigabytes(mem['total'], 2)} GB"
46
+ end
47
+ fs = node.dig('resource_usage','filesystem')
48
+ if fs
49
+ puts " filesystem:"
50
+ fs.each do |filesystem|
51
+ puts " - #{filesystem['name']}: #{to_gigabytes(filesystem['used'], 2)} of #{to_gigabytes(filesystem['total'], 2)} GB"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ module Kontena::Cli::Nodes
4
+ class SshCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+
8
+ usage "[OPTIONS] [NODE] -- [COMMANDS] ..."
9
+
10
+ parameter "[NODE]", "SSH to Grid node. Use --any to connect to the first available node"
11
+ parameter "[COMMANDS] ...", "Run command on host"
12
+ option ["-a", "--any"], :flag, "Connect to first available node"
13
+ option ["-i", "--identity-file"], "IDENTITY_FILE", "Path to ssh private key"
14
+ option ["-u", "--user"], "USER", "Login as a user", default: "core"
15
+ option "--private-ip", :flag, "Connect to node's private IP address"
16
+ option "--internal-ip", :flag, "Connect to node's internal IP address (requires VPN connection)"
17
+
18
+ requires_current_master
19
+ requires_current_grid
20
+
21
+ def execute
22
+ exit_with_error "Cannot combine --any with a node name" if self.node && any?
23
+
24
+ if self.node
25
+ node = client.get("nodes/#{current_grid}/#{self.node}")
26
+ elsif any?
27
+ nodes = client.get("grids/#{current_grid}/nodes")['nodes']
28
+ node = nodes.find{ |node| node['connected'] }
29
+ exit_with_error "There are no online nodes" if node.nil?
30
+ else
31
+ exit_with_error "No node name given. Use --any to connect to the first available node"
32
+ end
33
+
34
+ provider = Array(node["labels"]).find{ |l| l.start_with?('provider=')}.to_s.split('=').last
35
+
36
+ if provider == 'vagrant'
37
+ unless Kontena::PluginManager::Common.installed?('vagrant')
38
+ exit_with_error 'You need to install vagrant plugin to ssh into this node. Use kontena plugin install vagrant'
39
+ end
40
+ cmd = ['vagrant', 'node', 'ssh', node['name']]
41
+ unless commands_list.empty?
42
+ cmd << '--'
43
+ cmd.concat(commands_list)
44
+ end
45
+ Kontena.run!(cmd)
46
+ else
47
+ cmd = ['ssh']
48
+ cmd += ["-i", identity_file] if identity_file
49
+ if internal_ip?
50
+ ip = node['overlay_ip']
51
+ elsif private_ip?
52
+ ip = node['private_ip']
53
+ else
54
+ ip = node['public_ip']
55
+ end
56
+ cmd << "#{user}@#{ip}"
57
+ cmd += commands_list
58
+ logger.debug { "Running ssh command: #{cmd.inspect}" }
59
+ exec(*cmd)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,31 @@
1
+ module Kontena::Cli::Nodes
2
+ class UpdateCommand < 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", attribute_name: :nodes
11
+
12
+ option ["-l", "--label"], "LABEL", "Node label", multivalued: true
13
+ option "--clear-labels", :flag, "Clear node labels"
14
+ option "--availability", "active|drain", "Node scheduling availability"
15
+
16
+ def execute
17
+ data = {}
18
+
19
+ data[:labels] = self.label_list unless self.label_list.empty?
20
+ data[:labels] = [] if self.clear_labels?
21
+
22
+ data[:availability] = availability if availability
23
+
24
+ nodes.each do |node_name|
25
+ spinner "Updating node #{pastel.cyan(node_name)} " do
26
+ client.put("nodes/#{current_grid}/#{node_name}", data)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+
2
+ class Kontena::Cli::PluginCommand < Kontena::Command
3
+
4
+ subcommand ["list","ls"], "List plugins", load_subcommand('plugins/list_command')
5
+ subcommand "search", "Search plugins", load_subcommand('plugins/search_command')
6
+ subcommand "install", "Install a plugin", load_subcommand('plugins/install_command')
7
+ subcommand "uninstall", "Uninstall a plugin", load_subcommand('plugins/uninstall_command')
8
+ subcommand "upgrade", "Upgrade plugins", load_subcommand('plugins/upgrade_command')
9
+
10
+ def execute
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module Kontena::Cli::Plugins
2
+ module Common
3
+
4
+ def short_name(name)
5
+ name.sub('kontena-plugin-', '')
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,42 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ module Kontena::Cli::Plugins
4
+ class InstallCommand < Kontena::Command
5
+ include Kontena::Util
6
+ include Kontena::Cli::Common
7
+ include Kontena::PluginManager::Common
8
+
9
+ parameter 'NAME', 'Plugin name'
10
+
11
+ option ['-v', '--version'], 'VERSION', 'Specify version of plugin to install'
12
+ option '--pre', :flag, 'Allow pre-release of a plugin to be installed', default: false
13
+
14
+ def installer
15
+ Kontena::PluginManager::Installer.new(name, pre: pre?, version: version)
16
+ end
17
+
18
+ def execute
19
+ if installed?(name)
20
+ installed = spinner "Upgrading plugin #{pastel.cyan(name)}" do
21
+ installer.upgrade
22
+ end
23
+
24
+ spinner "Running cleanup" do |spin|
25
+ Kontena::PluginManager::Cleaner.new(name).cleanup
26
+ end
27
+ else
28
+ installed = spinner "Installing plugin #{pastel.cyan(name)}" do
29
+ installer.install
30
+ end
31
+ end
32
+
33
+ Array(installed).each do |gem|
34
+ if gem.name.start_with?('kontena-plugin-')
35
+ puts Kontena.pastel.green("Installed plugin #{gem.name.sub('kontena-plugin-', '')} version #{gem.version}")
36
+ else
37
+ puts Kontena.pastel.cyan("Installed dependency #{gem.name} version #{gem.version}")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ require 'kontena/plugin_manager'
2
+ require_relative 'common'
3
+
4
+ module Kontena::Cli::Plugins
5
+ class ListCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Cli::TableGenerator::Helper
8
+ include Common
9
+ include Kontena::PluginManager::Common
10
+
11
+ banner "List installed plugins"
12
+
13
+ def fields
14
+ quiet? ? [:name] : %i(name version description)
15
+ end
16
+
17
+ def plugin_list
18
+ plugins.map do |plugin|
19
+ {
20
+ name: short_name(plugin.name),
21
+ version: plugin.version,
22
+ description: plugin.description
23
+ }
24
+ end
25
+ end
26
+
27
+ def execute
28
+ print_table(plugin_list)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'common'
2
+ require 'kontena/plugin_manager'
3
+
4
+ module Kontena::Cli::Plugins
5
+ class SearchCommand < Kontena::Command
6
+ include Common
7
+ include Kontena::PluginManager::Common
8
+
9
+ parameter '[NAME]', 'Search text'
10
+ option '--pre', :flag, 'Include pre-release versions'
11
+
12
+ def execute
13
+ results = search_plugins(name)
14
+ exit_with_error("Cannot access plugin server") unless results
15
+ puts "%-50s %-10s %-60s" % ['NAME', 'VERSION', 'DESCRIPTION']
16
+ results.each do |item|
17
+ if pre?
18
+ latest = rubygems_client.latest_version(item['name'], pre: true)
19
+ item['version'] = latest.version.to_s
20
+ end
21
+ puts "%-50s %-10s %-60s" % [short_name(item['name']), item['version'], item['info']]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ module Kontena::Cli::Plugins
4
+ class ShowCommand < Kontena::Command
5
+ parameter 'NAME', 'Plugin name' do |name|
6
+ "kontena-plugin-#{name}"
7
+ end
8
+
9
+ def execute
10
+ require 'yaml'
11
+ plug = Gem::Specification.find { |g| g.name == name }
12
+ out = {}
13
+ out[:path] = plug.gem_dir
14
+ puts out.to_yaml
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ module Kontena::Cli::Plugins
4
+ class UninstallCommand < Kontena::Command
5
+ include Kontena::Util
6
+ include Kontena::Cli::Common
7
+
8
+ parameter 'NAME ...', 'Plugin name'
9
+
10
+ def execute
11
+ name_list.each do |name|
12
+ exit_with_error "Plugin #{name} has not been installed" unless plugin_installed?(name)
13
+ spinner "Uninstalling plugin #{pastel.cyan(name)}" do
14
+ plugin_uninstaller(name).uninstall
15
+ end
16
+ end
17
+ end
18
+
19
+ # @param name [String]
20
+ # @return [Boolean]
21
+ def plugin_installed?(name)
22
+ Kontena::PluginManager::Common.installed?(name)
23
+ end
24
+
25
+ # @param name [String]
26
+ # @return [Kontena::PluginManager::Uninstaller]
27
+ def plugin_uninstaller(name)
28
+ Kontena::PluginManager::Uninstaller.new(name)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,60 @@
1
+ require 'kontena/plugin_manager'
2
+ require_relative 'common'
3
+
4
+ module Kontena::Cli::Plugins
5
+ class UpgradeCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Common
8
+ include Kontena::PluginManager::Common
9
+
10
+ option '--pre', :flag, 'Include pre-release versions'
11
+ option '--silent', :flag, 'Less verbose output'
12
+
13
+ def running_verbose?
14
+ !silent?
15
+ end
16
+
17
+ def cleanup(*plugins)
18
+ return if plugins.empty?
19
+ vspinner "Running cleanup" do
20
+ plugins.each do |name|
21
+ Kontena::PluginManager::Cleaner.new(name).cleanup
22
+ end
23
+ end
24
+ end
25
+
26
+ def installer(name, version: nil)
27
+ Kontena::PluginManager::Installer.new(name, pre: pre?, version: version)
28
+ end
29
+
30
+ def upgrade(name, from, to)
31
+ vspinner "Upgrading #{pastel.cyan(name)} from #{pastel.cyan(from)} to #{pastel.cyan(to)}" do
32
+ installer(name, version: to).install
33
+ end
34
+ sputs "Upgraded #{name} from #{from} to #{to}" if silent?
35
+ end
36
+
37
+ def execute
38
+ upgradable = {}
39
+
40
+ vspinner "Checking for upgrades" do
41
+ plugins.each do |plugin|
42
+ short = short_name(plugin.name)
43
+ available_upgrade = installer(short).available_upgrade
44
+ unless available_upgrade.nil?
45
+ upgradable[short] = { from: plugin.version.to_s, to: available_upgrade }
46
+ end
47
+ end
48
+ end
49
+
50
+ if upgradable.empty?
51
+ vputs "Nothing upgraded"
52
+ else
53
+ upgradable.each do |name, data|
54
+ upgrade(name, data[:from], data[:to])
55
+ end
56
+ cleanup(upgradable.keys)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,151 @@
1
+ require_relative '../stacks/stacks_helper'
2
+ require 'securerandom'
3
+
4
+ module Kontena::Cli::Registry
5
+ class CreateCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Cli::GridOptions
8
+ include Kontena::Cli::Stacks::StacksHelper
9
+
10
+ REGISTRY_VERSION = '2.6.0'
11
+
12
+ option '--node', 'NODE', 'Node name'
13
+ option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
14
+ option '--s3-region', 'S3_REGION', 'S3 region', default: 'eu-west-1'
15
+ option '--s3-encrypt', :flag, 'Encrypt S3 objects', default: false
16
+ option '--s3-secure', :flag, 'Use secure connection in S3', default: true
17
+ option '--s3-v4auth', :flag, 'Use v4auth on S3', default: true
18
+ option '--azure-account-name', 'AZURE_ACCOUNT_NAME', 'Azure account name'
19
+ option '--azure-container-name', 'AZURE_CONTAINER_NAME', 'Azure container name'
20
+
21
+ def execute
22
+ require_api_url
23
+ token = require_token
24
+ preferred_node = node
25
+ secrets = []
26
+ affinity = []
27
+ stateful = true
28
+ instances = 1
29
+
30
+ registry = client(token).get("services/#{current_grid}/registry") rescue nil
31
+ exit_with_error('Registry already exists') if registry
32
+
33
+ nodes = client(token).get("grids/#{current_grid}/nodes")
34
+
35
+ if s3_bucket
36
+ ['REGISTRY_STORAGE_S3_ACCESSKEY', 'REGISTRY_STORAGE_S3_SECRETKEY'].each do |secret|
37
+ exit_with_error("Secret #{secret} does not exist in the vault") unless vault_secret_exists?(secret)
38
+ end
39
+ env = [
40
+ "REGISTRY_STORAGE=s3",
41
+ "REGISTRY_STORAGE_S3_REGION=#{s3_region}",
42
+ "REGISTRY_STORAGE_S3_BUCKET=#{s3_bucket}",
43
+ "REGISTRY_STORAGE_S3_ENCRYPT=#{s3_encrypt?}",
44
+ "REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}",
45
+ "REGISTRY_STORAGE_S3_V4AUTH=#{s3_v4auth?}"
46
+ ]
47
+ secrets = [
48
+ {secret: 'REGISTRY_STORAGE_S3_ACCESSKEY', name: 'REGISTRY_STORAGE_S3_ACCESSKEY', type: 'env'},
49
+ {secret: 'REGISTRY_STORAGE_S3_SECRETKEY', name: 'REGISTRY_STORAGE_S3_SECRETKEY', type: 'env'}
50
+ ]
51
+ stateful = false
52
+ instances = 2 if nodes['nodes'].size > 1
53
+ elsif azure_account_name || azure_container_name
54
+ exit_with_error('Option --azure-account-name is missing') if azure_account_name.nil?
55
+ exit_with_error('Option --azure-container-name is missing') if azure_container_name.nil?
56
+ exit_with_error('Secret REGISTRY_STORAGE_AZURE_ACCOUNTKEY does not exist in the vault') unless vault_secret_exists?('REGISTRY_STORAGE_AZURE_ACCOUNTKEY')
57
+ env = [
58
+ "REGISTRY_STORAGE=azure",
59
+ "REGISTRY_STORAGE_AZURE_ACCOUNTNAME=#{azure_account_name}",
60
+ "REGISTRY_STORAGE_AZURE_CONTAINER=#{azure_container_name}"
61
+ ]
62
+ secrets = [
63
+ {secret: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', name: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', type: 'env'}
64
+ ]
65
+ stateful = false
66
+ instances = 2 if nodes['nodes'].size > 1
67
+ else
68
+ env = [
69
+ "REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry"
70
+ ]
71
+ if preferred_node
72
+ node = nodes['nodes'].find{|n| n['connected'] && n['name'] == preferred_node }
73
+ exit_with_error('Node not found') if node.nil?
74
+ affinity << "node==#{node['name']}"
75
+ end
76
+ end
77
+
78
+ if vault_secret_exists?('REGISTRY_AUTH_PASSWORD')
79
+ secrets << {secret: 'REGISTRY_AUTH_PASSWORD', name: 'AUTH_PASSWORD', type: 'env'}
80
+ configure_registry_auth(vault_secret('REGISTRY_AUTH_PASSWORD'))
81
+ end
82
+ if vault_secret_exists?('REGISTRY_HTTP_TLS_CERTIFICATE')
83
+ secrets << {secret: 'REGISTRY_HTTP_TLS_CERTIFICATE', name: 'REGISTRY_HTTP_TLS_CERTIFICATE', type: 'env'}
84
+ secrets << {secret: 'REGISTRY_HTTP_TLS_KEY', name: 'REGISTRY_HTTP_TLS_KEY', type: 'env'}
85
+ env << "REGISTRY_HTTP_ADDR=0.0.0.0:443"
86
+ else
87
+ env << "REGISTRY_HTTP_ADDR=0.0.0.0:80"
88
+ end
89
+ env << "REGISTRY_HTTP_SECRET=#{SecureRandom.hex(24)}"
90
+
91
+ data = {
92
+ name: 'registry',
93
+ stack: 'kontena/registry',
94
+ version: Kontena::Cli::VERSION,
95
+ source: '---',
96
+ registry: 'file://',
97
+ expose: 'api',
98
+ services: [
99
+ {
100
+ name: 'api',
101
+ stateful: stateful,
102
+ container_count: instances,
103
+ image: "kontena/registry:#{REGISTRY_VERSION}",
104
+ volumes: ['/registry'],
105
+ env: env,
106
+ secrets: secrets,
107
+ affinity: affinity
108
+ }
109
+ ]
110
+ }
111
+
112
+ client(token).post("grids/#{current_grid}/stacks", data)
113
+ deployment = client(token).post("stacks/#{current_grid}/registry/deploy", {})
114
+ spinner "Deploying #{pastel.cyan(data[:name])} stack " do
115
+ wait_for_deploy_to_finish(deployment)
116
+ end
117
+ puts "\n"
118
+ puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_grid}.kontena.local."
119
+ puts "Note: "
120
+ puts " - OpenVPN connection is needed to establish connection to this registry. See http://www.kontena.io/docs/using-kontena/vpn-access for details"
121
+ puts " - you must set '--insecure-registry registry.#{current_grid}.kontena.local' to your client docker daemon before you are able to push to this registry"
122
+ end
123
+
124
+ # @param [String] name
125
+ # @return [Boolean]
126
+ def vault_secret_exists?(name)
127
+ client(require_token).get("secrets/#{current_grid}/#{name}")
128
+ true
129
+ rescue
130
+ false
131
+ end
132
+
133
+ # @param [String] name
134
+ # @return [String]
135
+ def vault_secret(name)
136
+ secret = client(require_token).get("secrets/#{current_grid}/#{name}")
137
+ secret['value']
138
+ end
139
+
140
+ # @param [String] password
141
+ def configure_registry_auth(password)
142
+ data = {
143
+ username: 'admin',
144
+ password: password,
145
+ email: 'not@val.id',
146
+ url: "http://registry.#{current_grid}.kontena.local/"
147
+ }
148
+ client(require_token).post("grids/#{current_grid}/external_registries", data) rescue nil
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,21 @@
1
+ module Kontena::Cli::Registry
2
+ class RemoveCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
6
+
7
+ def execute
8
+ require_api_url
9
+ token = require_token
10
+ confirm unless forced?
11
+ name = 'registry'
12
+
13
+ registry = client(token).get("stacks/#{current_grid}/#{name}") rescue nil
14
+ exit_with_error("Stack #{pastel.cyan(name)} does not exist") if registry.nil?
15
+
16
+ spinner "Removing #{pastel.cyan(name)} stack " do
17
+ client(token).delete("stacks/#{current_grid}/#{name}")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ class Kontena::Cli::RegistryCommand < Kontena::Command
2
+
3
+ subcommand "create", "Create Docker image registry service", load_subcommand('registry/create_command')
4
+ subcommand ["remove","rm"], "Remove Docker image registry service", load_subcommand('registry/remove_command')
5
+
6
+ def execute
7
+ end
8
+ end
@@ -0,0 +1,28 @@
1
+ class Kontena::Cli::ServiceCommand < Kontena::Command
2
+ subcommand ["list","ls"], "List services", load_subcommand('services/list_command')
3
+ subcommand "create", "Create a new service", load_subcommand('services/create_command')
4
+ subcommand "show", "Show service details", load_subcommand('services/show_command')
5
+ subcommand "update", "Update service configuration", load_subcommand('services/update_command')
6
+ subcommand "deploy", "Deploy service", load_subcommand('services/deploy_command')
7
+ subcommand "stop", "Stop service", load_subcommand('services/stop_command')
8
+ subcommand "start", "Start service", load_subcommand('services/start_command')
9
+ subcommand "restart", "Restart service", load_subcommand('services/restart_command')
10
+ subcommand "scale", "Scale service", load_subcommand('services/scale_command')
11
+ subcommand ["remove", "rm"], "Remove service", load_subcommand('services/remove_command')
12
+ subcommand "containers", "List service containers", load_subcommand('services/containers_command')
13
+ subcommand "logs", "Show service logs", load_subcommand('services/logs_command')
14
+ subcommand "events", "Show service events", load_subcommand('services/events_command')
15
+ subcommand "stats", "Show service statistics", load_subcommand('services/stats_command')
16
+ subcommand "monitor", "Monitor", load_subcommand('services/monitor_command')
17
+
18
+ subcommand "env", "Environment variable specific commands", load_subcommand('services/env_command')
19
+
20
+ subcommand "secret", "Secret specific commands", load_subcommand('services/secret_command')
21
+
22
+ subcommand "link", "Link service to another service", load_subcommand('services/link_command')
23
+ subcommand "unlink", "Unlink service from another service", load_subcommand('services/unlink_command')
24
+ subcommand "exec", "Execute commands in service containers", load_subcommand('services/exec_command')
25
+
26
+ def execute
27
+ end
28
+ end
@@ -0,0 +1,8 @@
1
+
2
+ class Kontena::Cli::ContainerCommand < Kontena::Command
3
+
4
+ subcommand "exec", "Execute command inside a container", load_subcommand('containers/exec_command')
5
+
6
+ def execute
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'services_helper'
2
+
3
+ module Kontena::Cli::Services
4
+ class ContainersCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+ include ServicesHelper
8
+
9
+ parameter "NAME", "Service name"
10
+ option ['-q', '--quiet'], :flag, "Output the identifying column only"
11
+
12
+ def execute
13
+ require_api_url
14
+ token = require_token
15
+
16
+ result = client(token).get("services/#{parse_service_id(name)}/containers")
17
+
18
+ if quiet?
19
+ puts result['containers'].map { |c| "#{c['node']['name']}/#{c['name']}" }.join("\n")
20
+ exit 0
21
+ end
22
+
23
+ result['containers'].each do |container|
24
+ puts "#{container['name']}:"
25
+ puts " rev: #{container['deploy_rev']}"
26
+ puts " node: #{container['node']['name']}"
27
+ puts " dns: #{container['hostname']}.#{container['domainname']}"
28
+ puts " ip: #{container['ip_address']}"
29
+ puts " public ip: #{container['node']['public_ip']}"
30
+ if container['status'] == 'unknown'
31
+ puts " status: #{pastel.yellow(container['status'])}"
32
+ else
33
+ puts " status: #{container['status']}"
34
+ end
35
+ puts ""
36
+ end
37
+ end
38
+ end
39
+ end