dapp 0.11.0 → 0.12.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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/config/en/net_status.yml +36 -4
  3. data/lib/dapp.rb +84 -36
  4. data/lib/dapp/cli.rb +3 -2
  5. data/lib/dapp/cli/command/base.rb +69 -0
  6. data/lib/dapp/config/config.rb +17 -0
  7. data/lib/dapp/config/directive/base.rb +90 -3
  8. data/lib/dapp/dapp.rb +6 -14
  9. data/lib/dapp/dapp/dappfile.rb +20 -27
  10. data/lib/dapp/dapp/deps/base.rb +2 -2
  11. data/lib/dapp/dapp/lock.rb +1 -1
  12. data/lib/dapp/dapp/logging/base.rb +11 -7
  13. data/lib/dapp/dapp/logging/process.rb +4 -2
  14. data/lib/dapp/dapp/shellout/base.rb +2 -2
  15. data/lib/dapp/dapp/ssh_agent.rb +2 -2
  16. data/lib/dapp/deployment.rb +1 -0
  17. data/lib/dapp/deployment/app.rb +120 -0
  18. data/lib/dapp/deployment/cli/cli.rb +1 -0
  19. data/lib/dapp/deployment/cli/command/base.rb +14 -0
  20. data/lib/dapp/deployment/cli/command/deployment.rb +21 -0
  21. data/lib/dapp/deployment/cli/command/deployment/apply.rb +26 -0
  22. data/lib/dapp/deployment/cli/command/deployment/minikube_setup.rb +13 -0
  23. data/lib/dapp/deployment/cli/command/deployment/mrproper.rb +13 -0
  24. data/lib/dapp/deployment/cli/command/deployment/secret_generate.rb +13 -0
  25. data/lib/dapp/deployment/cli/command/deployment/secret_key_generate.rb +13 -0
  26. data/lib/dapp/deployment/config/config.rb +46 -0
  27. data/lib/dapp/deployment/config/directive/app.rb +28 -0
  28. data/lib/dapp/deployment/config/directive/app/instance_methods.rb +51 -0
  29. data/lib/dapp/deployment/config/directive/base.rb +13 -0
  30. data/lib/dapp/deployment/config/directive/deployment.rb +11 -0
  31. data/lib/dapp/deployment/config/directive/expose.rb +68 -0
  32. data/lib/dapp/deployment/config/directive/group.rb +27 -0
  33. data/lib/dapp/deployment/config/directive/job.rb +28 -0
  34. data/lib/dapp/deployment/config/directive/mod/group.rb +22 -0
  35. data/lib/dapp/deployment/config/directive/mod/jobs.rb +26 -0
  36. data/lib/dapp/deployment/config/directive/namespace.rb +26 -0
  37. data/lib/dapp/deployment/config/directive/namespace/instance_methods.rb +37 -0
  38. data/lib/dapp/deployment/core_ext/hash.rb +19 -0
  39. data/lib/dapp/deployment/dapp/command/apply.rb +83 -0
  40. data/lib/dapp/deployment/dapp/command/common.rb +17 -0
  41. data/lib/dapp/deployment/dapp/command/minikube_setup.rb +393 -0
  42. data/lib/dapp/deployment/dapp/command/mrproper.rb +12 -0
  43. data/lib/dapp/deployment/dapp/command/secret_generate.rb +17 -0
  44. data/lib/dapp/deployment/dapp/command/secret_key_generate.rb +13 -0
  45. data/lib/dapp/deployment/dapp/dapp.rb +18 -0
  46. data/lib/dapp/deployment/dapp/dappfile.rb +23 -0
  47. data/lib/dapp/deployment/deployment.rb +46 -0
  48. data/lib/dapp/deployment/error/app.rb +7 -0
  49. data/lib/dapp/deployment/error/base.rb +7 -0
  50. data/lib/dapp/deployment/error/command.rb +7 -0
  51. data/lib/dapp/deployment/error/config.rb +7 -0
  52. data/lib/dapp/deployment/error/deployment.rb +7 -0
  53. data/lib/dapp/deployment/error/kubernetes.rb +7 -0
  54. data/lib/dapp/deployment/kube_app.rb +277 -0
  55. data/lib/dapp/deployment/kube_base.rb +97 -0
  56. data/lib/dapp/deployment/kube_deployment.rb +51 -0
  57. data/lib/dapp/deployment/kubernetes.rb +174 -0
  58. data/lib/dapp/deployment/kubernetes/error.rb +20 -0
  59. data/lib/dapp/deployment/mod/jobs.rb +37 -0
  60. data/lib/dapp/deployment/mod/namespace.rb +58 -0
  61. data/lib/dapp/deployment/mod/system_environments.rb +30 -0
  62. data/lib/dapp/deployment/secret.rb +93 -0
  63. data/lib/dapp/dimg/artifact.rb +1 -1
  64. data/lib/dapp/dimg/build/stage/artifact_default.rb +35 -23
  65. data/lib/dapp/dimg/build/stage/base.rb +1 -1
  66. data/lib/dapp/dimg/build/stage/before_setup.rb +0 -2
  67. data/lib/dapp/dimg/build/stage/build_artifact.rb +0 -2
  68. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +2 -2
  69. data/lib/dapp/dimg/build/stage/install/install.rb +0 -1
  70. data/lib/dapp/dimg/build/stage/setup/setup.rb +0 -1
  71. data/lib/dapp/dimg/cli/cli.rb +1 -1
  72. data/lib/dapp/dimg/cli/command/base.rb +14 -0
  73. data/lib/dapp/dimg/cli/{dimg.rb → command/dimg.rb} +5 -7
  74. data/lib/dapp/dimg/cli/{bp.rb → command/dimg/bp.rb} +3 -3
  75. data/lib/dapp/dimg/cli/{build.rb → command/dimg/build.rb} +3 -3
  76. data/lib/dapp/dimg/cli/{build_context.rb → command/dimg/build_context.rb} +3 -3
  77. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/export.rb +4 -4
  78. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/import.rb +4 -4
  79. data/lib/dapp/dimg/cli/{cleanup.rb → command/dimg/cleanup.rb} +3 -3
  80. data/lib/dapp/dimg/cli/{list.rb → command/dimg/list.rb} +3 -3
  81. data/lib/dapp/dimg/cli/{mrproper.rb → command/dimg/mrproper.rb} +4 -4
  82. data/lib/dapp/dimg/cli/{push.rb → command/dimg/push.rb} +5 -5
  83. data/lib/dapp/dimg/cli/{run.rb → command/dimg/run.rb} +8 -8
  84. data/lib/dapp/dimg/cli/{spush.rb → command/dimg/spush.rb} +4 -4
  85. data/lib/dapp/dimg/cli/{stage_image.rb → command/dimg/stage_image.rb} +3 -3
  86. data/lib/dapp/dimg/cli/{stages.rb → command/dimg/stages.rb} +3 -3
  87. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_local.rb +6 -6
  88. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_repo.rb +5 -5
  89. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_local.rb +5 -5
  90. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_repo.rb +6 -6
  91. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/pull.rb +6 -6
  92. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/push.rb +6 -6
  93. data/lib/dapp/dimg/cli/{tag.rb → command/dimg/tag.rb} +6 -6
  94. data/lib/dapp/dimg/config/config.rb +20 -0
  95. data/lib/dapp/dimg/config/directive/artifact_dimg.rb +19 -0
  96. data/lib/dapp/dimg/config/directive/artifact_group.rb +45 -0
  97. data/lib/dapp/dimg/config/directive/dimg.rb +36 -0
  98. data/lib/dapp/dimg/config/directive/dimg/instance_methods.rb +149 -0
  99. data/lib/dapp/dimg/config/directive/dimg/validation.rb +128 -0
  100. data/lib/dapp/dimg/config/directive/dimg_group.rb +64 -0
  101. data/lib/dapp/dimg/config/directive/dimg_group_base.rb +46 -0
  102. data/lib/dapp/dimg/config/directive/docker/dimg.rb +4 -4
  103. data/lib/dapp/dimg/config/directive/shell/dimg.rb +1 -1
  104. data/lib/dapp/dimg/dapp/command/bp.rb +4 -4
  105. data/lib/dapp/dimg/dapp/command/build.rb +2 -2
  106. data/lib/dapp/dimg/dapp/command/build_context/common.rb +2 -2
  107. data/lib/dapp/dimg/dapp/command/build_context/export.rb +1 -1
  108. data/lib/dapp/dimg/dapp/command/build_context/import.rb +1 -1
  109. data/lib/dapp/dimg/dapp/command/cleanup.rb +1 -1
  110. data/lib/dapp/dimg/dapp/command/common.rb +19 -4
  111. data/lib/dapp/dimg/dapp/command/list.rb +1 -1
  112. data/lib/dapp/dimg/dapp/command/mrproper.rb +3 -3
  113. data/lib/dapp/dimg/dapp/command/push.rb +6 -5
  114. data/lib/dapp/dimg/dapp/command/run.rb +1 -1
  115. data/lib/dapp/dimg/dapp/command/spush.rb +4 -3
  116. data/lib/dapp/dimg/dapp/command/stage_image.rb +2 -2
  117. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +1 -1
  118. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +3 -3
  119. data/lib/dapp/dimg/dapp/command/stages/common.rb +4 -4
  120. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +1 -1
  121. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +1 -1
  122. data/lib/dapp/dimg/dapp/command/stages/pull.rb +5 -4
  123. data/lib/dapp/dimg/dapp/command/stages/push.rb +4 -3
  124. data/lib/dapp/dimg/dapp/command/tag.rb +3 -2
  125. data/lib/dapp/dimg/dapp/dapp.rb +33 -0
  126. data/lib/dapp/dimg/dapp/dappfile.rb +25 -0
  127. data/lib/dapp/dimg/dimg.rb +3 -3
  128. data/lib/dapp/dimg/dimg/path.rb +1 -1
  129. data/lib/dapp/dimg/dimg/stages.rb +1 -1
  130. data/lib/dapp/dimg/dimg/tags.rb +5 -5
  131. data/lib/dapp/dimg/docker_registry.rb +3 -7
  132. data/lib/dapp/dimg/git_artifact.rb +30 -14
  133. data/lib/dapp/dimg/git_repo/base.rb +13 -1
  134. data/lib/dapp/dimg/git_repo/own.rb +9 -1
  135. data/lib/dapp/dimg/image/docker.rb +9 -3
  136. data/lib/dapp/helper/cli.rb +3 -1
  137. data/lib/dapp/helper/net_status.rb +5 -1
  138. data/lib/dapp/helper/trivia.rb +1 -1
  139. data/lib/dapp/version.rb +2 -2
  140. metadata +84 -38
  141. data/lib/dapp/cli/base.rb +0 -63
  142. data/lib/dapp/config/base.rb +0 -54
  143. data/lib/dapp/dimg/build/stage/mod/git_artifact_dependencies.rb +0 -23
  144. data/lib/dapp/dimg/cli/base.rb +0 -16
  145. data/lib/dapp/dimg/config/artifact_dimg.rb +0 -17
  146. data/lib/dapp/dimg/config/artifact_group.rb +0 -43
  147. data/lib/dapp/dimg/config/base.rb +0 -7
  148. data/lib/dapp/dimg/config/dimg.rb +0 -24
  149. data/lib/dapp/dimg/config/dimg/instance_methods.rb +0 -179
  150. data/lib/dapp/dimg/config/dimg/validation.rb +0 -126
  151. data/lib/dapp/dimg/config/dimg_group.rb +0 -61
  152. data/lib/dapp/dimg/config/dimg_group_base.rb +0 -54
  153. data/lib/dapp/dimg/config/dimg_group_main.rb +0 -22
  154. data/lib/dapp/dimg/dapp/command.rb +0 -21
