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,19 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class AffinitiesValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_affinities')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(Array)
9
+ errors[key] = 'affinity must be array'
10
+ return
11
+ end
12
+
13
+ invalid_formats = value.find_all { |a| !a.match(/(?<=\!|\=)=/) }
14
+ if invalid_formats.count > 0
15
+ errors[key] = "affinity contains invalid formats: #{invalid_formats.join(', ')}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class BuildValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_build')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(String) || value.is_a?(Hash)
9
+ errors[key] = 'build must be string or hash'
10
+ return
11
+ end
12
+ if value.is_a?(Hash)
13
+ build_validation = {
14
+ 'context' => 'string',
15
+ 'dockerfile' => HashValidator.optional('string'),
16
+ 'args' => HashValidator.optional(-> (value) { value.is_a?(Array) || value.is_a?(Hash) })
17
+ }
18
+ HashValidator.validator_for(build_validation).validate(key, value, build_validation, errors)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class CertificatesValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_certificates')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(Array)
9
+ errors[key] = 'certificates must be array'
10
+ return
11
+ end
12
+ certificate_item_validation = {
13
+ 'subject' => 'string',
14
+ 'name' => 'string',
15
+ 'type' => 'string'
16
+ }
17
+ value.each do |certificate|
18
+ HashValidator.validator_for(certificate_item_validation).validate(key, certificate, certificate_item_validation, errors)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class ExtendsValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_extends')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(String) || value.is_a?(Hash)
9
+ errors[key] = 'extends must be string or hash'
10
+ return
11
+ end
12
+ if value.is_a?(Hash)
13
+ extends_validation = {
14
+ 'service' => 'string',
15
+ 'file' => HashValidator.optional('string'),
16
+ 'stack' => HashValidator.optional('string')
17
+ }
18
+ HashValidator.validator_for(extends_validation).validate(key, value, extends_validation, errors)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,102 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class HooksValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_hooks')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(Hash)
9
+ errors[key] = "must be a mapping, not #{value.class}"
10
+ return
11
+ end
12
+
13
+ value.keys.each do |hook|
14
+ unless %w(pre_build pre_start post_start pre_stop).include?(hook)
15
+ errors[key] = "invalid hook #{hook}"
16
+ end
17
+ end
18
+
19
+ if value['pre_build']
20
+ validate_pre_build_hooks(key, value['pre_build'], errors)
21
+ end
22
+
23
+ if value['pre_start']
24
+ validate_pre_start_hooks(key, value['pre_start'], errors)
25
+ end
26
+
27
+ if value['post_start']
28
+ validate_post_start_hooks(key, value['post_start'], errors)
29
+ end
30
+
31
+ if value['pre_stop']
32
+ validate_pre_stop_hooks(key, value['pre_stop'], errors)
33
+ end
34
+ end
35
+
36
+ def validate_pre_build_hooks(key, pre_build_hooks, errors)
37
+ unless pre_build_hooks.is_a?(Array)
38
+ errors[key] = { 'pre_build' => "must be an array" }
39
+ return
40
+ end
41
+ pre_build_validation = {
42
+ 'name' => 'string',
43
+ 'cmd' => 'string'
44
+ }
45
+ validator = HashValidator.validator_for(pre_build_validation)
46
+ pre_build_hooks.each do |pre_build|
47
+ validator.validate('hooks.pre_build', pre_build, pre_build_validation, errors)
48
+ end
49
+ end
50
+
51
+ def validate_pre_start_hooks(key, pre_start_hooks, errors)
52
+ unless pre_start_hooks.is_a?(Array)
53
+ errors[key] = { 'pre_start' => 'must be an array' }
54
+ return
55
+ end
56
+ pre_start_validation = {
57
+ 'name' => 'string',
58
+ 'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
59
+ 'cmd' => 'string',
60
+ 'oneshot' => HashValidator.optional('boolean')
61
+ }
62
+ validator = HashValidator.validator_for(pre_start_validation)
63
+ pre_start_hooks.each do |pre_start|
64
+ validator.validate('hooks.pre_start', pre_start, pre_start_validation, errors)
65
+ end
66
+ end
67
+
68
+ def validate_post_start_hooks(key, post_start_hooks, errors)
69
+ unless post_start_hooks.is_a?(Array)
70
+ errors[key] = { 'post_start' => 'must be an array' }
71
+ return
72
+ end
73
+ post_start_validation = {
74
+ 'name' => 'string',
75
+ 'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
76
+ 'cmd' => 'string',
77
+ 'oneshot' => HashValidator.optional('boolean')
78
+ }
79
+ validator = HashValidator.validator_for(post_start_validation)
80
+ post_start_hooks.each do |post_start|
81
+ validator.validate('hooks.post_start', post_start, post_start_validation, errors)
82
+ end
83
+ end
84
+
85
+ def validate_pre_stop_hooks(key, pre_stop_hooks, errors)
86
+ unless pre_stop_hooks.is_a?(Array)
87
+ errors[key] = { 'pre_stop' => 'must be an array' }
88
+ return
89
+ end
90
+ pre_stop_validation = {
91
+ 'name' => 'string',
92
+ 'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
93
+ 'cmd' => 'string',
94
+ 'oneshot' => HashValidator.optional('boolean')
95
+ }
96
+ validator = HashValidator.validator_for(pre_stop_validation)
97
+ pre_stop_hooks.each do |pre_stop|
98
+ validator.validate('hooks.pre_stop', pre_stop, pre_stop_validation, errors)
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,22 @@
1
+ module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
2
+ class SecretsValidator < HashValidator::Validator::Base
3
+ def initialize
4
+ super('stacks_valid_secrets')
5
+ end
6
+
7
+ def validate(key, value, validations, errors)
8
+ unless value.is_a?(Array)
9
+ errors[key] = 'secrets must be array'
10
+ return
11
+ end
12
+ secret_item_validation = {
13
+ 'secret' => 'string',
14
+ 'name' => 'string',
15
+ 'type' => 'string'
16
+ }
17
+ value.each do |secret|
18
+ HashValidator.validator_for(secret_item_validation).validate(key, secret, secret_item_validation, errors)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ module Kontena::Cli::Stacks::YAML::Opto::Resolvers
2
+ class Certificates < ::Opto::Resolver
3
+ include Kontena::Cli::Common
4
+
5
+ def resolve
6
+ return nil unless current_master && current_grid
7
+ message = hint || 'Select SSL certificates'
8
+ certificates = get_certificates
9
+ if certificates.size > 0
10
+ prompt.multi_select(message) do |menu|
11
+ menu.default(*default_indexes(certificates)) if option.default
12
+ certificates.each do |s|
13
+ menu.choice s['subject']
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # @return [Array<Hash>] certificates
20
+ def get_certificates
21
+ client.get("grids/#{current_grid}/certificates")['certificates']
22
+ rescue
23
+ []
24
+ end
25
+
26
+ # @param certificates [Array<Hash>]
27
+ # @return [Array<Integer>]
28
+ def default_indexes(certificates)
29
+ indexes = []
30
+ option.default.to_a.each do |subject|
31
+ index = certificates.index { |s| s['subject'] == subject }
32
+ indexes << index.to_i + 1 if index
33
+ end
34
+ indexes
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,78 @@
1
+ require_relative '../opto'
2
+
3
+ module Kontena::Cli::Stacks
4
+ module YAML
5
+ class Prompt < ::Opto::Resolver
6
+ include Kontena::Cli::Common
7
+
8
+ using ::Opto::Extension::HashStringOrSymbolKey
9
+
10
+ def enum?
11
+ option.type == 'enum'
12
+ end
13
+
14
+ def boolean?
15
+ option.type == 'boolean'
16
+ end
17
+
18
+ def prompt_word
19
+ return "Select" if enum?
20
+ return "Enable" if boolean?
21
+ "Enter"
22
+ end
23
+
24
+ def question_text
25
+ (!hint.nil? && hint != option.name) ? "#{hint} :" : "#{prompt_word} #{option.label || option.name} :"
26
+ end
27
+
28
+ def enum_can_be_other?
29
+ enum? && option.handler.options[:can_be_other] ? true : false
30
+ end
31
+
32
+ def enum
33
+ opts = option.handler.options[:options]
34
+ opts << { label: '(Other)', value: nil, description: '(Other)' } if enum_can_be_other?
35
+
36
+ answer = prompt.select(question_text) do |menu|
37
+ menu.enum ':' # makes it show numbers before values, you can press the number to select.
38
+ menu.default(opts.index {|opt| opt[:value] == option.default }.to_i + 1) if option.default
39
+ opts.each do |opt|
40
+ menu.choice opt[:label], opt[:value]
41
+ end
42
+ end
43
+
44
+ if answer.nil? && enum_can_be_other?
45
+ ask
46
+ else
47
+ answer
48
+ end
49
+ end
50
+
51
+ def bool
52
+ prompt.yes?(question_text, default: option.default.nil? || option.default)
53
+ end
54
+
55
+ def echo?
56
+ return true if option.handler.nil?
57
+ return true if option.handler.options.nil?
58
+ return true if option.handler.options[:echo].nil?
59
+ option.handler.options[:echo]
60
+ end
61
+
62
+ def ask
63
+ prompt.ask(question_text, default: option.default, echo: echo?)
64
+ end
65
+
66
+ def resolve
67
+ return nil if option.skip?
68
+ if enum?
69
+ enum
70
+ elsif boolean?
71
+ bool
72
+ else
73
+ ask
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,25 @@
1
+ module Kontena::Cli::Stacks
2
+ module YAML
3
+ class Opto::Resolvers::ServiceInstances < ::Opto::Resolver
4
+ include Kontena::Cli::Common
5
+
6
+ def resolve
7
+ return nil unless current_master && current_grid
8
+ require 'kontena/cli/stacks/show_command'
9
+ stack = client.get("stacks/#{current_grid}/#{self.stack}")
10
+ service = stack['services'].find { |s| s['name'] == hint }
11
+ if service
12
+ service['instances']
13
+ else
14
+ nil
15
+ end
16
+ rescue Kontena::Errors::StandardError
17
+ nil
18
+ end
19
+
20
+ def stack
21
+ ENV['STACK']
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,80 @@
1
+ module Kontena::Cli::Stacks::YAML::Opto::Resolvers
2
+ class ServiceLink < ::Opto::Resolver
3
+ include Kontena::Cli::Common
4
+
5
+ def resolve
6
+ return nil unless current_master && current_grid
7
+ message = hint['prompt']
8
+ name_filter = hint['name']
9
+ image_filter = hint['image']
10
+ raise "prompt missing" unless message
11
+
12
+ services = get_services
13
+ services = filter_by_image(services, image_filter) if image_filter
14
+ services = filter_by_name(services, name_filter) if name_filter
15
+ return nil if services.size == 0
16
+ prompt.select(message) do |menu|
17
+ menu.default(default_index(services)) if option.default
18
+ menu.choice "<none>", nil unless option.required?
19
+ services.each do |s|
20
+ menu.choice service_name(s), service_link(s)
21
+ end
22
+ end
23
+ end
24
+
25
+ # @return [Array<Hash>]
26
+ def get_services
27
+ client.get("grids/#{current_grid}/services")['services']
28
+ rescue
29
+ []
30
+ end
31
+
32
+ # @param [Array<Hash>] services
33
+ # @return [Integer]
34
+ def default_index(services)
35
+ index = services.index {|s| service_link(s) == option.default }
36
+
37
+ if index && !option.required?
38
+ index + 2 # extra offset for the initial <none> option
39
+ elsif index
40
+ index + 1 # menu index starts from 1
41
+ else
42
+ 0 # XXX: this just explodes?
43
+ end
44
+ end
45
+
46
+ # @param [Hash] service
47
+ # @return [String]
48
+ def service_link(service)
49
+ grid, stack, service = service['id'].split('/')
50
+ "#{stack}/#{service}"
51
+ end
52
+
53
+ # @param [Hash] service
54
+ # @return [String]
55
+ def service_name(service)
56
+ grid, stack, service = service['id'].split('/')
57
+ if stack == 'null'.freeze
58
+ service
59
+ else
60
+ "#{stack}/#{service}"
61
+ end
62
+ end
63
+
64
+ def filter_by_image(services, image)
65
+ services.select { |s|
66
+ s['image'].include?(image)
67
+ }
68
+ end
69
+
70
+ def filter_by_name(services, name)
71
+ services.select { |s|
72
+ s['name'].include?(name)
73
+ }
74
+ end
75
+
76
+ def stack
77
+ ENV['STACK']
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,39 @@
1
+ module Kontena::Cli::Stacks::YAML::Opto::Resolvers
2
+ class VaultCertPrompt < ::Opto::Resolver
3
+ include Kontena::Cli::Common
4
+
5
+ def resolve
6
+ return nil unless current_master && current_grid
7
+ message = hint || 'Select SSL certs'
8
+ secrets = get_secrets.select{ |s|
9
+ s['name'].match(/(ssl|cert)/i)
10
+ }
11
+ if secrets.size > 0
12
+ prompt.multi_select(message) do |menu|
13
+ menu.default(*default_indexes(secrets)) if option.default
14
+ secrets.each do |s|
15
+ menu.choice s['name']
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # @return [Array<Hash>] secrets
22
+ def get_secrets
23
+ client.get("grids/#{current_grid}/secrets")['secrets']
24
+ rescue
25
+ []
26
+ end
27
+
28
+ # @param [Array<Hash>] secrets
29
+ # @return [Array<Integer>]
30
+ def default_indexes(secrets)
31
+ indexes = []
32
+ option.default.to_a.each do |name|
33
+ index = secrets.index { |s| s['name'] == name }
34
+ indexes << index.to_i + 1 if index
35
+ end
36
+ indexes
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ module Kontena::Cli::Stacks
2
+ module YAML
3
+ class Opto::Resolvers::Vault < ::Opto::Resolver
4
+ include Kontena::Cli::Common
5
+ def resolve
6
+ raise RuntimeError, "Missing or empty vault secret name" if hint.to_s.empty?
7
+ if current_master && current_grid
8
+ client.get("secrets/#{current_grid}/#{hint}")['value'] rescue nil
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ module Kontena::Cli::Stacks
2
+ module YAML
3
+ class Opto::Setters::Vault < ::Opto::Setter
4
+ include Kontena::Cli::Common
5
+ def set(value)
6
+ if current_master && current_grid
7
+ client.put("secrets/#{current_grid}/#{hint}", {name: hint, value: value, upsert: true})
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module Kontena::Cli::Stacks
2
+ module YAML
3
+ module Opto
4
+ module Resolvers; end
5
+ module Setters; end
6
+ end
7
+ end
8
+ end
9
+ require 'opto'
10
+ require_relative 'opto/vault_setter'
11
+ require_relative 'opto/vault_resolver'
12
+ require_relative 'opto/prompt_resolver'
13
+ require_relative 'opto/service_instances_resolver'
14
+ require_relative 'opto/vault_cert_prompt_resolver'
15
+ require_relative 'opto/certificates_resolver'
16
+ require_relative 'opto/service_link_resolver'