helm_upgrade_logs 0.2.3 → 0.2.6

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: e5195e2b08d8a4c6838d8cbf16fa070551bed1953008f46873d6f41ac07c829d
4
- data.tar.gz: 338bab0411ebc7e0a059b66392a30342187a6a9fb1ba623a3796baee331a5119
3
+ metadata.gz: b684e4674b966c9d98079db28468bf57ef4001864339ee751fcac7f732f8ec6e
4
+ data.tar.gz: 159438d7491016b11312941dd3fe9a7ff9a89234587243e0ce879bf5675af6f1
5
5
  SHA512:
6
- metadata.gz: 5d7b9c585181eef228e5bdaebacbc3d5d1764e6d0bbcb6aeb62db8389482f2011bba423d4d836dae44c8c16d0e2c94cab8352ef60b5376cb884b46ed2e858c75
7
- data.tar.gz: 1417cbbe9bcbcc02501d62c30eac1b6d13b9ee8bbe060f577e2342d188539e215ea73c32d25a072bb3f401a29fd3436a5a8de524ebdd73fce829d820eed459a3
6
+ metadata.gz: 9617547cfeb95b3b547196844bfa8cdfc20b33246b28c6b65b274dd2cba2a0271dfbe0574f96eb46daf50fb413ec10d6a45412d8010d94500ec3fa90710a9fcb
7
+ data.tar.gz: 67e19d49ffdd9ad203de6c7adb82f4344e35fb2b8637d2e32fb6f9df83c1d552cf63506ea67e3ce2c0a714f72b2b1a841256c7d418e57356d445cfc6dc6e6c0e
@@ -30,8 +30,6 @@ jobs:
30
30
  ruby-version: ${{ matrix.ruby-version }}
31
31
  - name: Start KIND cluster
32
32
  run: bash -f bin/start_kind.sh
33
- - name: Waiting for KIND cluster to get ready
34
- run: sleep 70
35
33
  - name: Install gem
36
34
  run: gem install helm_upgrade_logs
37
35
  - name: Add bitnami repo
@@ -39,6 +37,21 @@ jobs:
39
37
  - name: Helm install debugging logs
40
38
  run: helm_upgrade_logs --install nginx bitnami/nginx --wait --debug --set service.type=ClusterIP
41
39
 
40
+ unit_test:
41
+ runs-on: ubuntu-latest
42
+ strategy:
43
+ matrix:
44
+ ruby-version: ['3.0']
45
+ steps:
46
+ - uses: actions/checkout@v3
47
+ - name: Set up Ruby
48
+ uses: ruby/setup-ruby@v1
49
+ with:
50
+ ruby-version: ${{ matrix.ruby-version }}
51
+ bundler-cache: true
52
+ - name: Run tests
53
+ run: bundle exec rake
54
+
42
55
  test_exe:
43
56
  runs-on: ubuntu-latest
44
57
  strategy:
@@ -49,11 +62,11 @@ jobs:
49
62
  - uses: actions/checkout@v3
50
63
  - name: Start KIND cluster
51
64
  run: bash -f bin/start_kind.sh
52
- # - name: Waiting for KIND cluster to get ready
53
- # run: sleep 70
54
65
  - name: Add bitnami repo
55
66
  run: helm repo add bitnami https://charts.bitnami.com/bitnami
56
67
  - name: Install bitnami
57
68
  run: ./exe/helm_upgrade_logs --install nginx bitnami/nginx --wait --debug --set service.type=ClusterIP --set replicaCount=2
69
+ - name: Test bitnami
70
+ run: ./exe/helm_test_logs nginx
58
71
  - name: Install Redis
59
72
  run: ./exe/helm_upgrade_logs --install redis bitnami/redis --set auth.enabled=false --version 14.0.2 --wait
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.4
2
+ TargetRubyVersion: 3.0
3
3
 
4
4
  Style/StringLiterals:
5
5
  Enabled: true
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [0.2.6]
2
+
3
+ -- Don't log pods existing before an upgrade
4
+
5
+ ## [0.2.5] 2022-04-21
6
+
7
+ - Return helm status code as script's status code
8
+
9
+ ## [0.2.4] 2022-04-21
10
+
11
+ - Handle `n`, `--namespace` from helm command
12
+ - Exit if there is failure on helm command while trying to get logs
13
+
1
14
  ## [0.2.3] - 2022-04-20
2
15
 
3
16
  - Configuration on initial wait for pods logs and subsequent wait limits
data/README.md CHANGED
@@ -51,9 +51,6 @@ However if you do want to try it, to install `nginx` from the chart `bitnami/ngi
51
51
  curl -s https://raw.githubusercontent.com/SamuelGarrattIqa/helm_upgrade_logs/main/bin/helm_upgrade_logs.sh | bash -s -- --install nginx bitnami/nginx
52
52
  ```
53
53
 
54
- ## TODO
55
- * Make library handle `n`, `--namespace` from helm command
56
-
57
54
  ## Development
58
55
 
