kuber_kit 0.5.1 → 0.5.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: e92d48eb25df0740824ac18623687080cc2ae9336b6707057ad2be4d8b2c4dad
4
- data.tar.gz: 629b8c6f11674623d3348c390a5bc90776cc3844d45418bbc7311a268aa3fd1f
3
+ metadata.gz: 485e80726d7350ce239a165860ba4096b3549178d10e5ff8abdc918df983ab4c
4
+ data.tar.gz: 480a475c88bf4a6626a182ade7909e0a08143a978d96471faf0c2495021abf6a
5
5
  SHA512:
6
- metadata.gz: 44e8c023ad85250859ce0d3029fefe69d285db34604cdfa2c61e4017f01e24c819f68f16397eccd5e89de59aba9ddc6d1b6dcd1d344842716696dce6bbcdee98
7
- data.tar.gz: 3d55ac2765022a978f6925ef477a727da2a8db12df383dc13703414fa66b989944c5fc452936a01b5d7ccf696313fae0f067e7507c482b1e45bba53fa0adcfc0
6
+ metadata.gz: d285c169ea188e3c8d4679db94ea74a7c3b5cabc993fbd41e675d590505d1f714836de4b052cd1b1793d810069b1d61f2520d78bcc8c538a6efaa95730f0dc2d
7
+ data.tar.gz: b645418d23a5e68f5bebf571dcd2853d460cadd42247ccc749b5c938825b08671059fedd3cbb83fd960cc3deb8a6eb0a121c11468e4dc7e365dc89b803046383
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ **0.5.2**
2
+ - Added dependencies support to services
3
+ - Added an option to deploy all services in `kit deloy`
4
+ - Wait for rollout to finish during service deploy
5
+ - Deploy services in batches, not all of the simultaneously
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.5.1)
4
+ kuber_kit (0.5.2)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject
data/TODO.md CHANGED
@@ -1,8 +1,9 @@
1
1
  - do not show result for images list, if list is too large (Mikhail)
2
- - add kit get method for interactive kubernetes
3
- - kit status should show the list of services and their status, with ability to select & view logs
4
- - find a way to always deploy some service, e.g. for migrations and env_files
2
+ - add kit get method for more interactive kubernetes
3
+ - env files should use a separate deployment method (with change detection)
4
+ - add automatical confirmation support for service deployer
5
5
  - template should be able to set default attributes
6
6
  - template should be able to depend on image?
7
7
  - cleanup image builds older than some date
8
- - add some rotation for deploy log
8
+ - add some rotation for deploy log
9
+ - kit status should show the list of services and their status, with ability to select & view logs
@@ -2,5 +2,5 @@ KuberKit
2
2
  .define_configuration(:review)
3
3
  .use_registry(:review_default, as: :default)
4
4
  .use_artifact(:kuber_kit_repo, as: :kuber_kit_repo)
5
- #.deployer_require_confirimation
5
+ .deployer_require_confirimation
6
6
  #.use_build_server(:remote_bs)
@@ -1,5 +1,6 @@
1
1
  KuberKit
2
2
  .define_service(:ruby_app)
3
+ .depends_on(:env_file)
3
4
  .template(:service)
4
5
  .images(:ruby_app)
5
6
  .tags("app")
data/lib/kuber_kit.rb CHANGED
@@ -46,6 +46,10 @@ module KuberKit
46
46
  autoload :BuildServer, 'core/build_servers/build_server'
47
47
  end
48
48
 
49
+ module Dependencies
50
+ autoload :AbstractDependencyResolver, 'core/dependencies/abstract_dependency_resolver'
51
+ end
52
+
49
53
  module EnvFiles
50
54
  autoload :EnvFileStore, 'core/env_files/env_file_store'
51
55
  autoload :AbstractEnvFile, 'core/env_files/abstract_env_file'
@@ -145,6 +149,7 @@ module KuberKit
145
149
  autoload :StrategyDetector, 'service_deployer/strategy_detector'
146
150
  autoload :Deployer, 'service_deployer/deployer'
147
151
  autoload :ServiceListResolver, 'service_deployer/service_list_resolver'
152
+ autoload :ServiceDependencyResolver, 'service_deployer/service_dependency_resolver'
148
153
 
149
154
  module Strategies
150
155
  autoload :Abstract, 'service_deployer/strategies/abstract'
