kuber_kit 1.1.4 → 1.1.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -0
  3. data/README.md +2 -1
  4. data/kuber_kit.gemspec +3 -6
  5. data/lib/kuber_kit/actions/configuration_loader.rb +7 -1
  6. data/lib/kuber_kit/actions/kubectl_attacher.rb +7 -4
  7. data/lib/kuber_kit/actions/kubectl_logs.rb +7 -4
  8. data/lib/kuber_kit/actions/service_deployer.rb +33 -26
  9. data/lib/kuber_kit/actions/service_generator.rb +20 -0
  10. data/lib/kuber_kit/artifacts_sync/artifact_updater.rb +19 -9
  11. data/lib/kuber_kit/artifacts_sync/strategies/abstract.rb +9 -0
  12. data/lib/kuber_kit/artifacts_sync/strategies/git_updater.rb +46 -0
  13. data/lib/kuber_kit/artifacts_sync/strategies/null_updater.rb +12 -0
  14. data/lib/kuber_kit/cli.rb +29 -1
  15. data/lib/kuber_kit/configs.rb +3 -1
  16. data/lib/kuber_kit/container.rb +28 -4
  17. data/lib/kuber_kit/core/artifacts/abstract_artifact.rb +4 -0
  18. data/lib/kuber_kit/core/artifacts/git.rb +6 -1
  19. data/lib/kuber_kit/core/artifacts/local.rb +4 -0
  20. data/lib/kuber_kit/core/configuration.rb +10 -6
  21. data/lib/kuber_kit/core/configuration_definition.rb +30 -9
  22. data/lib/kuber_kit/core/configuration_factory.rb +3 -1
  23. data/lib/kuber_kit/core/context_helper/abstract_helper.rb +5 -0
  24. data/lib/kuber_kit/core/context_helper/base_helper.rb +1 -7
  25. data/lib/kuber_kit/core/context_helper/context_helper_factory.rb +3 -1
  26. data/lib/kuber_kit/core/context_helper/context_vars.rb +20 -4
  27. data/lib/kuber_kit/core/context_helper/local_context_helper.rb +14 -0
  28. data/lib/kuber_kit/core/context_helper/service_helper.rb +15 -1
  29. data/lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb +7 -0
  30. data/lib/kuber_kit/core/service.rb +8 -5
  31. data/lib/kuber_kit/core/service_definition.rb +16 -4
  32. data/lib/kuber_kit/core/service_factory.rb +2 -1
  33. data/lib/kuber_kit/defaults.rb +13 -4
  34. data/lib/kuber_kit/image_compiler/image_builder.rb +1 -1
  35. data/lib/kuber_kit/service_deployer/service_dependency_resolver.rb +1 -1
  36. data/lib/kuber_kit/service_deployer/strategies/helm.rb +41 -0
  37. data/lib/kuber_kit/service_deployer/strategies/kubernetes.rb +8 -2
  38. data/lib/kuber_kit/service_generator/action_handler.rb +16 -0
  39. data/lib/kuber_kit/service_generator/generator.rb +26 -0
  40. data/lib/kuber_kit/service_generator/strategies/abstract.rb +5 -0
  41. data/lib/kuber_kit/service_generator/strategies/helm.rb +33 -0
  42. data/lib/kuber_kit/service_generator/strategy_detector.rb +6 -0
  43. data/lib/kuber_kit/service_reader/reader.rb +2 -10
  44. data/lib/kuber_kit/shell/commands/docker_commands.rb +1 -1
  45. data/lib/kuber_kit/shell/commands/git_commands.rb +10 -0
  46. data/lib/kuber_kit/shell/commands/helm_commands.rb +42 -0
  47. data/lib/kuber_kit/shell/commands/kubectl_commands.rb +3 -2
  48. data/lib/kuber_kit/shell/local_shell.rb +1 -1
  49. data/lib/kuber_kit/shell_launcher/strategies/kubernetes.rb +1 -1
  50. data/lib/kuber_kit/template_reader/reader.rb +1 -0
  51. data/lib/kuber_kit/template_reader/renderer.rb +17 -0
  52. data/lib/kuber_kit/template_reader/strategies/artifact_file.rb +1 -0
  53. data/lib/kuber_kit/tools/logger_factory.rb +1 -1
  54. data/lib/kuber_kit/version.rb +1 -1
  55. data/lib/kuber_kit.rb +23 -3
  56. metadata +35 -10
  57. data/lib/kuber_kit/artifacts_sync/abstract_artifact_resolver.rb +0 -5
  58. data/lib/kuber_kit/artifacts_sync/git_artifact_resolver.rb +0 -31
  59. data/lib/kuber_kit/artifacts_sync/null_artifact_resolver.rb +0 -7
