kubes 0.1.0 → 0.2.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 (379) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +15 -7
  3. data/.rspec +3 -0
  4. data/CHANGELOG.md +10 -0
  5. data/Gemfile +3 -1
  6. data/Guardfile +19 -0
  7. data/LICENSE.txt +201 -0
  8. data/README.md +46 -18
  9. data/Rakefile +13 -1
  10. data/docs/.gitignore +5 -0
  11. data/docs/CNAME +1 -0
  12. data/docs/Gemfile +16 -0
  13. data/docs/LICENSE +201 -0
  14. data/docs/Procfile +2 -0
  15. data/docs/README.md +24 -0
  16. data/docs/Rakefile +38 -0
  17. data/docs/_config.yml +71 -0
  18. data/docs/_docs/auto-context.md +47 -0
  19. data/docs/_docs/config.md +9 -0
  20. data/docs/_docs/config/docker.md +70 -0
  21. data/docs/_docs/config/env.md +58 -0
  22. data/docs/_docs/config/kubectl.md +61 -0
  23. data/docs/_docs/contributing.md +98 -0
  24. data/docs/_docs/dsl.md +66 -0
  25. data/docs/_docs/dsl/multiple-resources.md +114 -0
  26. data/docs/_docs/dsl/resources.md +12 -0
  27. data/docs/_docs/dsl/resources/backend_config.md +45 -0
  28. data/docs/_docs/dsl/resources/config_map.md +84 -0
  29. data/docs/_docs/dsl/resources/daemon_set.md +58 -0
  30. data/docs/_docs/dsl/resources/deployment.md +142 -0
  31. data/docs/_docs/dsl/resources/generic.md +58 -0
  32. data/docs/_docs/dsl/resources/ingress.md +103 -0
  33. data/docs/_docs/dsl/resources/managed_certificate.md +39 -0
  34. data/docs/_docs/dsl/resources/namespace.md +34 -0
  35. data/docs/_docs/dsl/resources/network_policy.md +45 -0
  36. data/docs/_docs/dsl/resources/pod.md +82 -0
  37. data/docs/_docs/dsl/resources/role.md +44 -0
  38. data/docs/_docs/dsl/resources/role_binding.md +55 -0
  39. data/docs/_docs/dsl/resources/secret.md +87 -0
  40. data/docs/_docs/dsl/resources/service.md +60 -0
  41. data/docs/_docs/dsl/resources/service_account.md +37 -0
  42. data/docs/_docs/extra-env.md +23 -0
  43. data/docs/_docs/extra-env/dsl.md +86 -0
  44. data/docs/_docs/extra-env/yaml.md +67 -0
  45. data/docs/_docs/helpers.md +18 -0
  46. data/docs/_docs/intro.md +15 -0
  47. data/docs/_docs/intro/concepts.md +37 -0
  48. data/docs/_docs/intro/how-kubes-works.md +29 -0
  49. data/docs/_docs/intro/install.md +6 -0
  50. data/docs/_docs/intro/ordering.md +63 -0
  51. data/docs/_docs/intro/ordering/custom.md +25 -0
  52. data/docs/_docs/intro/structure.md +43 -0
  53. data/docs/_docs/kustomize.md +54 -0
  54. data/docs/_docs/layering.md +8 -0
  55. data/docs/_docs/layering/dsl.md +5 -0
  56. data/docs/_docs/layering/merge.md +96 -0
  57. data/docs/_docs/layering/yaml.md +5 -0
  58. data/docs/_docs/learn/dsl.md +5 -0
  59. data/docs/_docs/learn/dsl/change.md +16 -0
  60. data/docs/_docs/learn/dsl/cluster.md +5 -0
  61. data/docs/_docs/learn/dsl/delete.md +30 -0
  62. data/docs/_docs/learn/dsl/deploy.md +61 -0
  63. data/docs/_docs/learn/dsl/install.md +5 -0
  64. data/docs/_docs/learn/dsl/new-project.md +33 -0
  65. data/docs/_docs/learn/dsl/next-steps.md +5 -0
  66. data/docs/_docs/learn/dsl/review-project.md +52 -0
  67. data/docs/_docs/learn/dsl/update.md +53 -0
  68. data/docs/_docs/learn/yaml.md +5 -0
  69. data/docs/_docs/learn/yaml/change.md +17 -0
  70. data/docs/_docs/learn/yaml/cluster.md +5 -0
  71. data/docs/_docs/learn/yaml/delete.md +30 -0
  72. data/docs/_docs/learn/yaml/deploy.md +62 -0
  73. data/docs/_docs/learn/yaml/install.md +5 -0
  74. data/docs/_docs/learn/yaml/new-project.md +36 -0
  75. data/docs/_docs/learn/yaml/next-steps.md +5 -0
  76. data/docs/_docs/learn/yaml/review-project.md +97 -0
  77. data/docs/_docs/learn/yaml/update.md +54 -0
  78. data/docs/_docs/next-steps.md +13 -0
  79. data/docs/_docs/patterns.md +7 -0
  80. data/docs/_docs/patterns/clock-web-worker.md +71 -0
  81. data/docs/_docs/resources.md +11 -0
  82. data/docs/_docs/resources/base.md +33 -0
  83. data/docs/_docs/resources/role.md +41 -0
  84. data/docs/_docs/resources/shared.md +36 -0
  85. data/docs/_docs/yaml.md +46 -0
  86. data/docs/_includes/commands.html +131 -0
  87. data/docs/_includes/content.html +25 -0
  88. data/docs/_includes/dsl/methods.md +1 -0
  89. data/docs/_includes/dsl/rolling_deployment.md +1 -0
  90. data/docs/_includes/dsl/suffix_hash.md +8 -0
  91. data/docs/_includes/example.html +12 -0
  92. data/docs/_includes/footer.html +37 -0
  93. data/docs/_includes/google_analytics.html +10 -0
  94. data/docs/_includes/header.html +31 -0
  95. data/docs/_includes/intro/install.md +15 -0
  96. data/docs/_includes/js.html +3 -0
  97. data/docs/_includes/kubes-steps.md +3 -0
  98. data/docs/_includes/layering/layers.md +64 -0
  99. data/docs/_includes/learn/cluster.md +22 -0
  100. data/docs/_includes/learn/next-steps.md +6 -0
  101. data/docs/_includes/learn/review.md +25 -0
  102. data/docs/_includes/learn/start.md +3 -0
  103. data/docs/_includes/reference.md +3 -0
  104. data/docs/_includes/sidebar.html +113 -0
  105. data/docs/_layouts/default.html +35 -0
  106. data/docs/_reference/kubes-apply.md +24 -0
  107. data/docs/_reference/kubes-clean.md +22 -0
  108. data/docs/_reference/kubes-compile.md +22 -0
  109. data/docs/_reference/kubes-completion.md +42 -0
  110. data/docs/_reference/kubes-completion_script.md +25 -0
  111. data/docs/_reference/kubes-delete.md +23 -0
  112. data/docs/_reference/kubes-deploy.md +35 -0
  113. data/docs/_reference/kubes-docker-build.md +20 -0
  114. data/docs/_reference/kubes-docker-help.md +15 -0
  115. data/docs/_reference/kubes-docker-push.md +20 -0
  116. data/docs/_reference/kubes-docker.md +25 -0
  117. data/docs/_reference/kubes-init.md +26 -0
  118. data/docs/_reference/kubes-version.md +21 -0
  119. data/docs/_sass/bootstrap-overrides.scss +17 -0
  120. data/docs/_sass/buttons.scss +62 -0
  121. data/docs/_sass/caret.scss +39 -0
  122. data/docs/_sass/content.scss +21 -0
  123. data/docs/_sass/cta.scss +39 -0
  124. data/docs/_sass/default.scss +103 -0
  125. data/docs/_sass/footer.scss +66 -0
  126. data/docs/_sass/masthead.scss +77 -0
  127. data/docs/_sass/mixins.scss +79 -0
  128. data/docs/_sass/sidebar.scss +107 -0
  129. data/docs/_sass/syntax.scss +89 -0
  130. data/docs/_sass/table.scss +30 -0
  131. data/docs/_sass/theme.scss +292 -0
  132. data/docs/_sass/variables.scss +24 -0
  133. data/docs/bin/build +4 -0
  134. data/docs/bin/rerun +2 -0
  135. data/docs/bin/web +8 -0
  136. data/docs/css/main.scss +24 -0
  137. data/docs/docs.md +7 -0
  138. data/docs/getting-started.md +12 -0
  139. data/docs/img/logos/boltops-logo-full.png +0 -0
  140. data/docs/img/logos/boltops-logo.png +0 -0
  141. data/docs/img/logos/filler-logo.png +0 -0
  142. data/docs/img/logos/kubes-black.png +0 -0
  143. data/docs/img/logos/kubes-sign.png +0 -0
  144. data/docs/index.html +34 -0
  145. data/docs/js/app.js +39414 -0
  146. data/docs/opal/app.rb +16 -0
  147. data/docs/opal/pager.rb +90 -0
  148. data/docs/opal/sidebar.rb +94 -0
  149. data/docs/opal/sidebar/expander.rb +51 -0
  150. data/docs/reference.md +15 -0
  151. data/docs/support.md +19 -0
  152. data/docs/vendor/bootstrap/css/bootstrap-grid.css +3719 -0
  153. data/docs/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
  154. data/docs/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
  155. data/docs/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
  156. data/docs/vendor/bootstrap/css/bootstrap-reboot.css +331 -0
  157. data/docs/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
  158. data/docs/vendor/bootstrap/css/bootstrap-reboot.min.css +8 -0
  159. data/docs/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
  160. data/docs/vendor/bootstrap/css/bootstrap.css +10038 -0
  161. data/docs/vendor/bootstrap/css/bootstrap.css.map +1 -0
  162. data/docs/vendor/bootstrap/css/bootstrap.min.css +7 -0
  163. data/docs/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  164. data/docs/vendor/bootstrap/js/bootstrap.bundle.js +7013 -0
  165. data/docs/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
  166. data/docs/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  167. data/docs/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  168. data/docs/vendor/bootstrap/js/bootstrap.js +4435 -0
  169. data/docs/vendor/bootstrap/js/bootstrap.js.map +1 -0
  170. data/docs/vendor/bootstrap/js/bootstrap.min.js +7 -0
  171. data/docs/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
  172. data/docs/vendor/font-awesome/css/font-awesome.css +2337 -0
  173. data/docs/vendor/font-awesome/css/font-awesome.min.css +4 -0
  174. data/docs/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  175. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  176. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  177. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  178. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  179. data/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  180. data/docs/vendor/font-awesome/less/animated.less +34 -0
  181. data/docs/vendor/font-awesome/less/bordered-pulled.less +25 -0
  182. data/docs/vendor/font-awesome/less/core.less +12 -0
  183. data/docs/vendor/font-awesome/less/fixed-width.less +6 -0
  184. data/docs/vendor/font-awesome/less/font-awesome.less +18 -0
  185. data/docs/vendor/font-awesome/less/icons.less +789 -0
  186. data/docs/vendor/font-awesome/less/larger.less +13 -0
  187. data/docs/vendor/font-awesome/less/list.less +19 -0
  188. data/docs/vendor/font-awesome/less/mixins.less +60 -0
  189. data/docs/vendor/font-awesome/less/path.less +15 -0
  190. data/docs/vendor/font-awesome/less/rotated-flipped.less +20 -0
  191. data/docs/vendor/font-awesome/less/screen-reader.less +5 -0
  192. data/docs/vendor/font-awesome/less/stacked.less +20 -0
  193. data/docs/vendor/font-awesome/less/variables.less +799 -0
  194. data/docs/vendor/font-awesome/scss/_animated.scss +34 -0
  195. data/docs/vendor/font-awesome/scss/_bordered-pulled.scss +25 -0
  196. data/docs/vendor/font-awesome/scss/_core.scss +12 -0
  197. data/docs/vendor/font-awesome/scss/_fixed-width.scss +6 -0
  198. data/docs/vendor/font-awesome/scss/_icons.scss +789 -0
  199. data/docs/vendor/font-awesome/scss/_larger.scss +13 -0
  200. data/docs/vendor/font-awesome/scss/_list.scss +19 -0
  201. data/docs/vendor/font-awesome/scss/_mixins.scss +60 -0
  202. data/docs/vendor/font-awesome/scss/_path.scss +15 -0
  203. data/docs/vendor/font-awesome/scss/_rotated-flipped.scss +20 -0
  204. data/docs/vendor/font-awesome/scss/_screen-reader.scss +5 -0
  205. data/docs/vendor/font-awesome/scss/_stacked.scss +20 -0
  206. data/docs/vendor/font-awesome/scss/_variables.scss +799 -0
  207. data/docs/vendor/font-awesome/scss/font-awesome.scss +18 -0
  208. data/docs/vendor/jquery/jquery.js +10598 -0
  209. data/docs/vendor/jquery/jquery.min.js +2 -0
  210. data/docs/vendor/jquery/jquery.min.map +1 -0
  211. data/docs/vendor/jquery/jquery.slim.js +8495 -0
  212. data/docs/vendor/jquery/jquery.slim.min.js +2 -0
  213. data/docs/vendor/jquery/jquery.slim.min.map +1 -0
  214. data/docs/vendor/simple-line-icons/css/simple-line-icons.css +778 -0
  215. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot +0 -0
  216. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.svg +200 -0
  217. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf +0 -0
  218. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff +0 -0
  219. data/docs/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 +0 -0
  220. data/docs/vendor/simple-line-icons/less/simple-line-icons.less +982 -0
  221. data/docs/vendor/simple-line-icons/scss/simple-line-icons.scss +979 -0
  222. data/exe/kubes +14 -0
  223. data/kubes.gemspec +29 -19
  224. data/lib/kubes.rb +21 -1
  225. data/lib/kubes/args/custom.rb +30 -0
  226. data/lib/kubes/args/dsl.rb +14 -0
  227. data/lib/kubes/auth.rb +21 -0
  228. data/lib/kubes/auth/ecr.rb +55 -0
  229. data/lib/kubes/autoloader.rb +21 -0
  230. data/lib/kubes/aws_services.rb +14 -0
  231. data/lib/kubes/cli.rb +93 -0
  232. data/lib/kubes/cli/apply.rb +9 -0
  233. data/lib/kubes/cli/base.rb +9 -0
  234. data/lib/kubes/cli/build.rb +8 -0
  235. data/lib/kubes/cli/clean.rb +9 -0
  236. data/lib/kubes/cli/compile.rb +8 -0
  237. data/lib/kubes/cli/delete.rb +11 -0
  238. data/lib/kubes/cli/deploy.rb +13 -0
  239. data/lib/kubes/cli/describe.rb +8 -0
  240. data/lib/kubes/cli/docker.rb +20 -0
  241. data/lib/kubes/cli/get.rb +8 -0
  242. data/lib/kubes/cli/help.rb +11 -0
  243. data/lib/kubes/cli/help/completion.md +20 -0
  244. data/lib/kubes/cli/help/completion_script.md +3 -0
  245. data/lib/kubes/cli/help/deploy.md +10 -0
  246. data/lib/kubes/cli/init.rb +69 -0
  247. data/lib/kubes/cli/sequence.rb +27 -0
  248. data/lib/kubes/command.rb +100 -0
  249. data/lib/kubes/compiler.rb +71 -0
  250. data/lib/kubes/compiler/decorator.rb +17 -0
  251. data/lib/kubes/compiler/decorator/base.rb +16 -0
  252. data/lib/kubes/compiler/decorator/compile.rb +12 -0
  253. data/lib/kubes/compiler/decorator/resources/base.rb +13 -0
  254. data/lib/kubes/compiler/decorator/resources/container.rb +76 -0
  255. data/lib/kubes/compiler/decorator/resources/container/mapping.rb +28 -0
  256. data/lib/kubes/compiler/decorator/resources/deployment.rb +10 -0
  257. data/lib/kubes/compiler/decorator/resources/pod.rb +10 -0
  258. data/lib/kubes/compiler/decorator/resources/secret.rb +23 -0
  259. data/lib/kubes/compiler/decorator/write.rb +14 -0
  260. data/lib/kubes/compiler/dsl/core/base.rb +27 -0
  261. data/lib/kubes/compiler/dsl/core/blocks.rb +55 -0
  262. data/lib/kubes/compiler/dsl/core/fields.rb +78 -0
  263. data/lib/kubes/compiler/dsl/core/files.rb +28 -0
  264. data/lib/kubes/compiler/dsl/core/helpers.rb +4 -0
  265. data/lib/kubes/compiler/dsl/core/parser.rb +43 -0
  266. data/lib/kubes/compiler/dsl/syntax/backend_config.rb +10 -0
  267. data/lib/kubes/compiler/dsl/syntax/cluster_role.rb +4 -0
  268. data/lib/kubes/compiler/dsl/syntax/cluster_role_binding.rb +4 -0
  269. data/lib/kubes/compiler/dsl/syntax/config_map.rb +20 -0
  270. data/lib/kubes/compiler/dsl/syntax/daemon_set.rb +23 -0
  271. data/lib/kubes/compiler/dsl/syntax/deployment.rb +163 -0
  272. data/lib/kubes/compiler/dsl/syntax/ingress.rb +41 -0
  273. data/lib/kubes/compiler/dsl/syntax/managed_certificate.rb +18 -0
  274. data/lib/kubes/compiler/dsl/syntax/namespace.rb +13 -0
  275. data/lib/kubes/compiler/dsl/syntax/network_policy.rb +30 -0
  276. data/lib/kubes/compiler/dsl/syntax/pod.rb +81 -0
  277. data/lib/kubes/compiler/dsl/syntax/resource.rb +70 -0
  278. data/lib/kubes/compiler/dsl/syntax/role.rb +40 -0
  279. data/lib/kubes/compiler/dsl/syntax/role_binding.rb +43 -0
  280. data/lib/kubes/compiler/dsl/syntax/secret.rb +22 -0
  281. data/lib/kubes/compiler/dsl/syntax/service.rb +68 -0
  282. data/lib/kubes/compiler/dsl/syntax/service_account.rb +20 -0
  283. data/lib/kubes/compiler/layering.rb +39 -0
  284. data/lib/kubes/compiler/shared/helpers.rb +30 -0
  285. data/lib/kubes/compiler/strategy.rb +27 -0
  286. data/lib/kubes/compiler/strategy/base.rb +13 -0
  287. data/lib/kubes/compiler/strategy/dsl.rb +32 -0
  288. data/lib/kubes/compiler/strategy/erb.rb +42 -0
  289. data/lib/kubes/compiler/strategy/pass.rb +9 -0
  290. data/lib/kubes/compiler/strategy/result.rb +26 -0
  291. data/lib/kubes/compiler/util/normalize.rb +11 -0
  292. data/lib/kubes/compiler/util/yaml_dump.rb +23 -0
  293. data/lib/kubes/completer.rb +159 -0
  294. data/lib/kubes/completer/script.rb +6 -0
  295. data/lib/kubes/completer/script.sh +10 -0
  296. data/lib/kubes/config.rb +82 -0
  297. data/lib/kubes/core.rb +32 -0
  298. data/lib/kubes/docker/args/default.rb +39 -0
  299. data/lib/kubes/docker/base.rb +88 -0
  300. data/lib/kubes/docker/build.rb +33 -0
  301. data/lib/kubes/docker/push.rb +33 -0
  302. data/lib/kubes/hooks/builder.rb +41 -0
  303. data/lib/kubes/hooks/dsl.rb +19 -0
  304. data/lib/kubes/kubectl.rb +87 -0
  305. data/lib/kubes/kubectl/args/base.rb +12 -0
  306. data/lib/kubes/kubectl/args/kustomize.rb +28 -0
  307. data/lib/kubes/kubectl/args/standard.rb +32 -0
  308. data/lib/kubes/kubectl/batch.rb +49 -0
  309. data/lib/kubes/kubectl/decider.rb +15 -0
  310. data/lib/kubes/kubectl/kustomize.rb +13 -0
  311. data/lib/kubes/kubectl/ordering.rb +27 -0
  312. data/lib/kubes/logger.rb +26 -0
  313. data/lib/kubes/logging.rb +7 -0
  314. data/lib/kubes/util/consider.rb +9 -0
  315. data/lib/kubes/util/sh.rb +43 -0
  316. data/lib/kubes/util/sure.rb +17 -0
  317. data/lib/kubes/util/time.rb +14 -0
  318. data/lib/kubes/version.rb +1 -1
  319. data/lib/templates/base/.kubes/config.rb.tt +9 -0
  320. data/lib/templates/base/.kubes/config/env/dev.rb +6 -0
  321. data/lib/templates/base/.kubes/config/env/prod.rb +6 -0
  322. data/lib/templates/docker/Dockerfile +4 -0
  323. data/lib/templates/dsl/.kubes/resources/base/all.rb.tt +2 -0
  324. data/lib/templates/dsl/.kubes/resources/web/deployment.rb.tt +7 -0
  325. data/lib/templates/dsl/.kubes/resources/web/deployment/dev.rb +1 -0
  326. data/lib/templates/dsl/.kubes/resources/web/deployment/prod.rb +1 -0
  327. data/lib/templates/dsl/.kubes/resources/web/service.rb.tt +8 -0
  328. data/lib/templates/yaml/.kubes/resources/base/all.yaml.tt +2 -0
  329. data/lib/templates/yaml/.kubes/resources/base/deployment.yaml.tt +11 -0
  330. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +24 -0
  331. data/lib/templates/yaml/.kubes/resources/web/deployment/dev.yaml +2 -0
  332. data/lib/templates/yaml/.kubes/resources/web/deployment/prod.yaml +2 -0
  333. data/lib/templates/yaml/.kubes/resources/web/service.yaml.tt +14 -0
  334. data/spec/cli_spec.rb +8 -0
  335. data/spec/fixtures/artifacts/demo-web/deployment.yaml +26 -0
  336. data/spec/fixtures/artifacts/demo-web/service.yaml +16 -0
  337. data/spec/fixtures/blocks/deployments.rb +9 -0
  338. data/spec/fixtures/decorators/deployment/configMap/envFrom.yaml +27 -0
  339. data/spec/fixtures/decorators/deployment/configMap/valueFrom.yaml +30 -0
  340. data/spec/fixtures/decorators/deployment/configMap/volumes.yaml +34 -0
  341. data/spec/fixtures/decorators/deployment/secret/envFrom.yaml +27 -0
  342. data/spec/fixtures/decorators/deployment/secret/valueFrom.yaml +30 -0
  343. data/spec/fixtures/decorators/deployment/secret/volumes.yaml +34 -0
  344. data/spec/fixtures/decorators/pod/configMap/envFrom.yaml +12 -0
  345. data/spec/fixtures/decorators/pod/configMap/valueFrom.yaml +16 -0
  346. data/spec/fixtures/decorators/pod/configMap/volumes.yaml +19 -0
  347. data/spec/fixtures/decorators/pod/secret/envFrom.yaml +12 -0
  348. data/spec/fixtures/decorators/pod/secret/valueFrom.yaml +16 -0
  349. data/spec/fixtures/decorators/pod/secret/volumes.yaml +19 -0
  350. data/spec/fixtures/deployments/minimum.rb +5 -0
  351. data/spec/fixtures/deployments/props.rb +7 -0
  352. data/spec/fixtures/deployments/setter/container.rb +11 -0
  353. data/spec/fixtures/deployments/setter/containers.rb +14 -0
  354. data/spec/fixtures/deployments/setter/metadata.rb +15 -0
  355. data/spec/fixtures/deployments/setter/sidecar.rb +12 -0
  356. data/spec/fixtures/deployments/setter/spec.rb +10 -0
  357. data/spec/fixtures/multiple-files/deployment-1.rb +4 -0
  358. data/spec/fixtures/multiple-files/deployment-2.rb +4 -0
  359. data/spec/fixtures/project/.gitignore +1 -0
  360. data/spec/fixtures/project/.kubes/resources/deployment.rb +32 -0
  361. data/spec/fixtures/project/.kubes/resources/foobar.rb +0 -0
  362. data/spec/fixtures/project/.kubes/resources/service.rb +3 -0
  363. data/spec/fixtures/services/minimum.rb +3 -0
  364. data/spec/fixtures/syntax/network_policy.rb +3 -0
  365. data/spec/fixtures/syntax/pod.rb +1 -0
  366. data/spec/kubes/compiler/decorator/resources/deployment_spec.rb +92 -0
  367. data/spec/kubes/compiler/decorator/resources/pod_spec.rb +92 -0
  368. data/spec/kubes/compiler/strategy/dsl_spec.rb +36 -0
  369. data/spec/kubes/compiler_spec.rb +10 -0
  370. data/spec/kubes/dsl/daemon_set.rb +11 -0
  371. data/spec/kubes/dsl/deployment_spec.rb +60 -0
  372. data/spec/kubes/dsl/network_policy_spec.rb +14 -0
  373. data/spec/kubes/dsl/pod_spec.rb +11 -0
  374. data/spec/kubes/dsl/service_spec.rb +12 -0
  375. data/spec/kubes/kubectl/batch_spec.rb +24 -0
  376. data/spec/spec_helper.rb +34 -0
  377. metadata +602 -22
  378. data/bin/console +0 -14
  379. data/bin/setup +0 -8
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Trap ^C
4
+ Signal.trap("INT") {
5
+ puts "\nCtrl-C detected. Exiting..."
6
+ sleep 0.1
7
+ exit
8
+ }
9
+
10
+ $:.unshift(File.expand_path("../../lib", __FILE__))
11
+ require "kubes"
12
+ require "kubes/cli"
13
+
14
+ Kubes::CLI.start(ARGV)
@@ -7,28 +7,38 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "kubes"
8
8
  spec.version = Kubes::VERSION
