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,28 @@
1
+ class Kubes::Compiler::Decorator::Resources::Container
2
+ # Nice to group the mapping logic in ones spot, making a pattern of this is not worth it.
3
+ module Mapping
4
+ def deployment_keys
5
+ @containers_key = 'spec.template.spec.containers'
6
+ @volumes_key = 'spec.template.spec.volumes'
7
+ end
8
+
9
+ def pod_keys
10
+ @containers_key = 'spec.containers'
11
+ @volumes_key = 'spec.volumes'
12
+ end
13
+
14
+ def configMaps_fields
15
+ @envFrom_field = 'configMapRef'
16
+ @valueFrom_field = 'configMapKeyRef'
17
+ @volume_field = 'configMap'
18
+ @volume_field_name = 'name'
19
+ end
20
+
21
+ def secrets_fields
22
+ @envFrom_field = 'secretRef'
23
+ @valueFrom_field = 'secretKeyRef'
24
+ @volume_field = 'secret'
25
+ @volume_field_name = 'secretName'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module Kubes::Compiler::Decorator::Resources
2
+ class Deployment < Base
3
+ def perform
4
+ container = Container.new(@data, kind: "Deployment", fields_for: "Secret")
5
+ @data = container.run
6
+ container = Container.new(@data, kind: "Deployment", fields_for: "ConfigMap")
7
+ @data = container.run
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Kubes::Compiler::Decorator::Resources
2
+ class Pod < Base
3
+ def perform
4
+ container = Container.new(@data, kind: "Pod", fields_for: "Secret")
5
+ @data = container.run
6
+ container = Container.new(@data, kind: "Pod", fields_for: "ConfigMap")
7
+ @data = container.run
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ require 'digest'
2
+
3
+ module Kubes::Compiler::Decorator::Resources
4
+ class Secret < Base
5
+ include Kubes::Compiler::Util::YamlDump
6
+
7
+ def perform
8
+ # even though name is required, will allow logic to get the kubectl apply and kubectl to surface the required name error
9
+ name = @data.dig('metadata','name')
10
+ return @data unless name
11
+
12
+ md5 = md5(@data)
13
+ @data['metadata']['name'] = "#{name}-#{md5}"
14
+ Kubes::Compiler::Decorator.store(name, md5)
15
+ @data
16
+ end
17
+
18
+ def md5(data)
19
+ content = yaml_dump(data)
20
+ Digest::MD5.hexdigest(content)[0..9]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ module Kubes::Compiler::Decorator
2
+ class Write < Base
3
+ def process(item)
4
+ case item['kind']
5
+ when "Deployment"
6
+ Resources::Deployment.new(item).run
7
+ when "Pod"
8
+ Resources::Pod.new(item).run
9
+ else
10
+ item # pass through
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ class Base
3
+ extend Fields
4
+ include DslEvaluator
5
+ include Helpers
6
+ include Kubes::Compiler::Layering
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ @name = options[:name]
11
+ @path = options[:path]
12
+ end
13
+
14
+ def run
15
+ evaluate_files(pre_layers)
16
+ evaluate_file(@path) # main resource definition
17
+ evaluate_files(post_layers)
18
+ result if respond_to?(:result) # block form doesnt have result
19
+ end
20
+
21
+ def evaluate_files(paths)
22
+ paths.each do |path|
23
+ evaluate_file(path)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ class Blocks < Base
3
+ attr_reader :results
4
+ def run
5
+ @results = {} # Hash key is the name of resource, using it so we can keep a map to handle layering
6
+ @block_form = true # pluralizes the layer names
7
+ super # handles layering and evaluating the main DSL file
8
+ self
9
+ end
10
+
11
+ def syntax_instance(meth, name)
12
+ lookup = lookup_key(meth, name)
13
+ klass = "Kubes::Compiler::Dsl::Syntax::#{meth.camelize}".constantize
14
+ syntax = self.class.syntax_instances[lookup]
15
+ return syntax if syntax
16
+
17
+ syntax = klass.new(@options.merge(name: name))
18
+ syntax.kind_from_block = meth.camelize
19
+ self.class.syntax_instances[lookup] = syntax
20
+ end
21
+
22
+ def lookup_key(meth, name)
23
+ [meth, name].join('-')
24
+ end
25
+
26
+ class << self
27
+ def discovered_methods
28
+ syntax = File.expand_path("../syntax", __dir__)
29
+ expr = "#{syntax}/*.rb"
30
+ Dir.glob(expr).map do |path|
31
+ File.basename(path).sub('.rb','')
32
+ end
33
+ end
34
+
35
+ def block_method(meth)
36
+ meth = meth.to_s
37
+ define_method meth do |name, &block|
38
+ syntax = syntax_instance(meth, name)
39
+ syntax.instance_eval(&block) if block
40
+ lookup = lookup_key(meth, name)
41
+ @results[lookup] = syntax.result
42
+ end
43
+ end
44
+
45
+ @@syntax_instances = {}
46
+ def syntax_instances
47
+ @@syntax_instances
48
+ end
49
+ end
50
+
51
+ discovered_methods.each do |meth|
52
+ block_method meth
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,78 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ module Fields
3
+ # Defines field methods. Example:
4
+ #
5
+ # field :spec
6
+ #
7
+ # Results in:
8
+ #
9
+ # def spec(value=nil)
10
+ # value.nil? ? spec_reader : spec_writer(value)
11
+ # end
12
+ #
13
+ # def spec_reader
14
+ # default = default_spec if respond_to?(:default_spec)
15
+ # @spec || default
16
+ # end
17
+ #
18
+ # def spec_writer(value)
19
+ # case type # captured by closure. IE: labels:hash => type = hash
20
+ # when 'hash'
21
+ # spec_writer_hash(value)
22
+ # else
23
+ # @spec = value
24
+ # end
25
+ # end
26
+ #
27
+ # def spec_writer_hash(value)
28
+ # mode = value.delete(:_mode)
29
+ # @spec = {} if mode == "reset"
30
+ # @spec ||= {}
31
+ # @spec.deeper_merge!(value)
32
+ # end
33
+ #
34
+ def field(name)
35
+ name, type = name.to_s.split(':')
36
+ type ||= 'string'
37
+
38
+ reader = "#{name}_reader"
39
+ writer = "#{name}_writer"
40
+ ivar = "@#{name}"
41
+ writer_hash = "#{name}_writer_hash"
42
+
43
+ define_method(name) do |value=nil|
44
+ value.nil? ? send(reader) : send(writer, value)
45
+ end
46
+
47
+ define_method(reader) do
48
+ default_meth = "default_#{name}" # IE: default_spec, default_apiVersion etc
49
+ default = send(default_meth) if respond_to?(default_meth.to_sym)
50
+ instance_variable_get(ivar) || default
51
+ end
52
+
53
+ define_method(writer) do |value|
54
+ case type
55
+ when 'hash'
56
+ send(writer_hash, value)
57
+ else # string, object, etc
58
+ instance_variable_set(ivar, value)
59
+ end
60
+ end
61
+
62
+ define_method(writer_hash) do |value|
63
+ mode = value.delete(:_mode) # special treatment
64
+ result = instance_variable_get(ivar)
65
+ result = {} if mode == "reset" # allow user to override with mode: reset option
66
+ result ||= {} # maintain value for layering
67
+ result.deeper_merge!(value)
68
+ instance_variable_set(ivar, result)
69
+ end
70
+ end
71
+
72
+ def fields(*names)
73
+ names.each do |name|
74
+ field(name)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,28 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ module Files
3
+ def files(*list)
4
+ dir = current_dir
5
+ list.each do |file|
6
+ path = "#{dir}/#{file}"
7
+ load_data_from_file(path)
8
+ end
9
+ end
10
+
11
+ def load_data_from_file(path)
12
+ parser = Kubes::Compiler::Dsl::Core::Parser.new(path)
13
+ items = parser.parse
14
+ items.transform_values! { |v| base64(v) } if secret_class?
15
+ data(items)
16
+ end
17
+
18
+ def secret_class?
19
+ self.class == Kubes::Compiler::Dsl::Syntax::Secret
20
+ end
21
+
22
+ def current_dir
23
+ resources_line = caller.find { |l| l.include?('.kubes/resources') }
24
+ path = resources_line.split(':').first
25
+ File.dirname(path) # IE: /full/path/.kubes/resources
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ module Helpers
3
+ end
4
+ end
@@ -0,0 +1,43 @@
1
+ module Kubes::Compiler::Dsl::Core
2
+ class Parser
3
+ def initialize(path)
4
+ @path = path
5
+ end
6
+
7
+ def parse
8
+ contents = IO.read(@path)
9
+ lines = parse_contents(contents)
10
+
11
+ # First use a Hash structure so that overlay env files will override
12
+ # the base param file.
13
+ data = {}
14
+ lines.each do |line|
15
+ key,value = line.strip.split("=").map {|x| x.strip}
16
+ value = remove_surrounding_quotes(value)
17
+ data[key] = value
18
+ end
19
+ data
20
+ end
21
+
22
+ def parse_contents(contents)
23
+ lines = contents.split("\n")
24
+ # remove comment at the end of the line
25
+ lines.map! { |l| l.sub(/#.*/,'').strip }
26
+ # filter out commented lines
27
+ lines = lines.reject { |l| l =~ /(^|\s)#/i }
28
+ # filter out empty lines
29
+ lines = lines.reject { |l| l.strip.empty? }
30
+ lines
31
+ end
32
+
33
+ def remove_surrounding_quotes(s)
34
+ if s =~ /^"/ && s =~ /"$/
35
+ s.sub(/^["]/, '').gsub(/["]$/,'') # remove surrounding double quotes
36
+ elsif s =~ /^'/ && s =~ /'$/
37
+ s.sub(/^[']/, '').gsub(/[']$/,'') # remove surrounding single quotes
38
+ else
39
+ s
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class BackendConfig < Resource
3
+ fields :domain,
4
+ :domains
5
+
6
+ def default_apiVersion
7
+ "cloud.google.com/v1"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class ClusterRole < Role
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class ClusterRoleBinding < RoleBinding
3
+ end
4
+ end
@@ -0,0 +1,20 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class ConfigMap < Resource
3
+ include Kubes::Compiler::Dsl::Core::Files
4
+
5
+ # kubectl explain secret
6
+ fields "data:hash", # <map[string]string>
7
+ "binaryData:hash" # <map[string]string>
8
+
9
+ def default_apiVersion
10
+ "v1"
11
+ end
12
+
13
+ def default_result_append
14
+ {
15
+ data: data,
16
+ binaryData: binaryData,
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class DaemonSet < Resource
3
+ fields :minReadySeconds, # <integer>
4
+ :revisionHistoryLimit, # <integer>
5
+ :selector, # <Object> -required-
6
+ :template, # <Object> -required-
7
+ :updateStrategy # <Object>
8
+
9
+ def default_apiVersion
10
+ "apps/v1"
11
+ end
12
+
13
+ def default_spec
14
+ {
15
+ minReadySeconds: minReadySeconds,
16
+ revisionHistoryLimit: revisionHistoryLimit,
17
+ selector: selector,
18
+ template: template,
19
+ updateStrategy: updateStrategy,
20
+ }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,163 @@
1
+ module Kubes::Compiler::Dsl::Syntax
2
+ class Deployment < Resource
3
+ fields :container, # <Object>
4
+ :containers, # <[]Object>
5
+ "matchLabels:hash", # <map[string]string>
6
+ :sidecar, # <Object>
7
+ :templateMetadata, # <Object>
8
+ :templateSpec # <Object>
9
+
10
+ # kubectl explain deployment.spec
11
+ fields :minReadySeconds, # <integer>
12
+ :paused, # <boolean>
13
+ :progressDeadlineSeconds, # <integer>
14
+ :replicas, # <integer>
15
+ :revisionHistoryLimit, # <integer>
16
+ :selector, # <Object> -required-
17
+ :strategy, # <Object>
18
+ :template # <Object> -required-
19
+
20
+ # kubectl explain deployment.spec.strategy.rollingUpdate
21
+ fields :maxSurge, # <string>
22
+ :maxUnavailable # <string>
23
+
24
+ # kubectl explain deployment.spec.template.spec.containers
25
+ fields :args, # <[]string>
26
+ :command, # <[]string>
27
+ :env, # <[]Object>
28
+ :envFrom, # <[]Object>
29
+ :image, # <string>
30
+ :imagePullPolicy, # <string>
31
+ :lifecycle, # <Object>
32
+ :livenessProbe, # <Object>
33
+ :containerName, # <string> -required- (originally called name)
34
+ :ports, # <[]Object>
35
+ :readinessProbe, # <Object>
36
+ :resources, # <Object>
37
+ :securityContext, # <Object>
38
+ :startupProbe, # <Object>
39
+ :stdin, # <boolean>
40
+ :stdinOnce, # <boolean>
41
+ :terminationMessagePath, # <string>
42
+ :terminationMessagePolicy, # <string>
43
+ :tty, # <boolean>
44
+ :volumeDevices, # <[]Object>
45
+ :volumeMounts, # <[]Object>
46
+ :workingDir # <string>
47
+
48
+ # kubectl explain deployment.spec.template.spec.containers.ports
49
+ fields :containerPort, # <integer> -required-
50
+ :hostIP, # <string>
51
+ :hostPort, # <integer>
52
+ :portName, # <string> (originally called name)
53
+ :protocol # <string>
54
+
55
+ def default_apiVersion
56
+ "apps/v1"
57
+ end
58
+
59
+ def default_spec
60
+ {
61
+ minReadySeconds: minReadySeconds,
62
+ paused: paused,
63
+ progressDeadlineSeconds: progressDeadlineSeconds,
64
+ replicas: replicas,
65
+ revisionHistoryLimit: revisionHistoryLimit,
66
+ selector: selector,
67
+ strategy: strategy,
68
+ template: template,
69
+ }
70
+ end
71
+
72
+ def default_replicas
73
+ 1
74
+ end
75
+
76
+ def default_selector
77
+ { matchLabels: matchLabels }
78
+ end
79
+
80
+ def default_matchLabels
81
+ labels
82
+ end
83
+
84
+ def default_strategy
85
+ {
86
+ rollingUpdate: {
87
+ maxSurge: maxSurge,
88
+ maxUnavailable: maxUnavailable,
89
+ },
90
+ type: "RollingUpdate",
91
+ }
92
+ end
93
+
94
+ def default_maxSurge
95
+ 25
96
+ end
97
+
98
+ def default_maxUnavailable
99
+ 25
100
+ end
101
+
102
+ def default_template
103
+ {
104
+ metadata: templateMetadata,
105
+ spec: templateSpec,
106
+ }
107
+ end
108
+
109
+ def default_templateSpec
110
+ { containers: containers }
111
+ end
112
+
113
+ def default_templateMetadata
114
+ { labels: labels }
115
+ end
116
+
117
+ def default_containers
118
+ [container, sidecar].compact
119
+ end
120
+
121
+ def default_container
122
+ {
123
+ args: args,
124
+ command: command,
125
+ env: env,
126
+ envFrom: envFrom,
127
+ image: image,
128
+ imagePullPolicy: imagePullPolicy,
129
+ lifecycle: lifecycle,
130
+ livenessProbe: livenessProbe,
131
+ name: containerName || name,
132
+ ports: ports,
133
+ readinessProbe: readinessProbe,
134
+ resources: resources,
135
+ securityContext: securityContext,
136
+ startupProbe: startupProbe,
137
+ stdin: stdin,
138
+ stdinOnce: stdinOnce,
139
+ terminationMessagePath: terminationMessagePath,
140
+ terminationMessagePolicy: terminationMessagePolicy,
141
+ tty: tty,
142
+ volumeDevices: volumeDevices,
143
+ volumeMounts: volumeMounts,
144
+ workingDir: workingDir,
145
+ }
146
+ end
147
+
148
+ def default_ports
149
+ [
150
+ containerPort: containerPort,
151
+ hostIP: hostIP,
152
+ hostPort: hostPort,
153
+ name: portName,
154
+ protocol: protocol,
155
+ ]
156
+ end
157
+
158
+ # Override command instead of default_command since we want to change a String to an Array
159
+ def command_reader
160
+ @command.is_a?(String) ? @command.split(' ') : @command # else assume Array
161
+ end
162
+ end
163
+ end