dapp 0.10.2 → 0.36.24

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 (287) hide show
  1. checksums.yaml +5 -5
  2. data/bin/dapp +77 -15
  3. data/config/en/common.yml +20 -11
  4. data/config/en/net_status.yml +108 -27
  5. data/lib/dapp/cli/cli.rb +1 -0
  6. data/lib/dapp/cli/command/base.rb +111 -0
  7. data/lib/dapp/cli/command/sample/base.rb +28 -0
  8. data/lib/dapp/cli/command/sample/create.rb +24 -0
  9. data/lib/dapp/cli/command/sample/list.rb +25 -0
  10. data/lib/dapp/cli/command/sample.rb +20 -0
  11. data/lib/dapp/cli/command/slug.rb +26 -0
  12. data/lib/dapp/cli/command/update.rb +65 -0
  13. data/lib/dapp/cli/options/ssh.rb +18 -0
  14. data/lib/dapp/cli/options/tag.rb +51 -0
  15. data/lib/dapp/cli.rb +11 -3
  16. data/lib/dapp/config/config.rb +21 -0
  17. data/lib/dapp/config/directive/base.rb +100 -3
  18. data/lib/dapp/core_ext/hash.rb +14 -0
  19. data/lib/dapp/core_ext/pathname.rb +6 -4
  20. data/lib/dapp/dapp/chef.rb +1 -9
  21. data/lib/dapp/dapp/command/common.rb +24 -0
  22. data/lib/dapp/dapp/command/sample/common.rb +54 -0
  23. data/lib/dapp/dapp/command/sample/create.rb +57 -0
  24. data/lib/dapp/dapp/command/sample/list.rb +13 -0
  25. data/lib/dapp/dapp/command/slug.rb +11 -0
  26. data/lib/dapp/dapp/dapp_config.rb +85 -0
  27. data/lib/dapp/dapp/dappfile.rb +108 -27
  28. data/lib/dapp/dapp/deps/base.rb +9 -32
  29. data/lib/dapp/dapp/deps/common.rb +26 -0
  30. data/lib/dapp/dapp/deps/gitartifact.rb +2 -20
  31. data/lib/dapp/dapp/deps/toolchain.rb +11 -0
  32. data/lib/dapp/dapp/git_artifact.rb +6 -4
  33. data/lib/dapp/dapp/lock.rb +6 -5
  34. data/lib/dapp/dapp/logging/base.rb +32 -20
  35. data/lib/dapp/dapp/logging/i18n.rb +5 -1
  36. data/lib/dapp/dapp/logging/process.rb +6 -6
  37. data/lib/dapp/dapp/option_tags.rb +98 -0
  38. data/lib/dapp/dapp/ruby2go.rb +130 -0
  39. data/lib/dapp/dapp/sentry.rb +97 -0
  40. data/lib/dapp/dapp/shellout/base.rb +26 -18
  41. data/lib/dapp/dapp/shellout/streaming.rb +2 -2
  42. data/lib/dapp/dapp/slug.rb +12 -0
  43. data/lib/dapp/dapp/ssh_agent.rb +25 -7
  44. data/lib/dapp/dapp.rb +192 -41
  45. data/lib/dapp/deployment.rb +1 -0
  46. data/lib/dapp/dimg/artifact.rb +12 -4
  47. data/lib/dapp/dimg/build/stage/artifact_base.rb +26 -30
  48. data/lib/dapp/dimg/build/stage/artifact_default.rb +50 -28
  49. data/lib/dapp/dimg/build/stage/base.rb +187 -52
  50. data/lib/dapp/dimg/build/stage/before_install.rb +4 -15
  51. data/lib/dapp/dimg/build/stage/before_install_artifact.rb +4 -0
  52. data/lib/dapp/dimg/build/stage/before_setup.rb +1 -20
  53. data/lib/dapp/dimg/build/stage/build_artifact.rb +1 -20
  54. data/lib/dapp/dimg/build/stage/docker_instructions.rb +5 -4
  55. data/lib/dapp/dimg/build/stage/from.rb +62 -9
  56. data/lib/dapp/dimg/build/stage/ga_archive.rb +14 -1
  57. data/lib/dapp/dimg/build/stage/ga_artifact_patch.rb +1 -5
  58. data/lib/dapp/dimg/build/stage/ga_base.rb +5 -35
  59. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +15 -34
  60. data/lib/dapp/dimg/build/stage/ga_related_base.rb +21 -0
  61. data/lib/dapp/dimg/build/stage/import_artifact.rb +22 -11
  62. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch.rb +6 -2
  63. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch.rb +6 -2
  64. data/lib/dapp/dimg/build/stage/install/install.rb +1 -19
  65. data/lib/dapp/dimg/build/stage/instructions.rb +27 -0
  66. data/lib/dapp/dimg/build/stage/mod/group.rb +19 -7
  67. data/lib/dapp/dimg/build/stage/mod/logging.rb +15 -19
  68. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch.rb +24 -1
  69. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch.rb +6 -2
  70. data/lib/dapp/dimg/build/stage/setup/setup.rb +1 -19
  71. data/lib/dapp/dimg/builder/ansible.rb +5 -0
  72. data/lib/dapp/dimg/builder/chef/cookbook.rb +8 -8
  73. data/lib/dapp/dimg/builder/chef.rb +29 -16
  74. data/lib/dapp/dimg/builder/none.rb +1 -34
  75. data/lib/dapp/dimg/builder/ruby2go.rb +57 -0
  76. data/lib/dapp/dimg/builder/shell.rb +1 -20
  77. data/lib/dapp/dimg/cli/cli.rb +2 -1
  78. data/lib/dapp/dimg/cli/command/base.rb +24 -0
  79. data/lib/dapp/dimg/cli/command/dimg/bp.rb +60 -0
  80. data/lib/dapp/dimg/cli/command/dimg/build.rb +43 -0
  81. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/export.rb +9 -4
  82. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/import.rb +4 -4
  83. data/lib/dapp/dimg/cli/{build_context.rb → command/dimg/build_context.rb} +5 -5
  84. data/lib/dapp/dimg/cli/{cleanup.rb → command/dimg/cleanup.rb} +4 -6
  85. data/lib/dapp/dimg/cli/command/dimg/cleanup_repo.rb +47 -0
  86. data/lib/dapp/dimg/cli/command/dimg/flush_local.rb +24 -0
  87. data/lib/dapp/dimg/cli/command/dimg/flush_repo.rb +36 -0
  88. data/lib/dapp/dimg/cli/{list.rb → command/dimg/list.rb} +6 -3
  89. data/lib/dapp/dimg/cli/{mrproper.rb → command/dimg/mrproper.rb} +4 -4
  90. data/lib/dapp/dimg/cli/command/dimg/push.rb +39 -0
  91. data/lib/dapp/dimg/cli/{run.rb → command/dimg/run.rb} +30 -15
  92. data/lib/dapp/dimg/cli/{spush.rb → command/dimg/spush.rb} +4 -4
  93. data/lib/dapp/dimg/cli/{stage_image.rb → command/dimg/stage_image.rb} +12 -3
  94. data/lib/dapp/dimg/cli/command/dimg/stages/base.rb +13 -0
  95. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_local.rb +13 -9
  96. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_repo.rb +6 -8
  97. data/lib/dapp/dimg/cli/command/dimg/stages/flush_local.rb +21 -0
  98. data/lib/dapp/dimg/cli/command/dimg/stages/flush_repo.rb +28 -0
  99. data/lib/dapp/dimg/cli/command/dimg/stages/pull.rb +34 -0
  100. data/lib/dapp/dimg/cli/command/dimg/stages/push.rb +30 -0
  101. data/lib/dapp/dimg/cli/command/dimg/stages.rb +22 -0
  102. data/lib/dapp/dimg/cli/command/dimg/tag.rb +24 -0
  103. data/lib/dapp/dimg/cli/command/dimg.rb +31 -0
  104. data/lib/dapp/dimg/cli/options/introspection.rb +45 -0
  105. data/lib/dapp/dimg/config/config.rb +24 -0
  106. data/lib/dapp/dimg/config/directive/artifact.rb +13 -15
  107. data/lib/dapp/dimg/config/directive/artifact_base.rb +13 -8
  108. data/lib/dapp/dimg/config/directive/artifact_dimg.rb +12 -0
  109. data/lib/dapp/dimg/config/directive/artifact_group.rb +60 -0
  110. data/lib/dapp/dimg/config/directive/dimg/instance_methods.rb +203 -0
  111. data/lib/dapp/dimg/config/directive/dimg/validation.rb +217 -0
  112. data/lib/dapp/dimg/config/directive/dimg.rb +36 -0
  113. data/lib/dapp/dimg/config/directive/dimg_group.rb +73 -0
  114. data/lib/dapp/dimg/config/directive/dimg_group_base.rb +46 -0
  115. data/lib/dapp/dimg/config/directive/docker/artifact.rb +5 -0
  116. data/lib/dapp/dimg/config/directive/docker/base.rb +2 -3
  117. data/lib/dapp/dimg/config/directive/docker/dimg.rb +4 -4
  118. data/lib/dapp/dimg/config/directive/git_artifact_local.rb +24 -5
  119. data/lib/dapp/dimg/config/directive/git_artifact_remote.rb +23 -12
  120. data/lib/dapp/dimg/config/directive/mount.rb +11 -3
  121. data/lib/dapp/dimg/config/directive/shell/dimg.rb +2 -2
  122. data/lib/dapp/dimg/dapp/command/bp.rb +3 -5
  123. data/lib/dapp/dimg/dapp/command/build.rb +4 -6
  124. data/lib/dapp/dimg/dapp/command/build_context/common.rb +2 -2
  125. data/lib/dapp/dimg/dapp/command/build_context/export.rb +14 -14
  126. data/lib/dapp/dimg/dapp/command/build_context/import.rb +28 -23
  127. data/lib/dapp/dimg/dapp/command/cleanup.rb +4 -11
  128. data/lib/dapp/dimg/dapp/command/cleanup_repo.rb +143 -0
  129. data/lib/dapp/dimg/dapp/command/common.rb +148 -38
  130. data/lib/dapp/dimg/dapp/command/flush_local.rb +25 -0
  131. data/lib/dapp/dimg/dapp/command/flush_repo.rb +25 -0
  132. data/lib/dapp/dimg/dapp/command/list.rb +1 -1
  133. data/lib/dapp/dimg/dapp/command/mrproper.rb +16 -63
  134. data/lib/dapp/dimg/dapp/command/push.rb +11 -16
  135. data/lib/dapp/dimg/dapp/command/ruby2go_cleanup.rb +48 -0
  136. data/lib/dapp/dimg/dapp/command/run.rb +4 -4
  137. data/lib/dapp/dimg/dapp/command/spush.rb +4 -5
  138. data/lib/dapp/dimg/dapp/command/stage_image.rb +2 -2
  139. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +13 -115
  140. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +23 -102
  141. data/lib/dapp/dimg/dapp/command/stages/common.rb +57 -39
  142. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +13 -7
  143. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +14 -8
  144. data/lib/dapp/dimg/dapp/command/stages/pull.rb +4 -13
  145. data/lib/dapp/dimg/dapp/command/stages/push.rb +4 -9
  146. data/lib/dapp/dimg/dapp/command/tag.rb +4 -6
  147. data/lib/dapp/dimg/dapp/config_artifact_group.rb +20 -0
  148. data/lib/dapp/dimg/dapp/dapp.rb +40 -0
  149. data/lib/dapp/dimg/dapp/dappfile.rb +43 -0
  150. data/lib/dapp/dimg/dapp/dimg.rb +41 -0
  151. data/lib/dapp/dimg/dimg/git_artifact.rb +25 -11
  152. data/lib/dapp/dimg/dimg/path.rb +7 -9
  153. data/lib/dapp/dimg/dimg/stages.rb +27 -15
  154. data/lib/dapp/dimg/dimg.rb +172 -69
  155. data/lib/dapp/dimg/docker_registry/base.rb +31 -74
  156. data/lib/dapp/dimg/docker_registry/dimg.rb +55 -0
  157. data/lib/dapp/dimg/docker_registry.rb +5 -23
  158. data/lib/dapp/dimg/error/build.rb +1 -1
  159. data/lib/dapp/dimg/error/chef.rb +1 -5
  160. data/lib/dapp/dimg/error/{command.rb → default.rb} +1 -1
  161. data/lib/dapp/dimg/error/dimg.rb +1 -1
  162. data/lib/dapp/dimg/error/lock.rb +1 -1
  163. data/lib/dapp/dimg/error/registry.rb +1 -1
  164. data/lib/dapp/dimg/error/rugged.rb +1 -1
  165. data/lib/dapp/dimg/error/tar_writer.rb +1 -1
  166. data/lib/dapp/dimg/git_artifact.rb +195 -179
  167. data/lib/dapp/dimg/git_repo/base.rb +49 -45
  168. data/lib/dapp/dimg/git_repo/local.rb +45 -0
  169. data/lib/dapp/dimg/git_repo/own.rb +3 -31
  170. data/lib/dapp/dimg/git_repo/remote.rb +65 -26
  171. data/lib/dapp/dimg/image/argument.rb +15 -50
  172. data/lib/dapp/dimg/image/dimg.rb +15 -0
  173. data/lib/dapp/dimg/image/scratch.rb +35 -9
  174. data/lib/dapp/dimg/image/stage.rb +223 -44
  175. data/lib/dapp/dimg/lock/file.rb +4 -4
  176. data/lib/dapp/downloader.rb +117 -0
  177. data/lib/dapp/error/base.rb +1 -5
  178. data/lib/dapp/error/command.rb +5 -0
  179. data/lib/dapp/error/config.rb +5 -0
  180. data/lib/dapp/error/dapp.rb +1 -1
  181. data/lib/dapp/error/dappfile.rb +1 -1
  182. data/lib/dapp/error/default.rb +11 -0
  183. data/lib/dapp/error/mod/user.rb +11 -0
  184. data/lib/dapp/error/shellout.rb +1 -1
  185. data/lib/dapp/exception/base.rb +1 -1
  186. data/lib/dapp/helper/case_conversion.rb +17 -0
  187. data/lib/dapp/helper/cli.rb +18 -7
  188. data/lib/dapp/helper/net_status.rb +5 -1
  189. data/lib/dapp/helper/sha256.rb +1 -1
  190. data/lib/dapp/helper/tar.rb +31 -0
  191. data/lib/dapp/helper/trivia.rb +40 -1
  192. data/lib/dapp/helper/url.rb +23 -0
  193. data/lib/dapp/helper/yaml.rb +24 -0
  194. data/lib/dapp/kube/cli/cli.rb +1 -0
  195. data/lib/dapp/kube/cli/command/base.rb +14 -0
  196. data/lib/dapp/kube/cli/command/kube/chart_create.rb +19 -0
  197. data/lib/dapp/kube/cli/command/kube/deploy.rb +80 -0
  198. data/lib/dapp/kube/cli/command/kube/dismiss.rb +31 -0
  199. data/lib/dapp/kube/cli/command/kube/lint.rb +53 -0
  200. data/lib/dapp/kube/cli/command/kube/minikube_setup.rb +19 -0
  201. data/lib/dapp/kube/cli/command/kube/render.rb +63 -0
  202. data/lib/dapp/kube/cli/command/kube/secret_edit.rb +30 -0
  203. data/lib/dapp/kube/cli/command/kube/secret_extract.rb +39 -0
  204. data/lib/dapp/kube/cli/command/kube/secret_generate.rb +34 -0
  205. data/lib/dapp/kube/cli/command/kube/secret_key_generate.rb +16 -0
  206. data/lib/dapp/kube/cli/command/kube/secret_regenerate.rb +29 -0
  207. data/lib/dapp/kube/cli/command/kube/value_get.rb +47 -0
  208. data/lib/dapp/kube/cli/command/kube.rb +28 -0
  209. data/lib/dapp/kube/dapp/command/chart_create.rb +103 -0
  210. data/lib/dapp/kube/dapp/command/common.rb +379 -0
  211. data/lib/dapp/kube/dapp/command/deploy.rb +351 -0
  212. data/lib/dapp/kube/dapp/command/dismiss.rb +50 -0
  213. data/lib/dapp/kube/dapp/command/lint.rb +69 -0
  214. data/lib/dapp/kube/dapp/command/minikube_setup.rb +402 -0
  215. data/lib/dapp/kube/dapp/command/render.rb +54 -0
  216. data/lib/dapp/kube/dapp/command/ruby2go.rb +17 -0
  217. data/lib/dapp/kube/dapp/command/secret_edit.rb +21 -0
  218. data/lib/dapp/kube/dapp/command/secret_extract.rb +17 -0
  219. data/lib/dapp/kube/dapp/command/secret_generate.rb +21 -0
  220. data/lib/dapp/kube/dapp/command/secret_key_generate.rb +13 -0
  221. data/lib/dapp/kube/dapp/command/secret_regenerate.rb +13 -0
  222. data/lib/dapp/kube/dapp/command/value_get.rb +32 -0
  223. data/lib/dapp/kube/dapp/dapp.rb +26 -0
  224. data/lib/dapp/kube/error/default.rb +7 -0
  225. data/lib/dapp/kube/helm/release.rb +189 -0
  226. data/lib/dapp/kube/helm/values.rb +148 -0
  227. data/lib/dapp/kube/helm.rb +5 -0
  228. data/lib/dapp/kube/kubernetes/client/error.rb +43 -0
  229. data/lib/dapp/kube/kubernetes/client/resource/base.rb +33 -0
  230. data/lib/dapp/kube/kubernetes/client/resource/deployment.rb +11 -0
  231. data/lib/dapp/kube/kubernetes/client/resource/event.rb +8 -0
  232. data/lib/dapp/kube/kubernetes/client/resource/job.rb +27 -0
  233. data/lib/dapp/kube/kubernetes/client/resource/pod.rb +62 -0
  234. data/lib/dapp/kube/kubernetes/client/resource/replicaset.rb +8 -0
  235. data/lib/dapp/kube/kubernetes/client.rb +314 -0
  236. data/lib/dapp/kube/kubernetes/config.rb +132 -0
  237. data/lib/dapp/kube/kubernetes/error.rb +15 -0
  238. data/lib/dapp/kube/kubernetes/manager/base.rb +15 -0
  239. data/lib/dapp/kube/kubernetes/manager/container.rb +103 -0
  240. data/lib/dapp/kube/kubernetes/manager/deployment.rb +212 -0
  241. data/lib/dapp/kube/kubernetes/manager/job.rb +65 -0
  242. data/lib/dapp/kube/kubernetes/manager/pod.rb +69 -0
  243. data/lib/dapp/kube/kubernetes.rb +6 -0
  244. data/lib/dapp/kube/secret.rb +93 -0
  245. data/lib/dapp/kube.rb +1 -0
  246. data/lib/dapp/version.rb +2 -2
  247. data/lib/dapp.rb +155 -61
  248. metadata +208 -61
  249. data/lib/dapp/cli/base.rb +0 -63
  250. data/lib/dapp/config/base.rb +0 -54
  251. data/lib/dapp/config/error/config.rb +0 -7
  252. data/lib/dapp/dimg/build/stage/ga_archive_dependencies.rb +0 -27
  253. data/lib/dapp/dimg/build/stage/ga_dependencies_base.rb +0 -20
  254. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch_dependencies.rb +0 -22
  255. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch_dependencies.rb +0 -22
  256. data/lib/dapp/dimg/build/stage/mod/git_artifact_dependencies.rb +0 -23
  257. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch_dependencies.rb +0 -32
  258. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch_dependencies.rb +0 -22
  259. data/lib/dapp/dimg/cli/base.rb +0 -16
  260. data/lib/dapp/dimg/cli/bp.rb +0 -37
  261. data/lib/dapp/dimg/cli/build.rb +0 -64
  262. data/lib/dapp/dimg/cli/dimg.rb +0 -30
  263. data/lib/dapp/dimg/cli/push.rb +0 -61
  264. data/lib/dapp/dimg/cli/stages/flush_local.rb +0 -23
  265. data/lib/dapp/dimg/cli/stages/flush_repo.rb +0 -24
  266. data/lib/dapp/dimg/cli/stages/pull.rb +0 -28
  267. data/lib/dapp/dimg/cli/stages/push.rb +0 -24
  268. data/lib/dapp/dimg/cli/stages.rb +0 -22
  269. data/lib/dapp/dimg/cli/tag.rb +0 -24
  270. data/lib/dapp/dimg/config/artifact_dimg.rb +0 -17
  271. data/lib/dapp/dimg/config/artifact_group.rb +0 -43
  272. data/lib/dapp/dimg/config/base.rb +0 -7
  273. data/lib/dapp/dimg/config/dimg/instance_methods.rb +0 -179
  274. data/lib/dapp/dimg/config/dimg/validation.rb +0 -126
  275. data/lib/dapp/dimg/config/dimg.rb +0 -24
  276. data/lib/dapp/dimg/config/dimg_group.rb +0 -61
  277. data/lib/dapp/dimg/config/dimg_group_base.rb +0 -54
  278. data/lib/dapp/dimg/config/dimg_group_main.rb +0 -22
  279. data/lib/dapp/dimg/dapp/command.rb +0 -21
  280. data/lib/dapp/dimg/dimg/tags.rb +0 -65
  281. data/lib/dapp/dimg/docker_registry/base/authorization.rb +0 -63
  282. data/lib/dapp/dimg/docker_registry/base/request.rb +0 -34
  283. data/lib/dapp/dimg/docker_registry/default.rb +0 -18
  284. data/lib/dapp/dimg/error/base.rb +0 -7
  285. data/lib/dapp/dimg/error/config.rb +0 -7
  286. data/lib/dapp/dimg/exception/introspect_image.rb +0 -7
  287. data/lib/dapp/dimg/image/docker.rb +0 -134