9
9
  spec.authors = ["Tung Nguyen"]
10
- spec.email = ["tongueroo@gmail.com"]
10
+ spec.email = ["tung@boltops.com"]
11
+ spec.summary = "Kubernetes Deployment Tool: build docker image, compile Kubernetes YAML files, and apply them"
12
+ spec.homepage = "https://github.com/boltops-tools/kubes"
13
+ spec.license = "Apache2.0"
11
14
 
12
- spec.summary = %q{Kubes tool}
13
- spec.description = %q{Kubes tool}
14
- spec.homepage = "https://github.com/tongueroo/kubes"
15
-
16
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
- # to allow pushing to a single host or delete this section to allow pushing to any host.
18
- # if spec.respond_to?(:metadata)
19
- # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
- # else
21
- # raise "RubyGems 2.0 or newer is required to protect against " \
22
- # "public gem pushes."
23
- # end
24
-
25
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
- f.match(%r{^(test|spec|features)/})
27
- end
15
+ spec.files = File.directory?('.git') ? `git ls-files`.split($/) : Dir.glob("**/*")
28
16
  spec.bindir = "exe"
29
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
30
19
  spec.require_paths = ["lib"]
31
20
 
32
- spec.add_development_dependency "bundler", "~> 1.15"
33
- spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_dependency "activesupport"
22
+ spec.add_dependency "deep_merge"
23
+ spec.add_dependency "dsl_evaluator"
24
+ spec.add_dependency "hash_squeezer"
25
+ spec.add_dependency "memoist"
26
+ spec.add_dependency "rainbow"
27
+ spec.add_dependency "render_me_pretty"
28
+ spec.add_dependency "thor"
29
+ spec.add_dependency "zeitwerk"
30
+
31
+ spec.add_development_dependency "bundler"
32
+ spec.add_development_dependency "byebug"
33
+ spec.add_development_dependency "cli_markdown"
34
+ spec.add_development_dependency "rake"
35
+ spec.add_development_dependency "rspec"
36
+
37
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
38
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
39
+ if spec.respond_to?(:metadata)
40
+ spec.metadata["homepage_uri"] = spec.homepage
41
+ else
42
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
43
+ end
34
44
  end
