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,20 @@
1
+ class Kubes::CLI
2
+ class Docker < Kubes::Command
3
+ desc "build", "Build docker image."
4
+ long_desc Help.text("docker:build")
5
+ option :push, type: :boolean, default: false
6
+ def build
7
+ builder = Kubes::Docker::Build.new(options)
8
+ builder.run
9
+ push if options[:push]
10
+ end
11
+
12
+ desc "push IMAGE", "Push the docker image."
13
+ long_desc Help.text("docker:push")
14
+ option :push, type: :boolean, default: false
15
+ def push
16
+ pusher = Kubes::Docker::Push.new(options)
17
+ pusher.run
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ class Kubes::CLI
2
+ class Get < Base
3
+ def run
4
+ Compile.new(@options).run unless @options[:compile] == false
5
+ Kubes::Kubectl.run(:get, @options)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class Kubes::CLI
2
+ module Help
3
+ class << self
4
+ def text(namespaced_command)
5
+ path = namespaced_command.to_s.gsub(':','/')
6
+ path = File.expand_path("../help/#{path}.md", __FILE__)
7
+ IO.read(path) if File.exist?(path)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ ## Examples
2
+
3
+ kubes completion
4
+
5
+ Prints words for TAB auto-completion.
6
+
7
+ kubes completion
8
+ kubes completion hello
9
+ kubes completion hello name
10
+
11
+ To enable, TAB auto-completion add the following to your profile:
12
+
13
+ eval $(kubes completion_script)
14
+
15
+ Auto-completion example usage:
16
+
17
+ kubes [TAB]
18
+ kubes hello [TAB]
19
+ kubes hello name [TAB]
20
+ kubes hello name --[TAB]
@@ -0,0 +1,3 @@
1
+ To use, add the following to your `~/.bashrc` or `~/.profile`
2
+
3
+ eval $(kubes completion_script)
@@ -0,0 +1,10 @@
1
+ ## Examples
2
+
3
+ Deploy all resources in .kubes/resources/web
4
+
5
+ kubes deploy web
6
+
7
+ Deploy specific resource, like .kubes/resources/web/deployment.rb
8
+
9
+ kubes deploy web deployment
10
+ kubes deploy web service
@@ -0,0 +1,69 @@
1
+ class Kubes::CLI
2
+ class Init < Sequence
3
+ def self.options
4
+ [
5
+ [:app, aliases: ["a"], required: true, desc: "Docker repo name. Example: web. Generates .kubes/APP/resources folder"],
6
+ [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
7
+ [:type, aliases: ["t"], default: "yaml", desc: "Type: dsl or yaml"],
8
+ [:repo, required: true, desc: "Docker repo name. Example: user/repo. Configures .kubes/config.rb"],
9
+ ]
10
+ end
11
+
12
+ options.each { |args| class_option(*args) }
13
+
14
+ private
15
+ # Needs to be a method to its available for templates/.kubes/resources/%app%
16
+ def app
17
+ @options[:app]
18
+ end
19
+
20
+ public
21
+ def create_dockefile
22
+ return if File.exist?("Dockerfile")
23
+ set_source("docker")
24
+ directory ".", "."
25
+ end
26
+
27
+ def create_base_files
28
+ set_source("base")
29
+ directory ".", "."
30
+ end
31
+
32
+ def create_dsl_files
33
+ return unless @options[:type] == "dsl"
34
+ set_source("dsl")
35
+ directory ".", "."
36
+ end
37
+
38
+ def create_yaml_files
39
+ return if @options[:type] == "dsl"
40
+ set_source("yaml")
41
+ directory ".", "."
42
+ end
43
+
44
+ def message
45
+ logger.info "Initialized .kubes folder"
46
+ end
47
+
48
+ def adjust_gitignore
49
+ ignores = %w[
50
+ .kubes/output
51
+ .kubes/state
52
+ ]
53
+ if File.exist?(".gitignore")
54
+ lines = IO.readlines(".gitignore")
55
+ if lines.detect { |l| l.include?('.kubes/output') }
56
+ return # early
57
+ else
58
+ lines += ignores
59
+ end
60
+ else
61
+ lines = ignores
62
+ end
63
+
64
+ text = lines.join("\n") + "\n"
65
+ IO.write(".gitignore", text)
66
+ puts "Updated .gitignore"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ require 'thor'
2
+
3
+ class Kubes::CLI
4
+ class Sequence < Thor::Group
5
+ include Thor::Actions
6
+
7
+ private
8
+ def logger
9
+ Kubes.logger
10
+ end
11
+
12
+ def set_source(type)
13
+ override_source_paths(File.expand_path("../../templates/#{type}", __dir__))
14
+ end
15
+
16
+ def override_source_paths(*paths)
17
+ # https://github.com/erikhuda/thor/blob/34df888d721ecaa8cf0cea97d51dc6c388002742/lib/thor/actions.rb#L128
18
+ instance_variable_set(:@source_paths, nil) # unset instance variable cache
19
+ # Using string with instance_eval because block doesnt have access to path at runtime.
20
+ self.class.instance_eval %{
21
+ def self.source_paths
22
+ #{paths.flatten.inspect}
23
+ end
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,100 @@
1
+ require "thor"
2
+
3
+ # Override thor's long_desc identation behavior
4
+ # https://github.com/erikhuda/thor/issues/398
5
+ class Thor
6
+ module Shell
7
+ class Basic
8
+ def print_wrapped(message, options = {})
9
+ message = "\n#{message}" unless message[0] == "\n"
10
+ stdout.puts message
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # Gets rid of the c_l_i extra commands in the help menu. Seems like thor_classes_in is only used
17
+ # for this purpose. More details: https://gist.github.com/tongueroo/ee92ec28a4d3eed301d88e8ccdd2fe10
18
+ module ThorPrepend
19
+ module Util
20
+ def thor_classes_in(klass)
21
+ klass.name.include?("CLI") ? [] : super
22
+ end
23
+ end
24
+ end
25
+ Thor::Util.singleton_class.prepend(ThorPrepend::Util)
26
+
27
+ module Kubes
28
+ class Command < Thor
29
+ class << self
30
+ def dispatch(m, args, options, config)
31
+ # Allow calling for help via:
32
+ # kubes command help
33
+ # kubes command -h
34
+ # kubes command --help
35
+ # kubes command -D
36
+ #
37
+ # as well thor's normal way:
38
+ #
39
+ # kubes help command
40
+ help_flags = Thor::HELP_MAPPINGS + ["help"]
41
+ if args.length > 1 && !(args & help_flags).empty?
42
+ args -= help_flags
43
+ args.insert(-2, "help")
44
+ end
45
+
46
+ # kubes version
47
+ # kubes --version
48
+ # kubes -v
49
+ version_flags = ["--version", "-v"]
50
+ if args.length == 1 && !(args & version_flags).empty?
51
+ args = ["version"]
52
+ end
53
+
54
+ super
55
+ end
56
+
57
+ # Override command_help to include the description at the top of the
58
+ # long_description.
59
+ def command_help(shell, command_name)
60
+ meth = normalize_command_name(command_name)
61
+ command = all_commands[meth]
62
+ alter_command_description(command)
63
+ super
64
+ end
65
+
66
+ def alter_command_description(command)
67
+ return unless command
68
+
69
+ # Add description to beginning of long_description
70
+ long_desc = if command.long_description
71
+ "#{command.description}\n\n#{command.long_description}"
72
+ else
73
+ command.description
74
+ end
75
+
76
+ # add reference url to end of the long_description
77
+ unless website.empty?
78
+ full_command = [command.ancestor_name, command.name].compact.join('-')
79
+ url = "#{website}/reference/kubes-#{full_command}"
80
+ long_desc += "\n\nHelp also available at: #{url}"
81
+ end
82
+
83
+ command.long_description = long_desc
84
+ end
85
+ private :alter_command_description
86
+
87
+ # meant to be overriden
88
+ def website
89
+ ""
90
+ end
91
+
92
+ # https://github.com/erikhuda/thor/issues/244
93
+ # Deprecation warning: Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `Lono::CLI`
94
+ # You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
95
+ def exit_on_failure?
96
+ true
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,71 @@
1
+ module Kubes
2
+ class Compiler
3
+ include Kubes::Logging
4
+ include Kubes::Util::Consider
5
+
6
+ def initialize(options={})
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ results = resources.map do |path|
12
+ strategy = Strategy.new(@options.merge(path: path))
13
+ strategy.compile
14
+ end.compact
15
+
16
+ results.each do |result|
17
+ write(result)
18
+ end
19
+
20
+ puts "Compiled .kubes/resources files to .kubes/output" if show_compiled_message?
21
+ end
22
+
23
+ def resources
24
+ paths = []
25
+ expr = "#{Kubes.root}/.kubes/resources/**/*"
26
+ Dir.glob(expr).each do |path|
27
+ next unless process?(path)
28
+ paths << path
29
+ end
30
+ paths
31
+ end
32
+
33
+ # Only considering files 2 layers deep. So:
34
+ #
35
+ # Yes = web/deployment.yaml
36
+ # No = web/deployment/dev.yaml
37
+ #
38
+ def process?(path)
39
+ if Kubes.kustomize?
40
+ File.file?(path)
41
+ else
42
+ consider?(path) && two_levels_deep?(path)
43
+ end
44
+ end
45
+
46
+ def two_levels_deep?(path)
47
+ rel_path = path.sub(%r{.*\.kubes/resources/},'')
48
+ rel_path.split('/').size == 2
49
+ end
50
+
51
+ def write(result)
52
+ result.write_decorate!
53
+ filename, content = result.filename, result.content
54
+ dest = "#{Kubes.root}/.kubes/output/#{filename}"
55
+
56
+ if result.io?
57
+ FileUtils.cp(filename, dest) # preserve permissions
58
+ else
59
+ FileUtils.mkdir_p(File.dirname(dest))
60
+ IO.write(dest, content)
61
+ end
62
+
63
+ pretty_dest = dest.sub("#{Kubes.root}/",'')
64
+ logger.debug "Compiled #{pretty_dest}"
65
+ end
66
+
67
+ def show_compiled_message?
68
+ !%w[g ge get].include?(ARGV.first)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,17 @@
1
+ class Kubes::Compiler
2
+ module Decorator
3
+ @@md5s = {}
4
+ def store(name, md5)
5
+ @@md5s[name] = md5
6
+ end
7
+
8
+ def fetch(name)
9
+ @@md5s[name]
10
+ end
11
+
12
+ def md5s
13
+ @@md5s
14
+ end
15
+ extend self
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module Kubes::Compiler::Decorator
2
+ class Base
3
+ def initialize(data)
4
+ @data = data
5
+ end
6
+
7
+ def result
8
+ if @data.is_a?(Kubes::Compiler::Dsl::Core::Blocks)
9
+ @data.results.each { |k,v| process(v) } # returns nil
10
+ else
11
+ process(@data) # returns Hash
12
+ end
13
+ @data # important to return @data so we keep the original @data structure: Blocks or Hash
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ module Kubes::Compiler::Decorator
2
+ class Compile < Base
3
+ def process(item)
4
+ case item['kind']
5
+ when "ConfigMap", "Secret"
6
+ Resources::Secret.new(item).run
7
+ else
8
+ item # pass through
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Kubes::Compiler::Decorator::Resources
2
+ class Base
3
+ attr_reader :data
4
+ def initialize(data)
5
+ @data = data
6
+ end
7
+
8
+ def run
9
+ return @data unless Kubes.config.suffix_hash
10
+ perform
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ module Kubes::Compiler::Decorator::Resources
2
+ class Container
3
+ include Mapping
4
+
5
+ def initialize(data, kind:, fields_for:)
6
+ @data = data
7
+ # These methods are defined in Mapping
8
+ kind == "Deployment" ? deployment_keys : pod_keys
9
+ fields_for == "Secret" ? secrets_fields : configMaps_fields
10
+ end
11
+
12
+ def run
13
+ envFrom!
14
+ valueFrom!
15
+ volumes!
16
+ @data
17
+ end
18
+
19
+ # spec.envFrom.configMapRef
20
+ # spec.envFrom.secretRef
21
+ def envFrom!
22
+ return @data unless containers
23
+
24
+ containers.each do |container|
25
+ next unless envFrom_list = container.dig('envFrom') # intentional assignment
26
+
27
+ envFrom_list.each do |envFrom|
28
+ next unless name = envFrom.dig(@envFrom_field, 'name') # intentional assignment
29
+
30
+ md5 = Kubes::Compiler::Decorator.fetch(name)
31
+ envFrom[@envFrom_field]['name'] = [name, md5].compact.join('-')
32
+ end
33
+ end
34
+ end
35
+
36
+ # spec.valueFrom.configMapKeyRef
37
+ # spec.valueFrom.secretKeyRef
38
+ def valueFrom!
39
+ return @data unless containers
40
+
41
+ containers.each do |container|
42
+ next unless env_list = container.dig('env') # intentional assignment
43
+
44
+ env_list.each do |env|
45
+ next unless name = env.dig('valueFrom',@valueFrom_field,'name') # intentional assignment
46
+
47
+ md5 = Kubes::Compiler::Decorator.fetch(name)
48
+ env['valueFrom'][@valueFrom_field]['name'] = [name, md5].compact.join('-')
49
+ end
50
+ end
51
+ end
52
+
53
+ # spec.volumes.configMap.name
54
+ # spec.volumes.secret.secretName
55
+ def volumes!
56
+ volumes = @data.dig(*@volumes_key.split('.'))
57
+ return @data unless volumes
58
+
59
+ volumes.each do |volume|
60
+ # Example:
61
+ # next unless field = volume.dig('secret') # intentional assignment
62
+ # next unless name = field['secretName'] # intentional assignment
63
+ next unless field = volume.dig(@volume_field) # intentional assignment
64
+ next unless name = field[@volume_field_name] # intentional assignment
65
+
66
+ md5 = Kubes::Compiler::Decorator.fetch(name)
67
+ field[@volume_field_name] = [name, md5].compact.join('-')
68
+ end
69
+ end
70
+
71
+ private
72
+ def containers
73
+ @data.dig(*@containers_key.split('.'))
74
+ end
75
+ end
76
+ end