@@ -1,9 +1,9 @@
1
1
  class KuberKit::Core::Configuration
2
2
  attr_reader :name, :artifacts, :registries, :env_files, :templates, :kubeconfig_path, :kubectl_entrypoint,
3
3
  :services_attributes, :enabled_services, :disabled_services, :default_services,
4
- :initial_services, :build_servers, :global_build_vars,
4
+ :pre_deploy_services, :post_deploy_services, :build_servers, :global_build_vars,
5
5
  :deployer_strategy, :deployer_namespace, :deployer_require_confirmation,
6
- :shell_launcher_strategy
6
+ :shell_launcher_strategy, :generator_strategy
7
7
 
8
8
  Contract KeywordArgs[
9
9
  name: Symbol,
@@ -17,18 +17,20 @@ class KuberKit::Core::Configuration
17
17
  enabled_services: ArrayOf[Symbol],
18
18
  disabled_services: ArrayOf[Symbol],
19
19
  default_services: ArrayOf[Symbol],
20
- initial_services: ArrayOf[Symbol],
20
+ pre_deploy_services: ArrayOf[Symbol],
21
+ post_deploy_services: ArrayOf[Symbol],
21
22
  build_servers: ArrayOf[KuberKit::Core::BuildServers::AbstractBuildServer],
22
23
  global_build_vars: HashOf[Symbol => Any],
23
24
  deployer_strategy: Symbol,
24
25
  deployer_namespace: Maybe[Or[Symbol, String]],
25
26
  deployer_require_confirmation: Bool,
26
27
  shell_launcher_strategy: Symbol,
28
+ generator_strategy: Symbol,
27
29
  ] => Any
28
30
  def initialize(name:, artifacts:, registries:, env_files:, templates:, kubeconfig_path:, kubectl_entrypoint:,
29
31
  services_attributes:, enabled_services:, disabled_services:, default_services:,
30
- initial_services:, build_servers:, global_build_vars:,
31
- deployer_strategy:, deployer_namespace:, deployer_require_confirmation:, shell_launcher_strategy:)
32
+ pre_deploy_services:, post_deploy_services:, build_servers:, global_build_vars:,
33
+ deployer_strategy:, deployer_namespace:, deployer_require_confirmation:, shell_launcher_strategy:, generator_strategy:)
32
34
  @name = name
33
35
  @artifacts = artifacts
34
36
  @registries = registries
@@ -41,12 +43,14 @@ class KuberKit::Core::Configuration
41
43
  @enabled_services = enabled_services
42
44
  @disabled_services = disabled_services
43
45
  @default_services = default_services
44
- @initial_services = initial_services
46
+ @pre_deploy_services = pre_deploy_services
47
+ @post_deploy_services = post_deploy_services
45
48
  @global_build_vars = global_build_vars
46
49
  @deployer_strategy = deployer_strategy
47
50
  @deployer_namespace = deployer_namespace
48
51
  @deployer_require_confirmation = deployer_require_confirmation
49
52
  @shell_launcher_strategy = shell_launcher_strategy
53
+ @generator_strategy = generator_strategy
50
54
  end
51
55
 
52
56
  def service_attributes(service_name)
@@ -9,13 +9,14 @@ class KuberKit::Core::ConfigurationDefinition
9
9
  @artifacts = {}
10
10
  @registries = {}
11
11
  @env_files = {}
