kuber_kit 1.3.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6afb44a6d4d220f74b0254b1334eb8c1a54eaed3bb343ac701a88bc25f2afcaa
4
- data.tar.gz: dde0f72facc6c08af028bc32ba2d024b1838e036836e94f2785695e43f948d96
3
+ metadata.gz: a3a577fb45bf9933ff2168b199459df8bd3801246ec999e53d2f314a5cd76ca4
4
+ data.tar.gz: 50404be436a1821825e11109a9f34564b6cd162a0c7c8a20e27b023f55fcde9d
5
5
  SHA512:
6
- metadata.gz: 383427ada7a5ca0ecd9a6db9c6747ecdf830866d2a7ea890706b5201566fa8e4aa59b868b6b49c94ab3524c7f5d7f8e85a8ea137e9d8c973d825d8aef028f1dc
7
- data.tar.gz: 66c2f065953353e283dc5986582e5d440b03c2e3e532dd70c717e91288aa15d99b872c1eb337b23dc9a4fd4873c72ded43dcd0fd5f630cf579ae76e01c652eeb
6
+ metadata.gz: e36744815c27471bbe4785cdaa83301b15080e15abd38a189a9ed06dbc38b6ec070a213018fca27e3b17ec61a24ca923461800aeb9ba5979cbaf909fcc90bbd5
7
+ data.tar.gz: d7720f929d549261f430cb4599ba4131f3472200aa53125355a7215f8e06c27a872a5cb7fb51be15ea93a333b56d82d2d2dd114c311e0ae9436671cb48920e37
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ **1.3.1**
2
+ - Added an ability to generate helm templates using `kit generate` command
3
+
4
+ **1.3.1**
5
+ - Fix upgrade command for helm strategy
6
+
1
7
  **1.3.0**
2
8
  - Allow sending custom apply command for k8s deploy strategy
3
9
  - Added initial support for helm deploy strategy
data/README.md CHANGED
@@ -19,7 +19,7 @@ Please install specific kuber_kit version, depending on Ruby version.
19
19
  | Ruby Version | KuberKit Version |
20
20
  | ------------ | ------------ |
21
21
  | 2.6 | 1.0.1 |
22
- | 2.7 | 1.1.3 |
22
+ | 2.7 | 1.1.5 |
23
23
  | > 3.0 | 1.2.6 |
24
24
 
25
25
  ## Usage
@@ -29,11 +29,11 @@ class KuberKit::Actions::ServiceDeployer
29
29
  services, tags = deployment_options_selector.call()
30
30
  end
31
31
 
32
- disabled_services = current_configuration.disabled_services.map(&:to_s)
33
- disabled_services += skip_services if skip_services
34
- default_services = current_configuration.default_services.map(&:to_s) - disabled_services
35
- initial_services = current_configuration.initial_services.map(&:to_s) - disabled_services
36
- initial_service_names = initial_services.map(&:to_sym)
32
+ disabled_services = current_configuration.disabled_services.map(&:to_s)
33
+ disabled_services += skip_services if skip_services
34
+ default_services = current_configuration.default_services.map(&:to_s) - disabled_services
35
+ pre_deploy_services = current_configuration.pre_deploy_services.map(&:to_s) - disabled_services
36
+ post_deploy_services = current_configuration.post_deploy_services.map(&:to_s) - disabled_services
37
37
 