@@ -2,9 +2,11 @@ class KuberKit::Actions::ServiceDeployer
2
2
  include KuberKit::Import[
3
3
  "actions.image_compiler",
4
4
  "service_deployer.service_list_resolver",
5
+ "service_deployer.service_dependency_resolver",
5
6
  "core.service_store",
6
7
  "shell.local_shell",
7
8
  "tools.process_cleaner",
9
+ "configs",
8
10
  "ui",
9
11
  service_deployer: "service_deployer.action_handler",
10
12
  ]
@@ -24,14 +26,17 @@ class KuberKit::Actions::ServiceDeployer
24
26
  services: services || [],
25
27
  tags: tags || [],
26
28
  enabled_services: KuberKit.current_configuration.enabled_services.map(&:to_s)
27
- )
29
+ ).map(&:to_sym)
28
30
 
29
- unless service_names.any?
31
+ # Return the list of services with all dependencies.
32
+ all_service_names = service_dependency_resolver.get_all(service_names)
33
+
34
+ unless all_service_names.any?
30
35
  ui.print_warning "ServiceDeployer", "No service found with given options, nothing will be deployed."
31
36
  return false
32
37
  end
33
38
 
34
- services_list = service_names.map(&:to_s).map(&:yellow).join(", ")
39
+ services_list = all_service_names.map(&:to_s).map(&:yellow).join(", ")
35
40
  ui.print_info "ServiceDeployer", "The following services will be deployed: #{services_list}"
36
41
 
37
42
  if require_confirmation
@@ -39,7 +44,7 @@ class KuberKit::Actions::ServiceDeployer
39
44
  return false unless ["confirm".green, "confirm", "yes"].include?(result)
40
45
  end
41
46
 
42
- services = service_names.map do |service_name|
47
+ services = all_service_names.map do |service_name|
43
48
  service_store.get_service(service_name.to_sym)
44
49
  end
45
50
 
@@ -50,9 +55,16 @@ class KuberKit::Actions::ServiceDeployer
50
55
  return false unless compile_result
51
56
  end
52
57
 
53
- deployment_result = deploy_services(service_names)
58
+ deployed_services = []
59
+ deployment_result = {}
60
+ service_dependency_resolver.each_with_deps(service_names) do |dep_service_names|
61
+ ui.print_debug("ServiceDeployer", "Scheduling to compile: #{dep_service_names.inspect}. Limit: #{configs.deploy_simultaneous_limit}")
62
+ result = deploy_simultaneously(dep_service_names)
63
+ deployed_services += dep_service_names
64
+ deployment_result = deployment_result.merge(result)
65
+ end
54
66
 
55
- { services: service_names, deployment: deployment_result }
67
+ { services: all_service_names, deployment: deployment_result }
56
68
  rescue KuberKit::Error => e
57
69
  ui.print_error("Error", e.message)
58
70
 
@@ -61,69 +73,73 @@ class KuberKit::Actions::ServiceDeployer
61
73
  process_cleaner.clean
62
74
  end
63
75
 
64
- def deploy_services(service_names)
65
- task_group = ui.create_task_group
76
+ private
77
+ def deploy_simultaneously(service_names)
78
+ task_group = ui.create_task_group
66
79
 
67
- deployer_result = {}
80
+ deployer_result = {}
68
81
 
69
- service_names.each do |service_name|
82
+ service_names.each do |service_name|
70
83
 
71
- ui.print_debug("ServiceDeployer", "Started deploying: #{service_name.to_s.green}")
72
- task_group.add("Deploying #{service_name.to_s.yellow}") do |task|
73
- deployer_result[service_name] = service_deployer.call(local_shell, service_name.to_sym)
84
+ ui.print_debug("ServiceDeployer", "Started deploying: #{service_name.to_s.green}")
85
+ task_group.add("Deploying #{service_name.to_s.yellow}") do |task|
86
+ deployer_result[service_name] = service_deployer.call(local_shell, service_name.to_sym)
74
87
 
75
- task.update_title("Deployed #{service_name.to_s.green}")
76
- ui.print_debug("ServiceDeployer", "Finished deploying: #{service_name.to_s.green}")
88
+ task.update_title("Deployed #{service_name.to_s.green}")
89
+ ui.print_debug("ServiceDeployer", "Finished deploying: #{service_name.to_s.green}")
90
+ end
77
91
  end
