kuber_kit 0.2.7 → 0.3.2
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/Gemfile.lock +15 -13
- data/TODO.md +5 -7
- data/example/app_data/docker_compose.yml +6 -0
- data/example/config.rb +3 -0
- data/example/configurations/review.rb +1 -1
- data/example/images/ruby_app/Dockerfile +1 -1
- data/example/images/ruby_app/image.rb +3 -0
- data/example/infrastructure/build_servers.rb +5 -5
- data/example/infrastructure/templates.rb +5 -0
- data/example/services/compose_app.rb +10 -0
- data/example/services/env_file.rb +1 -1
- data/lib/kuber_kit.rb +22 -3
- data/lib/kuber_kit/actions/configuration_loader.rb +19 -1
- data/lib/kuber_kit/actions/kubectl_applier.rb +2 -2
- data/lib/kuber_kit/actions/kubectl_attacher.rb +2 -2
- data/lib/kuber_kit/actions/template_reader.rb +3 -6
- data/lib/kuber_kit/configs.rb +63 -32
- data/lib/kuber_kit/container.rb +14 -2
- data/lib/kuber_kit/core/configuration.rb +19 -8
- data/lib/kuber_kit/core/configuration_definition.rb +30 -10
- data/lib/kuber_kit/core/configuration_factory.rb +11 -10
- data/lib/kuber_kit/core/context_helper/base_helper.rb +4 -0
- data/lib/kuber_kit/core/context_helper/context_helper_factory.rb +3 -2
- data/lib/kuber_kit/core/context_helper/context_vars.rb +39 -0
- data/lib/kuber_kit/core/context_helper/image_helper.rb +17 -0
- data/lib/kuber_kit/core/image.rb +3 -1
- data/lib/kuber_kit/core/image_definition.rb +7 -5
- data/lib/kuber_kit/core/service.rb +4 -4
- data/lib/kuber_kit/core/service_definition.rb +3 -3
- data/lib/kuber_kit/core/service_factory.rb +6 -6
- data/lib/kuber_kit/env_file_reader/reader.rb +10 -6
- data/lib/kuber_kit/extensions/indocker_compat.rb +4 -0
- data/lib/kuber_kit/image_compiler/compiler.rb +1 -1
- data/lib/kuber_kit/service_deployer/deployer.rb +14 -8
- data/lib/kuber_kit/service_deployer/strategies/docker_compose.rb +24 -0
- data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +6 -6
- data/lib/kuber_kit/service_deployer/strategies/kubernetes_runner.rb +7 -7
- data/lib/kuber_kit/service_deployer/strategy_detector.rb +1 -1
- data/lib/kuber_kit/shell/abstract_shell.rb +4 -0
- data/lib/kuber_kit/shell/commands/docker_commands.rb +14 -0
- data/lib/kuber_kit/shell/commands/docker_compose_commands.rb +17 -0
- data/lib/kuber_kit/shell/commands/kubectl_commands.rb +5 -6
- data/lib/kuber_kit/shell/local_shell.rb +14 -0
- data/lib/kuber_kit/shell/ssh_shell.rb +4 -0
- data/lib/kuber_kit/template_reader/action_handler.rb +13 -0
- data/lib/kuber_kit/template_reader/reader.rb +13 -9
- data/lib/kuber_kit/template_reader/{abstract_template_reader.rb → strategies/abstract.rb} +1 -1
- data/lib/kuber_kit/template_reader/{artifact_file_reader.rb → strategies/artifact_file.rb} +1 -1
- data/lib/kuber_kit/version.rb +1 -1
- metadata +11 -4
@@ -0,0 +1,24 @@
|
|
1
|
+
class KuberKit::ServiceDeployer::Strategies::DockerCompose < KuberKit::ServiceDeployer::Strategies::Abstract
|
2
|
+
include KuberKit::Import[
|
3
|
+
"service_reader.reader",
|
4
|
+
"shell.docker_compose_commands",
|
5
|
+
"configs",
|
6
|
+
]
|
7
|
+
|
8
|
+
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
|
9
|
+
def deploy(shell, service)
|
10
|
+
service_config = reader.read(shell, service)
|
11
|
+
config_path = "#{configs.service_config_dir}/#{service.name}.yml"
|
12
|
+
shell.write(config_path, service_config)
|
13
|
+
|
14
|
+
deployer_service_name = service.attribute(:deployer_service_name, default: service.name.to_s)
|
15
|
+
deployer_command_name = service.attribute(:deployer_command_name, default: "bash")
|
16
|
+
deployer_interactive = service.attribute(:deployer_interactive, default: false)
|
17
|
+
|
18
|
+
docker_compose_commands.run(shell, config_path,
|
19
|
+
service: deployer_service_name,
|
20
|
+
command: deployer_command_name,
|
21
|
+
interactive: deployer_interactive
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
@@ -12,14 +12,14 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
|
|
12
12
|
shell.write(config_path, service_config)
|
13
13
|
|
14
14
|
kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
|
15
|
-
|
15
|
+
deployer_namespace = KuberKit.current_configuration.deployer_namespace
|
16
16
|
|
17
|
-
kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace:
|
17
|
+
kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
if
|
22
|
-
kubectl_commands.rolling_restart(shell,
|
19
|
+
deployer_restart_enabled = service.attribute(:deployer_restart_enabled, default: true)
|
20
|
+
deployer_restart_name = service.attribute(:deployer_restart_name, default: service.uri)
|
21
|
+
if deployer_restart_enabled
|
22
|
+
kubectl_commands.rolling_restart(shell, deployer_restart_name, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -12,17 +12,17 @@ class KuberKit::ServiceDeployer::Strategies::KubernetesRunner < KuberKit::Servic
|
|
12
12
|
shell.write(config_path, service_config)
|
13
13
|
|
14
14
|
kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
|
15
|
-
|
15
|
+
deployer_namespace = KuberKit.current_configuration.deployer_namespace
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
deployer_resource_name = service.attribute(:deployer_resource_name, default: service.uri)
|
18
|
+
deployer_resource_type = service.attribute(:deployer_resource_type, default: "job")
|
19
19
|
|
20
|
-
|
21
|
-
if
|
22
|
-
delete_resource_if_exists(shell,
|
20
|
+
deployer_delete_enabled = service.attribute(:deployer_delete_enabled, default: true)
|
21
|
+
if deployer_delete_enabled
|
22
|
+
delete_resource_if_exists(shell, deployer_resource_type, deployer_resource_name, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
|
23
23
|
end
|
24
24
|
|
25
|
-
kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace:
|
25
|
+
kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: deployer_namespace)
|
26
26
|
end
|
27
27
|
|
28
28
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class KuberKit::ServiceDeployer::StrategyDetector
|
2
2
|
Contract KuberKit::Core::Service => Symbol
|
3
3
|
def call(service)
|
4
|
-
service.
|
4
|
+
service.deployer_strategy || KuberKit.current_configuration.deployer_strategy
|
5
5
|
end
|
6
6
|
end
|
@@ -6,6 +6,10 @@ class KuberKit::Shell::AbstractShell
|
|
6
6
|
raise KuberKit::NotImplementedError, "must be implemented"
|
7
7
|
end
|
8
8
|
|
9
|
+
def interactive!(command)
|
10
|
+
raise KuberKit::NotImplementedError, "must be implemented"
|
11
|
+
end
|
12
|
+
|
9
13
|
def read(file_path)
|
10
14
|
raise KuberKit::NotImplementedError, "must be implemented"
|
11
15
|
end
|
@@ -13,4 +13,18 @@ class KuberKit::Shell::Commands::DockerCommands
|
|
13
13
|
def push(shell, tag_name)
|
14
14
|
shell.exec!(%Q{docker push #{tag_name}})
|
15
15
|
end
|
16
|
+
|
17
|
+
def get_container_id(shell, container_name, only_healthy: false, status: "running")
|
18
|
+
command_parts = []
|
19
|
+
command_parts << "docker ps -a -q"
|
20
|
+
|
21
|
+
if only_healthy
|
22
|
+
command_parts << "--filter=\"health=healthy\""
|
23
|
+
end
|
24
|
+
|
25
|
+
command_parts << "--filter=\"status=#{status}\""
|
26
|
+
command_parts << "--filter=\"name=#{container_name}\""
|
27
|
+
|
28
|
+
shell.exec!(command_parts.join(" "))
|
29
|
+
end
|
16
30
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class KuberKit::Shell::Commands::DockerComposeCommands
|
2
|
+
def run(shell, path, service:, command:, interactive: false)
|
3
|
+
command_parts = [
|
4
|
+
"docker-compose",
|
5
|
+
"-f #{path}",
|
6
|
+
"run",
|
7
|
+
service,
|
8
|
+
command
|
9
|
+
]
|
10
|
+
|
11
|
+
if interactive
|
12
|
+
shell.interactive!(command_parts.join(" "))
|
13
|
+
else
|
14
|
+
shell.exec!(command_parts.join(" "))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -16,9 +16,8 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
16
16
|
|
17
17
|
command_parts += Array(command_list)
|
18
18
|
|
19
|
-
# TODO: investigate how to do it with shell.
|
20
19
|
if interactive
|
21
|
-
|
20
|
+
shell.interactive!(command_parts.join(" "))
|
22
21
|
else
|
23
22
|
shell.exec!(command_parts.join(" "))
|
24
23
|
end
|
@@ -58,8 +57,8 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
58
57
|
kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
59
58
|
end
|
60
59
|
|
61
|
-
def rolling_restart(shell,
|
62
|
-
patch_deployment(shell,
|
60
|
+
def rolling_restart(shell, deployer_name, kubeconfig_path: nil, namespace: nil)
|
61
|
+
patch_deployment(shell, deployer_name, {
|
63
62
|
spec: {
|
64
63
|
template: {
|
65
64
|
metadata: {
|
@@ -72,10 +71,10 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
72
71
|
}, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
73
72
|
end
|
74
73
|
|
75
|
-
def patch_deployment(shell,
|
74
|
+
def patch_deployment(shell, deployer_name, specs, kubeconfig_path: nil, namespace: nil)
|
76
75
|
specs_json = JSON.dump(specs).gsub('"', '\"')
|
77
76
|
|
78
|
-
command = %Q{patch deployment #{
|
77
|
+
command = %Q{patch deployment #{deployer_name} -p "#{specs_json}"}
|
79
78
|
|
80
79
|
kubectl_run(shell, command, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
81
80
|
end
|
@@ -30,6 +30,20 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
|
|
30
30
|
result
|
31
31
|
end
|
32
32
|
|
33
|
+
def interactive!(command, log_command: true)
|
34
|
+
command_number = command_counter.get_number.to_s.rjust(2, "0")
|
35
|
+
|
36
|
+
if log_command
|
37
|
+
logger.info("Interactive: [#{command_number}]: #{command.to_s.cyan}")
|
38
|
+
end
|
39
|
+
|
40
|
+
result = system(command)
|
41
|
+
|
42
|
+
if !$?.success?
|
43
|
+
raise ShellError, "Shell command failed: #{command}\r\n#{result}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
33
47
|
def sync(local_path, remote_path, exclude: nil, delete: true)
|
34
48
|
rsync_commands.rsync(self, local_path, remote_path, exclude: exclude, delete: delete)
|
35
49
|
end
|
@@ -38,6 +38,10 @@ class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
|
|
38
38
|
raise ShellError.new(e.message)
|
39
39
|
end
|
40
40
|
|
41
|
+
def interactive!(command, log_command: true)
|
42
|
+
raise "Currently interactive run is not supported for ssh shell."
|
43
|
+
end
|
44
|
+
|
41
45
|
def sync(local_path, remote_path, exclude: nil, delete: true)
|
42
46
|
rsync_commands.rsync(
|
43
47
|
local_shell, local_path, remote_path,
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class KuberKit::TemplateReader::ActionHandler
|
2
|
+
include KuberKit::Import[
|
3
|
+
"template_reader.reader",
|
4
|
+
"core.template_store",
|
5
|
+
]
|
6
|
+
|
7
|
+
Contract KuberKit::Shell::AbstractShell, Symbol => Any
|
8
|
+
def call(shell, template_name)
|
9
|
+
template = template_store.get(template_name)
|
10
|
+
|
11
|
+
reader.read(shell, template)
|
12
|
+
end
|
13
|
+
end
|
@@ -2,22 +2,25 @@ class KuberKit::TemplateReader::Reader
|
|
2
2
|
ReaderNotFoundError = Class.new(KuberKit::NotFoundError)
|
3
3
|
|
4
4
|
include KuberKit::Import[
|
5
|
-
"template_reader.
|
5
|
+
"template_reader.strategies.artifact_file",
|
6
6
|
]
|
7
7
|
|
8
|
+
def initialize(**injected_deps)
|
9
|
+
super(injected_deps)
|
10
|
+
add_default_strategies
|
11
|
+
end
|
12
|
+
|
8
13
|
def use_reader(template_reader, template_class:)
|
9
14
|
@@readers ||= {}
|
10
15
|
|
11
|
-
if !template_reader.is_a?(KuberKit::TemplateReader::
|
12
|
-
raise ArgumentError.new("should be an instance of KuberKit::TemplateReader::
|
16
|
+
if !template_reader.is_a?(KuberKit::TemplateReader::Strategies::Abstract)
|
17
|
+
raise ArgumentError.new("should be an instance of KuberKit::TemplateReader::Strategies::Abstract, got: #{template_reader.inspect}")
|
13
18
|
end
|
14
19
|
|
15
20
|
@@readers[template_class] = template_reader
|
16
21
|
end
|
17
22
|
|
18
23
|
def read(shell, template)
|
19
|
-
add_default_readers
|
20
|
-
|
21
24
|
reader = @@readers[template.class]
|
22
25
|
|
23
26
|
raise ReaderNotFoundError, "Can't find reader for template #{template}" if reader.nil?
|
@@ -25,11 +28,12 @@ class KuberKit::TemplateReader::Reader
|
|
25
28
|
reader.read(shell, template)
|
26
29
|
end
|
27
30
|
|
28
|
-
def add_default_readers
|
29
|
-
use_reader(artifact_file_reader, template_class: KuberKit::Core::Templates::ArtifactFile)
|
30
|
-
end
|
31
|
-
|
32
31
|
def reset!
|
33
32
|
@@readers = {}
|
34
33
|
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def add_default_strategies
|
37
|
+
use_reader(artifact_file, template_class: KuberKit::Core::Templates::ArtifactFile)
|
38
|
+
end
|
35
39
|
end
|
data/lib/kuber_kit/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuber_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iskander Khaziev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: contracts-lite
|
@@ -158,10 +158,12 @@ files:
|
|
158
158
|
- TODO.md
|
159
159
|
- bin/console
|
160
160
|
- bin/kit
|
161
|
+
- example/app_data/docker_compose.yml
|
161
162
|
- example/app_data/env_file.yml
|
162
163
|
- example/app_data/service.yml
|
163
164
|
- example/app_data/test.env
|
164
165
|
- example/app_data/test.txt
|
166
|
+
- example/config.rb
|
165
167
|
- example/configurations/review.rb
|
166
168
|
- example/images/app_sources/Dockerfile
|
167
169
|
- example/images/app_sources/build_context/source.rb
|
@@ -179,6 +181,7 @@ files:
|
|
179
181
|
- example/infrastructure/env_files.rb
|
180
182
|
- example/infrastructure/registries.rb
|
181
183
|
- example/infrastructure/templates.rb
|
184
|
+
- example/services/compose_app.rb
|
182
185
|
- example/services/env_file.rb
|
183
186
|
- example/services/ruby_app.rb
|
184
187
|
- kuber_kit.gemspec
|
@@ -212,6 +215,7 @@ files:
|
|
212
215
|
- lib/kuber_kit/core/configuration_store.rb
|
213
216
|
- lib/kuber_kit/core/context_helper/base_helper.rb
|
214
217
|
- lib/kuber_kit/core/context_helper/context_helper_factory.rb
|
218
|
+
- lib/kuber_kit/core/context_helper/context_vars.rb
|
215
219
|
- lib/kuber_kit/core/context_helper/image_helper.rb
|
216
220
|
- lib/kuber_kit/core/context_helper/service_helper.rb
|
217
221
|
- lib/kuber_kit/core/env_files/abstract_env_file.rb
|
@@ -256,6 +260,7 @@ files:
|
|
256
260
|
- lib/kuber_kit/service_deployer/deployer.rb
|
257
261
|
- lib/kuber_kit/service_deployer/service_list_resolver.rb
|
258
262
|
- lib/kuber_kit/service_deployer/strategies/abstract.rb
|
263
|
+
- lib/kuber_kit/service_deployer/strategies/docker_compose.rb
|
259
264
|
- lib/kuber_kit/service_deployer/strategies/kubernetes.rb
|
260
265
|
- lib/kuber_kit/service_deployer/strategies/kubernetes_runner.rb
|
261
266
|
- lib/kuber_kit/service_deployer/strategy_detector.rb
|
@@ -265,15 +270,17 @@ files:
|
|
265
270
|
- lib/kuber_kit/shell/command_counter.rb
|
266
271
|
- lib/kuber_kit/shell/commands/bash_commands.rb
|
267
272
|
- lib/kuber_kit/shell/commands/docker_commands.rb
|
273
|
+
- lib/kuber_kit/shell/commands/docker_compose_commands.rb
|
268
274
|
- lib/kuber_kit/shell/commands/git_commands.rb
|
269
275
|
- lib/kuber_kit/shell/commands/kubectl_commands.rb
|
270
276
|
- lib/kuber_kit/shell/commands/rsync_commands.rb
|
271
277
|
- lib/kuber_kit/shell/local_shell.rb
|
272
278
|
- lib/kuber_kit/shell/ssh_session.rb
|
273
279
|
- lib/kuber_kit/shell/ssh_shell.rb
|
274
|
-
- lib/kuber_kit/template_reader/
|
275
|
-
- lib/kuber_kit/template_reader/artifact_file_reader.rb
|
280
|
+
- lib/kuber_kit/template_reader/action_handler.rb
|
276
281
|
- lib/kuber_kit/template_reader/reader.rb
|
282
|
+
- lib/kuber_kit/template_reader/strategies/abstract.rb
|
283
|
+
- lib/kuber_kit/template_reader/strategies/artifact_file.rb
|
277
284
|
- lib/kuber_kit/tools/file_presence_checker.rb
|
278
285
|
- lib/kuber_kit/tools/logger_factory.rb
|
279
286
|
- lib/kuber_kit/ui.rb
|