12
- @templates = {}
13
- @build_servers = []
14
- @enabled_services = []
15
- @disabled_services = []
16
- @default_services = []
17
- @initial_services = []
18
- @services_attributes = {}
12
+ @templates = {}
13
+ @build_servers = []
14
+ @enabled_services = []
15
+ @disabled_services = []
16
+ @default_services = []
17
+ @pre_deploy_services = []
18
+ @post_deploy_services = []
19
+ @services_attributes = {}
19
20
  end
20
21
 
21
22
  def to_attrs
@@ -30,7 +31,8 @@ class KuberKit::Core::ConfigurationDefinition
30
31
  enabled_services: @enabled_services,
31
32
  disabled_services: @disabled_services,
32
33
  default_services: @default_services,
33
- initial_services: @initial_services,
34
+ pre_deploy_services: @pre_deploy_services,
35
+ post_deploy_services: @post_deploy_services,
34
36
  build_servers: @build_servers,
35
37
  services_attributes: @services_attributes,
36
38
  global_build_vars: @global_build_vars,
@@ -38,6 +40,7 @@ class KuberKit::Core::ConfigurationDefinition
38
40
  deployer_namespace: @deployer_namespace,
39
41
  deployer_require_confirmation: @deployer_require_confirmation || false,
40
42
  shell_launcher_strategy: @shell_launcher_strategy,
43
+ generator_strategy: @generator_strategy,
41
44
  )
42
45
  end
43
46
 
@@ -109,6 +112,12 @@ class KuberKit::Core::ConfigurationDefinition
109
112
  self
110
113
  end
111
114
 
115
+ def generator_strategy(strategy)
116
+ @generator_strategy = strategy
117
+
118
+ self
119
+ end
120
+
112
121
  def deployer_require_confirmation
113
122
  @deployer_require_confirmation = true
114
123
 
@@ -143,7 +152,19 @@ class KuberKit::Core::ConfigurationDefinition
143
152
  end
144
153
 
145
154
  def initial_services(services)
146
- @initial_services += services.map(&:to_sym)
155
+ unless KuberKit.deprecation_warnings_disabled?
156
+ puts "WARNING: initial_services is deprecated, please use pre_deploy_services instead"
157
+ end
158
+ pre_deploy_services(services)
159
+ end
160
+
161
+ def pre_deploy_services(services)
162
+ @pre_deploy_services += services.map(&:to_sym)
163
+ return self
164
+ end
165
+
166
+ def post_deploy_services(services)
167
+ @post_deploy_services += services.map(&:to_sym)
147
168
  return self
148
169
  end
149
170
 
@@ -32,12 +32,14 @@ class KuberKit::Core::ConfigurationFactory
32
32
  enabled_services: configuration_attrs.enabled_services,
33
33
  disabled_services: configuration_attrs.disabled_services,
34
34
  default_services: configuration_attrs.default_services,
35
- initial_services: configuration_attrs.initial_services,
35
+ pre_deploy_services: configuration_attrs.pre_deploy_services,
36
+ post_deploy_services: configuration_attrs.post_deploy_services,
36
37
  global_build_vars: configuration_attrs.global_build_vars || {},
37
38
  deployer_strategy: configuration_attrs.deployer_strategy || configs.deployer_strategy,
38
39
  deployer_namespace: configuration_attrs.deployer_namespace,
39
40
  deployer_require_confirmation: configuration_attrs.deployer_require_confirmation,
40
41
  shell_launcher_strategy: configuration_attrs.shell_launcher_strategy || configs.shell_launcher_strategy,
42
+ generator_strategy: configuration_attrs.generator_strategy || configs.generator_strategy,
41
43
  )
42
44
  end
43
45
 
@@ -0,0 +1,5 @@
1
+ class KuberKit::Core::ContextHelper::AbstractHelper
2
+ def get_binding
3
+ binding
4
+ end
5
+ end
@@ -1,6 +1,4 @@
1
- class KuberKit::Core::ContextHelper::BaseHelper
2
- CONTRACT = RespondTo[:get_binding]
3
-
1
+ class KuberKit::Core::ContextHelper::BaseHelper < KuberKit::Core::ContextHelper::AbstractHelper
4
2
  attr_reader :shell, :artifact_store, :image_store, :env_file_reader