78
- end
79
92
 
80
- task_group.wait
93
+ task_group.wait
81
94
 
82
- deployer_result
83
- end
84
-
85
- def compile_images(images_names)
86
- return true if images_names.empty?
87
- image_compiler.call(images_names, {})
88
- end
95
+ deployer_result
96
+ end
89
97
 
90
- def show_tags_selection()
91
- specific_service_option = "deploy specific service"
92
-
93
- tags = [specific_service_option]
94
- tags += service_store
95
- .all_definitions
96
- .values
97
- .map(&:to_service_attrs)
98
- .map(&:tags)
99
- .flatten
100
- .uniq
101
- .sort
102
- .map(&:to_s)
103
-
104
- selected_tag = ui.prompt("Please select which tag to deploy", tags)
105
-
106
- if selected_tag == specific_service_option
107
- show_service_selection
108
- else
109
- [[], [selected_tag]]
98
+ def compile_images(images_names)
99
+ return true if images_names.empty?
100
+ image_compiler.call(images_names, {})
110
101
  end
111
- end
112
102
 
113
- def show_service_selection()
114
- services = service_store
115
- .all_definitions
116
- .values
117
- .map(&:service_name)
118
- .uniq
119
- .sort
120
- .map(&:to_s)
121
-
122
- if services.empty?
123
- return [[], []]
103
+ def show_tags_selection()
104
+ specific_service_option = "deploy specific service"
105
+ all_services_option = "deploy all services"
106
+
107
+ tags = [specific_service_option, all_services_option]
108
+ tags += service_store
109
+ .all_definitions
110
+ .values
111
+ .map(&:to_service_attrs)
112
+ .map(&:tags)
113
+ .flatten
114
+ .uniq
115
+ .sort
116
+ .map(&:to_s)
117
+
118
+ selected_tag = ui.prompt("Please select which tag to deploy", tags)
119
+
120
+ if selected_tag == specific_service_option
121
+ show_service_selection
122
+ elsif selected_tag == all_services_option
123
+ [["*"], []]
124
+ else
125
+ [[], [selected_tag]]
126
+ end
124
127
  end
125
128
 
126
- selected_service = ui.prompt("Please select which service to deploy", services)
127
- [[selected_service], []]
128
- end
129
+ def show_service_selection()
130
+ services = service_store
131
+ .all_definitions
132
+ .values
133
+ .map(&:service_name)
134
+ .uniq
135
+ .sort
136
+ .map(&:to_s)
137
+
138
+ if services.empty?
139
+ return [[], []]
140
+ end
141
+
142
+ selected_service = ui.prompt("Please select which service to deploy", services)
143
+ [[selected_service], []]
144
+ end
129
145
  end
@@ -4,7 +4,7 @@ class KuberKit::Configs
4
4
  AVAILABLE_CONFIGS = [
5
5
  :image_dockerfile_name, :image_build_context_dir, :image_tag, :docker_ignore_list, :image_compile_dir,
6
6
  :kuber_kit_dirname, :kuber_kit_min_version, :images_dirname, :services_dirname, :infra_dirname, :configurations_dirname,
7
- :artifact_clone_dir, :service_config_dir, :deployer_strategy, :compile_simultaneous_limit,
7
+ :artifact_clone_dir, :service_config_dir, :deployer_strategy, :compile_simultaneous_limit, :deploy_simultaneous_limit,
8
8
  :additional_images_paths, :deprecation_warnings_disabled, :log_file_path
9
9
  ]
