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,42 @@
1
+ module Kontena
2
+ module Machine
3
+ module RandomName
4
+
5
+ def generate_name
6
+ rnd1 = Random.rand(64)
7
+ rnd2 = Random.rand(64)
8
+ "#{adjectives[rnd1%adjectives.length]}-#{nouns[rnd2%adjectives.length]}"
9
+ end
10
+
11
+ private
12
+
13
+ def adjectives
14
+ [
15
+ "autumn", "hidden", "bitter", "misty", "silent", "empty", "dry", "dark",
16
+ "summer", "icy", "delicate", "quiet", "white", "cool", "spring", "winter",
17
+ "patient", "twilight", "dawn", "crimson", "wispy", "weathered", "blue",
18
+ "billowing", "broken", "cold", "damp", "falling", "frosty", "green",
19
+ "long", "late", "bold", "little", "morning", "muddy",
20
+ "red", "rough", "still", "small", "sparkling", "shy",
21
+ "wandering", "withered", "wild", "black", "young", "holy", "solitary",
22
+ "fragrant", "aged", "snowy", "proud", "floral", "restless",
23
+ "polished", "purple", "lively", "nameless"
24
+ ]
25
+ end
26
+
27
+ def nouns
28
+ [
29
+ "waterfall", "river", "breeze", "moon", "rain", "wind", "sea", "morning",
30
+ "snow", "lake", "sunset", "pine", "shadow", "leaf", "dawn", "glitter",
31
+ "forest", "hill", "cloud", "meadow", "sun", "glade", "bird", "brook",
32
+ "butterfly", "bush", "dew", "dust", "field", "fire", "flower", "firefly",
33
+ "feather", "grass", "haze", "mountain", "night", "pond", "darkness",
34
+ "snowflake", "silence", "sound", "sky", "shape", "surf", "thunder",
35
+ "violet", "water", "wildflower", "wave", "water", "resonance", "sun",
36
+ "wood", "dream", "cherry", "tree", "fog", "frost", "voice", "paper",
37
+ "frog", "smoke", "star"
38
+ ]
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,66 @@
1
+ require 'kontena/command'
2
+
3
+ class Kontena::MainCommand < Kontena::Command
4
+ option ['-v', '--version'], :flag, "Output Kontena CLI version #{Kontena::Cli::VERSION}" do
5
+ build_tags = [ 'ruby' + RUBY_VERSION ]
6
+ build_tags << RUBY_PLATFORM
7
+ build_tags += ENV["KONTENA_EXTRA_BUILDTAGS"].to_s.split(',')
8
+ puts ['kontena-cli', Kontena::Cli::VERSION, "[#{build_tags.join('+')}]"].join(' ')
9
+ exit 0
10
+ end
11
+
12
+ banner Kontena.pastel.green("Getting started:"), false
13
+ banner ' - Create a Kontena Master (see "kontena plugin search" for a list of', false
14
+ banner ' provisioning plugins)', false
15
+ banner ' - Or log into an existing master, use: "kontena master login <master url>"', false
16
+ banner ' - Read more about Kontena at https://www.kontena.io/docs/', false
17
+
18
+ subcommand "master", "Kontena Master specific commands", load_subcommand('master_command')
19
+ subcommand "cloud", "Kontena Cloud specific commands", load_subcommand('cloud_command')
20
+ subcommand "node", "Node specific commands", load_subcommand('node_command')
21
+ subcommand "grid", "Grid specific commands", load_subcommand('grid_command')
22
+ subcommand "stack", "Stack specific commands", load_subcommand('stack_command')
23
+ subcommand "service", "Service specific commands", load_subcommand('service_command')
24
+ subcommand "container", "Container specific commands", load_subcommand('container_command')
25
+ subcommand "vault", "Vault specific commands", load_subcommand('vault_command')
26
+ subcommand "vpn", "VPN specific commands", load_subcommand('vpn_command')
27
+ subcommand "etcd", "Etcd specific commands", load_subcommand('etcd_command')
28
+ subcommand "certificate", "LE Certificate specific commands", load_subcommand('certificate_command')
29
+ subcommand "registry", "Registry specific commands", load_subcommand('registry_command')
30
+ subcommand "external-registry", "External registry specific commands", load_subcommand('external_registry_command')
31
+ subcommand "volume", "Volume specific commands", load_subcommand('volume_command')
32
+ subcommand "plugin", "Plugin specific commands", load_subcommand('plugin_command')
33
+ subcommand "whoami", "Shows current logged in user", load_subcommand('whoami_command')
34
+ subcommand "version", "Show CLI and current master version", load_subcommand('version_command')
35
+
36
+ def execute
37
+ end
38
+
39
+ # @param [String] command
40
+ # @param [String] description
41
+ # @param [Class] klass
42
+ def self.register(command, description, command_class)
43
+ subcommand(command, description, command_class)
44
+ end
45
+
46
+ def subcommand_missing(name)
47
+ extend Kontena::Cli::Common
48
+ if known_plugin_subcommand?(name)
49
+ exit_with_error "The '#{name}' plugin has not been installed. Use: kontena plugin install #{name}"
50
+ elsif name == 'login'
51
+ exit_with_error "Use 'kontena master login' to log into a Kontena Master\n"+
52
+ " or 'kontena cloud login' for logging into your Kontena Cloud account"
53
+ elsif name == 'logout'
54
+ exit_with_error "Use 'kontena master logout' to log out from a Kontena Master\n"+
55
+ " or 'kontena cloud logout' for logging out from your Kontena Cloud account"
56
+ elsif name == 'app'
57
+ exit_with_error "The deprecated app subcommand has been moved into a plugin. You can install\n" +
58
+ " it by using 'kontena plugin install app-command'"
59
+ end
60
+ super
61
+ end
62
+
63
+ def known_plugin_subcommand?(name)
64
+ ['vagrant', 'packet', 'digitalocean', 'azure', 'upcloud', 'aws', 'shell'].include?(name)
65
+ end
66
+ end
@@ -0,0 +1,33 @@
1
+ require 'kontena/plugin_manager/common'
2
+ require 'rubygems/commands/cleanup_command'
3
+
4
+ module Kontena
5
+ module PluginManager
6
+ class Cleaner
7
+ include Common
8
+
9
+ attr_reader :plugin_name
10
+
11
+ def initialize(plugin_name)
12
+ @plugin_name = plugin_name
13
+ end
14
+
15
+ def command
16
+ @command ||= Gem::Commands::CleanupCommand.new
17
+ end
18
+
19
+ # Runs gem cleanup, removes remains from previous versions
20
+ # @param plugin_name [String]
21
+ def cleanup
22
+ options = []
23
+ options += ['-q', '--no-verbose'] unless Kontena.debug?
24
+ command.handle_options options
25
+ command.execute
26
+ true
27
+ rescue Gem::SystemExitException => e
28
+ raise unless e.exit_code.zero?
29
+ true
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,89 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ module Kontena
4
+ module PluginManager
5
+ module Common
6
+ Gem.autoload :DefaultUserInteraction, 'rubygems/user_interaction'
7
+ Gem.autoload :StreamUI, 'rubygems/user_interaction'
8
+
9
+ KONTENA_PLUGIN = 'kontena-plugin-%s'
10
+
11
+ # @return [Boolean] is the CLI in plugin debugging mode?
12
+ def plugin_debug?
13
+ @plugin_debug ||= ENV['DEBUG'] == 'plugin'
14
+ end
15
+ module_function :plugin_debug?
16
+
17
+ # @return [Gem::StreamUI] a rubygems user interaction module with minimal output
18
+ def dummy_ui
19
+ Gem::StreamUI.new(StringIO.new, StringIO.new, StringIO.new, false)
20
+ end
21
+ module_function :dummy_ui
22
+
23
+ # Tell rubygems to use the dummy ui as default user interaction
24
+ def use_dummy_ui
25
+ Gem::DefaultUserInteraction.ui = dummy_ui
26
+ end
27
+ module_function :use_dummy_ui
28
+
29
+ # Prefix a plugin name into a gem name (hello to kontena-plugin-hello)
30
+ def prefix(plugin_name)
31
+ return KONTENA_PLUGIN % nil if plugin_name.nil? || plugin_name.empty?
32
+ return plugin_name if plugin_name.start_with?('kontena-plugin-') || plugin_name.include?('.')
33
+ KONTENA_PLUGIN % plugin_name
34
+ end
35
+ module_function :prefix
36
+
37
+ # Find a plugin by name from installed plugins
38
+ # @param plugin_name [String]
39
+ def installed(plugin_name)
40
+ search = prefix(plugin_name)
41
+ plugins.find {|plugin| plugin.name == search }
42
+ end
43
+ module_function :installed
44
+
45
+ def installed?(plugin_name)
46
+ !installed(plugin_name).nil?
47
+ end
48
+ module_function :installed?
49
+
50
+ # Gem installation directory
51
+ # @return [String]
52
+ def install_dir
53
+ return @install_dir if @install_dir
54
+ install_dir = File.join(Dir.home, '.krates', 'gems', RUBY_VERSION)
55
+ unless File.directory?(install_dir)
56
+ require 'fileutils'
57
+ FileUtils.mkdir_p(install_dir, mode: 0700)
58
+ end
59
+ @install_dir = install_dir
60
+ end
61
+ module_function :install_dir
62
+
63
+ # @return [Kontena::PluginManager::RubygemsClient]
64
+ def rubygems_client
65
+ @rubygems_client ||= Kontena::PluginManager::RubygemsClient.new
66
+ end
67
+ module_function :rubygems_client
68
+
69
+ # Search rubygems for kontena plugins
70
+ # @param pattern [String] optional search pattern
71
+ def search_plugins(pattern = nil)
72
+ rubygems_client.search(prefix(pattern))
73
+ end
74
+ module_function :search_plugins
75
+
76
+ # Retrieve plugin versions from rubygems
77
+ # @param plugin_name [String]
78
+ def gem_versions(plugin_name)
79
+ rubygems_client.versions(prefix(plugin_name))
80
+ end
81
+ module_function :gem_versions
82
+
83
+ def plugins
84
+ Kontena::PluginManager.plugins
85
+ end
86
+ module_function :plugins
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,78 @@
1
+ require 'kontena/plugin_manager/common'
2
+ require 'rubygems/dependency_installer'
3
+ require 'rubygems/requirement'
4
+
5
+ module Kontena
6
+ module PluginManager
7
+ class Installer
8
+ include Common
9
+
10
+ attr_reader :plugin_name, :pre
11
+ attr_accessor :version
12
+
13
+ # Create a new instance of plugin installer
14
+ # @param plugin_name [String]
15
+ # @param pre [Boolean] install a prerelease version if available
16
+ # @param version [String] install a specific version
17
+ def initialize(plugin_name, pre: false, version: nil)
18
+ @plugin_name = plugin_name
19
+ @pre = pre
20
+ @version = version
21
+ end
22
+
23
+ def pre?
24
+ !!@pre
25
+ end
26
+
27
+ def command
28
+ @command ||= Gem::DependencyInstaller.new(
29
+ document: false,
30
+ force: true,
31
+ prerelease: pre,
32
+ minimal_deps: true
33
+ )
34
+ end
35
+
36
+ # Install a plugin
37
+ def install
38
+ return install_uri if plugin_name.include?('://')
39
+ plugin_version = version.nil? ? Gem::Requirement.default : Gem::Requirement.new(version)
40
+ command.install(prefix(plugin_name), plugin_version)
41
+ command.installed_gems
42
+ end
43
+
44
+ def install_uri
45
+ require 'tempfile'
46
+ require 'open-uri'
47
+ file = Tempfile.new(['kontena_plugin', '.gem'])
48
+ open(plugin_name) do |input|
49
+ file.write input.read
50
+ file.close
51
+ end
52
+ self.class.new(file.path).install
53
+ ensure
54
+ file.unlink
55
+ end
56
+
57
+ def available_upgrade
58
+ installed = installed(plugin_name)
59
+ return false unless installed
60
+
61
+ pre = installed.version.prerelease?
62
+ latest = rubygems_client.latest_version(prefix(plugin_name), pre: pre? || pre)
63
+ if latest > installed.version
64
+ latest.to_s
65
+ end
66
+ end
67
+
68
+ # Upgrade an installed plugin
69
+ def upgrade
70
+ return install if version
71
+ upgrade_to = available_upgrade
72
+ if upgrade_to
73
+ Installer.new(plugin_name, version: upgrade_to).install
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,93 @@
1
+ require 'kontena_cli'
2
+ require 'kontena/plugin_manager/common'
3
+
4
+ module Kontena
5
+ module PluginManager
6
+ class Loader
7
+ include Common
8
+
9
+ CLI_GEM = 'krates'.freeze
10
+ MIN_CLI_VERSION = '0.15.99'.freeze
11
+
12
+ def loaded_plugins
13
+ @loaded_plugins ||= []
14
+ end
15
+
16
+ def load_plugins
17
+ Gem::Specification.to_a.each do |spec|
18
+ plugin_path = plugin_require_path(spec)
19
+ next unless plugin_path
20
+ next if loaded_plugins.find { |p| p.name == spec.name }
21
+ load_plugin(plugin_path, spec)
22
+ end
23
+ loaded_plugins
24
+ end
25
+
26
+ private
27
+
28
+ def load_plugin(path, spec)
29
+ unless spec_has_valid_dependency?(spec)
30
+ plugin_name = spec.name.sub('kontena-plugin-', '')
31
+ $stderr.puts " [#{Kontena.pastel.red('error')}] Plugin #{Kontena.pastel.cyan(plugin_name)} (#{spec.version}) is not compatible with the current cli version."
32
+ $stderr.puts " To update the plugin, run 'kontena plugin install #{plugin_name}'"
33
+ return false
34
+ end
35
+
36
+ start_tracking
37
+ activate(spec)
38
+
39
+ Kontena.logger.debug { "Loading plugin #{spec.name} from #{path}" }
40
+ require(path)
41
+ Kontena.logger.debug { "Loaded plugin #{spec.name}" } if plugin_debug?
42
+
43
+ report_tracking(spec)
44
+ true
45
+ rescue ScriptError, LoadError, StandardError => ex
46
+ warn " [#{Kontena.pastel.red('error')}] Failed to load plugin: #{spec.name} from #{spec.gem_dir}\n\tRerun the command with environment DEBUG=true set to get the full exception."
47
+ Kontena.logger.error(ex)
48
+ spec.description = spec.description + Kontena.pastel.red(" (broken)")
49
+ false
50
+ ensure
51
+ loaded_plugins << spec
52
+ end
53
+
54
+ def activate(spec)
55
+ Kontena.logger.debug { "Activating plugin #{spec.name}" } if plugin_debug?
56
+ spec.activate
57
+ spec.activate_dependencies
58
+ end
59
+
60
+ # @param [Gem::Specification] spec
61
+ # @return [Boolean]
62
+ def spec_has_valid_dependency?(spec)
63
+ kontena_cli = spec.runtime_dependencies.find{ |d| d.name == CLI_GEM }
64
+ !kontena_cli.match?(CLI_GEM, MIN_CLI_VERSION)
65
+ rescue
66
+ false
67
+ end
68
+
69
+ def plugin_require_path(spec)
70
+ paths = spec.require_paths.to_a.map do |require_path|
71
+ File.join(spec.gem_dir, require_path, 'kontena_cli_plugin.rb')
72
+ end
73
+ paths.find { |path| File.exist?(path) }
74
+ end
75
+
76
+ def start_tracking
77
+ return unless plugin_debug?
78
+ @loaded_features_before = $LOADED_FEATURES.dup
79
+ @load_path_before = $LOAD_PATH.dup
80
+ end
81
+
82
+ def report_tracking(spec)
83
+ return unless plugin_debug?
84
+ added_features = ($LOADED_FEATURES - @loaded_features_before).map {|feat| "- #{feat}"}
85
+ added_paths = ($LOAD_PATH - @load_path_before).map {|feat| "- #{feat}"}
86
+ Kontena.logger.debug { "Plugin manager loaded features for #{spec.name}:" } unless added_features.empty?
87
+ added_features.each { |feat| Kontena.logger.debug { feat } }
88
+ Kontena.logger.debug { "Plugin manager load paths added for #{spec.name}:" } unless added_paths.empty?
89
+ added_paths.each { |path| Kontena.logger.debug { path } }
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,59 @@
1
+ require 'kontena_cli'
2
+ require 'json'
3
+ require 'uri'
4
+ require 'net/https'
5
+
6
+ module Kontena
7
+ module PluginManager
8
+ class RubygemsClient
9
+
10
+ JSON_MIME ='application/json'.freeze
11
+ ACCEPT = 'Accept'.freeze
12
+ HTTPOK = "200".freeze
13
+
14
+ def search(pattern = nil)
15
+ get('/api/v1/search.json', query: pattern)
16
+ end
17
+
18
+ def versions(gem_name)
19
+ response = get("/api/v1/versions/#{gem_name}.json")
20
+ response.map { |version| Gem::Version.new(version["number"]) }.sort.reverse
21
+ end
22
+
23
+ # Get the latest version number from rubygems
24
+ # @param plugin_name [String]
25
+ # @param pre [Boolean] include prerelease versions
26
+ def latest_version(gem_name, pre: false)
27
+ return versions(gem_name).first if pre
28
+ versions(gem_name).find { |version| !version.prerelease? }
29
+ end
30
+
31
+ def client
32
+ return @client if @client
33
+ @client = Net::HTTP.new('rubygems.org', 443)
34
+ @client.use_ssl = true
35
+ @client
36
+ end
37
+
38
+ def request_path(path, query = nil)
39
+ uri = URI(path)
40
+ uri.query = URI.encode_www_form(query) if query
41
+ uri.to_s
42
+ end
43
+
44
+ def get_request(path)
45
+ request = Net::HTTP::Get.new(path)
46
+ request[ACCEPT] = JSON_MIME
47
+ request
48
+ end
49
+
50
+ def get(path, query = nil)
51
+ Kontena.logger.debug { "Requesting GET #{path}" }
52
+ response = client.request(get_request(request_path(path, query)))
53
+ Kontena.logger.debug { "Response #{response.code}" }
54
+ raise "Server responded with #{response.code} (#{response.class.name})" unless response.code == HTTPOK
55
+ JSON.parse(response.body)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,34 @@
1
+ require 'rubygems/uninstaller'
2
+
3
+ module Kontena
4
+ module PluginManager
5
+ class Uninstaller
6
+ include PluginManager::Common
7
+
8
+ attr_reader :plugin_name
9
+
10
+ def initialize(plugin_name)
11
+ @plugin_name = plugin_name
12
+ end
13
+
14
+ def command(spec)
15
+ @command ||= Gem::Uninstaller.new(
16
+ spec.name,
17
+ all: true,
18
+ executables: true,
19
+ force: true,
20
+ install_dir: spec.base_dir
21
+ )
22
+ end
23
+
24
+ # Uninstall a plugin
25
+ # @param plugin_name [String]
26
+ def uninstall
27
+ installed = installed(plugin_name)
28
+ raise "Plugin #{plugin_name} not installed" unless installed
29
+
30
+ command(installed).uninstall
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Kontena
2
+ module PluginManager
3
+ autoload :RubygemsClient, 'kontena/plugin_manager/rubygems_client'
4
+ autoload :Loader, 'kontena/plugin_manager/loader'
5
+ autoload :Installer, 'kontena/plugin_manager/installer'
6
+ autoload :Uninstaller, 'kontena/plugin_manager/uninstaller'
7
+ autoload :Cleaner, 'kontena/plugin_manager/cleaner'
8
+ autoload :Common, 'kontena/plugin_manager/common'
9
+
10
+ # Initialize plugin manager
11
+ def init
12
+ ENV["GEM_HOME"] = Common.install_dir
13
+ Gem.paths = ENV
14
+ Common.use_dummy_ui unless Kontena.debug?
15
+ plugins
16
+ true
17
+ end
18
+ module_function :init
19
+
20
+ # @return [Array<Gem::Specification>]
21
+ def plugins
22
+ @plugins ||= Loader.new.load_plugins
23
+ end
24
+ module_function :plugins
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ ---
2
+ oauth2.authorize_endpoint: https://github.com/login/oauth/authorize
3
+ oauth2.code_requires_basic_auth: false
4
+ oauth2.token_endpoint: https://github.com/login/oauth/access_token
5
+ oauth2.token_method: post
6
+ oauth2.token_post_content_type: application/json
7
+ oauth2.userinfo_scope: user:email
8
+ oauth2.userinfo_endpoint: https://api.github.com/user
9
+ oauth2.userinfo_username_jsonpath: "$..login"
10
+ oauth2.userinfo_email_jsonpath: "$..email"
11
+ oauth2.userinfo_user_id_jsonpath: "$..id"
@@ -0,0 +1,11 @@
1
+ ---
2
+ oauth2.authorize_endpoint: https://cloud.kontena.io/login/oauth/authorize
3
+ oauth2.code_requires_basic_auth: false
4
+ oauth2.token_endpoint: https://cloud-api.kontena.io/oauth2/token
5
+ oauth2.token_method: post
6
+ oauth2.token_post_content_type: application/x-www-form-urlencoded
7
+ oauth2.userinfo_endpoint: https://cloud-api.kontena.io/user
8
+ oauth2.userinfo_username_jsonpath: "$..username"
9
+ oauth2.userinfo_email_jsonpath: "$..email"
10
+ oauth2.userinfo_user_id_jsonpath: "$..id"
11
+ oauth2.userinfo_scope: user
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # resolve bin path, ignoring symlinks
5
+ require 'pathname'
6
+ bin_file = Pathname.new(__FILE__).realpath
7
+ $:.unshift File.expand_path('../../..', bin_file)
8
+
9
+ require 'kontena/scripts/completer'