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.
- checksums.yaml +4 -4
- data/config/en/net_status.yml +36 -4
- data/lib/dapp.rb +84 -36
- data/lib/dapp/cli.rb +3 -2
- data/lib/dapp/cli/command/base.rb +69 -0
- data/lib/dapp/config/config.rb +17 -0
- data/lib/dapp/config/directive/base.rb +90 -3
- data/lib/dapp/dapp.rb +6 -14
- data/lib/dapp/dapp/dappfile.rb +20 -27
- data/lib/dapp/dapp/deps/base.rb +2 -2
- data/lib/dapp/dapp/lock.rb +1 -1
- data/lib/dapp/dapp/logging/base.rb +11 -7
- data/lib/dapp/dapp/logging/process.rb +4 -2
- data/lib/dapp/dapp/shellout/base.rb +2 -2
- data/lib/dapp/dapp/ssh_agent.rb +2 -2
- data/lib/dapp/deployment.rb +1 -0
- data/lib/dapp/deployment/app.rb +120 -0
- data/lib/dapp/deployment/cli/cli.rb +1 -0
- data/lib/dapp/deployment/cli/command/base.rb +14 -0
- data/lib/dapp/deployment/cli/command/deployment.rb +21 -0
- data/lib/dapp/deployment/cli/command/deployment/apply.rb +26 -0
- data/lib/dapp/deployment/cli/command/deployment/minikube_setup.rb +13 -0
- data/lib/dapp/deployment/cli/command/deployment/mrproper.rb +13 -0
- data/lib/dapp/deployment/cli/command/deployment/secret_generate.rb +13 -0
- data/lib/dapp/deployment/cli/command/deployment/secret_key_generate.rb +13 -0
- data/lib/dapp/deployment/config/config.rb +46 -0
- data/lib/dapp/deployment/config/directive/app.rb +28 -0
- data/lib/dapp/deployment/config/directive/app/instance_methods.rb +51 -0
- data/lib/dapp/deployment/config/directive/base.rb +13 -0
- data/lib/dapp/deployment/config/directive/deployment.rb +11 -0
- data/lib/dapp/deployment/config/directive/expose.rb +68 -0
- data/lib/dapp/deployment/config/directive/group.rb +27 -0
- data/lib/dapp/deployment/config/directive/job.rb +28 -0
- data/lib/dapp/deployment/config/directive/mod/group.rb +22 -0
- data/lib/dapp/deployment/config/directive/mod/jobs.rb +26 -0
- data/lib/dapp/deployment/config/directive/namespace.rb +26 -0
- data/lib/dapp/deployment/config/directive/namespace/instance_methods.rb +37 -0
- data/lib/dapp/deployment/core_ext/hash.rb +19 -0
- data/lib/dapp/deployment/dapp/command/apply.rb +83 -0
- data/lib/dapp/deployment/dapp/command/common.rb +17 -0
- data/lib/dapp/deployment/dapp/command/minikube_setup.rb +393 -0
- data/lib/dapp/deployment/dapp/command/mrproper.rb +12 -0
- data/lib/dapp/deployment/dapp/command/secret_generate.rb +17 -0
- data/lib/dapp/deployment/dapp/command/secret_key_generate.rb +13 -0
- data/lib/dapp/deployment/dapp/dapp.rb +18 -0
- data/lib/dapp/deployment/dapp/dappfile.rb +23 -0
- data/lib/dapp/deployment/deployment.rb +46 -0
- data/lib/dapp/deployment/error/app.rb +7 -0
- data/lib/dapp/deployment/error/base.rb +7 -0
- data/lib/dapp/deployment/error/command.rb +7 -0
- data/lib/dapp/deployment/error/config.rb +7 -0
- data/lib/dapp/deployment/error/deployment.rb +7 -0
- data/lib/dapp/deployment/error/kubernetes.rb +7 -0
- data/lib/dapp/deployment/kube_app.rb +277 -0
- data/lib/dapp/deployment/kube_base.rb +97 -0
- data/lib/dapp/deployment/kube_deployment.rb +51 -0
- data/lib/dapp/deployment/kubernetes.rb +174 -0
- data/lib/dapp/deployment/kubernetes/error.rb +20 -0
- data/lib/dapp/deployment/mod/jobs.rb +37 -0
- data/lib/dapp/deployment/mod/namespace.rb +58 -0
- data/lib/dapp/deployment/mod/system_environments.rb +30 -0
- data/lib/dapp/deployment/secret.rb +93 -0
- data/lib/dapp/dimg/artifact.rb +1 -1
- data/lib/dapp/dimg/build/stage/artifact_default.rb +35 -23
- data/lib/dapp/dimg/build/stage/base.rb +1 -1
- data/lib/dapp/dimg/build/stage/before_setup.rb +0 -2
- data/lib/dapp/dimg/build/stage/build_artifact.rb +0 -2
- data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +2 -2
- data/lib/dapp/dimg/build/stage/install/install.rb +0 -1
- data/lib/dapp/dimg/build/stage/setup/setup.rb +0 -1
- data/lib/dapp/dimg/cli/cli.rb +1 -1
- data/lib/dapp/dimg/cli/command/base.rb +14 -0
- data/lib/dapp/dimg/cli/{dimg.rb → command/dimg.rb} +5 -7
- data/lib/dapp/dimg/cli/{bp.rb → command/dimg/bp.rb} +3 -3
- data/lib/dapp/dimg/cli/{build.rb → command/dimg/build.rb} +3 -3
- data/lib/dapp/dimg/cli/{build_context.rb → command/dimg/build_context.rb} +3 -3
- data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/export.rb +4 -4
- data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/import.rb +4 -4
- data/lib/dapp/dimg/cli/{cleanup.rb → command/dimg/cleanup.rb} +3 -3
- data/lib/dapp/dimg/cli/{list.rb → command/dimg/list.rb} +3 -3
- data/lib/dapp/dimg/cli/{mrproper.rb → command/dimg/mrproper.rb} +4 -4
- data/lib/dapp/dimg/cli/{push.rb → command/dimg/push.rb} +5 -5
- data/lib/dapp/dimg/cli/{run.rb → command/dimg/run.rb} +8 -8
- data/lib/dapp/dimg/cli/{spush.rb → command/dimg/spush.rb} +4 -4
- data/lib/dapp/dimg/cli/{stage_image.rb → command/dimg/stage_image.rb} +3 -3
- data/lib/dapp/dimg/cli/{stages.rb → command/dimg/stages.rb} +3 -3
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_local.rb +6 -6
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_repo.rb +5 -5
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_local.rb +5 -5
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/flush_repo.rb +6 -6
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/pull.rb +6 -6
- data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/push.rb +6 -6
- data/lib/dapp/dimg/cli/{tag.rb → command/dimg/tag.rb} +6 -6
- data/lib/dapp/dimg/config/config.rb +20 -0
- data/lib/dapp/dimg/config/directive/artifact_dimg.rb +19 -0
- data/lib/dapp/dimg/config/directive/artifact_group.rb +45 -0
- data/lib/dapp/dimg/config/directive/dimg.rb +36 -0
- data/lib/dapp/dimg/config/directive/dimg/instance_methods.rb +149 -0
- data/lib/dapp/dimg/config/directive/dimg/validation.rb +128 -0
- data/lib/dapp/dimg/config/directive/dimg_group.rb +64 -0
- data/lib/dapp/dimg/config/directive/dimg_group_base.rb +46 -0
- data/lib/dapp/dimg/config/directive/docker/dimg.rb +4 -4
- data/lib/dapp/dimg/config/directive/shell/dimg.rb +1 -1
- data/lib/dapp/dimg/dapp/command/bp.rb +4 -4
- data/lib/dapp/dimg/dapp/command/build.rb +2 -2
- data/lib/dapp/dimg/dapp/command/build_context/common.rb +2 -2
- data/lib/dapp/dimg/dapp/command/build_context/export.rb +1 -1
- data/lib/dapp/dimg/dapp/command/build_context/import.rb +1 -1
- data/lib/dapp/dimg/dapp/command/cleanup.rb +1 -1
- data/lib/dapp/dimg/dapp/command/common.rb +19 -4
- data/lib/dapp/dimg/dapp/command/list.rb +1 -1
- data/lib/dapp/dimg/dapp/command/mrproper.rb +3 -3
- data/lib/dapp/dimg/dapp/command/push.rb +6 -5
- data/lib/dapp/dimg/dapp/command/run.rb +1 -1
- data/lib/dapp/dimg/dapp/command/spush.rb +4 -3
- data/lib/dapp/dimg/dapp/command/stage_image.rb +2 -2
- data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +1 -1
- data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +3 -3
- data/lib/dapp/dimg/dapp/command/stages/common.rb +4 -4
- data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +1 -1
- data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +1 -1
- data/lib/dapp/dimg/dapp/command/stages/pull.rb +5 -4
- data/lib/dapp/dimg/dapp/command/stages/push.rb +4 -3
- data/lib/dapp/dimg/dapp/command/tag.rb +3 -2
- data/lib/dapp/dimg/dapp/dapp.rb +33 -0
- data/lib/dapp/dimg/dapp/dappfile.rb +25 -0
- data/lib/dapp/dimg/dimg.rb +3 -3
- data/lib/dapp/dimg/dimg/path.rb +1 -1
- data/lib/dapp/dimg/dimg/stages.rb +1 -1
- data/lib/dapp/dimg/dimg/tags.rb +5 -5
- data/lib/dapp/dimg/docker_registry.rb +3 -7
- data/lib/dapp/dimg/git_artifact.rb +30 -14
- data/lib/dapp/dimg/git_repo/base.rb +13 -1
- data/lib/dapp/dimg/git_repo/own.rb +9 -1
- data/lib/dapp/dimg/image/docker.rb +9 -3
- data/lib/dapp/helper/cli.rb +3 -1
- data/lib/dapp/helper/net_status.rb +5 -1
- data/lib/dapp/helper/trivia.rb +1 -1
- data/lib/dapp/version.rb +2 -2
- metadata +84 -38
- data/lib/dapp/cli/base.rb +0 -63
- data/lib/dapp/config/base.rb +0 -54
- data/lib/dapp/dimg/build/stage/mod/git_artifact_dependencies.rb +0 -23
- data/lib/dapp/dimg/cli/base.rb +0 -16
- data/lib/dapp/dimg/config/artifact_dimg.rb +0 -17
- data/lib/dapp/dimg/config/artifact_group.rb +0 -43
- data/lib/dapp/dimg/config/base.rb +0 -7
- data/lib/dapp/dimg/config/dimg.rb +0 -24
- data/lib/dapp/dimg/config/dimg/instance_methods.rb +0 -179
- data/lib/dapp/dimg/config/dimg/validation.rb +0 -126
- data/lib/dapp/dimg/config/dimg_group.rb +0 -61
- data/lib/dapp/dimg/config/dimg_group_base.rb +0 -54
- data/lib/dapp/dimg/config/dimg_group_main.rb +0 -22
- data/lib/dapp/dimg/dapp/command.rb +0 -21
@@ -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,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,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
|