10
10
  DOCKER_IGNORE_LIST = [
@@ -49,6 +49,7 @@ class KuberKit::Configs
49
49
  set :service_config_dir, "/tmp/kuber_kit/services"
50
50
  set :deployer_strategy, :kubernetes
51
51
  set :compile_simultaneous_limit, 5
52
+ set :deploy_simultaneous_limit, 5
52
53
  set :additional_images_paths, []
53
54
  set :deprecation_warnings_disabled, false
54
55
  set :log_file_path, "/tmp/kuber_kit.log"
@@ -257,6 +257,10 @@ class KuberKit::Container
257
257
  KuberKit::ServiceDeployer::ServiceListResolver.new
258
258
  end
259
259
 
260
+ register "service_deployer.service_dependency_resolver" do
261
+ KuberKit::ServiceDeployer::ServiceDependencyResolver.new
262
+ end
263
+
260
264
  register "service_deployer.strategies.kubernetes" do
261
265
  KuberKit::ServiceDeployer::Strategies::Kubernetes.new
262
266
  end
@@ -0,0 +1,75 @@
1
+ class KuberKit::Core::Dependencies::AbstractDependencyResolver
2
+ CircularDependencyError = Class.new(KuberKit::Error)
3
+ DependencyNotFoundError = Class.new(KuberKit::NotFoundError)
4
+
5
+ # Iterate over list of dependencies for items (including the items themself).
6
+ # Iteration will send the list to the callback block function
7
+ Contract Or[Symbol, ArrayOf[Symbol]], Proc => Any
8
+ def each_with_deps(item_names, &block)
9
+ resolved_dependencies = []
10
+ # Get first list of dependencies ready to resolve
11
+ next_dependencies = get_next(item_names, limit: dependency_batch_size)
12
+
13
+ # Call the block for each list of dependencies ready to resolve, then calculate the next list
14
+ while (next_dependencies - resolved_dependencies).any?
15
+ block.call(next_dependencies)
16
+ resolved_dependencies += next_dependencies
17
+ next_dependencies = get_next(item_names, resolved: resolved_dependencies, limit: dependency_batch_size)
18
+ end
19
+
20
+ (item_names - resolved_dependencies).each_slice(dependency_batch_size) do |group|
21
+ block.call(group)
22
+ end
23
+ end
24
+
25
+ # Returns next list of dependencies ready to resolve.
26
+ # Item is not ready to resolve if it has personal dependency.
27
+ # E.g. if "A" depends on "B" and "C", "C" depends on "D", then only "B" and "D" will be returned.
28
+ Contract Or[Symbol, ArrayOf[Symbol]], KeywordArgs[
29
+ resolved: Optional[ArrayOf[Symbol]],
30
+ limit: Optional[Maybe[Num]]
31
+ ] => Any
32
+ def get_next(item_names, resolved: [], limit: nil)
33
+ deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten.uniq
34
+
35
+ # Find out which dependencies are ready to resolve,
36
+ # they should not have unresolved personal dependencies
37
+ ready_to_resolve = deps.select do |dep_name|
38
+ unresolved_deps = get_deps(dep_name) - resolved
39
+ unresolved_deps.empty?
40
+ end
41
+ unresolved_deps = ready_to_resolve - resolved
42
+ unresolved_deps = unresolved_deps.take(limit) if limit
43
+ unresolved_deps
44
+ end
45
+
46
+ # Get all dependencies for items (including the items themself), without any limitations
47
+ Contract Or[Symbol, ArrayOf[Symbol]] => Any
48
+ def get_all(item_names)
49
+ deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten
50
+ (deps + item_names).uniq
51
+ end
52
+
53
+ def get_recursive_deps(item_name, dependency_tree: [])
54
+ deps = get_deps(item_name)
55
+
56
+ if dependency_tree.include?(item_name)
57
+ raise CircularDependencyError, "Circular dependency found for #{item_name}. Dependency tree: #{dependency_tree.inspect}"
58
+ end
59
+
60
+ child_deps = []
61
+ deps.each do |i|
62
+ child_deps += get_recursive_deps(i, dependency_tree: dependency_tree + [item_name])
63
+ end
64
+
65
+ (deps + child_deps).uniq
66
+ end
67
+
68
+ def get_deps(item_name)
69
+ raise "This method should be overriden"
70
+ end
71
+
72
+ def dependency_batch_size
73
+ raise "This method should be overriden"
74
+ end
75
+ end
@@ -1,5 +1,6 @@
1
1
  class KuberKit::Core::Image
2
- attr_reader :name, :dependencies, :registry, :dockerfile_path, :build_vars, :build_context_dir, :tag, :before_build_callback, :after_build_callback
2
+ attr_reader :name, :dependencies, :registry, :dockerfile_path, :build_vars, :build_context_dir, :tag,
3
+ :before_build_callback, :after_build_callback
3
4
 
4
5
  Contract KeywordArgs[
5
6
  name: Symbol,
@@ -1,18 +1,20 @@
1
1
  class KuberKit::Core::Service
2
2
  AttributeNotSet = Class.new(Indocker::Error)
3
3
 
4
- attr_reader :name, :template_name, :tags, :images, :attributes, :deployer_strategy
4
+ attr_reader :name, :dependencies, :template_name, :tags, :images, :attributes, :deployer_strategy
5
5
 
6
6
  Contract KeywordArgs[
7
7
  name: Symbol,
8
+ dependencies: ArrayOf[Symbol],
8
9
  template_name: Maybe[Symbol],
9
10
  tags: ArrayOf[Symbol],
10
11
  images: ArrayOf[Symbol],
11
12
  attributes: HashOf[Symbol => Any],
12
13
  deployer_strategy: Maybe[Symbol]
13
14
  ] => Any
14
- def initialize(name:, template_name:, tags:, images:, attributes:, deployer_strategy:)
15
+ def initialize(name:, dependencies:, template_name:, tags:, images:, attributes:, deployer_strategy:)
15
16
  @name = name
17
+ @dependencies = dependencies
16
18
  @template_name = template_name
17
19
  @tags = tags
18
20
  @images = images
@@ -1,22 +1,29 @@
1
1
  class KuberKit::Core::ServiceDefinition
2
- attr_reader :service_name, :template_name
2
+ attr_reader :service_name, :template_name, :dependencies
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
8
  end
8
9
 
9
10
  def to_service_attrs
10
11
  OpenStruct.new(
11
- name: @service_name,
12
- template_name: get_value(@template_name),
13
- tags: Array(get_value(@tags)).map(&:to_sym),
14
- images: Array(get_value(@images)).map(&:to_sym),
15
- attributes: get_value(@attributes),
12
+ name: @service_name,
13
+ dependencies: @dependencies,
14
+ template_name: get_value(@template_name),
15
+ tags: Array(get_value(@tags)).map(&:to_sym),
16
+ images: Array(get_value(@images)).map(&:to_sym),
17
+ attributes: get_value(@attributes),
16
18
  deployer_strategy: get_value(@deployer_strategy),
17
19
  )
18
20
  end
19
21
 
22
+ def depends_on(*value, &block)
23
+ @dependencies = Array(value).flatten
24
+ self
25
+ end
26
+
20
27
  def template(value = nil, &block)
21
28
  @template_name = block_given? ? block : value
22
29
 
@@ -7,6 +7,7 @@ class KuberKit::Core::ServiceFactory
7
7
 
8
8
  KuberKit::Core::Service.new(
9
9
  name: service_attrs.name,
10
+ dependencies: service_attrs.dependencies,
10
11
  template_name: service_attrs.template_name,
11
12
  tags: service_attrs.tags,
12
13
  images: service_attrs.images,
@@ -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
@@ -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 = strategy_options.fetch(:restart_if_exists, true)
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,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.5.1"
2
+ VERSION = "0.5.2"
3
3
  end
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.5.1
4
+ version: 0.5.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: 2021-03-03 00:00:00.000000000 Z
11
+ date: 2021-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -165,6 +165,7 @@ files:
165
165
  - ".ruby-gemset"
166
166
  - ".ruby-version"
167
167
  - ".travis.yml"
168
+ - CHANGELOG.md
168
169
  - Gemfile
169
170
  - Gemfile.lock
170
171
  - LICENSE.txt
@@ -239,6 +240,7 @@ files:
239
240
  - lib/kuber_kit/core/context_helper/context_vars.rb
240
241
  - lib/kuber_kit/core/context_helper/image_helper.rb
241
242
  - lib/kuber_kit/core/context_helper/service_helper.rb
243
+ - lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb
242
244
  - lib/kuber_kit/core/env_files/abstract_env_file.rb
243
245
  - lib/kuber_kit/core/env_files/artifact_file.rb
244
246
  - lib/kuber_kit/core/env_files/env_file_store.rb
@@ -281,6 +283,7 @@ files:
281
283
  - lib/kuber_kit/preprocessing/text_preprocessor.rb
282
284
  - lib/kuber_kit/service_deployer/action_handler.rb
283
285
  - lib/kuber_kit/service_deployer/deployer.rb
286
+ - lib/kuber_kit/service_deployer/service_dependency_resolver.rb
284
287
  - lib/kuber_kit/service_deployer/service_list_resolver.rb
285
288
  - lib/kuber_kit/service_deployer/strategies/abstract.rb
286
289
  - lib/kuber_kit/service_deployer/strategies/docker.rb