@@ -0,0 +1,351 @@
1
+ module Dapp
2
+ module Kube
3
+ module Dapp
4
+ module Command
5
+ module Deploy
6
+ def kube_deploy
7
+ # TODO: move setup_ssh_agent to golang
8
+ setup_ssh_agent
9
+
10
+ command = "deploy"
11
+
12
+ # TODO: move option_tags logic to golang
13
+ tag = begin
14
+ raise ::Dapp::Error::Command, code: :expected_only_one_tag, data: { tags: option_tags.join(', ') } if option_tags.count > 1
15
+ option_tags.first
16
+ end
17
+
18
+ # TODO: move project name logic to golang
19
+ project_name = name.to_s
20
+
21
+ # TODO: move project dir logic to golang
22
+ project_dir = path.to_s
23
+
24
+ # TODO: move release name logic to golang
25
+ release_name = kube_release_name
26
+
27
+ # TODO: move repo logic to golang
28
+ repo = option_repo
29
+
30
+ dimgs = self.build_configs.map do |config|
31
+ d = self.dimg(config: config, ignore_signature_auto_calculation: true)
32
+ {"Name" => d.name, "ImageTag" => tag, "Repo" => repo}
33
+ end.uniq do |dimg|
34
+ dimg["Name"]
35
+ end
36
+
37
+ res = ruby2go_deploy(
38
+ "command" => command,
39
+ "projectName" => project_name,
40
+ "projectDir" => project_dir,
41
+ "tag" => tag,
42
+ "releaseName" => release_name,
43
+ "repo" => repo,
44
+ "dimgs" => JSON.dump(dimgs),
45
+ "rubyCliOptions" => JSON.dump(self.options),
46
+ options: { host_docker_config_dir: self.class.host_docker_config_dir },
47
+ )
48
+
49
+ raise ::Dapp::Error::Command, code: :ruby2go_deploy_command_failed, data: { command: command, message: res["error"] } unless res["error"].nil?
50
+ end
51
+
52
+ def kube_deploy_old
53
+ setup_ssh_agent
54
+
55
+ helm_release do |release|
56
+ do_deploy = proc do
57
+ init_kube_deploy_start_time
58
+ kube_run_deploy(release)
59
+ end
60
+
61
+ if dry_run?
62
+ do_deploy.call
63
+ else
64
+ lock_helm_release &do_deploy
65
+ end
66
+ end
67
+ end
68
+
69
+ def init_kube_deploy_start_time
70
+ @kube_deploy_start_time ||= Time.now.to_datetime.rfc3339
71
+ end
72
+
73
+ def kube_deploy_start_time
74
+ @kube_deploy_start_time
75
+ end
76
+
77
+ def kube_flush_hooks_jobs(release)
78
+ all_jobs_names = kube_all_jobs_names
79
+
80
+ all_pods_specs = kubernetes.pod_list["items"]
81
+ .map {|spec| Kubernetes::Client::Resource::Pod.new(spec)}
82
+
83
+ release.hooks.values
84
+ .reject { |job| ['0', 'false'].include? job.annotations["dapp/recreate"].to_s }
85
+ .select { |job| all_jobs_names.include? job.name }
86
+ .each do |job|
87
+ log_process("Delete hook job `#{job.name}` (dapp/recreate)", short: true) do
88
+ kube_delete_job!(job.name, all_pods_specs) unless dry_run?
89
+ end
90
+ end
91
+ end
92
+
93
+ def kube_all_jobs_names
94
+ kubernetes.job_list['items'].map { |i| i['metadata']['name'] }
95
+ end
96
+
97
+ def kube_delete_job!(job_name, all_pods_specs)
98
+ job_spec = Kubernetes::Client::Resource::Pod.new kubernetes.job(job_name)
99
+
100
+ job_pods_specs = all_pods_specs
101
+ .select do |pod|
102
+ Array(pod.metadata['ownerReferences']).any? do |owner_reference|
103
+ owner_reference['uid'] == job_spec.metadata['uid']
104
+ end
105
+ end
106
+
107
+ job_pods_specs.each do |job_pod_spec|
108
+ kubernetes.delete_pod!(job_pod_spec.name)
109
+ end
110
+
111
+ # FIXME: https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/
112
+ # FIXME: orphanDependents deprecated, should be propagationPolicy=Orphan. But it does not work.
113
+ # FIXME: Also, kubectl uses the same: https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/delete.go#L388
114
+ # FIXME: https://github.com/kubernetes/kubernetes/issues/46659
115
+ kubernetes.delete_job!(job_name, orphanDependents: false)
116
+ loop do
117
+ break unless kubernetes.job?(job_name)
118
+ sleep 1
119
+ end
120
+ end
121
+
122
+ def kube_helm_auto_purge_trigger_file_path(release_name)
123
+ File.join(self.class.home_dir, "helm", release_name, "auto_purge_failed_release_on_next_deploy")
124
+ end
125
+
126
+ def kube_create_helm_auto_purge_trigger_file(release_name)
127
+ FileUtils.mkdir_p File.dirname(kube_helm_auto_purge_trigger_file_path(release_name))
128
+ FileUtils.touch kube_helm_auto_purge_trigger_file_path(release_name)
129
+ end
130
+
131
+ def kube_delete_helm_auto_purge_trigger_file(release_name)
132
+ if File.exists? kube_helm_auto_purge_trigger_file_path(release_name)
133
+ FileUtils.rm_rf kube_helm_auto_purge_trigger_file_path(release_name)
134
+ end
135
+ end
136
+
137
+ def kube_run_deploy(release)
138
+ log_process("Deploy release #{release.name}") do
139
+ helm_status_res = shellout([
140
+ "helm",
141
+ ("--kube-context #{custom_kube_context}" if custom_kube_context),
142
+ "status",
143
+ release.name,
144
+ ].compact.join(" "))
145
+
146
+ release_status = nil
147
+ if helm_status_res.status.success?
148
+ status_line = helm_status_res.stdout.lines.find {|l| l.start_with? "STATUS: "}
149
+ release_status = status_line.partition(": ")[2].strip if status_line
150
+ end
151
+
152
+ release_exists = nil
153
+
154
+ if not helm_status_res.status.success?
155
+ # Helm release is not exists.
156
+ release_exists = false
157
+
158
+ # Create purge-trigger for the next run.
159
+ kube_create_helm_auto_purge_trigger_file(release.name)
160
+ elsif ["FAILED", "PENDING_INSTALL"].include? release_status
161
+ release_exists = true
162
+
163
+ if File.exists? kube_helm_auto_purge_trigger_file_path(release.name)
164
+ log_process("Purge helm release #{release.name}") do
165
+ shellout!([
166
+ "helm",
167
+ ("--kube-context #{custom_kube_context}" if custom_kube_context),
168
+ "delete",
169
+ "--purge #{release.name}",
170
+ ].compact.join(" "))
171
+ end
172
+
173
+ # Purge-trigger file remains to exist
174
+ release_exists = false
175
+ end
176
+ else
177
+ if File.exists? kube_helm_auto_purge_trigger_file_path(release.name)
178
+ log_warning "[WARN] Will not purge helm release #{release.name}: expected FAILED or PENDING_INSTALL release status, got #{release_status}"
179
+ end
180
+
181
+ release_exists = true
182
+ kube_delete_helm_auto_purge_trigger_file(release.name)
183
+ end
184
+
185
+ kube_flush_hooks_jobs(release)
186
+
187
+ watch_hooks_by_type = release.jobs.values
188
+ .reduce({}) do |res, job|
189
+ if job.annotations['dapp/watch-logs'].to_s == 'true'
190
+ job.annotations['helm.sh/hook'].to_s.split(',').each do |hook_type|
191
+ res[hook_type] ||= []
192
+ res[hook_type] << job
193
+ end
194
+ end
195
+
196
+ res
197
+ end
198
+ .tap do |res|
199
+ res.values.each do |jobs|
200
+ jobs.sort_by! {|job| job.annotations['helm.sh/hook-weight'].to_i}
201
+ end
202
+ end
203
+
204
+ watch_hooks = if release_exists
205
+ watch_hooks_by_type['pre-upgrade'].to_a + watch_hooks_by_type['post-upgrade'].to_a
206
+ else
207
+ watch_hooks_by_type['pre-install'].to_a + watch_hooks_by_type['post-install'].to_a
208
+ end
209
+
210
+ watch_hooks_thr = nil
211
+ watch_hooks_condition_mutex = ::Mutex.new
212
+ watch_hooks_condition = ::ConditionVariable.new
213
+ deploy_has_began = false
214
+
215
+ unless dry_run? and watch_hooks.any?
216
+ watch_hooks_thr = Thread.new do
217
+ watch_hooks_condition_mutex.synchronize do
218
+ while not deploy_has_began do
219
+ watch_hooks_condition.wait(watch_hooks_condition_mutex)
220
+ end
221
+ end
222
+
223
+ begin
224
+ watch_hooks.each do |job|
225
+ begin
226
+ if ENV["KUBEDOG"] != "0"
227
+ timeout = self.options[:timeout] || 300
228
+ tmp_dir = Dir.mktmpdir('dapp-ruby2go-', tmp_base_dir)
229
+ res = nil
230
+
231
+ begin
232
+ res = ruby2go_deploy_watcher(
233
+ {
234
+ "action" => "watch job",
235
+ "resourceName" => job.name,
236
+ "namespace" => release.namespace,
237
+ "timeout" => timeout,
238
+ "logsFromTime" => kube_deploy_start_time,
239
+ "kubeContext" => custom_kube_context,
240
+ },
241
+ tmp_dir: tmp_dir,
242
+ )
243
+ rescue ::Dapp::Dapp::Ruby2Go::Error => err
244
+ # ignore interrupt
245
+ if err.net_status[:data][:status_code] == 17
246
+ res = {}
247
+ else
248
+ raise
249
+ end
250
+ ensure
251
+ FileUtils.rmtree(tmp_dir)
252
+ end
253
+
254
+ if res["error"]
255
+ $stderr.puts(::Dapp::Dapp.paint_string(res["error"], :warning))
256
+ end
257
+ else
258
+ Kubernetes::Manager::Job.new(self, job.name).watch_till_done!
259
+ end
260
+ rescue ::Exception => e
261
+ raise
262
+ end
263
+ end # watch_hooks.each
264
+ rescue Kubernetes::Error::Default => e
265
+ # Default-ошибка -- это ошибка для пользователя которую перехватывает и
266
+ # показывает bin/dapp, а затем dapp выходит с ошибкой.
267
+ # Нельзя убивать родительский поток по Default-ошибке
268
+ # из-за того, что в этот момент в нем вероятно работает helm,
269
+ # а процесс деплоя в helm прерывать не стоит.
270
+ # Поэтому перехватываем и просто отображаем произошедшую
271
+ # ошибку для информации пользователю без завершения работы dapp.
272
+ $stderr.puts(::Dapp::Dapp.paint_string(::Dapp::Helper::NetStatus.message(e), :warning))
273
+ end
274
+ end # Thread
275
+ end # unless
276
+
277
+ deployment_managers = release.deployments.values
278
+ .map {|deployment| Kubernetes::Manager::Deployment.new(self, deployment.name)}
279
+
280
+ deployment_managers.each(&:before_deploy)
281
+
282
+ log_process("#{release_exists ? "Upgrade" : "Install"} helm release #{release.name}") do
283
+ watch_hooks_condition_mutex.synchronize do
284
+ deploy_has_began = true
285
+ # Фактически гарантируется лишь вывод сообщения log_process перед выводом из потока watch_thr
286
+ watch_hooks_condition.signal
287
+ end
288
+
289
+ cmd_res = if release_exists
290
+ release.upgrade_helm_release
291
+ else
292
+ release.install_helm_release
293
+ end
294
+
295
+ if cmd_res.error?
296
+ if cmd_res.stderr.end_with? "has no deployed releases\n"
297
+ log_warning "[WARN] Helm release #{release.name} is in improper state: #{cmd_res.stderr}"
298
+ log_warning "[WARN] Helm release #{release.name} will be removed with `helm delete --purge` on the next run of `dapp kube deploy`"
299
+
300
+ kube_create_helm_auto_purge_trigger_file(release.name)
301
+ end
302
+
303
+ watch_hooks_thr.kill if !dry_run? && watch_hooks_thr && watch_hooks_thr.alive?
304
+
305
+ raise ::Dapp::Error::Command, code: :kube_helm_failed, data: {output: (cmd_res.stdout + cmd_res.stderr).strip}
306
+ else
307
+ kube_delete_helm_auto_purge_trigger_file(release.name)
308
+ log_info((cmd_res.stdout + cmd_res.stderr).strip)
309
+
310
+ watch_hooks_thr.join if !dry_run? && watch_hooks_thr && watch_hooks_thr.alive?
311
+ end
312
+ end
313
+
314
+ deployment_managers.each(&:after_deploy)
315
+
316
+ unless dry_run?
317
+ begin
318
+ timeout = self.options[:timeout] || 300
319
+ ::Timeout::timeout(timeout) do
320
+ deployment_managers.each {|deployment_manager|
321
+ if deployment_manager.should_watch?
322
+ if ENV["KUBEDOG"] != "0"
323
+ res = ruby2go_deploy_watcher(
324
+ "action" => "watch deployment",
325
+ "resourceName" => deployment_manager.name,
326
+ "namespace" => release.namespace,
327
+ "timeout" => timeout,
328
+ "logsFromTime" => kube_deploy_start_time,
329
+ "kubeContext" => custom_kube_context,
330
+ )
331
+
332
+ if res["error"]
333
+ raise ::Dapp::Kube::Kubernetes::Error::Default.new data: {message: res["error"]}
334
+ end
335
+ else
336
+ deployment_manager.watch_till_ready!
337
+ end
338
+ end
339
+ }
340
+ end
341
+ rescue ::Timeout::Error
342
+ raise ::Dapp::Error::Command, code: :kube_deploy_timeout
343
+ end
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
350
+ end
351
+ end
@@ -0,0 +1,50 @@
1
+ module Dapp
2
+ module Kube
3
+ module Dapp
4
+ module Command
5
+ module Dismiss
6
+ def kube_dismiss
7
+ command = "dismiss"
8
+
9
+ # TODO: move release name logic to golang
10
+ release_name = kube_release_name
11
+
12
+ res = ruby2go_deploy(
13
+ "command" => command,
14
+ "releaseName" => release_name,
15
+ "rubyCliOptions" => JSON.dump(self.options),
16
+ )
17
+
18
+ raise ::Dapp::Error::Command, code: :ruby2go_deploy_command_failed, data: { command: command, message: res["error"] } unless res["error"].nil?
19
+ end
20
+
21
+ def kube_dismiss_old
22
+ lock_helm_release do
23
+ kube_check_helm!
24
+ kube_check_helm_release!
25
+ log_process("Delete release #{kube_release_name}") do
26
+ shellout!([
27
+ "helm",
28
+ ("--kube-context #{custom_kube_context}" if custom_kube_context),
29
+ "delete",
30
+ kube_release_name,
31
+ "--purge",
32
+ ].compact.join(" "))
33
+ kubernetes.delete_namespace!(kube_namespace) if options[:with_namespace]
34
+ end
35
+ end
36
+ end
37
+
38
+ def kube_check_helm_release!
39
+ pr = shellout([
40
+ "helm",
41
+ ("--kube-context #{custom_kube_context}" if custom_kube_context),
42
+ "list | grep #{kube_release_name}"
43
+ ].compact.join(" "))
44
+ raise ::Dapp::Error::Command, code: :helm_release_not_exist, data: { name: kube_release_name } if pr.status == 1 || pr.stdout.empty?
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,69 @@
1
+ module Dapp
2
+ module Kube
3
+ module Dapp
4
+ module Command
5
+ module Lint
6
+ def kube_lint
7
+ command = "lint"
8
+
9
+ # TODO: move project dir logic to golang
10
+ project_dir = path.to_s
11
+
12
+ dimgs = self.build_configs.map do |config|
13
+ {"Name" => config._name, "ImageTag" => "DOCKER_TAG", "Repo" => "REPO"}
14
+ end.uniq do |dimg|
15
+ dimg["Name"]
16
+ end
17
+
18
+ res = ruby2go_deploy(
19
+ "command" => command,
20
+ "projectDir" => project_dir,
21
+ "rubyCliOptions" => JSON.dump(self.options),
22
+ "dimgs" => JSON.dump(dimgs),
23
+ )
24
+
25
+ raise ::Dapp::Error::Command, code: :ruby2go_deploy_command_failed, data: { command: command, message: res["error"] } unless res["error"].nil?
26
+ end
27
+
28
+ def kube_chart_name
29
+ chart_spec = yaml_load_file(kube_chart_yaml_path)
30
+
31
+ if chart_spec["name"].nil? || chart_spec["name"].empty?
32
+ raise ::Dapp::Error::Command, code: :no_helm_chart_spec_name, data: { name: chart_spec["name"], path: kube_chart_yaml_path, raw_spec: kube_chart_yaml_path.read.strip }
33
+ end
34
+
35
+ chart_spec["name"]
36
+ end
37
+
38
+ def with_kube_tmp_lint_chart_dir(&blk)
39
+ old_kube_tmp_helm_chart_dir = @kube_tmp_helm_chart_dir
40
+ unless ENV['DAPP_HELM_CHART_DIR']
41
+ @kube_tmp_helm_chart_dir = File.join(Dir.mktmpdir('dapp-helm-lint-', tmp_base_dir), kube_chart_name)
42
+ end
43
+
44
+ begin
45
+ with_kube_tmp_chart_dir(&blk)
46
+ ensure
47
+ @kube_tmp_helm_chart_dir = old_kube_tmp_helm_chart_dir
48
+ end
49
+ end
50
+
51
+ def kube_lint_old
52
+ kube_check_helm_chart_yaml!
53
+ with_kube_tmp_lint_chart_dir do
54
+ helm_release(&:lint!)
55
+ end
56
+ end
57
+
58
+ def kube_check_helm_chart_yaml!
59
+ raise ::Dapp::Error::Command, code: :chart_yaml_not_found, data: { path: kube_chart_yaml_path } unless kube_chart_yaml_path.exist?
60
+ end
61
+
62
+ def kube_chart_yaml_path
63
+ kube_chart_path.join("Chart.yaml")
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end