kuber_kit 0.5.1 → 0.5.6
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/CHANGELOG.md +21 -0
- data/Gemfile.lock +5 -5
- data/TODO.md +5 -5
- data/example/configurations/review.rb +1 -1
- data/example/services/docker_app.rb +2 -1
- data/example/services/env_file.rb +1 -1
- data/example/services/ruby_app.rb +2 -1
- data/lib/kuber_kit.rb +10 -0
- data/lib/kuber_kit/actions/kubectl_get.rb +32 -0
- data/lib/kuber_kit/actions/service_checker.rb +5 -0
- data/lib/kuber_kit/actions/service_deployer.rb +85 -61
- data/lib/kuber_kit/cli.rb +14 -3
- data/lib/kuber_kit/configs.rb +10 -6
- data/lib/kuber_kit/container.rb +20 -0
- data/lib/kuber_kit/core/artifacts/artifact_store.rb +3 -0
- data/lib/kuber_kit/core/configuration.rb +4 -2
- data/lib/kuber_kit/core/configuration_definition.rb +7 -0
- data/lib/kuber_kit/core/configuration_factory.rb +1 -0
- data/lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb +75 -0
- data/lib/kuber_kit/core/env_files/abstract_env_file.rb +4 -0
- data/lib/kuber_kit/core/env_files/artifact_file.rb +4 -0
- data/lib/kuber_kit/core/env_files/env_file_store.rb +3 -0
- data/lib/kuber_kit/core/env_files/env_group.rb +12 -0
- data/lib/kuber_kit/core/image.rb +2 -1
- data/lib/kuber_kit/core/registries/registry_store.rb +3 -0
- data/lib/kuber_kit/core/service.rb +4 -2
- data/lib/kuber_kit/core/service_definition.rb +13 -6
- data/lib/kuber_kit/core/service_factory.rb +1 -0
- data/lib/kuber_kit/core/templates/template_store.rb +3 -0
- data/lib/kuber_kit/env_file_reader/env_file_parser.rb +51 -0
- data/lib/kuber_kit/env_file_reader/env_file_tempfile_creator.rb +17 -0
- data/lib/kuber_kit/env_file_reader/reader.rb +2 -0
- data/lib/kuber_kit/env_file_reader/strategies/artifact_file.rb +9 -65
- data/lib/kuber_kit/env_file_reader/strategies/env_group.rb +21 -0
- data/lib/kuber_kit/image_compiler/image_dependency_resolver.rb +5 -53
- data/lib/kuber_kit/service_deployer/service_dependency_resolver.rb +14 -0
- data/lib/kuber_kit/service_deployer/service_list_resolver.rb +11 -6
- data/lib/kuber_kit/service_deployer/strategies/docker.rb +31 -12
- data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +9 -2
- data/lib/kuber_kit/shell/commands/kubectl_commands.rb +8 -0
- data/lib/kuber_kit/shell/local_shell.rb +15 -1
- data/lib/kuber_kit/template_reader/strategies/artifact_file.rb +3 -3
- data/lib/kuber_kit/tools/logger_factory.rb +14 -0
- data/lib/kuber_kit/version.rb +1 -1
- metadata +10 -2
@@ -0,0 +1,17 @@
|
|
1
|
+
class KuberKit::EnvFileReader::EnvFileTempfileCreator
|
2
|
+
include KuberKit::Import[
|
3
|
+
"env_file_reader.reader",
|
4
|
+
"configs"
|
5
|
+
]
|
6
|
+
|
7
|
+
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::EnvFiles::AbstractEnvFile => String
|
8
|
+
def call(shell, env_file)
|
9
|
+
env_file_hash = reader.read(shell, env_file)
|
10
|
+
env_file_raw = env_file_hash.to_a.map{|k,v| "#{k}=#{v}"}.join("\r\n")
|
11
|
+
temp_file_path = File.join(configs.env_file_compile_dir, env_file.uniq_name)
|
12
|
+
|
13
|
+
shell.write(temp_file_path, env_file_raw)
|
14
|
+
|
15
|
+
temp_file_path
|
16
|
+
end
|
17
|
+
end
|
@@ -3,6 +3,7 @@ class KuberKit::EnvFileReader::Reader
|
|
3
3
|
|
4
4
|
include KuberKit::Import[
|
5
5
|
"env_file_reader.strategies.artifact_file",
|
6
|
+
"env_file_reader.strategies.env_group",
|
6
7
|
]
|
7
8
|
|
8
9
|
def initialize(**injected_deps)
|
@@ -35,5 +36,6 @@ class KuberKit::EnvFileReader::Reader
|
|
35
36
|
private
|
36
37
|
def add_default_strategies
|
37
38
|
use_reader(artifact_file, env_file_class: KuberKit::Core::EnvFiles::ArtifactFile)
|
39
|
+
use_reader(env_group, env_file_class: KuberKit::Core::EnvFiles::EnvGroup)
|
38
40
|
end
|
39
41
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
class KuberKit::EnvFileReader::Strategies::ArtifactFile < KuberKit::EnvFileReader::Strategies::Abstract
|
2
2
|
include KuberKit::Import[
|
3
|
-
"core.artifact_store"
|
3
|
+
"core.artifact_store",
|
4
|
+
"env_file_reader.env_file_parser",
|
5
|
+
"preprocessing.text_preprocessor"
|
4
6
|
]
|
5
7
|
|
8
|
+
PREPROCESS_EXTENSIONS = [".erb"]
|
9
|
+
|
6
10
|
def read(shell, env_file)
|
7
11
|
artifact = artifact_store.get(env_file.artifact_name)
|
8
12
|
|
@@ -16,71 +20,11 @@ class KuberKit::EnvFileReader::Strategies::ArtifactFile < KuberKit::EnvFileReade
|
|
16
20
|
def read_file(shell, file_path)
|
17
21
|
result = {}
|
18
22
|
content = shell.read(file_path)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
# Parser is based on:
|
23
|
-
# https://github.com/bkeepers/dotenv/blob/master/lib/dotenv/parser.rb
|
24
|
-
class Parser
|
25
|
-
LINE = /
|
26
|
-
(?:^|\A) # beginning of line
|
27
|
-
\s* # leading whitespace
|
28
|
-
(?:export\s+)? # optional export
|
29
|
-
([\w\.]+) # key
|
30
|
-
(?:\s*=\s*?|:\s+?) # separator
|
31
|
-
( # optional value begin
|
32
|
-
\s*'(?:\\'|[^'])*' # single quoted value
|
33
|
-
| # or
|
34
|
-
\s*"(?:\\"|[^"])*" # double quoted value
|
35
|
-
| # or
|
36
|
-
[^\#\r\n]+ # unquoted value
|
37
|
-
)? # value end
|
38
|
-
\s* # trailing whitespace
|
39
|
-
(?:\#.*)? # optional comment
|
40
|
-
(?:$|\z) # end of line
|
41
|
-
/x
|
42
|
-
|
43
|
-
class << self
|
44
|
-
def call(string, is_load = false)
|
45
|
-
new(string, is_load).call
|
23
|
+
enable_preprocessing = PREPROCESS_EXTENSIONS.any?{ |e| e == File.extname(file_path) }
|
24
|
+
if enable_preprocessing
|
25
|
+
content = text_preprocessor.compile(content)
|
46
26
|
end
|
47
|
-
end
|
48
27
|
|
49
|
-
|
50
|
-
@string = string
|
51
|
-
@hash = {}
|
52
|
-
@is_load = is_load
|
28
|
+
env_file_parser.call(content)
|
53
29
|
end
|
54
|
-
|
55
|
-
def call
|
56
|
-
# Convert line breaks to same format
|
57
|
-
lines = @string.gsub(/\r\n?/, "\n")
|
58
|
-
# Process matches
|
59
|
-
lines.scan(LINE).each do |key, value|
|
60
|
-
@hash[key] = parse_value(value || "")
|
61
|
-
end
|
62
|
-
@hash
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def parse_value(value)
|
68
|
-
# Remove surrounding quotes
|
69
|
-
value = value.strip.sub(/\A(['"])(.*)\1\z/m, '\2')
|
70
|
-
|
71
|
-
if Regexp.last_match(1) == '"'
|
72
|
-
value = unescape_characters(expand_newlines(value))
|
73
|
-
end
|
74
|
-
|
75
|
-
value
|
76
|
-
end
|
77
|
-
|
78
|
-
def unescape_characters(value)
|
79
|
-
value.gsub(/\\([^$])/, '\1')
|
80
|
-
end
|
81
|
-
|
82
|
-
def expand_newlines(value)
|
83
|
-
value.gsub('\n', "\n").gsub('\r', "\r")
|
84
|
-
end
|
85
|
-
end
|
86
30
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class KuberKit::EnvFileReader::Strategies::EnvGroup < KuberKit::EnvFileReader::Strategies::Abstract
|
2
|
+
include KuberKit::Import[
|
3
|
+
"env_file_reader.strategies.artifact_file",
|
4
|
+
"core.env_file_store",
|
5
|
+
]
|
6
|
+
|
7
|
+
def read(shell, env_group)
|
8
|
+
content = {}
|
9
|
+
env_group.env_files.each do |env_file_name|
|
10
|
+
env_file = env_file_store.get(env_file_name)
|
11
|
+
|
12
|
+
if env_file.is_a?(KuberKit::Core::EnvFiles::EnvGroup)
|
13
|
+
raise "EnvGroup inside another EnvGroup is not supported"
|
14
|
+
end
|
15
|
+
|
16
|
+
result = artifact_file.read(shell, env_file)
|
17
|
+
content = content.merge(result)
|
18
|
+
end
|
19
|
+
content
|
20
|
+
end
|
21
|
+
end
|
@@ -1,62 +1,14 @@
|
|
1
|
-
class KuberKit::ImageCompiler::ImageDependencyResolver
|
2
|
-
CircularDependencyError = Class.new(KuberKit::Error)
|
3
|
-
DependencyNotFoundError = Class.new(KuberKit::NotFoundError)
|
4
|
-
|
1
|
+
class KuberKit::ImageCompiler::ImageDependencyResolver < KuberKit::Core::Dependencies::AbstractDependencyResolver
|
5
2
|
include KuberKit::Import[
|
6
3
|
"core.image_store",
|
7
4
|
"configs"
|
8
5
|
]
|
9
|
-
|
10
|
-
Contract Or[Symbol, ArrayOf[Symbol]], Proc => Any
|
11
|
-
def each_with_deps(image_names, &block)
|
12
|
-
compile_limit = configs.compile_simultaneous_limit
|
13
|
-
|
14
|
-
resolved_dependencies = []
|
15
|
-
next_dependencies = get_next(image_names, limit: compile_limit)
|
16
|
-
|
17
|
-
while (next_dependencies - resolved_dependencies).any?
|
18
|
-
block.call(next_dependencies)
|
19
|
-
resolved_dependencies += next_dependencies
|
20
|
-
next_dependencies = get_next(image_names, resolved: resolved_dependencies, limit: compile_limit)
|
21
|
-
end
|
22
|
-
|
23
|
-
(image_names - resolved_dependencies).each_slice(compile_limit) do |group|
|
24
|
-
block.call(group)
|
25
|
-
end
|
26
|
-
end
|
27
6
|
|
28
|
-
Contract Or[Symbol, ArrayOf[Symbol]], KeywordArgs[
|
29
|
-
resolved: Optional[ArrayOf[Symbol]],
|
30
|
-
limit: Optional[Maybe[Num]]
|
31
|
-
] => Any
|
32
|
-
def get_next(image_names, resolved: [], limit: nil)
|
33
|
-
deps = Array(image_names).map { |i| get_recursive_deps(i) }.flatten.uniq
|
34
|
-
|
35
|
-
ready_to_resolve = deps.select do |dep_name|
|
36
|
-
unresolved_deps = get_deps(dep_name) - resolved
|
37
|
-
unresolved_deps.empty?
|
38
|
-
end
|
39
|
-
unresolved_deps = ready_to_resolve - resolved
|
40
|
-
unresolved_deps = unresolved_deps.take(limit) if limit
|
41
|
-
unresolved_deps
|
42
|
-
end
|
43
|
-
|
44
|
-
def get_recursive_deps(image_name, dependency_tree: [])
|
45
|
-
deps = get_deps(image_name)
|
46
|
-
|
47
|
-
if dependency_tree.include?(image_name)
|
48
|
-
raise CircularDependencyError, "Circular dependency found for #{image_name}. Dependency tree: #{dependency_tree.inspect}"
|
49
|
-
end
|
50
|
-
|
51
|
-
child_deps = []
|
52
|
-
deps.each do |i|
|
53
|
-
child_deps += get_recursive_deps(i, dependency_tree: dependency_tree + [image_name])
|
54
|
-
end
|
55
|
-
|
56
|
-
(deps + child_deps).uniq
|
57
|
-
end
|
58
|
-
|
59
7
|
def get_deps(image_name)
|
60
8
|
image_store.get_definition(image_name).dependencies
|
61
9
|
end
|
10
|
+
|
11
|
+
def dependency_batch_size
|
12
|
+
configs.compile_simultaneous_limit
|
13
|
+
end
|
62
14
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class KuberKit::ServiceDeployer::ServiceDependencyResolver < KuberKit::Core::Dependencies::AbstractDependencyResolver
|
2
|
+
include KuberKit::Import[
|
3
|
+
"core.service_store",
|
4
|
+
"configs"
|
5
|
+
]
|
6
|
+
|
7
|
+
def get_deps(service_name)
|
8
|
+
service_store.get_definition(service_name).dependencies
|
9
|
+
end
|
10
|
+
|
11
|
+
def dependency_batch_size
|
12
|
+
configs.deploy_simultaneous_limit
|
13
|
+
end
|
14
|
+
end
|
@@ -4,11 +4,12 @@ class KuberKit::ServiceDeployer::ServiceListResolver
|
|
4
4
|
]
|
5
5
|
|
6
6
|
Contract KeywordArgs[
|
7
|
-
services:
|
8
|
-
tags:
|
9
|
-
enabled_services:
|
7
|
+
services: Optional[ArrayOf[String]],
|
8
|
+
tags: Optional[ArrayOf[String]],
|
9
|
+
enabled_services: Optional[ArrayOf[String]],
|
10
|
+
disabled_services: Optional[ArrayOf[String]]
|
10
11
|
] => ArrayOf[String]
|
11
|
-
def resolve(services: [], tags: [], enabled_services: [])
|
12
|
+
def resolve(services: [], tags: [], enabled_services: [], disabled_services: [])
|
12
13
|
all_definitions = service_store.all_definitions.values
|
13
14
|
|
14
15
|
included_services, excluded_services = split_by_inclusion(services)
|
@@ -36,14 +37,18 @@ class KuberKit::ServiceDeployer::ServiceListResolver
|
|
36
37
|
included_services = included_services.select{ |s| enabled_services.include?(s) }
|
37
38
|
end
|
38
39
|
|
40
|
+
if disabled_services.any?
|
41
|
+
included_services = included_services.select{ |s| !disabled_services.include?(s) }
|
42
|
+
end
|
43
|
+
|
39
44
|
included_services
|
40
45
|
end
|
41
46
|
|
42
47
|
Contract Array => Array
|
43
48
|
def split_by_inclusion(array)
|
44
|
-
excluded, included = array.partition{|e| e.start_with?('
|
49
|
+
excluded, included = array.partition{|e| e.start_with?('^') }
|
45
50
|
|
46
|
-
excluded.map!{ |item| item.gsub(
|
51
|
+
excluded.map!{ |item| item.gsub(/^\^/, "") }
|
47
52
|
|
48
53
|
[included, excluded]
|
49
54
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer::Strategies::Abstract
|
2
2
|
include KuberKit::Import[
|
3
|
+
"env_file_reader.env_file_tempfile_creator",
|
3
4
|
"shell.docker_commands",
|
5
|
+
"core.env_file_store",
|
4
6
|
"core.image_store",
|
5
7
|
"configs",
|
6
8
|
]
|
@@ -18,6 +20,7 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
|
|
18
20
|
:networks,
|
19
21
|
:expose,
|
20
22
|
:publish,
|
23
|
+
:env_file_names
|
21
24
|
]
|
22
25
|
|
23
26
|
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
|
@@ -28,16 +31,19 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
|
|
28
31
|
raise KuberKit::Error, "Unknow options for deploy strategy: #{unknown_options}. Available options: #{STRATEGY_OPTIONS}"
|
29
32
|
end
|
30
33
|
|
31
|
-
namespace
|
32
|
-
container_name
|
33
|
-
command_name
|
34
|
-
|
35
|
-
custom_args
|
36
|
-
networks
|
37
|
-
volumes
|
38
|
-
expose_ports
|
39
|
-
publish_ports
|
40
|
-
hostname
|
34
|
+
namespace = strategy_options.fetch(:namespace, nil)
|
35
|
+
container_name = strategy_options.fetch(:container_name, [namespace, service.name].compact.join("_"))
|
36
|
+
command_name = strategy_options.fetch(:command_name, nil)
|
37
|
+
custom_env_file = strategy_options.fetch(:env_file, nil)
|
38
|
+
custom_args = strategy_options.fetch(:custom_args, nil)
|
39
|
+
networks = strategy_options.fetch(:networks, [])
|
40
|
+
volumes = strategy_options.fetch(:volumes, [])
|
41
|
+
expose_ports = strategy_options.fetch(:expose, [])
|
42
|
+
publish_ports = strategy_options.fetch(:publish, [])
|
43
|
+
hostname = strategy_options.fetch(:hostname, container_name)
|
44
|
+
|
45
|
+
env_file_names = strategy_options.fetch(:env_file_names, [])
|
46
|
+
env_files = prepare_env_files(shell, env_file_names)
|
41
47
|
|
42
48
|
image_name = strategy_options.fetch(:image_name, nil)
|
43
49
|
if image_name.nil?
|
@@ -54,8 +60,8 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
|
|
54
60
|
if container_name
|
55
61
|
custom_args << "--name #{container_name}"
|
56
62
|
end
|
57
|
-
if
|
58
|
-
custom_args << "--env-file #{
|
63
|
+
if custom_env_file
|
64
|
+
custom_args << "--env-file #{custom_env_file}"
|
59
65
|
end
|
60
66
|
if hostname
|
61
67
|
custom_args << "--hostname #{hostname}"
|
@@ -75,6 +81,9 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
|
|
75
81
|
Array(publish_ports).each do |publish_port|
|
76
82
|
custom_args << "--publish #{publish_port}"
|
77
83
|
end
|
84
|
+
Array(env_files).each do |env_file|
|
85
|
+
custom_args << "--env-file #{env_file}"
|
86
|
+
end
|
78
87
|
|
79
88
|
docker_commands.run(
|
80
89
|
shell, image.remote_registry_url,
|
@@ -84,4 +93,14 @@ class KuberKit::ServiceDeployer::Strategies::Docker < KuberKit::ServiceDeployer:
|
|
84
93
|
interactive: !strategy_options[:detached]
|
85
94
|
)
|
86
95
|
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def prepare_env_files(shell, env_file_names)
|
99
|
+
env_files = env_file_names.map do |env_file_name|
|
100
|
+
env_file_store.get(env_file_name)
|
101
|
+
end
|
102
|
+
env_files.map do |env_file|
|
103
|
+
env_file_tempfile_creator.call(shell, env_file)
|
104
|
+
end
|
105
|
+
end
|
87
106
|
end
|
@@ -9,7 +9,8 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
|
|
9
9
|
:resource_type,
|
10
10
|
:resource_name,
|
11
11
|
:delete_if_exists,
|
12
|
-
:restart_if_exists
|
12
|
+
:restart_if_exists,
|
13
|
+
:wait_for_rollout
|
13
14
|
]
|
14
15
|
|
15
16
|
Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
|
@@ -41,12 +42,18 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
|
|
41
42
|
|
42
43
|
apply_result = kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
43
44
|
|
44
|
-
restart_enabled
|
45
|
+
restart_enabled = strategy_options.fetch(:restart_if_exists, true)
|
46
|
+
wait_for_rollout = strategy_options.fetch(:wait_for_rollout, true)
|
45
47
|
if restart_enabled && resource_exists
|
46
48
|
kubectl_commands.rolling_restart(
|
47
49
|
shell, resource_type, resource_name,
|
48
50
|
kubeconfig_path: kubeconfig_path, namespace: namespace
|
49
51
|
)
|
52
|
+
|
53
|
+
kubectl_commands.rollout_status(
|
54
|
+
shell, resource_type, resource_name, wait: true,
|
55
|
+
kubeconfig_path: kubeconfig_path, namespace: namespace
|
56
|
+
) if wait_for_rollout
|
50
57
|
end
|
51
58
|
|
52
59
|
apply_result
|
@@ -102,4 +102,12 @@ class KuberKit::Shell::Commands::KubectlCommands
|
|
102
102
|
}
|
103
103
|
}, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
104
104
|
end
|
105
|
+
|
106
|
+
def rollout_status(shell, resource_type, resource_name, wait: true, kubeconfig_path: nil, namespace: nil)
|
107
|
+
command_parts = []
|
108
|
+
command_parts << %Q{rollout status #{resource_type} #{resource_name}}
|
109
|
+
command_parts << "-w" if wait
|
110
|
+
|
111
|
+
kubectl_run(shell, command_parts, kubeconfig_path: kubeconfig_path, namespace: namespace)
|
112
|
+
end
|
105
113
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
3
|
class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
|
4
|
+
MAX_LINES_TO_PRINT = 50
|
5
|
+
|
4
6
|
include KuberKit::Import[
|
5
7
|
"shell.command_counter",
|
6
8
|
"shell.rsync_commands",
|
@@ -20,7 +22,19 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
|
|
20
22
|
end
|
21
23
|
|
22
24
|
if result && result != "" && log_command
|
23
|
-
|
25
|
+
print_result = result
|
26
|
+
print_result_lines = print_result.split("\n")
|
27
|
+
|
28
|
+
if print_result_lines.count >= MAX_LINES_TO_PRINT
|
29
|
+
print_result = [
|
30
|
+
"[Result is too long, showing only first and last items]".yellow,
|
31
|
+
print_result_lines.first,
|
32
|
+
"[#{print_result_lines.count - 2} lines not showing]".yellow,
|
33
|
+
print_result_lines.last
|
34
|
+
].join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
ui.print_debug("LocalShell", "Finished [#{command_number}] with result: \n ----\n#{print_result.grey}\n ----")
|
24
38
|
end
|
25
39
|
|
26
40
|
if $?.exitstatus != 0
|
@@ -3,10 +3,10 @@ class KuberKit::TemplateReader::Strategies::ArtifactFile < KuberKit::TemplateRea
|
|
3
3
|
"core.artifact_store"
|
4
4
|
]
|
5
5
|
|
6
|
-
def read(shell,
|
7
|
-
artifact = artifact_store.get(
|
6
|
+
def read(shell, template)
|
7
|
+
artifact = artifact_store.get(template.artifact_name)
|
8
8
|
|
9
|
-
file_parts = [artifact.cloned_path,
|
9
|
+
file_parts = [artifact.cloned_path, template.file_path].compact
|
10
10
|
file_path = File.join(*file_parts)
|
11
11
|
|
12
12
|
shell.read(file_path)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'logger'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
class KuberKit::Tools::LoggerFactory
|
4
5
|
SEVERITY_COLORS_BY_LEVEL = {
|
@@ -14,6 +15,10 @@ class KuberKit::Tools::LoggerFactory
|
|
14
15
|
]
|
15
16
|
|
16
17
|
def create(stdout = nil, level = nil)
|
18
|
+
if !stdout
|
19
|
+
prepare_log_file(configs.log_file_path)
|
20
|
+
end
|
21
|
+
|
17
22
|
logger = Logger.new(stdout || configs.log_file_path)
|
18
23
|
|
19
24
|
logger.level = level || Logger::DEBUG
|
@@ -35,4 +40,13 @@ class KuberKit::Tools::LoggerFactory
|
|
35
40
|
|
36
41
|
logger
|
37
42
|
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def prepare_log_file(file_path)
|
46
|
+
dir_path = File.dirname(file_path)
|
47
|
+
unless Dir.exists?(dir_path)
|
48
|
+
FileUtils.mkdir_p(dir_path)
|
49
|
+
end
|
50
|
+
FileUtils.touch(file_path)
|
51
|
+
end
|
38
52
|
end
|