@@ -1,5 +1,25 @@
1
+ $stdout.sync = true unless ENV["KUBES_STDOUT_SYNC"] == "0"
2
+
3
+ $:.unshift(File.expand_path("../", __FILE__))
4
+ require "active_support/core_ext/class"
5
+ require "active_support/core_ext/hash"
6
+ require "active_support/core_ext/string"
7
+ require "active_support/ordered_options"
8
+ require "deep_merge/rails_compat"
9
+ require "dsl_evaluator"
10
+ require "fileutils"
11
+ require "hash_squeezer"
1
12
  require "kubes/version"
13
+ require "memoist"
14
+ require "rainbow/ext/string"
15
+ require "yaml"
16
+
17
+ DslEvaluator.backtrace_reject = ".kubes"
18
+
19
+ require "kubes/autoloader"
20
+ Kubes::Autoloader.setup
2
21
 
3
22
  module Kubes
4
- # Your code goes here...
23
+ class Error < StandardError; end
24
+ extend Core
5
25
  end
@@ -0,0 +1,30 @@
1
+ module Kubes::Args
2
+ class Custom
3
+ extend Memoist
4
+ include Dsl
5
+ include DslEvaluator
6
+
7
+ attr_accessor :name
8
+ def initialize(name, file)
9
+ @name = name.to_s
10
+ @file = file # IE: .kubes/config/kubectl/args.rb
11
+ @commands = {}
12
+ end
13
+
14
+ def build
15
+ return @commands unless File.exist?(@file)
16
+ evaluate_file(@file)
17
+ @commands.deep_stringify_keys!
18
+ end
19
+ memoize :build
20
+
21
+ def args
22
+ args = dig("args")
23
+ args.compact.flatten
24
+ end
25
+
26
+ def dig(prop, default=[])
27
+ @commands.dig(@name, prop) || default
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ module Kubes::Args
2
+ module Dsl
3
+ def command(*commands, **props)
4
+ commands.each do |name|
5
+ each_command(name, props)
6
+ end
7
+ end
8
+ alias_method :commands, :command
9
+
10
+ def each_command(name, props={})
11
+ @commands[name.to_s] = props
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module Kubes
2
+ class Auth
3
+ def initialize(image)
4
+ @image = image
5
+ end
6
+
7
+ def run
8
+ klass = strategy_class
9
+ return unless klass
10
+ klass.new(@image).run
11
+ end
12
+
13
+ # Currently only support ECR
14
+ def strategy_class
15
+ case @image
16
+ when /\.amazonaws\.com/ # IE: 112233445566.dkr.ecr.us-west-2.amazonaws.com/demo/sinatra
17
+ Ecr
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,55 @@
1
+ # Normally, you must authorized to AWS ECR to push to their registry with:
2
+ #
3
+ # eval $(aws ecr get-login --no-include-email)
4
+ #
5
+ # If you haven't ever ran the ecr get-login command before then you'll get this error:
6
+ #
7
+ # no basic auth credentials
8
+ #
9
+ # If you have ran it before but the auto token has expired you'll get this message:
10
+ #
11
+ # denied: Your Authorization Token has expired. Please run 'aws ecr get-login' to fetch a new one.
12
+ #
13
+ # This class updates the ~/.docker/config.json file which is an internal docker file to automatically update the auto token for you.
14
+ # If that format changes, the update will need to be updated.
15
+ #
16
+ class Kubes::Auth
17
+ class Ecr
18
+ include Kubes::AwsServices
19
+
20
+ def initialize(image)
21
+ @image = image
22
+ @repo_domain = "#{image.split('/').first}"
23
+ end
24
+
25
+ def run
26
+ auth_token = fetch_auth_token
27
+ if File.exist?(docker_config)
28
+ data = JSON.load(IO.read(docker_config))
29
+ data["auths"][@repo_domain] = {auth: auth_token}
30
+ else
31
+ data = {"auths" => {@repo_domain => {auth: auth_token}}}
32
+ end
33
+
34
+ # Handle legacy docker clients that still have old format with https://
35
+ legacy_entry = "https://#{@repo_domain}"
36
+ data["auths"][legacy_entry] = {auth: auth_token}
37
+
38
+ ensure_dotdocker_exists
39
+ IO.write(docker_config, JSON.pretty_generate(data))
40
+ end
41
+
42
+ def fetch_auth_token
43
+ ecr.get_authorization_token.authorization_data.first.authorization_token
44
+ end
45
+
46
+ def docker_config
47
+ "#{ENV['HOME']}/.docker/config.json"
48
+ end
49
+
50
+ def ensure_dotdocker_exists
51
+ dirname = File.dirname(docker_config)
52
+ FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ require "zeitwerk"
2
+
3
+ module Kubes
4
+ class Autoloader
5
+ class Inflector < Zeitwerk::Inflector
6
+ def camelize(basename, _abspath)
7
+ map = { cli: "CLI", version: "VERSION" }
8
+ map[basename.to_sym] || super
9
+ end
10
+ end
11
+
12
+ class << self
13
+ def setup
14
+ loader = Zeitwerk::Loader.new
15
+ loader.inflector = Inflector.new
16
+ loader.push_dir(File.dirname(__dir__)) # lib
17
+ loader.setup
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require "aws-sdk-ecr"
2
+
3
+ # require "aws_mfa_secure/ext/aws" # add MFA support
4
+
5
+ module Kubes
6
+ module AwsServices
7
+ extend Memoist
8
+
9
+ def ecr
10
+ Aws::ECR::Client.new
11
+ end
12
+ memoize :ecr
13
+ end
14
+ end
@@ -0,0 +1,93 @@
1
+ module Kubes
2
+ class CLI < Command
3
+ class_option :verbose, type: :boolean
4
+ class_option :noop, type: :boolean
5
+
6
+ image_option = Proc.new {
7
+ option :image, desc: "override image"
8
+ }
9
+ compile_option = Proc.new {
10
+ option :compile, type: :boolean, default: true, desc: "whether or not to compile the .kube/resources"
11
+ }
12
+
13
+ desc "docker SUBCOMMAND", "Docker subcommands"
14
+ long_desc Help.text(:docker)
15
+ subcommand "docker", Docker
16
+
17
+ desc "apply [ROLE] [RESOURCE]", "Apply the Kubernetes YAML files without building docker image"
18
+ long_desc Help.text(:apply)
19
+ image_option.call
20
+ compile_option.call
21
+ def apply(role=nil, resource=nil)
22
+ Apply.new(options.merge(role: role, resource: resource)).run
23
+ end
24
+
25
+ desc "clean", "Remove .kubes/output files"
26
+ long_desc Help.text(:clean)
27
+ image_option.call
28
+ def clean
29
+ Clean.new(options).run
30
+ end
31
+
32
+ desc "compile", "Compile Kubernetes YAML files from DSL"
33
+ long_desc Help.text(:compile)
34
+ image_option.call
35
+ def compile
36
+ Compile.new(options).run
37
+ end
38
+
39
+ desc "delete [ROLE] [RESOURCE]", "Delete Kubernetes resources within the app folder"
40
+ long_desc Help.text(:delete)
41
+ image_option.call
42
+ option :yes, aliases: %w[y], type: :boolean, desc: "Skip are you sure prompt"
43
+ def delete(role=nil, resource=nil)
44
+ Delete.new(options.merge(role: role, resource: resource)).run
45
+ end
46
+
47
+ desc "deploy [ROLE] [RESOURCE]", "Deploy to Kubernetes: docker build/push, kubes compile, and kubectl apply"
48
+ long_desc Help.text(:deploy)
49
+ image_option.call
50
+ option :build, type: :boolean, default: true, desc: "whether or not to build docker image"
51
+ def deploy(role=nil, resource=nil)
52
+ Deploy.new(options.merge(role: role, resource: resource)).run
53
+ end
54
+
55
+ desc "describe [ROLE] [RESOURCE]", "Describe Kubernetes resource using the compiled YAML files"
56
+ long_desc Help.text(:describe)
57
+ image_option.call
58
+ compile_option.call
59
+ def describe(role=nil, resource=nil)
60
+ Describe.new(options.merge(role: role, resource: resource)).run
61
+ end
62
+
63
+ desc "get [ROLE] [RESOURCE]", "Get Kubernetes resource using the compiled YAML files"
64
+ long_desc Help.text(:get)
65
+ image_option.call
66
+ compile_option.call
67
+ option :output, aliases: %w[o], desc: "Output format: json|yaml|wide|name"
68
+ def get(role=nil, resource=nil)
69
+ Get.new(options.merge(role: role, resource: resource)).run
70
+ end
71
+
72
+ long_desc Help.text(:init)
73
+ Init.options.each { |args| option(*args) }
74
+ register(Init, "init", "init", "Init project")
75
+
76
+ desc "completion *PARAMS", "Prints words for auto-completion."
77
+ long_desc Help.text(:completion)
78
+ def completion(*params)
79
+ Completer.new(CLI, *params).run
80
+ end
81
+
82
+ desc "completion_script", "Generates a script that can be eval to setup auto-completion."
83
+ long_desc Help.text(:completion_script)
84
+ def completion_script
85
+ Completer::Script.generate
86
+ end
87
+
88
+ desc "version", "prints version"
89
+ def version
90
+ puts VERSION
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,9 @@
1
+ class Kubes::CLI
2
+ class Apply < Base
3
+ def run
4
+ Compile.new(@options).run unless @options[:compile] == false
5
+ logger.info "Deploying kubes resources"
6
+ Kubes::Kubectl::Decider.new(:apply, @options).run
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Kubes::CLI
2
+ class Base
3
+ include Kubes::Logging
4
+
5
+ def initialize(options={})
6
+ @options = options
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ class Kubes::CLI
2
+ class Build < Base
3
+ def run
4
+ Kubes::Docker::Build.new(@options).run
5
+ Kubes::Docker::Push.new(@options).run
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class Kubes::CLI
2
+ class Clean < Base
3
+ def run
4
+ path = ".kubes/output"
5
+ FileUtils.rm_rf("#{Kubes.root}/#{path}")
6
+ logger.info "Removed #{path}" unless @options[:mute]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ class Kubes::CLI
2
+ class Compile < Base
3
+ def run
4
+ Clean.new(@options.merge(mute: true)).run
5
+ Kubes::Compiler.new(@options).run
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class Kubes::CLI
2
+ class Delete < Base
3
+ include Kubes::Util::Sure
4
+
5
+ def run
6
+ sure?("This will delete resources. Are you sure?")
7
+ Compile.new(@options).run
8
+ Kubes::Kubectl::Decider.new(:delete, @options).run
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ class Kubes::CLI
2
+ class Deploy < Base
3
+ def run
4
+ Build.new(@options).run if build?
5
+ Apply.new(@options).run # also calls Compile
6
+ end
7
+
8
+ def build?
9
+ return false if @options[:build] == false || @options[:image]
10
+ @options[:resource].nil? || @options[:resource] == "deployment"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ class Kubes::CLI
2
+ class Describe < Base
3
+ def run
4
+ Compile.new(@options).run unless @options[:compile] == false
5
+ Kubes::Kubectl.run(:describe, @options)
6
+ end
7
+ end
8
+ end