5
3
 
6
4
  def initialize(image_store:, artifact_store:, shell:, env_file_reader:)
@@ -39,8 +37,4 @@ class KuberKit::Core::ContextHelper::BaseHelper
39
37
  end
40
38
  global_build_vars
41
39
  end
42
-
43
- def get_binding
44
- binding
45
- end
46
40
  end
@@ -2,7 +2,8 @@ class KuberKit::Core::ContextHelper::ContextHelperFactory
2
2
  include KuberKit::Import[
3
3
  "core.image_store",
4
4
  "core.artifact_store",
5
- env_file_reader: "env_file_reader.action_handler"
5
+ template_renderer: "template_reader.renderer",
6
+ env_file_reader: "env_file_reader.action_handler"
6
7
  ]
7
8
 
8
9
  def build_image_context(shell, image)
@@ -22,6 +23,7 @@ class KuberKit::Core::ContextHelper::ContextHelperFactory
22
23
  shell: shell,
23
24
  env_file_reader: env_file_reader,
24
25
  service: service,
26
+ template_renderer: template_renderer
25
27
  )
26
28
  end
27
29
  end
@@ -1,3 +1,4 @@
1
+ require 'ostruct'
1
2
  class KuberKit::Core::ContextHelper::ContextVars
2
3
  attr_reader :parent, :parent_name
3
4
 
@@ -37,12 +38,27 @@ class KuberKit::Core::ContextHelper::ContextVars
37
38
  dig(name)
38
39
  end
39
40
 
41
+ def keys
42
+ @context_vars.keys
43
+ end
44
+
40
45
  def to_h
41
- if @context_vars.is_a?(Hash)
42
- return @context_vars
43
- else
44
- return {value: @context_vars}
46
+ values = keys.map do |key|
47
+ value = get_variable_value(key)
48
+ hash_value = value.respond_to?(:to_h) ? value.to_h : value
49
+ [key, hash_value]
50
+ end
51
+ Hash[values]
52
+ end
53
+
54
+ def to_struct
55
+ values = keys.map do |key|
56
+ value = get_variable_value(key)
57
+ hash_value = value.respond_to?(:to_struct) ? value.to_struct : value
58
+ [key, hash_value]
45
59
  end
60
+ hash = Hash[values]
61
+ OpenStruct.new(hash)
46
62
  end
47
63
 
48
64
  def get_variable_value(variable_name)
@@ -0,0 +1,14 @@
1
+ class KuberKit::Core::ContextHelper::LocalContextHelper < KuberKit::Core::ContextHelper::AbstractHelper
2
+ def initialize(parent_context_helper:, variables:)
3
+ @parent_context_helper = parent_context_helper
4
+ @variables = variables
5
+ end
6
+
7
+ def method_missing(method_name, *args, &block)
8
+ if @variables.has_key?(method_name)
9
+ @variables[method_name]
10
+ else
11
+ @parent_context_helper.send(method_name, *args, &block)
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  class KuberKit::Core::ContextHelper::ServiceHelper < KuberKit::Core::ContextHelper::BaseHelper
2
- def initialize(image_store:, artifact_store:, shell:, env_file_reader:, service:)
2
+ def initialize(image_store:, artifact_store:, shell:, env_file_reader:, service:, template_renderer:)
3
3
  super(
4
4
  image_store: image_store,
5
5
  artifact_store: artifact_store,
@@ -7,6 +7,7 @@ class KuberKit::Core::ContextHelper::ServiceHelper < KuberKit::Core::ContextHelp
7
7
  env_file_reader: env_file_reader
8
8
  )
9
9
  @service = service
10
+ @template_renderer = template_renderer
10
11
  end
11
12
 
12
13
  def service_name
@@ -20,4 +21,17 @@ class KuberKit::Core::ContextHelper::ServiceHelper < KuberKit::Core::ContextHelp
20
21
  def attribute(attribute_name, default: nil)
21
22
  @service.attribute(attribute_name, default: default)
22
23
  end