59
56
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -9,4 +9,4 @@ require "rubocop/rake_task"
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
- task default: %i[spec rubocop]
12
+ task default: %i[spec]
data/exe/helm_test_logs CHANGED
@@ -2,13 +2,16 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
- require 'helm_upgrade_logs'
5
+ require "helm_upgrade_logs"
6
6
 
7
- $release_name = ARGV.find { |arg| !arg.start_with?('-') }
7
+ @release_name = ARGV.find { |arg| !arg.start_with?("-") }
8
+ @namespace = namespace_from_args(ARGV)
8
9
 
9
- helm_pid = Process.spawn "helm test #{ARGV.join(' ')}"
10
+ helm_pid = Process.spawn "helm test #{ARGV.join(" ")}"
10
11
 
11
- log_pid = Process.spawn "kubectl logs -lapp.kubernetes.io/managed-by=Helm,app.kubernetes.io/instance=#{$release_name} -f --all-containers --prefix --ignore-errors=true --max-log-requests=20 --timestamps=true"
12
+ log_pid = Process.spawn(add_ns("kubectl logs -lapp.kubernetes.io/instance=#{@release_name} -f --all-containers --prefix --ignore-errors=true --max-log-requests=20 --timestamps=true --since=1s"))
12
13
 
13
14
  Process.wait helm_pid
14
- puts `kill #{log_pid}`
15
+ helm_status = $CHILD_STATUS.exitstatus
16
+ `kill #{log_pid}`
17
+ exit helm_status
@@ -1,42 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'open3'
4
+ require "open3"
5
5
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
6
- require 'helm_upgrade_logs'
6
+ require "helm_upgrade_logs"
7
7
 
8
- $release_name = ARGV.find { |arg| !arg.start_with?('-') }
8
+ @release_name = ARGV.find { |arg| !arg.start_with?("-") }
9
+ @namespace = namespace_from_args(ARGV)
9
10
 
10
- helm_pid = Process.spawn "helm upgrade #{ARGV.join(' ')}"
11
+ @helm_pid = Process.spawn "helm upgrade #{ARGV.join(" ")}"
11
12
 
12
- event_pid = Process.spawn 'kubectl get events --watch-only=true'
13
- service_pid = Process.spawn 'kubectl get services --watch-only=true'
13
+ pods_before_upgrade = read_pods
14
+ puts "[INFO] Pods before upgrade #{pods_before_upgrade}" if pods_before_upgrade.size.positive?
15
+
16
+ event_pid = Process.spawn(add_ns("kubectl get events --watch-only=true"))
17
+ service_pid = Process.spawn(add_ns("kubectl get services --watch-only=true"))
14
18
 
15
19
  wait_for_pod_to_log
16
20
 
17
21
  @pods = []
18
22
  @pod_pids = {}
19
23
 
20
- while Process.waitpid(helm_pid, Process::WNOHANG) == nil do
21
- pods = get_pods
24
+ begin
25
+ Process.waitpid(@helm_pid, Process::WNOHANG)
26
+ rescue Errno::ECHILD
27
+ `kill #{event_pid}`
28
+ `kill #{service_pid}`
29
+ raise HelmUpgradeLogs::Error, "Failed to find logs before helm finished"
30
+ end
31
+
32
+ while Process.waitpid(@helm_pid, Process::WNOHANG).nil?
33
+ pods = read_pods - pods_before_upgrade
22
34
  if pods != @pods
23
35
  @pods = pods
24
- puts "[INFO] Pods: #{pods.join(',')}"
36
+ puts "[INFO] Pods: #{pods.join(",")}"
25
37
  # Could change this each to Parallel.each
26
38
  @pods.each do |pod|
27
- if @pod_pids[pod].nil?
28
- wait_for_specific_pod_to_log pod
29
- log_pid = Process.spawn "kubectl logs #{pod} -f --all-containers --prefix --ignore-errors=true --timestamps=true"
30
- @pod_pids[pod] = log_pid
31
- end
39
+ next unless @pod_pids[pod].nil?
40
+
41
+ wait_for_specific_pod_to_log pod
42
+ log_pid = Process.spawn(add_ns("kubectl logs #{pod} -f --all-containers --prefix --ignore-errors=true --timestamps=true"))
43
+ @pod_pids[pod] = log_pid
32
44
  end
33
45
  end
34
46
  sleep 1
35
47
  end
48
+ helm_status = $CHILD_STATUS.exitstatus
36
49
  `kill #{event_pid}`
37
50
  `kill #{service_pid}`
38
- @pod_pids.each do |pod, pid|
51
+ @pod_pids.each do |_pod, pid|
39
52
  `kill #{pid}`
40
53
  end
41
-
42
-
54
+ exit helm_status
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HelmUpgradeLogs
4
- VERSION = "0.2.3"
4
+ # @return [String] Version of helm upgrade logs
5
+ VERSION = "0.2.6"
5
6
  end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'open3'
3
+ require "open3"
4
+ require 'English'
4
5
  require_relative "helm_upgrade_logs/version"
5
6
 
