kuber_kit 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 197d241ca2d0f76b0d8d749db348c3f033d63f619e4d1af223fc2b7886131b24
4
- data.tar.gz: 984d1db7f60e0bd1669aacc88f8b8901ff0be18a3a7d286b41c998aa661ac6f9
3
+ metadata.gz: d221b8cd2f09dc4a239e125c2d53ebed3b6ba85c07cbf47f13b13f064b4acc35
4
+ data.tar.gz: fe87b38b80cf8e76bcd8f24a8c12e5e1564cf39ca184065d7f10463419ae3472
5
5
  SHA512:
6
- metadata.gz: 2b0fd0641482e5d1510d3a4ab04715ebe417a026bb2face987f923d4cba65e30532b2e2bb7cf3d10a6088a1e729e4fdefaa323a686c28bd917c1e2952b2eac5b
7
- data.tar.gz: f7d083f24f6194f0815fd01a7b953c93db75e33c3db50d3c7e1677798be45f2a3f479500643cf4b83174f9aca65848f8313f873a07bb339881b76fbb6ff04ec8
6
+ metadata.gz: 9820d98b32ddb5876ad536c3a785360db92e6301b9d359f7fd6cc795cfdc996408eb52685d891b3ef7a058f7e6022247afa057ac0ed65f1db33adff7eb5d6274
7
+ data.tar.gz: 51376794f59eb73726187455144309c957b04850fd9c1c92b98de82109536105db94f4babd0734ff422907ae65a4722fad0fd2f271ee030819ff40173953d8fe
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kuber_kit (0.4.7)
4
+ kuber_kit (0.4.8)
5
5
  cli-ui
6
6
  contracts-lite
7
7
  dry-auto_inject
data/TODO.md CHANGED
@@ -1,7 +1,8 @@
1
+ - do not show result for images list, if list is too large (Mikhail)
1
2
  - add kit get method for interactive kubernetes
2
- - do not show result for images list, if list is too large
3
3
  - kit status should show the list of services and their status, with ability to select & view logs
4
4
  - find a way to always deploy some service, e.g. for migrations and env_files
5
5
  - template should be able to set default attributes
6
6
  - template should be able to depend on image?
7
- - cleanup image builds older than some date
7
+ - cleanup image builds older than some date
8
+ - add some rotation for deploy log
@@ -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)
@@ -8,4 +8,6 @@ COPY README.md README.md
8
8
 
9
9
  RUN ruby /app/source.rb
10
10
 
11
- COPY example_file.txt <%= build_vars.example_file_name %>
11
+ COPY example_file.txt <%= build_vars.example_file_name %>
12
+
13
+ CMD ["tail", "-f", "/dev/null"]
@@ -4,7 +4,7 @@ KuberKit
4
4
  .deployer_strategy(:docker)