38
38
  service_names = service_list_resolver.resolve(
39
39
  services: services || [],
@@ -50,17 +50,19 @@ class KuberKit::Actions::ServiceDeployer
50
50
  all_service_names = service_dependency_resolver.get_all(service_names)
51
51
  end
52
52
 
53
+ all_service_names_with_hooks = (pre_deploy_services.map(&:to_sym) + all_service_names + post_deploy_services.map(&:to_sym)).uniq
54
+
53
55
  unless all_service_names.any?
54
56
  ui.print_warning "ServiceDeployer", "No service found with given options, nothing will be deployed."
55
57
  return false
56
58
  end
57
59
 
58
- unless allow_deployment?(require_confirmation: require_confirmation, service_names: (initial_service_names + all_service_names).uniq)
60
+ unless allow_deployment?(require_confirmation: require_confirmation, service_names: all_service_names_with_hooks)
59
61
  return false
60
62
  end
61
63
 
62
64
  # Compile images for all services and dependencies
63
- images_names = get_image_names(service_names: (initial_service_names + all_service_names).uniq)
65
+ images_names = get_image_names(service_names: all_service_names_with_hooks.uniq)
64
66
  unless skip_compile
65
67
  compilation_result = compile_images(images_names)
66
68
 
@@ -72,33 +74,31 @@ class KuberKit::Actions::ServiceDeployer
72
74
  return deployment_result
73
75
  end
74
76
 
75
- # First deploy initial services.
77
+ # First, deploy pre-deploy services.
76
78
  # This feature is used to deploy some services, required for deployment of other services, e.g. env files
77
79
  # Note: Initial services are deployed without dependencies
78
- initial_services.map(&:to_sym).each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
79
- ui.print_debug("ServiceDeployer", "Scheduling to compile: #{batch_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
80
+ pre_deploy_services.map(&:to_sym).each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
81
+ deploy_simultaneously(batch_service_names, deployment_result)
82
+ end
80
83
 
81
- if deployment_result.succeeded?
84
+ # Next, deploy all initializers simultaneously.
85
+ # Note: In earlier versions, KuberKit would deploy all dependencies in the order defined by dependency tree.
86
+ # Now it would deploy all dependencies (initializers) at the same time, even if one initializer depends on another initializer.
87
+ unless skip_dependencies
88
+ initializers = service_dependency_resolver.get_all_deps(service_names)
89
+ initializers.map(&:to_sym).each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
82
90
  deploy_simultaneously(batch_service_names, deployment_result)
83
91
  end
84
92
  end
85
93
 
86
- if skip_dependencies
87
- service_names.each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
88
- ui.print_debug("ServiceDeployer", "Scheduling to deploy: #{batch_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
89
-
90
- if deployment_result.succeeded?
91
- deploy_simultaneously(batch_service_names, deployment_result)
92
- end
93
- end
94
- else
95
- service_dependency_resolver.each_with_deps(service_names) do |dep_service_names|
96
- ui.print_debug("ServiceDeployer", "Scheduling to deploy: #{dep_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
94
+ # Next, deploy all requested services.
95
+ service_names.each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
96
+ deploy_simultaneously(batch_service_names, deployment_result)
97
+ end
97
98
 
98
- if deployment_result.succeeded?
99
- deploy_simultaneously(dep_service_names, deployment_result)
100
- end
101
- end
99
+ # Last, deploy post-deploy services.
100
+ post_deploy_services.map(&:to_sym).each_slice(configs.deploy_simultaneous_limit) do |batch_service_names|
101
+ deploy_simultaneously(batch_service_names, deployment_result)
102
102
  end
103
103
 
104
104
  deployment_result
@@ -116,6 +116,13 @@ class KuberKit::Actions::ServiceDeployer
116
116
 
117
117
  private
118
118
  def deploy_simultaneously(service_names, deployment_result)
119
+ unless deployment_result.succeeded?
120
+ ui.print_debug("ServiceDeployer", "Deploymet already failed. Canceling: #{service_names.inspect}")
121
+ return
122
+ end
123
+
124
+ ui.print_debug("ServiceDeployer", "Scheduling to deploy: #{service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
125
+
119
126
  task_group = ui.create_task_group
120
127
 
121
128
  service_names.each do |service_name|
@@ -0,0 +1,20 @@
1
+ class KuberKit::Actions::ServiceGenerator
2
+ include KuberKit::Import[
3
+ "shell.local_shell",
4
+ "service_generator.action_handler",
5
+ "ui",
6
+ ]
7
+
8
+ Contract Symbol, String => Any
9
+ def call(service_name, path)
10
+ expanded_path = File.expand_path(path)
11
+ puts expanded_path
12
+ action_handler.call(local_shell, service_name, expanded_path)
13
+
14
+ true
15
+ rescue KuberKit::Error => e
16
+ ui.print_error("Error", e.message)
17
+
18
+ false
19
+ end
20
+ end
data/lib/kuber_kit/cli.rb CHANGED
@@ -111,6 +111,16 @@ class KuberKit::CLI < Thor
111
111
  end
112
112
  end
113
113
 
114
+
115
+ desc "generate SERVICE_NAME PATH_NAME", "Generates a template for a given service in a given path"
116
+ def generate(service_name, path)
117
+ setup(options)
118
+
119
+ if KuberKit::Container['actions.configuration_loader'].call(options)
120
+ KuberKit::Container['actions.service_generator'].call(service_name.to_sym, path)
121
+ end
122
+ end
123
+
114
124
  desc "apply FILE_PATH", "Apply FILE_PATH with kubectl"
115
125
  def apply(file_path)
116
126
  setup(options)
@@ -5,7 +5,8 @@ class KuberKit::Configs
5
5
  :image_dockerfile_name, :image_build_context_dir, :image_tag, :docker_ignore_list, :image_compile_dir, :remote_image_compile_dir,
6
6
  :kuber_kit_dirname, :kuber_kit_min_version, :images_dirname, :services_dirname, :infra_dirname, :configurations_dirname,
7
7
  :artifact_clone_dir, :service_config_dir, :deployer_strategy, :compile_simultaneous_limit, :deploy_simultaneous_limit,
8
- :additional_images_paths, :deprecation_warnings_disabled, :log_file_path, :env_file_compile_dir, :shell_launcher_strategy, :shell_launcher_sets_configration
8
+ :additional_images_paths, :deprecation_warnings_disabled, :log_file_path, :env_file_compile_dir, :shell_launcher_strategy,
9
+ :shell_launcher_sets_configration, :generator_strategy
9
10
  ]
10
11
  DOCKER_IGNORE_LIST = [
11
12
  'Dockerfile',
@@ -60,6 +61,7 @@ class KuberKit::Configs
60
61
  set :log_file_path, File.join(absolute_kuber_kit_path, "deploy.log")
61
62
  set :env_file_compile_dir, File.join(absolute_kuber_kit_path, "env_files")
62
63
  set :shell_launcher_sets_configration, true
64
+ set :generator_strategy, :helm
63
65
  end
64
66
 
65
67
  def items
@@ -25,6 +25,10 @@ class KuberKit::Container
25
25
  KuberKit::Actions::ServiceChecker.new
26
26
  end
27
27
 
28
+ register "actions.service_generator" do
29
+ KuberKit::Actions::ServiceGenerator.new
30
+ end
31
+
28
32
  register "actions.configuration_loader" do
29
33
  KuberKit::Actions::ConfigurationLoader.new
30
34
  end
@@ -301,6 +305,18 @@ class KuberKit::Container
301
305
  KuberKit::ServiceDeployer::ServiceDependencyResolver.new
302
306
  end
303
307
 
308
+ register "service_generator.action_handler" do
309
+ KuberKit::ServiceGenerator::ActionHandler.new
310
+ end
311
+
312
+ register "service_generator.strategy_detector" do
313
+ KuberKit::ServiceGenerator::StrategyDetector.new
314
+ end
315
+
316
+ register "service_generator.generator" do
317
+ KuberKit::ServiceGenerator::Generator.new
318
+ end
319
+
304
320
  register "service_reader.action_handler" do
305
321
  KuberKit::ServiceReader::ActionHandler.new
306
322
  end
@@ -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
 
@@ -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
@@ -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::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
@@ -14,8 +14,8 @@ class KuberKit::ServiceDeployer::Strategies::Helm < KuberKit::ServiceDeployer::S
14
14
  chart_config_path = File.join(chart_root_path, "Chart.yaml")
15
15
  release_path = File.join(chart_templates_path, "release.yaml")
16
16
 
17
- bash_commands.mkdir_p(shell, File.dirname(chart_root_path))
18
- bash_commands.mkdir_p(shell, File.dirname(chart_templates_path))
17
+ bash_commands.mkdir_p(shell, chart_root_path)
18
+ bash_commands.mkdir_p(shell, chart_templates_path)
19
19
 
20
20
  shell.write(release_path, service_config)
21
21
  shell.write(chart_config_path, chart_config_content(service.uri))
@@ -23,7 +23,7 @@ class KuberKit::ServiceDeployer::Strategies::Helm < KuberKit::ServiceDeployer::S
23
23
  kubeconfig_path = KuberKit.current_configuration.kubeconfig_path
24
24
  namespace = KuberKit.current_configuration.deployer_namespace
25
25
 
26
- upgrade_result = helm_commands.upgrade(shell, chart_root_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
26
+ upgrade_result = helm_commands.upgrade(shell, service.uri, chart_root_path, kubeconfig_path: kubeconfig_path, namespace: namespace)
27
27
 
28
28
  upgrade_result
29
29
  end
@@ -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,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "1.3.0"
2
+ VERSION = "1.3.2"
3
3
  end
data/lib/kuber_kit.rb CHANGED
@@ -171,6 +171,17 @@ module KuberKit
171
171
  end
172
172
  end
173
173
 
174
+ module ServiceGenerator
175
+ autoload :ActionHandler, 'service_generator/action_handler'
176
+ autoload :StrategyDetector, 'service_generator/strategy_detector'
177
+ autoload :Generator, 'service_generator/generator'
178
+
179
+ module Strategies
180
+ autoload :Abstract, 'service_generator/strategies/abstract'
181
+ autoload :Helm, 'service_generator/strategies/helm'
182
+ end
183
+ end
184
+
174
185
  module ServiceReader
175
186
  autoload :ActionHandler, 'service_reader/action_handler'
176
187
  autoload :Reader, 'service_reader/reader'
@@ -194,6 +205,7 @@ module KuberKit
194
205
  autoload :ServiceReader, 'actions/service_reader'
195
206
  autoload :ServiceDeployer, 'actions/service_deployer'
196
207
  autoload :ServiceChecker, 'actions/service_checker'
208
+ autoload :ServiceGenerator, 'actions/service_generator'
197
209
  autoload :ConfigurationLoader, 'actions/configuration_loader'
198
210
  autoload :KubectlApplier, 'actions/kubectl_applier'
199
211
  autoload :KubectlAttacher, 'actions/kubectl_attacher'
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: 1.3.0
4
+ version: 1.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: 2023-08-11 00:00:00.000000000 Z
11
+ date: 2023-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts
@@ -259,6 +259,7 @@ files:
259
259
  - lib/kuber_kit/actions/kubectl_logs.rb
260
260
  - lib/kuber_kit/actions/service_checker.rb
261
261
  - lib/kuber_kit/actions/service_deployer.rb
262
+ - lib/kuber_kit/actions/service_generator.rb
262
263
  - lib/kuber_kit/actions/service_reader.rb
263
264
  - lib/kuber_kit/actions/shell_launcher.rb
264
265
  - lib/kuber_kit/actions/template_reader.rb
@@ -346,6 +347,11 @@ files:
346
347
  - lib/kuber_kit/service_deployer/strategies/helm.rb
347
348
  - lib/kuber_kit/service_deployer/strategies/kubernetes.rb
348
349
  - lib/kuber_kit/service_deployer/strategy_detector.rb
350
+ - lib/kuber_kit/service_generator/action_handler.rb
351
+ - lib/kuber_kit/service_generator/generator.rb
352
+ - lib/kuber_kit/service_generator/strategies/abstract.rb
353
+ - lib/kuber_kit/service_generator/strategies/helm.rb
354
+ - lib/kuber_kit/service_generator/strategy_detector.rb
349
355
  - lib/kuber_kit/service_reader/action_handler.rb
350
356
  - lib/kuber_kit/service_reader/reader.rb
351
357
  - lib/kuber_kit/shell/abstract_shell.rb