@@ -0,0 +1,12 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Dapp
4
+ module Command
5
+ module Mrproper
6
+ def deployment_mrproper
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Dapp
4
+ module Command
5
+ module SecretGenerate
6
+ def deployment_secret_generate
7
+ raise Error::Command, code: :secret_key_not_found if secret.nil?
8
+ unless (data = $stdin.gets(nil)).nil?
9
+ puts unless data.end_with?("\n")
10
+ puts secret.generate(data)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Dapp
4
+ module Command
5
+ module SecretKeyGenerate
6
+ def deployment_secret_key_generate
7
+ puts Secret.generate_key
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Dapp
4
+ module Dapp
5
+ include Command::Apply
6
+ include Command::SecretKeyGenerate
7
+ include Command::SecretGenerate
8
+ include Command::MinikubeSetup
9
+ include Command::Mrproper
10
+ include Command::Common
11
+
12
+ include Dappfile
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ ::Dapp::Dapp.send(:include, ::Dapp::Deployment::Dapp::Dapp)
@@ -0,0 +1,23 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Dapp
4
+ module Dappfile
5
+ def apps_configs
6
+ @apps_configs ||= begin
7
+ config._app.select do |app|
8
+ apps_patterns.any? { |pattern| app._name.nil? || File.fnmatch(pattern, app._name) }
9
+ end.tap do |apps|
10
+ raise ::Dapp::Error::Dapp, code: :no_such_app, data: { apps_patterns: apps_patterns.join(', ') } if apps.empty?
11
+ end
12
+ end
13
+ end
14
+
15
+ def apps_patterns
16
+ @apps_patterns ||= (options[:apps_patterns] || []).tap do |patterns|
17
+ patterns << '*' unless patterns.any?
18
+ end
19
+ end
20
+ end # Dappfile
21
+ end # Dapp
22
+ end # Dimg
23
+ end # Dapp
@@ -0,0 +1,46 @@
1
+ module Dapp
2
+ module Deployment
3
+ class Deployment
4
+ include Mod::Namespace
5
+ include Mod::SystemEnvironments
6
+ include Mod::Jobs
7
+
8
+ attr_reader :dapp
9
+
10
+ def initialize(dapp:)
11
+ @dapp = dapp
12
+ end
13
+
14
+ def name(*args)
15
+ [dapp.name, *args].flatten.compact.join('-').gsub('_', '-')
16
+ end
17
+
18
+ def kube
19
+ @kube ||= KubeDeployment.new(self)
20
+ end
21
+
22
+ def apps
23
+ @apps ||= dapp.apps_configs.map { |app_config| App.new(app_config: app_config, deployment: self) }
24
+ end
25
+
26
+ def namespace
27
+ dapp.options[:namespace] || ENV['DAPP_NAMESPACE']
28
+ end
29
+
30
+ def kubernetes
31
+ @kubernetes ||= Kubernetes.new(namespace: namespace)
32
+ end
33
+
34
+ protected
35
+
36
+ def deployment_config
37
+ dapp.config._deployment
38
+ end
39
+ alias config deployment_config
40
+
41
+ def secret
42
+ dapp.secret
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class App < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class Base < ::Dapp::Error::Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class Command < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class Config < ::Dapp::Config::Error::Config; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class Deployment < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Dapp
2
+ module Deployment
3
+ module Error
4
+ class Kubernetes < Base; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,277 @@
1
+ module Dapp
2
+ module Deployment
3
+ class KubeApp < KubeBase
4
+ module Error
5
+ class Base < ::Dapp::Deployment::Error::Deployment
6
+ def initialize(**net_status)
7
+ super(**net_status, context: :kube_app)
8
+ end
9
+ end
10
+ end
11
+
12
+ attr_reader :app
13
+
14
+ def initialize(app)
15
+ @app = app
16
+ end
17
+
18
+ def deployment
19
+ app.deployment
20
+ end
21
+
22
+ def labels
23
+ deployment.kube.labels.merge('dapp-app' => app.name)
24
+ end
25
+
26
+ [[:deployment, 'Deployment'], [:service, 'Service']].each do |(type, resource_name)|
27
+ define_method "#{type}_exist?" do |name|
28
+ public_send("existing_#{type}s_names").include?(name)
29
+ end
30
+
31
+ define_method "existing_#{type}s_names" do
32
+ deployment.kubernetes.public_send(:"#{type}_list", labelSelector: labelSelector)['items'].map do |item|
33
+ item['metadata']['name']
34
+ end
35
+ end
36
+
37
+ define_method "#{type}_spec_changed?" do |name, spec|
38
+ current_spec = deployment.kubernetes.public_send(type, name)
39
+ current_spec != send(:"merge_kube_#{type}_spec", current_spec, spec)
40
+ end
41
+
42
+ define_method "delete_#{type}!" do |*args|
43
+ deployment.kubernetes.public_send(:"delete_#{type}!", *args)
44
+ end
45
+
46
+ define_method "apply_#{type}!" do |name, spec|
47
+ if app.kube.send(:"#{type}_exist?", name)
48
+ if app.kube.send(:"#{type}_spec_changed?", name, spec)
49
+ app.kube.send(:"replace_#{type}!", name, spec)
50
+ else
51
+ app.deployment.dapp.log_step("Kubernetes #{resource_name} #{name} is up to date")
52
+ end
53
+ else
54
+ app.kube.send(:"create_#{type}!", spec)
55
+ end
56
+ end
57
+ end
58
+
59
+ def create_service!(conf_spec)
60
+ srv = nil
61
+ app.deployment.dapp.log_process("Creating kubernetes Service #{conf_spec['metadata']['name']}") do
62
+ srv = app.deployment.kubernetes.create_service!(conf_spec)
63
+ end
64
+ _dump_service_info srv
65
+ end
66
+
67
+ def replace_service!(name, conf_spec)
68
+ srv = nil
69
+ app.deployment.dapp.log_process("Replacing kubernetes Service #{name}") do
70
+ old_spec = deployment.kubernetes.service(name)
71
+ new_spec = merge_kube_service_spec(old_spec, conf_spec)
72
+ srv = app.deployment.kubernetes.replace_service!(name, new_spec)
73
+ end
74
+ _dump_service_info srv
75
+ end
76
+
77
+ def _dump_service_info(srv)
78
+ app.deployment.dapp.with_log_indent do
79
+ app.deployment.dapp.log_info("type: #{srv['spec']['type']}")
80
+ app.deployment.dapp.log_info("clusterIP: #{srv['spec']['clusterIP']}")
81
+
82
+ srv['spec'].fetch('ports', []).each do |port|
83
+ app.deployment.dapp.log_info("Port #{port['port']}:")
84
+ app.deployment.dapp.with_log_indent do
85
+ %w(protocol targetPort nodePort).each do |field_name|
86
+ app.deployment.dapp.log_info("#{field_name}: #{_field_value_for_log(port[field_name])}")
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ def create_deployment!(conf_spec)
94
+ d = nil
95
+ app.deployment.dapp.log_process("Creating kubernetes Deployment #{conf_spec['metadata']['name']}") do
96
+ d = app.deployment.kubernetes.create_deployment!(conf_spec)
97
+ end
98
+ _wait_for_deployment(d)
99
+ end
100
+
101
+ def replace_deployment!(name, conf_spec)
102
+ d = nil
103
+ old_d_revision = nil
104
+ app.deployment.dapp.log_process("Replacing kubernetes Deployment #{name}") do
105
+ old_spec = deployment.kubernetes.deployment(name)
106
+ old_d_revision = old_spec.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
107
+ new_spec = merge_kube_deployment_spec(old_spec, conf_spec)
108
+ new_spec.fetch('metadata', {}).fetch('annotations', {}).delete('deployment.kubernetes.io/revision')
109
+ d = app.deployment.kubernetes.replace_deployment!(name, new_spec)
110
+ end
111
+ _wait_for_deployment(d, old_d_revision: old_d_revision)
112
+ end
113
+
114
+ # NOTICE: old_d_revision на данный момент выводится на экран как информация для дебага.
115
+ # NOTICE: deployment.kubernetes.io/revision не меняется при изменении количества реплик, поэтому
116
+ # NOTICE: критерий ожидания по изменению ревизии не верен.
117
+ # NOTICE: Однако, при обновлении deployment ревизия сбрасывается и ожидание переустановки этой ревизии
118
+ # NOTICE: является одним из критериев завершения ожидания на данный момент.
119
+ def _wait_for_deployment(d, old_d_revision: nil)
120
+ app.deployment.dapp.log_process("Waiting for kubernetes Deployment #{d['metadata']['name']} readiness", verbose: true) do
121
+ app.deployment.dapp.with_log_indent do
122
+ known_events_by_pod = {}
123
+
124
+ loop do
125
+ d_revision = d.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
126
+
127
+ app.deployment.dapp.log_step("[#{Time.now}] Poll kubernetes Deployment status")
128
+ app.deployment.dapp.with_log_indent do
129
+ app.deployment.dapp.log_info("Target replicas: #{_field_value_for_log(d['spec']['replicas'])}")
130
+ app.deployment.dapp.log_info("Updated replicas: #{_field_value_for_log(d['status']['updatedReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
131
+ app.deployment.dapp.log_info("Available replicas: #{_field_value_for_log(d['status']['availableReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
132
+ app.deployment.dapp.log_info("Ready replicas: #{_field_value_for_log(d['status']['readyReplicas'])} / #{_field_value_for_log(d['spec']['replicas'])}")
133
+ app.deployment.dapp.log_info("Old deployment.kubernetes.io/revision: #{_field_value_for_log(old_d_revision)}")
134
+ app.deployment.dapp.log_info("Current deployment.kubernetes.io/revision: #{_field_value_for_log(d_revision)}")
135
+ end
136
+
137
+ rs = nil
138
+ if d_revision
139
+ # Находим актуальный, текущий ReplicaSet.
140
+ # Если такая ситуация, когда есть несколько подходящих по revision ReplicaSet, то берем старейший по дате создания.
141
+ # Также делает kubectl: https://github.com/kubernetes/kubernetes/blob/d86a01570ba243e8d75057415113a0ff4d68c96b/pkg/controller/deployment/util/deployment_util.go#L664
142
+ rs = app.deployment.kubernetes.replicaset_list['items']
143
+ .select do |_rs|
144
+ Array(_rs['metadata']['ownerReferences']).any? do |owner_reference|
145
+ owner_reference['uid'] == d['metadata']['uid']
146
+ end
147
+ end
148
+ .select do |_rs|
149
+ rs_revision = _rs.fetch('metadata', {}).fetch('annotations', {}).fetch('deployment.kubernetes.io/revision', nil)
150
+ (rs_revision and (d_revision == rs_revision))
151
+ end
152
+ .sort_by do |_rs|
153
+ Time.parse _rs['metadata']['creationTimestamp']
154
+ end.first
155
+ end
156
+
157
+ if rs
158
+ # Pod'ы связанные с активным ReplicaSet
159
+ rs_pods = app.deployment.kubernetes
160
+ .pod_list(labelSelector: labels.map{|k, v| "#{k}=#{v}"}.join(','))['items']
161
+ .select do |pod|
162
+ Array(pod['metadata']['ownerReferences']).any? do |owner_reference|
163
+ owner_reference['uid'] == rs['metadata']['uid']
164
+ end
165
+ end
166
+
167
+ app.deployment.dapp.with_log_indent do
168
+ app.deployment.dapp.log_info("Pods:") if rs_pods.any?
169
+
170
+ rs_pods.each do |pod|
171
+ app.deployment.dapp.with_log_indent do
172
+ app.deployment.dapp.log_info("* #{pod['metadata']['name']}")
173
+
174
+ known_events_by_pod[pod['metadata']['name']] ||= []
175
+ pod_events = app.deployment.kubernetes
176
+ .event_list(fieldSelector: "involvedObject.uid=#{pod['metadata']['uid']}")['items']
177
+ .reject do |event|
178
+ known_events_by_pod[pod['metadata']['name']].include? event['metadata']['uid']
179
+ end
180
+
181
+ if pod_events.any?
182
+ pod_events.each do |event|
183
+ app.deployment.dapp.with_log_indent do
184
+ app.deployment.dapp.log_info("[#{event['metadata']['creationTimestamp']}] #{event['message']}")
185
+ end
186
+ known_events_by_pod[pod['metadata']['name']] << event['metadata']['uid']
187
+ end
188
+ end
189
+
190
+ ready_condition = pod['status'].fetch('conditions', {}).find {|condition| condition['type'] == 'Ready'}
191
+ next if (not ready_condition) or (ready_condition['status'] == 'True')
192
+
193
+ if ready_condition['reason'] == 'ContainersNotReady'
194
+ Array(pod['status']['containerStatuses']).each do |container_status|
195
+ next if container_status['ready']
196
+
197
+ waiting_reason = container_status.fetch('state', {}).fetch('waiting', {}).fetch('reason', nil)
198
+ case waiting_reason
199
+ when 'ImagePullBackOff', 'ErrImagePull'
200
+ raise Error::Base,
201
+ code: :image_not_found,
202
+ data: {app: app.name,
203
+ pod_name: pod['metadata']['name'],
204
+ reason: container_status['state']['waiting']['reason'],
205
+ message: container_status['state']['waiting']['message']}
206
+ when 'CrashLoopBackOff'
207
+ raise Error::Base,
208
+ code: :container_crash,
209
+ data: {app: app.name,
210
+ pod_name: pod['metadata']['name'],
211
+ reason: container_status['state']['waiting']['reason'],
212
+ message: container_status['state']['waiting']['message']}
213
+ end
214
+ end
215
+ else
216
+ app.deployment.dapp.with_log_indent do
217
+ app.deployment.dapp.log_warning("Unknown pod readiness condition reason '#{ready_condition['reason']}': #{ready_condition}")
218
+ end
219
+ end
220
+ end # with_log_indent
221
+ end # rs_pods.each
222
+ end # with_log_indent
223
+ end
224
+
225
+ break if begin
226
+ d_revision and
227
+ d['spec']['replicas'] and
228
+ d['status']['updatedReplicas'] and
229
+ d['status']['availableReplicas'] and
230
+ d['status']['readyReplicas'] and
231
+ (d['status']['updatedReplicas'] >= d['spec']['replicas']) and
232
+ (d['status']['availableReplicas'] >= d['spec']['replicas']) and
233
+ (d['status']['readyReplicas'] >= d['spec']['replicas'])
234
+ end
235
+
236
+ sleep 1
237
+ d = app.deployment.kubernetes.deployment(d['metadata']['name'])
238
+ end
239
+ end # with_log_indent
240
+ end
241
+ end
242
+
243
+ def _field_value_for_log(value)
244
+ value ? value : '-'
245
+ end
246
+
247
+ def merge_kube_deployment_spec(spec1, spec2)
248
+ merge_kube_controller_spec(spec1, spec2)
249
+ end
250
+
251
+ def merge_kube_service_spec(spec1, spec2)
252
+ spec1.kube_in_depth_merge(spec2).tap do |spec|
253
+ spec['metadata'] ||= {}
254
+ metadata_labels = spec2.fetch('metadata', {}).fetch('labels', nil)
255
+ spec['metadata']['labels'] = metadata_labels if metadata_labels
256
+
257
+ spec['spec'] ||= {}
258
+ spec_selector = spec2.fetch('spec', {}).fetch('selector', nil)
259
+ spec['spec']['selector'] = spec_selector if spec_selector
260
+ spec['spec']['ports'] = begin
261
+ ports1 = spec1.fetch('spec', {}).fetch('ports', [])
262
+ ports2 = spec2.fetch('spec', {}).fetch('ports', [])
263
+ ports2.map do |port2|
264
+ if (port1 = ports1.find { |p| p['name'] == port2['name'] }).nil?
265
+ port2
266
+ else
267
+ port = port1.merge(port2)
268
+ port.delete('nodePort') if spec['spec']['type'] == 'ClusterIP'
269
+ port
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end
275
+ end
276
+ end
277
+ end