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,212 @@
1
+ module Dapp
2
+ module Kube
3
+ module Kubernetes::Manager
4
+ class Deployment < Base
5
+ # NOTICE: @revision_before_deploy на данный момент выводится на экран как информация для дебага.
6
+ # NOTICE: deployment.kubernetes.io/revision не меняется при изменении количества реплик, поэтому
7
+ # NOTICE: критерий ожидания по изменению ревизии не верен.
8
+ # NOTICE: Однако, при обновлении deployment ревизия сбрасывается и ожидание переустановки этой ревизии
9
+ # NOTICE: является одним из критериев завершения ожидания на данный момент.
10
+
11
+ def before_deploy
12
+ if dapp.kubernetes.deployment? name
13
+ d = Kubernetes::Client::Resource::Deployment.new(dapp.kubernetes.deployment(name))
14
+
15
+ @revision_before_deploy = d.annotations['deployment.kubernetes.io/revision']
16
+
17
+ unless @revision_before_deploy.nil?
18
+ new_spec = Marshal.load(Marshal.dump(d.spec))
19
+ new_spec.delete('status')
20
+ new_spec.fetch('metadata', {}).fetch('annotations', {}).delete('deployment.kubernetes.io/revision')
21
+
22
+ @deployment_before_deploy = Kubernetes::Client::Resource::Deployment.new(dapp.kubernetes.replace_deployment!(name, new_spec))
23
+ end
24
+ end
25
+
26
+ @deploy_began_at = Time.now
27
+ end
28
+
29
+ def after_deploy
30
+ @deployed_at = Time.now
31
+ end
32
+
33
+ def should_watch?
34
+ d = Kubernetes::Client::Resource::Deployment.new(dapp.kubernetes.deployment(name))
35
+
36
+ ["dapp/watch", "dapp/watch-logs"].all? do |anno|
37
+ d.annotations[anno] != "false"
38
+ end
39
+ end
40
+
41
+ def watch_till_ready!
42
+ dapp.log_process("Watch deployment '#{name}' till ready") do
43
+ known_events_by_pod = {}
44
+ known_log_timestamps_by_pod_and_container = {}
45
+
46
+ d = @deployment_before_deploy || Kubernetes::Client::Resource::Deployment.new(dapp.kubernetes.deployment(name))
47
+
48
+ loop do
49
+ d_revision = d.annotations['deployment.kubernetes.io/revision']
50
+
51
+ dapp.log_step("[#{Time.now}] Poll deployment '#{d.name}' status")
52
+ dapp.with_log_indent do
53
+ dapp.log_info("Replicas: #{_field_value_for_log(d.status['replicas'])}")
54
+ dapp.log_info("Updated replicas: #{_field_value_for_log(d.status['updatedReplicas'])}")
55
+ dapp.log_info("Available replicas: #{_field_value_for_log(d.status['availableReplicas'])}")
56
+ dapp.log_info("Unavailable replicas: #{_field_value_for_log(d.status['unavailableReplicas'])}")
57
+ dapp.log_info("Ready replicas: #{_field_value_for_log(d.status['readyReplicas'])} / #{_field_value_for_log(d.replicas)}")
58
+ end
59
+
60
+ rs = nil
61
+ if d_revision
62
+ # Находим актуальный, текущий ReplicaSet.
63
+ # Если такая ситуация, когда есть несколько подходящих по revision ReplicaSet, то берем старейший по дате создания.
64
+ # Также делает kubectl: https://github.com/kubernetes/kubernetes/blob/d86a01570ba243e8d75057415113a0ff4d68c96b/pkg/controller/deployment/util/deployment_util.go#L664
65
+ rs = dapp.kubernetes.replicaset_list['items']
66
+ .map {|spec| Kubernetes::Client::Resource::Replicaset.new(spec)}
67
+ .select do |_rs|
68
+ Array(_rs.metadata['ownerReferences']).any? do |owner_reference|
69
+ owner_reference['uid'] == d.metadata['uid']
70
+ end
71
+ end
72
+ .select do |_rs|
73
+ rs_revision = _rs.annotations['deployment.kubernetes.io/revision']
74
+ (rs_revision and (d_revision == rs_revision))
75
+ end
76
+ .sort_by do |_rs|
77
+ if creation_timestamp = _rs.metadata['creationTimestamp']
78
+ Time.parse(creation_timestamp)
79
+ else
80
+ Time.now
81
+ end
82
+ end.first
83
+ end
84
+
85
+ if rs
86
+ dapp.with_log_indent do
87
+ dapp.log_step("Current ReplicaSet '#{rs.name}' status")
88
+ dapp.with_log_indent do
89
+ dapp.log_info("Replicas: #{_field_value_for_log(rs.status['replicas'])}")
90
+ dapp.log_info("Fully labeled replicas: #{_field_value_for_log(rs.status['fullyLabeledReplicas'])}")
91
+ dapp.log_info("Available replicas: #{_field_value_for_log(rs.status['availableReplicas'])}")
92
+ dapp.log_info("Ready replicas: #{_field_value_for_log(rs.status['readyReplicas'])} / #{_field_value_for_log(d.replicas)}")
93
+ end
94
+ end
95
+
96
+ # Pod'ы связанные с активным ReplicaSet
97
+ rs_pods = dapp.kubernetes.pod_list['items']
98
+ .map {|spec| Kubernetes::Client::Resource::Pod.new(spec)}
99
+ .select do |pod|
100
+ Array(pod.metadata['ownerReferences']).any? do |owner_reference|
101
+ owner_reference['uid'] == rs.metadata['uid']
102
+ end
103
+ end
104
+
105
+ dapp.with_log_indent do
106
+ dapp.log_step("Pods:") if rs_pods.any?
107
+
108
+ rs_pods.each do |pod|
109
+ dapp.with_log_indent do
110
+ dapp.log_step(pod.name)
111
+
112
+ known_events_by_pod[pod.name] ||= []
113
+ pod_events = dapp.kubernetes
114
+ .event_list(fieldSelector: "involvedObject.uid=#{pod.uid}")['items']
115
+ .map {|spec| Kubernetes::Client::Resource::Event.new(spec)}
116
+ .reject do |event|
117
+ known_events_by_pod[pod.name].include? event.uid
118
+ end
119
+
120
+ if pod_events.any?
121
+ dapp.with_log_indent do
122
+ dapp.log_step("Last events:")
123
+ pod_events.each do |event|
124
+ dapp.with_log_indent do
125
+ dapp.log_info("[#{event.metadata['creationTimestamp']}] #{event.spec['message']}")
126
+ end
127
+ known_events_by_pod[pod.name] << event.uid
128
+ end
129
+ end
130
+ end
131
+
132
+ dapp.with_log_indent do
133
+ pod.containers_names.each do |container_name|
134
+ known_log_timestamps_by_pod_and_container[pod.name] ||= {}
135
+ known_log_timestamps_by_pod_and_container[pod.name][container_name] ||= Set.new
136
+
137
+ since_time = nil
138
+ # Если под еще не перешел в состоянии готовности, то можно вывести все логи которые имеются.
139
+ # Иначе выводим только новые логи с момента начала текущей сессии деплоя.
140
+ if [nil, "True"].include? pod.ready_condition_status
141
+ since_time = @deploy_began_at.utc.iso8601(9) if @deploy_began_at
142
+ end
143
+
144
+ log_lines_by_time = []
145
+ begin
146
+ log_lines_by_time = dapp.kubernetes.pod_log(pod.name, container: container_name, timestamps: true, sinceTime: since_time)
147
+ .lines.map(&:strip)
148
+ .map {|line|
149
+ timestamp, _, data = line.partition(' ')
150
+ unless known_log_timestamps_by_pod_and_container[pod.name][container_name].include? timestamp
151
+ known_log_timestamps_by_pod_and_container[pod.name][container_name].add timestamp
152
+ [timestamp, data]
153
+ end
154
+ }.compact
155
+ rescue Kubernetes::Client::Error::Pod::ContainerCreating, Kubernetes::Client::Error::Pod::PodInitializing
156
+ next
157
+ rescue Kubernetes::Client::Error::Base => err
158
+ dapp.log_warning("#{dapp.log_time}Error while fetching pod's #{pod.name} logs: #{err.message}", stream: dapp.service_stream)
159
+ next
160
+ end
161
+
162
+ if log_lines_by_time.any?
163
+ dapp.log_step("Last container '#{container_name}' log:")
164
+ dapp.with_log_indent do
165
+ log_lines_by_time.each do |timestamp, line|
166
+ dapp.log("[#{timestamp}] #{line}")
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ pod_manager = Kubernetes::Manager::Pod.new(dapp, pod.name)
174
+ pod_manager.check_readiness_condition_if_available!(pod)
175
+ end # with_log_indent
176
+ end # rs_pods.each
177
+ end # with_log_indent
178
+ end
179
+
180
+ # break only when rs is not nil
181
+
182
+ if d_revision && d.replicas && d.replicas == 0
183
+ break
184
+ end
185
+
186
+ if d_revision && d.replicas && rs
187
+ break if is_deployment_ready(d) && is_replicaset_ready(d, rs)
188
+ end
189
+
190
+ sleep 5
191
+ d = Kubernetes::Client::Resource::Deployment.new(dapp.kubernetes.deployment(d.name))
192
+ end
193
+ end
194
+ end
195
+
196
+ def is_deployment_ready(d)
197
+ d.status.key?("readyReplicas") && d.status["readyReplicas"] >= d.replicas
198
+ end
199
+
200
+ def is_replicaset_ready(d, rs)
201
+ rs.status.key?("readyReplicas") && rs.status["readyReplicas"] >= d.replicas
202
+ end
203
+
204
+ private
205
+
206
+ def _field_value_for_log(value)
207
+ value ? value : '-'
208
+ end
209
+ end # Deployment
210
+ end # Kubernetes::Manager
211
+ end # Kube
212
+ end # Dapp
@@ -0,0 +1,65 @@
1
+ module Dapp
2
+ module Kube
3
+ module Kubernetes::Manager
4
+ class Job < Base
5
+ def initialize(dapp, name)
6
+ super(dapp, name)
7
+
8
+ @processed_pods_names = []
9
+ end
10
+
11
+ def wait_till_exists!
12
+ loop do
13
+ break if dapp.kubernetes.job?(name)
14
+ sleep 0.1
15
+ end
16
+ end
17
+
18
+ def watch_till_done!
19
+ wait_till_exists!
20
+
21
+ job = Kubernetes::Client::Resource::Job.new(dapp.kubernetes.job(name))
22
+
23
+ loop do
24
+ # Получить очередной pod для обработки
25
+ process_pod = dapp.kubernetes.pod_list.fetch('items', [])
26
+ .select do |pod_spec|
27
+ pod_spec.fetch('metadata', {}).fetch('labels', {})['controller-uid'] == job.uid
28
+ end
29
+ .reject do |pod_spec|
30
+ @processed_pods_names.include? pod_spec.fetch('metadata', {})['name']
31
+ end
32
+ .sort_by do |pod_spec|
33
+ Time.parse(pod_spec.fetch('metadata', {})['creationTimestamp'])
34
+ end
35
+ .map {|pod_spec| Kubernetes::Client::Resource::Pod.new(pod_spec)}
36
+ .first
37
+
38
+ if process_pod.nil?
39
+ job = Kubernetes::Client::Resource::Job.new(dapp.kubernetes.job(name))
40
+ if job.succeeded?
41
+ break
42
+ elsif job.failed?
43
+ dapp.log_warning "#{dapp.log_time}Job '#{name}' has been failed: #{job.spec['status']}", stream: dapp.service_stream
44
+ break
45
+ end
46
+
47
+ sleep 0.1
48
+
49
+ next
50
+ end
51
+
52
+ pod_manager = Kubernetes::Manager::Pod.new(dapp, process_pod.name)
53
+ begin
54
+ pod_manager.watch_till_done!
55
+ rescue Kubernetes::Client::Error::Pod::NotFound => err
56
+ dapp.log_warning "#{dapp.log_time}Pod '#{pod_manager.name}' has been deleted", stream: dapp.service_stream
57
+ ensure
58
+ @processed_pods_names << process_pod.name
59
+ end
60
+ end
61
+ end
62
+ end # Job
63
+ end # Kubernetes::Manager
64
+ end # Kube
65
+ end # Dapp
@@ -0,0 +1,69 @@
1
+ module Dapp
2
+ module Kube
3
+ module Kubernetes::Manager
4
+ class Pod < Base
5
+ def containers
6
+ pod = Kubernetes::Client::Resource::Pod.new(dapp.kubernetes.pod(name))
7
+ @containers ||= pod.containers_names.map do |container_name|
8
+ Container.new(dapp, container_name, self)
9
+ end
10
+ end
11
+
12
+ def check_readiness_condition_if_available!(pod)
13
+ return if [nil, "True"].include? pod.ready_condition_status
14
+
15
+ if pod.ready_condition['reason'] == 'ContainersNotReady'
16
+ [*Array(pod.status["initContainerStatuses"]), *Array(pod.status["containerStatuses"])].each do |container_status|
17
+ next if container_status['ready']
18
+
19
+ waiting_reason = container_status.fetch('state', {}).fetch('waiting', {}).fetch('reason', nil)
20
+ case waiting_reason
21
+ when 'ImagePullBackOff', 'ErrImagePull'
22
+ raise Kubernetes::Error::Default,
23
+ code: :bad_image,
24
+ data: {pod_name: pod.name,
25
+ reason: waiting_reason,
26
+ message: container_status['state']['waiting']['message']}
27
+ when 'CrashLoopBackOff'
28
+ raise Kubernetes::Error::Default,
29
+ code: :container_crash,
30
+ data: {pod_name: pod.name,
31
+ reason: waiting_reason,
32
+ message: container_status['state']['waiting']['message']}
33
+ end
34
+ end
35
+ else
36
+ dapp.with_log_indent do
37
+ dapp.log_warning("#{dapp.log_time}Unknown pod readiness condition reason '#{pod.ready_condition['reason']}': #{pod.ready_condition}", stream: dapp.service_stream)
38
+ end
39
+ end
40
+ end
41
+
42
+ def wait_till_launched!
43
+ loop do
44
+ pod = Kubernetes::Client::Resource::Pod.new(dapp.kubernetes.pod(name))
45
+
46
+ break if pod.phase != "Pending"
47
+
48
+ check_readiness_condition_if_available!(pod)
49
+
50
+ sleep 0.1
51
+ end
52
+ end
53
+
54
+ def watch_till_done!
55
+ process_queue = containers.map {|c| [c, nil]}
56
+ loop do
57
+ container, last_processed_at = process_queue.shift
58
+ break unless container
59
+
60
+ sleep 1 if last_processed_at and (Time.now - last_processed_at < 1)
61
+
62
+ container.watch_till_terminated!
63
+ process_queue.push([container, Time.now]) unless container.done?
64
+ end
65
+ end
66
+ end # Pod
67
+ end # Kubernetes::Manager
68
+ end # Kube
69
+ end # Dapp
@@ -0,0 +1,6 @@
1
+ module Dapp
2
+ module Kube
3
+ module Kubernetes
4
+ end # Kubernetes
5
+ end # Kube
6
+ end # Dapp
@@ -0,0 +1,93 @@
1
+ module Dapp
2
+ module Kube
3
+ class Secret
4
+ attr_reader :key
5
+
6
+ def initialize(key)
7
+ self.class._validate_key!(key)
8
+ @key = key
9
+ end
10
+
11
+ def generate(value)
12
+ cipher = self.class._openssl_cipher
13
+ cipher.encrypt
14
+ cipher.key = self.class._hex_to_binary key
15
+ iv = cipher.random_iv
16
+
17
+ iv_size_prefix = [iv.bytesize].pack('S')
18
+ encrypted = cipher.update(value.to_s) + cipher.final
19
+
20
+ self.class._binary_to_hex "#{iv_size_prefix}#{iv}#{encrypted}"
21
+ end
22
+
23
+ def extract(hexdata)
24
+ data = self.class._hex_to_binary hexdata.to_s
25
+
26
+ iv_size = data.unpack('S').first
27
+ data = data.byteslice(2..-1)
28
+ raise ExtractionError, code: :bad_data, data: {data: hexdata} unless data
29
+
30
+ iv = data.byteslice(0, iv_size)
31
+ data = data.byteslice(iv_size..-1)
32
+ raise ExtractionError, code: :bad_data, data: {data: hexdata} unless data
33
+
34
+ decipher = self.class._openssl_cipher
35
+ decipher.decrypt
36
+ decipher.key = self.class._hex_to_binary(key)
37
+
38
+ begin
39
+ decipher.iv = iv
40
+ rescue OpenSSL::Cipher::CipherError
41
+ raise ExtractionError, code: :bad_data, data: {data: hexdata}
42
+ end
43
+
44
+ begin
45
+ value = decipher.update(data) + decipher.final
46
+ rescue OpenSSL::Cipher::CipherError
47
+ raise ExtractionError, code: :bad_data, data: {data: hexdata}
48
+ end
49
+ value.force_encoding('utf-8')
50
+ end
51
+
52
+ class << self
53
+ def generate_key
54
+ _binary_to_hex _openssl_cipher.random_key
55
+ end
56
+
57
+ def _openssl_cipher
58
+ OpenSSL::Cipher::AES.new(128, :CBC)
59
+ end
60
+
61
+ def _hex_to_binary(key)
62
+ [key].pack('H*')
63
+ end
64
+
65
+ def _binary_to_hex(key)
66
+ key.unpack('H*').first
67
+ end
68
+
69
+ def _validate_key!(key)
70
+ # Требуется 128 битный ключ — это 16 байт.
71
+ # Ключ закодирован в hex кодировке для пользователя.
72
+ # 2 hex символа на 1 байт в hex кодировке.
73
+ # Поэтому требуется длина ключа в hex кодировке в 32 символа.
74
+ if key.bytesize < 32
75
+ raise InvalidKeyError, code: :key_length_too_short, data: {required_size: 32}
76
+ end
77
+ end
78
+ end
79
+
80
+ class Error < ::Dapp::Kube::Error::Default
81
+ def initialize(**net_status)
82
+ super(net_status.merge(context: :secret))
83
+ end
84
+ end
85
+
86
+ class InvalidKeyError < Error
87
+ end
88
+
89
+ class ExtractionError < Error
90
+ end
91
+ end
92
+ end
93
+ end
data/lib/dapp/kube.rb ADDED
@@ -0,0 +1 @@
1
+ module Dapp::Kube; end
data/lib/dapp/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.10.2'.freeze
3
- BUILD_CACHE_VERSION = 7
2
+ VERSION = "0.36.24"
3
+ BUILD_CACHE_VERSION = 33
4
4
  end