5
5
  .attributes(
6
6
  deployer: {
7
- detached: true,
7
+ detached: false,
8
8
  image_name: :ruby_app,
9
9
  container_name: "test_docker_app",
10
10
  delete_if_exists: true
data/lib/kuber_kit.rb CHANGED
@@ -76,6 +76,7 @@ module KuberKit
76
76
  module Tools
77
77
  autoload :FilePresenceChecker, 'tools/file_presence_checker'
78
78
  autoload :LoggerFactory, 'tools/logger_factory'
79
+ autoload :ProcessCleaner, 'tools/process_cleaner'
79
80
  end
80
81
 
81
82
  module Shell
@@ -92,6 +93,7 @@ module KuberKit
92
93
  autoload :GitCommands, 'shell/commands/git_commands'
93
94
  autoload :RsyncCommands, 'shell/commands/rsync_commands'
94
95
  autoload :KubectlCommands, 'shell/commands/kubectl_commands'
96
+ autoload :SystemCommands, 'shell/commands/system_commands'
95
97
  end
96
98
  end
97
99
 
@@ -4,6 +4,7 @@ class KuberKit::Actions::ServiceDeployer
4
4
  "service_deployer.service_list_resolver",
5
5
  "core.service_store",
6
6
  "shell.local_shell",
7
+ "tools.process_cleaner",
7
8
  "ui",
8
9
  service_deployer: "service_deployer.action_handler",
9
10
  ]
@@ -56,6 +57,8 @@ class KuberKit::Actions::ServiceDeployer
56
57
  ui.print_error("Error", e.message)
57
58
 
58
59
  false
60
+ rescue Interrupt => e
61
+ process_cleaner.clean
59
62
  end
60
63
 
61
64
  def deploy_services(service_names)
data/lib/kuber_kit/cli.rb CHANGED
@@ -160,4 +160,21 @@ class KuberKit::CLI < Thor
160
160
  def print_result(message, data = {})
161
161
  KuberKit::Container['ui'].print_result(message, data)
162
162
  end
163
+
164
+ def cleanup_processes
165
+ # Stop all threads
166
+ Thread.list.each do |t|
167
+ t.abort_on_exception = false
168
+ t.report_on_exception = false
169
+ Thread.kill(t) if t != Thread.current
170
+ end
171
+
172
+ # Find all system calls
173
+ child_pids_raw = `ps auxww | grep '[K]IT=#{Process.pid}' | awk '{print $2}'`
174
+ child_pids = child_pids_raw.to_s.split("\n").reject(&:empty?)
175
+ child_pids.each do |pid|
176
+ puts "Killing child process: #{pid}"
177
+ Process.kill("SIGHUP", pid.to_i)
178
+ end
179
+ end
163
180
  end
@@ -121,6 +121,10 @@ class KuberKit::Container
121
121
  KuberKit::Container["tools.logger_factory"].create()
122
122
  end
123
123
 
124
+ register "tools.process_cleaner" do
125
+ KuberKit::Tools::ProcessCleaner.new
126
+ end
127
+
124
128
  register "shell.bash_commands" do
125
129
  KuberKit::Shell::Commands::BashCommands.new
126
130
  end
@@ -145,6 +149,10 @@ class KuberKit::Container
145
149
  KuberKit::Shell::Commands::KubectlCommands.new
146
150
  end
147
151
 
152
+ register "shell.system_commands" do
153
+ KuberKit::Shell::Commands::SystemCommands.new
154
+ end
155
+
148
156
  register "shell.local_shell" do
149
157
  KuberKit::Shell::LocalShell.new
150
158
  end
@@ -0,0 +1,32 @@
1
+ class KuberKit::Shell::Commands::SystemCommands
2
+ def kill_process(shell, pid)
3
+ # we need to use kill command directly sometimes,
4
+ # because Process.kill doesn't kill processes created by system() call
5
+ shell.exec!("kill -9 #{pid}")
6
+ true
7
+ rescue
8
+ false
9
+ end
10
+
11
+ def find_pids_by_name(shell, name)
12
+ shell
13
+ .exec!("ps auxww | grep '#{name}' | grep -v 'grep' | awk '{print $2}'")
14
+ .split("\n")
15
+ .reject(&:empty?)
16
+ .map(&:chomp)
17
+ .map(&:to_i)
18
+ rescue
19
+ []
20
+ end
21
+
22
+ def get_child_pids(shell, pid)
23
+ shell
24
+ .exec!("pgrep -P #{pid}")
25
+ .split("\n")
26
+ .reject(&:empty?)
27
+ .map(&:chomp)
28
+ .map(&:to_i)
29
+ rescue
30
+ []
31
+ end
32
+ end
@@ -15,7 +15,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
15
15
  end
16
16
 
17
17
  result = nil
18
- IO.popen(command, err: [:child, :out]) do |io|
18
+ IO.popen(wrap_command_with_pid(command), err: [:child, :out]) do |io|
19
19
  result = io.read.chomp.strip
20
20
  end
21
21
 
@@ -37,7 +37,7 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
37
37
  ui.print_debug("LocalShell", "Interactive: [#{command_number}]: #{command.to_s.cyan}")
38
38
  end
39
39
 
40
- result = system(command)
40
+ result = system(wrap_command_with_pid(command))
41
41
 
42
42
  if !$?.success?
43
43
  raise ShellError, "Shell command failed: #{command}\r\n#{result}"
@@ -86,6 +86,10 @@ class KuberKit::Shell::LocalShell < KuberKit::Shell::AbstractShell
86
86
  end
87
87
  end
88
88
 
89
+ def wrap_command_with_pid(command)
90
+ "KIT=#{Process.pid} #{command}"
91
+ end
92
+
89
93
  private
90
94
  def ensure_directory_exists(file_path)
91
95
  dir_path = File.dirname(file_path)
@@ -27,7 +27,7 @@ class KuberKit::Shell::SshShell < KuberKit::Shell::LocalShell
27
27
  ui.print_debug("SshShell", "#{ssh_session.host.green} > Execute: [#{command_number}]: #{command.to_s.cyan}")
28
28
  end
29
29
 
30
- result = ssh_session.exec!(command)
30
+ result = ssh_session.exec!(wrap_command_with_pid(command))
31
31
 
32
32
  if result && result != "" && log_command
33
33
  ui.print_debug("SshShell", "#{ssh_session.host.green} > Finished [#{command_number}] with result: \n#{result.grey}")
@@ -0,0 +1,38 @@
1
+ class KuberKit::Tools::ProcessCleaner
2
+ include KuberKit::Import[
3
+ "shell.system_commands",
4
+ "shell.local_shell"
5
+ ]
6
+
7
+ def clean
8
+ stop_threads
9
+ stop_child_proceses
10
+ end
11
+
12
+ def stop_threads
13
+ Thread.list.each do |t|
14
+ t.abort_on_exception = false
15
+ t.report_on_exception = false
16
+ Thread.kill(t) if t != Thread.current
17
+ end
18
+ end
19
+
20
+ def stop_child_proceses
21
+ find_all_child_processes.each do |pid|
22
+ system_commands.kill_process(local_shell, pid)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def find_all_child_processes
29
+ pids = system_commands.find_pids_by_name(local_shell, "KIT=#{Process.pid}")
30
+ pids + get_child_pids(pids)
31
+ end
32
+
33
+ def get_child_pids(pids)
34
+ pids
35
+ .map{ |p| system_commands.get_child_pids(local_shell, p) }
36
+ .flatten
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module KuberKit
2
- VERSION = "0.4.7"
2
+ VERSION = "0.4.8"
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.4.7
4
+ version: 0.4.8
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-02-10 00:00:00.000000000 Z
11
+ date: 2021-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts-lite
@@ -294,6 +294,7 @@ files:
294
294
  - lib/kuber_kit/shell/commands/git_commands.rb
295
295
  - lib/kuber_kit/shell/commands/kubectl_commands.rb
296
296
  - lib/kuber_kit/shell/commands/rsync_commands.rb
297
+ - lib/kuber_kit/shell/commands/system_commands.rb
297
298
  - lib/kuber_kit/shell/local_shell.rb
298
299
  - lib/kuber_kit/shell/ssh_session.rb
299
300
  - lib/kuber_kit/shell/ssh_shell.rb
@@ -303,6 +304,7 @@ files:
303
304
  - lib/kuber_kit/template_reader/strategies/artifact_file.rb
304
305
  - lib/kuber_kit/tools/file_presence_checker.rb
305
306
  - lib/kuber_kit/tools/logger_factory.rb
307
+ - lib/kuber_kit/tools/process_cleaner.rb
306
308
  - lib/kuber_kit/ui.rb
307
309
  - lib/kuber_kit/ui/api.rb
308
310
  - lib/kuber_kit/ui/debug.rb