24
+
25
+ Contract Maybe[String, Symbol], Hash => String
26
+ def render(template_name, variables = {})
27
+ context_helper = KuberKit::Core::ContextHelper::LocalContextHelper.new(
28
+ parent_context_helper: self,
29
+ variables: variables
30
+ )
31
+ @template_renderer.call(shell, template_name.to_sym, context_helper: context_helper)
32
+ end
33
+
34
+ def method_missing(m, *args, &block)
35
+ raise("Unknown variable: #{m} while rendering '#{service_name}' with '#{@service.template_name}' template.")
36
+ end
23
37
  end
@@ -50,6 +50,13 @@ class KuberKit::Core::Dependencies::AbstractDependencyResolver
50
50
  (deps + item_names).uniq
51
51
  end
52
52
 
53
+ # Get all dependencies for items (excluding the items themself), without any limitations
54
+ Contract Or[Symbol, ArrayOf[Symbol]] => Any
55
+ def get_all_deps(item_names)
56
+ deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten
57
+ deps.uniq - item_names
58
+ end
59
+
53
60
  def get_recursive_deps(item_name, dependency_tree: [])
54
61
  deps = get_deps(item_name)
55
62
 
@@ -1,25 +1,28 @@
1
1
  class KuberKit::Core::Service
2
2
  AttributeNotSet = Class.new(KuberKit::Error)
3
3
 
4
- attr_reader :name, :dependencies, :template_name, :tags, :images, :attributes, :deployer_strategy
4
+ attr_reader :name, :initializers, :template_name, :tags, :images, :attributes,
5
+ :deployer_strategy, :generator_strategy
5
6
 
6
7
  Contract KeywordArgs[
7
8
  name: Symbol,
8
- dependencies: ArrayOf[Symbol],
9
+ initializers: ArrayOf[Symbol],
9
10
  template_name: Maybe[Symbol],
10
11
  tags: ArrayOf[Symbol],
11
12
  images: ArrayOf[Symbol],
12
13
  attributes: HashOf[Symbol => Any],
13
- deployer_strategy: Maybe[Symbol]
14
+ deployer_strategy: Maybe[Symbol],
15
+ generator_strategy: Maybe[Symbol]
14
16
  ] => Any
15
- def initialize(name:, dependencies:, template_name:, tags:, images:, attributes:, deployer_strategy:)
17
+ def initialize(name:, initializers:, template_name:, tags:, images:, attributes:, deployer_strategy:, generator_strategy:)
16
18
  @name = name
17
- @dependencies = dependencies
19
+ @initializers = initializers
18
20
  @template_name = template_name
19
21
  @tags = tags
20
22
  @images = images
21
23
  @attributes = attributes
22
24
  @deployer_strategy = deployer_strategy
25
+ @generator_strategy = generator_strategy
23
26
  end
24
27
 
25
28
  def uri
@@ -1,26 +1,32 @@
1
1
  class KuberKit::Core::ServiceDefinition
2
- attr_reader :service_name, :template_name, :dependencies
2
+ attr_reader :service_name, :template_name, :dependencies, :initializers
3
3
 
4
4
  Contract Or[Symbol, String] => Any
5
5
  def initialize(service_name)
6
6
  @service_name = service_name.to_sym
7
- @dependencies = []
7
+ @initializers = []
8
8
  end
9
9
 
10
10
  def to_service_attrs
11
11
  OpenStruct.new(
12
12
  name: @service_name,
13
- dependencies: @dependencies,
13
+ initializers: @initializers,
14
14
  template_name: get_value(@template_name),
15
15
  tags: Array(get_value(@tags)).map(&:to_sym),
16
16
  images: Array(get_value(@images)).map(&:to_sym),
17
17
  attributes: get_value(@attributes),
18
18
  deployer_strategy: get_value(@deployer_strategy),
19
+ generator_strategy: get_value(@generator_strategy),
19
20
  )
20
21
  end
21
22
 
22
23
  def depends_on(*value, &block)
23
- @dependencies = Array(value).flatten
24
+ initialize_with(value)
25
+ self
26
+ end
27
+
28
+ def initialize_with(*value, &block)
29
+ @initializers = Array(value).flatten
24
30
  self
25
31
  end
26
32
 