6
- ENV['helm_upgrade_logs_log_start'] ||= '90'
7
- ENV['helm_upgrade_logs_pod_start'] ||= '35'
7
+ ENV["helm_upgrade_logs_log_start"] ||= "90"
8
+ ENV["helm_upgrade_logs_pod_start"] ||= "35"
8
9
 
9
10
  # Approach not ideal as it will for all containers to be ready and want to stream logs before that
10
11
  def wait_for_container_ready
@@ -12,43 +13,61 @@ def wait_for_container_ready
12
13
  Process.wait wait_pid
13
14
  end
14
15
 
15
- # Wait for pods with logs to be present
16
+ # Wait for very first pods with logs to be present
16
17
  # Not ideal due to https://github.com/kubernetes/kubernetes/issues/28746
17
18
  def wait_for_pod_to_log
18
- ENV['helm_upgrade_logs_log_start'].to_i.times do |i|
19
+ ENV["helm_upgrade_logs_log_start"].to_i.times do |i|
20
+ break unless Process.waitpid(@helm_pid, Process::WNOHANG).nil?
21
+
19
22
  sleep 1
20
- stdout, stderr, _ = Open3.capture3 "kubectl logs -lapp.kubernetes.io/instance=#{$release_name}"
23
+ stdout, stderr, = Open3.capture3(add_ns("kubectl logs -lapp.kubernetes.io/instance=#{@release_name}"))
21
24
  if stderr.empty? && !stdout.strip.empty?
22
- puts '[INFO] Pods with logs found'
25
+ puts "[INFO] Pods with logs found"
23
26
  break
24
- else
25
- puts "[INFO] Waiting for pod logs: #{stderr}" if i % 3 == 0
27
+ elsif (i % 3).zero?
28
+ puts "[INFO] Waiting for pod logs: #{stderr}"
26
29
  end
27
30
  end
28
31
  end
29
32
 
33
+ # Wait for logs from a specific pod
30
34
  def wait_for_specific_pod_to_log(pod_name)
31
- ENV['helm_upgrade_logs_pod_start'].to_i.times do |i|
35
+ ENV["helm_upgrade_logs_pod_start"].to_i.times do |i|
32
36
  sleep 1
33
- stdout, stderr, _ = Open3.capture3 "kubectl logs #{pod_name}"
37
+ stdout, stderr, = Open3.capture3(add_ns("kubectl logs #{pod_name}"))
34
38
  if stderr.empty? && !stdout.strip.empty?
35
39
  puts "[INFO] Pod #{pod_name} with logs found"
36
40
  break
37
- else
38
- puts "[INFO] Waiting for pod #{pod_name} logs: #{stderr}" if i % 2 == 0
41
+ elsif i.even?
42
+ puts "[INFO] Waiting for pod #{pod_name} logs: #{stderr}"
39
43
  end
40
44
  end
41
45
  end
42
46
 
43
- def get_pods
44
- stdout, stderr, _ = Open3.capture3 "kubectl get pods -lapp.kubernetes.io/instance=#{$release_name} -o name"
47
+ # Get pods
48
+ def read_pods
49
+ stdout, stderr, = Open3.capture3(add_ns("kubectl get pods -lapp.kubernetes.io/instance=#{@release_name} -o name"))
45
50
  if stderr.empty?
46
- stdout.lines.collect { |pod| pod.strip }
51
+ stdout.lines.collect(&:strip)
47
52
  else
48
53
  []
49
54
  end
50
55
  end
51
56
 
57
+ # @param [Array] args
58
+ def namespace_from_args(args)
59
+ match_index = args.find_index { |arg| %w[-n --namespace].include?(arg) }
60
+ return nil unless match_index
61
+
62
+ args[match_index + 1]
63
+ end
64
+
65
+ # Add namespace to kube query
66
+ def add_ns(kube_query)
67
+ kube_query += " -n #{@namespace}" if @namespace
68
+ kube_query
69
+ end
70
+
52
71
  module HelmUpgradeLogs
53
72
  class Error < StandardError; end
54
73
  # Your code goes here...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helm_upgrade_logs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Garratt
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-20 00:00:00.000000000 Z
11
+ date: 2022-04-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Basic wrapper around helm and kubectl to allow easy debugging of a helm
14
14
  release. All arguments after a usual helm upgrade are used as normal
@@ -41,7 +41,6 @@ files:
41
41
  - bin/start_kind.sh
42
42
  - exe/helm_test_logs
43
43
  - exe/helm_upgrade_logs
44
- - get_pods.rb
45
44
  - helm_upgrade_logs.gemspec
46
45
  - lib/helm_upgrade_logs.rb
47
46
  - lib/helm_upgrade_logs/version.rb
data/get_pods.rb DELETED
@@ -1,7 +0,0 @@
1
- require 'open3'
2
-
3
- $release_name = 'redis'
4
- stdout, stderr, _ = Open3.capture3 "kubectl get pods -lapp.kubernetes.io/managed-by=Helm,app.kubernetes.io/instance=#{$release_name} -o name"
5
- if stderr.empty?
6
- puts stdout.lines.join(',')
7
- end