@@ -54,6 +60,12 @@ class KuberKit::Core::ServiceDefinition
54
60
  self
55
61
  end
56
62
 
63
+ def generator_strategy(value = nil, &block)
64
+ @generator_strategy = block_given? ? block : value
65
+
66
+ self
67
+ end
68
+
57
69
  private
58
70
  def get_value(variable)
59
71
  variable.is_a?(Proc) ? variable.call : variable
@@ -7,12 +7,13 @@ class KuberKit::Core::ServiceFactory
7
7
 
8
8
  KuberKit::Core::Service.new(
9
9
  name: service_attrs.name,
10
- dependencies: service_attrs.dependencies,
10
+ initializers: service_attrs.initializers,
11
11
  template_name: service_attrs.template_name,
12
12
  tags: service_attrs.tags,
13
13
  images: service_attrs.images,
14
14
  attributes: attributes,
15
15
  deployer_strategy: service_attrs.deployer_strategy,
16
+ generator_strategy: service_attrs.generator_strategy,
16
17
  )
17
18
  end
18
19
  end
@@ -7,12 +7,12 @@ class KuberKit::Defaults
7
7
  end
8
8
 
9
9
  def init!
10
- container["artifacts_sync.artifact_updater"].use_resolver(
11
- container["artifacts_sync.git_artifact_resolver"],
10
+ container["artifacts_sync.artifact_updater"].use_strategy(
11
+ container["artifacts_sync.strategies.git_updater"],
12
12
  artifact_class: KuberKit::Core::Artifacts::Git
13
13
  )
14
- container["artifacts_sync.artifact_updater"].use_resolver(
15
- container["artifacts_sync.null_artifact_resolver"],
14
+ container["artifacts_sync.artifact_updater"].use_strategy(
15
+ container["artifacts_sync.strategies.null_updater"],
16
16
  artifact_class: KuberKit::Core::Artifacts::Local
17
17
  )
18
18
  container["env_file_reader.reader"].use_reader(
@@ -39,6 +39,15 @@ class KuberKit::Defaults
39
39
  :docker_compose,
40
40
  KuberKit::ServiceDeployer::Strategies::DockerCompose.new
41
41
  )
42
+ container["service_deployer.deployer"].register_strategy(
43
+ :helm,
44
+ KuberKit::ServiceDeployer::Strategies::Helm.new
45
+ )
46
+
47
+ container["service_generator.generator"].register_strategy(
48
+ :helm,
49
+ KuberKit::ServiceGenerator::Strategies::Helm.new
50
+ )
42
51
 
43
52
  container["shell_launcher.launcher"].register_strategy(
44
53
  :kubernetes,
@@ -5,7 +5,7 @@ class KuberKit::ImageCompiler::ImageBuilder
5
5
  ]
6
6
 
7
7
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Image, String, KeywordArgs[
8
- context_helper: Maybe[KuberKit::Core::ContextHelper::BaseHelper::CONTRACT]
8
+ context_helper: Maybe[KuberKit::Core::ContextHelper::AbstractHelper]
9
9
  ] => Any
10
10
  def build(shell, image, build_dir, context_helper: nil)
11
11
  image.before_build_callback.call(context_helper, build_dir) if image.before_build_callback
@@ -5,7 +5,7 @@ class KuberKit::ServiceDeployer::ServiceDependencyResolver < KuberKit::Core::Dep
5
5
  ]
6
6
 
7
7
  def get_deps(service_name)
8
- service_store.get_definition(service_name).dependencies
8
+ service_store.get_definition(service_name).initializers
9
9
  end
10
10
 
11
11
  def dependency_batch_size
@@ -0,0 +1,41 @@
1
+ class KuberKit::ServiceDeployer::Strategies::Helm < KuberKit::ServiceDeployer::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "service_reader.reader",
4
+ "shell.helm_commands",
5
+ "shell.bash_commands",
6
+ "configs",
7
+ ]
8
+
9
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
10
+ def deploy(shell, service)
11
+ service_config = reader.read(shell, service)
12
+ chart_root_path = File.join(configs.service_config_dir, "#{service.name}_chart")
13
+ chart_templates_path = File.join(chart_root_path, "templates")
14
+ chart_config_path = File.join(chart_root_path, "Chart.yaml")
15
+ release_path = File.join(chart_templates_path, "release.yaml")
16
+
17
+ bash_commands.mkdir_p(shell, chart_root_path)
18
+ bash_commands.mkdir_p(shell, chart_templates_path)
19
+
20
+ shell.write(release_path, service_config)
21
+ shell.write(chart_config_path, chart_config_content(service.uri))
22
+
23
+ kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
24
+ namespace = KuberKit.current_configuration.deployer_namespace
25
+
26
+ upgrade_result = helm_commands.upgrade(shell, service.uri, chart_root_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
27
+
28
+ upgrade_result
29
+ end
30
+
31
+ def chart_config_content(release_name)
32
+ query = <<-CHART
33
+ apiVersion: v2
34
+ name: #{release_name}
35
+ description: #{release_name}
36
+ type: application
37
+ version: 1.0.0
38
+ appVersion: "1.0.0"
39
+ CHART
40
+ end
41
+ end
@@ -10,7 +10,8 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
10
10
  :resource_name,
11
11
  :delete_if_exists,
12
12
  :restart_if_exists,
13
- :wait_for_rollout
13
+ :wait_for_rollout,
14
+ :apply_command
14
15
  ]
15
16
 
16
17
  Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service => Any
@@ -40,7 +41,12 @@ class KuberKit::ServiceDeployer::Strategies::Kubernetes < KuberKit::ServiceDeplo
40
41
  kubectl_commands.delete_resource(shell, resource_type, resource_name, kubeconfig_path: kubeconfig_path, namespace: namespace)
41
42
  end
42
43
 
43
- apply_result = kubectl_commands.apply_file(shell, config_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
44
+ apply_result = kubectl_commands.apply_file(
45
+ shell, config_path,
46
+ kubeconfig_path: kubeconfig_path,
47
+ namespace: namespace,
48
+ apply_command: strategy_options.fetch(:apply_command, "apply")
49
+ )
44
50
 
45
51
  restart_enabled = strategy_options.fetch(:restart_if_exists, true)
46
52
  wait_for_rollout = strategy_options.fetch(:wait_for_rollout, true)
@@ -0,0 +1,16 @@
1
+ class KuberKit::ServiceGenerator::ActionHandler
2
+ include KuberKit::Import[
3
+ "service_generator.generator",
4
+ "service_generator.strategy_detector",
5
+ "core.service_store",
6
+ ]
7
+
8
+ Contract KuberKit::Shell::AbstractShell, Symbol, String => Any
9
+ def call(shell, service_name, export_path)
10
+ service = service_store.get_service(service_name)
11
+
12
+ strategy_name = strategy_detector.call(service)
13
+
14
+ generator.generate(shell, service, export_path, strategy_name)
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ class KuberKit::ServiceGenerator::Generator
2
+ StrategyNotFoundError = Class.new(KuberKit::NotFoundError)
3
+
4
+ include KuberKit::Import[
5
+ "core.service_store",
6
+ ]
7
+
8
+ def register_strategy(strategy_name, strategy)
9
+ @@strategies ||= {}
10
+
11
+ if !strategy.is_a?(KuberKit::ServiceGenerator::Strategies::Abstract)
12
+ raise ArgumentError.new("should be an instance of KuberKit::ServiceGenerator::Strategies::Abstract, got: #{strategy.inspect}")
13
+ end
14
+
15
+ @@strategies[strategy_name] = strategy
16
+ end
17
+
18
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service, String, Symbol => Any
19
+ def generate(shell, service, export_path, strategy_name)
20
+ generator = @@strategies[strategy_name]
21
+
22
+ raise StrategyNotFoundError, "Can't find strategy with name #{strategy_name}" if generator.nil?
23
+
24
+ generator.generate(shell, service, export_path)
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ class KuberKit::ServiceGenerator::Strategies::Abstract
2
+ def generate(shell, service, export_path)
3
+ raise KuberKit::NotImplementedError, "must be implemented"
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ class KuberKit::ServiceGenerator::Strategies::Helm < KuberKit::ServiceGenerator::Strategies::Abstract
2
+ include KuberKit::Import[
3
+ "service_reader.reader",
4
+ "shell.bash_commands",
5
+ "configs",
6
+ ]
7
+
8
+ Contract KuberKit::Shell::AbstractShell, KuberKit::Core::Service, String => Any
9
+ def generate(shell, service, export_path)
10
+ service_config = reader.read(shell, service)
11
+ chart_root_path = File.join(export_path, "#{service.name}_chart")
12
+ chart_templates_path = File.join(chart_root_path, "templates")
13
+ chart_config_path = File.join(chart_root_path, "Chart.yaml")
14
+ release_path = File.join(chart_templates_path, "release.yaml")
15
+
16
+ bash_commands.mkdir_p(shell, chart_root_path)
17
+ bash_commands.mkdir_p(shell, chart_templates_path)
18
+
19
+ shell.write(release_path, service_config)
20
+ shell.write(chart_config_path, chart_config_content(service.uri))
21
+ end
22
+
23
+ def chart_config_content(release_name)
24
+ query = <<-CHART
25
+ apiVersion: v2
26
+ name: #{release_name}
27
+ description: #{release_name}
28
+ type: application
29
+ version: 1.0.0
30
+ appVersion: "1.0.0"
31
+ CHART
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ class KuberKit::ServiceGenerator::StrategyDetector
2
+ Contract KuberKit::Core::Service => Symbol
3
+ def call(service)
4
+ service.generator_strategy || KuberKit.current_configuration.generator_strategy
5
+ end
6
+ end
@@ -1,9 +1,7 @@
1
1
  class KuberKit::ServiceReader::Reader
2
2
  include KuberKit::Import[
3
- "core.template_store",
4
3
  "core.context_helper_factory",
5
- "template_reader.reader",
6
- "preprocessing.text_preprocessor"
4
+ "template_reader.renderer"
7
5
  ]
8
6
 
9
7
  AttributeNotSetError = Class.new(KuberKit::Error)
@@ -14,14 +12,8 @@ class KuberKit::ServiceReader::Reader
14
12
  raise AttributeNotSetError, "Please set template for service using #template method"
15
13
  end
16
14
 
17
- template = template_store.get(service.template_name)
18
-
19
15
  context_helper = context_helper_factory.build_service_context(shell, service)
20
16
 
21
- template = reader.read(shell, template)
22
-
23
- result = text_preprocessor.compile(template, context_helper: context_helper)
24
-
25
- result
17
+ renderer.call(shell, service.template_name, context_helper: context_helper)
26
18
  end
27
19
  end
@@ -44,7 +44,7 @@ class KuberKit::Shell::Commands::DockerCommands
44
44
  if status
45
45
  command_parts << "--filter=\"status=#{status}\""
46
46
  end
47
- command_parts << "--filter=\"name=#{container_name}\""
47
+ command_parts << "--filter=\"name=^/#{container_name}$\""
48
48
 
49
49
  shell.exec!(command_parts.join(" "))
50
50
  end
@@ -8,6 +8,15 @@ class KuberKit::Shell::Commands::GitCommands
8
8
  return nil
9
9
  end
10
10
 
11
+ def get_branch_name(shell, git_repo_path, remote_name: "origin")
12
+ shell.exec!([
13
+ "cd #{git_repo_path}",
14
+ "git rev-parse --abbrev-ref HEAD",
15
+ ].join(" && "), merge_stderr: true)
16
+ rescue KuberKit::Shell::AbstractShell::ShellError
17
+ return nil
18
+ end
19
+
11
20
  def get_version_hash(shell, git_repo_path)
12
21
  shell.exec!([
13
22
  "cd #{git_repo_path}",
@@ -28,6 +37,7 @@ class KuberKit::Shell::Commands::GitCommands
28
37
  "cd #{path}",
29
38
  "git add .",
30
39
  "git reset HEAD --hard",
40
+ "git fetch origin #{branch}",
31
41
  "git checkout #{branch}",
32
42
  "git reset --hard '@{u}'",
33
43
  "git pull --force",