kubernetes-deploy 0.30.0 → 0.31.0

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +15 -0
  4. data/CONTRIBUTING.md +2 -2
  5. data/README.md +1 -1
  6. data/dev.yml +1 -1
  7. data/dev/flamegraph-from-tests +1 -1
  8. data/exe/kubernetes-deploy +11 -9
  9. data/exe/kubernetes-render +9 -7
  10. data/exe/kubernetes-restart +3 -3
  11. data/exe/kubernetes-run +1 -1
  12. data/kubernetes-deploy.gemspec +3 -3
  13. data/lib/krane.rb +5 -3
  14. data/lib/{kubernetes-deploy → krane}/bindings_parser.rb +1 -1
  15. data/lib/krane/cli/deploy_command.rb +14 -11
  16. data/lib/krane/cli/global_deploy_command.rb +47 -0
  17. data/lib/krane/cli/krane.rb +12 -3
  18. data/lib/krane/cli/render_command.rb +11 -9
  19. data/lib/krane/cli/restart_command.rb +4 -4
  20. data/lib/krane/cli/run_command.rb +3 -3
  21. data/lib/krane/cli/version_command.rb +1 -1
  22. data/lib/krane/cluster_resource_discovery.rb +102 -0
  23. data/lib/{kubernetes-deploy → krane}/common.rb +8 -9
  24. data/lib/krane/concerns/template_reporting.rb +29 -0
  25. data/lib/{kubernetes-deploy → krane}/concurrency.rb +1 -1
  26. data/lib/{kubernetes-deploy → krane}/container_logs.rb +1 -1
  27. data/lib/{kubernetes-deploy → krane}/deferred_summary_logging.rb +2 -2
  28. data/lib/{kubernetes-deploy → krane}/delayed_exceptions.rb +0 -0
  29. data/lib/krane/deploy_task.rb +2 -2
  30. data/lib/{kubernetes-deploy → krane}/deploy_task_config_validator.rb +1 -1
  31. data/lib/krane/deprecated_deploy_task.rb +404 -0
  32. data/lib/{kubernetes-deploy → krane}/duration_parser.rb +1 -1
  33. data/lib/{kubernetes-deploy → krane}/ejson_secret_provisioner.rb +3 -3
  34. data/lib/krane/errors.rb +28 -0
  35. data/lib/{kubernetes-deploy → krane}/formatted_logger.rb +2 -2
  36. data/lib/krane/global_deploy_task.rb +210 -0
  37. data/lib/krane/global_deploy_task_config_validator.rb +12 -0
  38. data/lib/{kubernetes-deploy → krane}/kubeclient_builder.rb +11 -3
  39. data/lib/{kubernetes-deploy → krane}/kubectl.rb +2 -2
  40. data/lib/{kubernetes-deploy → krane}/kubernetes_resource.rb +54 -22
  41. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/cloudsql.rb +1 -1
  42. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/config_map.rb +1 -1
  43. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/cron_job.rb +1 -1
  44. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/custom_resource.rb +2 -2
  45. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/custom_resource_definition.rb +1 -5
  46. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/daemon_set.rb +7 -4
  47. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/deployment.rb +2 -2
  48. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/horizontal_pod_autoscaler.rb +1 -1
  49. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/ingress.rb +1 -1
  50. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/job.rb +1 -1
  51. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/network_policy.rb +1 -1
  52. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/persistent_volume_claim.rb +1 -1
  53. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/pod.rb +2 -2
  54. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/pod_disruption_budget.rb +2 -2
  55. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/pod_set_base.rb +3 -3
  56. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/pod_template.rb +1 -1
  57. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/replica_set.rb +2 -2
  58. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/resource_quota.rb +1 -1
  59. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/role.rb +1 -1
  60. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/role_binding.rb +1 -1
  61. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/secret.rb +1 -1
  62. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/service.rb +2 -2
  63. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/service_account.rb +1 -1
  64. data/lib/{kubernetes-deploy → krane}/kubernetes_resource/stateful_set.rb +2 -2
  65. data/lib/{kubernetes-deploy → krane}/label_selector.rb +1 -1
  66. data/lib/{kubernetes-deploy → krane}/oj.rb +0 -0
  67. data/lib/{kubernetes-deploy → krane}/options_helper.rb +2 -2
  68. data/lib/{kubernetes-deploy → krane}/remote_logs.rb +2 -2
  69. data/lib/krane/render_task.rb +149 -0
  70. data/lib/{kubernetes-deploy → krane}/renderer.rb +1 -1
  71. data/lib/{kubernetes-deploy → krane}/resource_cache.rb +4 -3
  72. data/lib/krane/resource_deployer.rb +265 -0
  73. data/lib/{kubernetes-deploy → krane}/resource_watcher.rb +6 -6
  74. data/lib/krane/restart_task.rb +224 -0
  75. data/lib/{kubernetes-deploy → krane}/rollout_conditions.rb +1 -1
  76. data/lib/krane/runner_task.rb +212 -0
  77. data/lib/{kubernetes-deploy → krane}/runner_task_config_validator.rb +1 -1
  78. data/lib/{kubernetes-deploy → krane}/statsd.rb +13 -27
  79. data/lib/krane/task_config.rb +19 -0
  80. data/lib/{kubernetes-deploy → krane}/task_config_validator.rb +1 -1
  81. data/lib/{kubernetes-deploy → krane}/template_sets.rb +5 -5
  82. data/lib/krane/version.rb +4 -0
  83. data/lib/kubernetes-deploy/deploy_task.rb +6 -603
  84. data/lib/kubernetes-deploy/errors.rb +1 -26
  85. data/lib/kubernetes-deploy/render_task.rb +5 -139
  86. data/lib/kubernetes-deploy/rescue_krane_exceptions.rb +18 -0
  87. data/lib/kubernetes-deploy/restart_task.rb +6 -215
  88. data/lib/kubernetes-deploy/runner_task.rb +6 -203
  89. metadata +75 -58
  90. data/lib/kubernetes-deploy/cluster_resource_discovery.rb +0 -57
  91. data/lib/kubernetes-deploy/task_config.rb +0 -16
  92. data/lib/kubernetes-deploy/version.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e7827354d151cb81a0955882abede556706c6e82faabad54e4b44d36746927f
4
- data.tar.gz: '083dd77e75f92608d6c04c59a8edab5dbc35da3725e3cddc7fee99706c3655d7'
3
+ metadata.gz: 2f9a199d384a4137903191ff608290e6ff0c22423f8c783e866160fc546f7d00
4
+ data.tar.gz: 8936ac0d23a1cb1534df26b3e1a5e78ca75006ed929bd00fb6bc70877b3342c4
5
5
  SHA512:
6
- metadata.gz: 8ee6de674126f680b470b35f33c08056095284fd29ee5a267781172b170e4de39f77d442a4e530d44ecee46ddd35a5323821f2dafbe20618aa7d0e30135eb801
7
- data.tar.gz: 1746664b8c13c7c8bc64f2c6903bb62761b13f8d45e6177f82338776c2d67f3979d9e80b8a38b15290b7818d473b2967d18e1a8784cf72c30880c64f40ff5f6d
6
+ metadata.gz: 37add457c1cb9e1deb7691a73318b413407dbe58c7326eff5769cd88afebc56cee6b53fa8c399cd0a44c1b89078d5cb32fa50492c18e5963fa9a776967979ffd
7
+ data.tar.gz: f16bf5443c6eb37a187e0bfbb82d21222d83dbaa4387a7958041d46dfef39086fbcc398c09acc1ab998a17e9031ddd0d7866e48dee318ef0b8cf3fc01e874f91
@@ -14,4 +14,4 @@ Sorbet/ConstantsFromStrings:
14
14
 
15
15
  Layout/Tab:
16
16
  Exclude:
17
- - test/integration/kubernetes_deploy_test.rb
17
+ - test/integration/krane_deploy_test.rb
@@ -3,6 +3,21 @@
3
3
  *Important!*
4
4
  - The next release will be 1.0.0, which means that master will contain breaking changes.
5
5
 
6
+ ## 0.31
7
+
8
+ *Enhancements*
9
+ - (alpha) Add a new krane global-deploy task for deploying global resources. Note that global pruning is turned on by default ([#602](https://github.com/Shopify/kubernetes-deploy/pull/602) and [#612](https://github.com/Shopify/kubernetes-deploy/pull/612))
10
+ - Add support for deploying resources that use `generateName` ([#608](https://github.com/Shopify/kubernetes-deploy/pull/608))
11
+ - ENV["REVISION"] is not transparently passed into krane. Instead, you must now use the `--current-sha` flag to set the `current_sha` ERB binding in your templates. Note that kubernetes-deploy, _but not krane_, can still use ENV["REVISION"] as a fallback if `--current-sha` is not provided. ([#613](https://github.com/Shopify/kubernetes-deploy/pull/613))
12
+
13
+ *Bug Fixes*
14
+ - `krane deploy` can accept multiple filenames with `-f` flag ([#606](https://github.com/Shopify/kubernetes-deploy/pull/606))
15
+ - Ensure DaemonSet status has converged with pod statuses before reporting rollout success ([#617](https://github.com/Shopify/kubernetes-deploy/pull/617))
16
+
17
+ *Other*
18
+ - Update references from using `kubernetes-deploy` to `krane` in preparation for 1.0 release ([#585](https://github.com/Shopify/kubernetes-deploy/pull/585))
19
+ - Refactor StatsD usage so we can depend on the latest version again. ([#594](https://github.com/Shopify/kubernetes-deploy/pull/594))
20
+
6
21
  ## 0.30.0
7
22
 
8
23
  *Enhancements*
@@ -141,9 +141,9 @@ Using another local cluster:
141
141
  2. Put the name of the context you want to use in a file named `.local-context` in the root of this project. For example: `echo "dind" > .local-context`.
142
142
  3. Run `bundle exec rake test` (or `dev test` if you work for Shopify).
143
143
 
144
- To make StatsD log what it would have emitted, run a test with `STATSD_DEV=1`.
144
+ To make StatsD log what it would have emitted, run a test with `STATSD_ENV=development`.
145
145
 
146
- To see the full-color output of a specific integration test, you can use `PRINT_LOGS=1`. For example: `PRINT_LOGS=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n/test_name/`.
146
+ To see the full-color output of a specific integration test, you can use `PRINT_LOGS=1`. For example: `PRINT_LOGS=1 bundle exec ruby -I test test/integration/krane_deploy_test.rb -n/test_name/`.
147
147
 
148
148
 
149
149
  ![test-output](screenshots/test-output.png)
data/README.md CHANGED
@@ -268,7 +268,7 @@ To run a task in your cluster at the beginning of every deploy, simply include a
268
268
  * The pod's `spec.restartPolicy` must be set to `Never` so that it will be run exactly once. We'll fail the deploy if that run exits with a non-zero status.
269
269
  * The pod's `spec.activeDeadlineSeconds` should be set to a reasonable value for the performed task (not required, but highly recommended)
270
270
 
271
- A simple example can be found in the test fixtures: test/fixtures/hello-cloud/unmanaged-pod.yml.erb.
271
+ A simple example can be found in the test fixtures: [test/fixtures/hello-cloud/unmanaged-pod-1.yml.erb](test/fixtures/hello-cloud/unmanaged-pod-1.yml.erb).
272
272
 
273
273
  The logs of all pods run in this way will be printed inline. If there is only one pod, the logs will be streamed in real-time. If there are multiple, they will be fetched when the pod terminates.
274
274
 
data/dev.yml CHANGED
@@ -19,7 +19,7 @@ commands:
19
19
  test:
20
20
  run: bin/test
21
21
  tophat:
22
- run: PRINT_LOGS=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n/${1}/
22
+ run: PRINT_LOGS=1 bundle exec ruby -I test test/integration/krane_deploy_test.rb -n/${1}/
23
23
  desc: Tophat a change by running a test scenario with logging output enabled.
24
24
  syntax:
25
25
  optional:
@@ -22,7 +22,7 @@ if [[ -f $PROFILE_FILENAME ]]; then
22
22
  fi
23
23
 
24
24
  echo "Running test(s) with profiling"
25
- PROFILE=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n /$1/ > /dev/null
25
+ PROFILE=1 bundle exec ruby -I test test/integration/krane_deploy_test.rb -n /$1/ > /dev/null
26
26
 
27
27
  echo "Processing profile"
28
28
  cat $PROFILE_FILENAME | perl -w $FLAMEGRAPH_PL --countname=ms --width=1500 --title=$1 > $SVG_FILENAME
@@ -2,9 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'kubernetes-deploy/deploy_task'
5
- require 'kubernetes-deploy/options_helper'
6
- require 'kubernetes-deploy/bindings_parser'
7
- require 'kubernetes-deploy/label_selector'
5
+ require 'krane/options_helper'
6
+ require 'krane/bindings_parser'
7
+ require 'krane/label_selector'
8
8
 
9
9
  require 'optparse'
10
10
 
@@ -17,9 +17,10 @@ bindings = {}
17
17
  verbose_log_prefix = false
18
18
  max_watch_seconds = nil
19
19
  selector = nil
20
+ current_sha = ENV["REVISION"]
20
21
 
21
22
  ARGV.options do |opts|
22
- parser = KubernetesDeploy::BindingsParser.new
23
+ parser = Krane::BindingsParser.new
23
24
  opts.on("--bindings=BINDINGS", "Expose additional variables to ERB templates " \
24
25
  "(format: k1=v1,k2=v2, JSON string or file (JSON or YAML) path prefixed by '@')") { |b| parser.add(b) }
25
26
 
@@ -41,7 +42,7 @@ ARGV.options do |opts|
41
42
  end
42
43
  opts.on("--selector=SELECTOR", "Ensure that all resources in your template dir match the given selector, " \
43
44
  "and restrict pruning to deployed resources it selects. (format: k1=v1,k2=v2)") do |s|
44
- selector = KubernetesDeploy::LabelSelector.parse(s)
45
+ selector = Krane::LabelSelector.parse(s)
45
46
  end
46
47
 
47
48
  opts.on_tail("-h", "--help", "Print this help") do
@@ -49,16 +50,17 @@ ARGV.options do |opts|
49
50
  exit
50
51
  end
51
52
  opts.on_tail("-v", "--version", "Show version") do
52
- puts "v#{KubernetesDeploy::VERSION}"
53
+ puts "v#{Krane::VERSION}"
53
54
  exit
54
55
  end
56
+ opts.on("--current-sha=CURRENT_SHA", "Expose SHA `current_sha` in ERB bindings") { |r| current_sha = r }
55
57
  opts.parse!
56
58
  bindings = parser.parse
57
59
  end
58
60
 
59
61
  namespace = ARGV[0]
60
62
  context = ARGV[1]
61
- logger = KubernetesDeploy::FormattedLogger.build(namespace, context, verbose_prefix: verbose_log_prefix)
63
+ logger = Krane::FormattedLogger.build(namespace, context, verbose_prefix: verbose_log_prefix)
62
64
 
63
65
  # Deprecation path: this can be removed when --template-dir is fully replaced by -f
64
66
  if template_dir && !template_paths.empty?
@@ -68,11 +70,11 @@ end
68
70
  template_paths = [template_dir] if template_paths.empty? && template_dir
69
71
 
70
72
  begin
71
- KubernetesDeploy::OptionsHelper.with_processed_template_paths(template_paths) do |paths|
73
+ Krane::OptionsHelper.with_processed_template_paths(template_paths) do |paths|
72
74
  runner = KubernetesDeploy::DeployTask.new(
73
75
  namespace: namespace,
74
76
  context: context,
75
- current_sha: ENV["REVISION"],
77
+ current_sha: current_sha,
76
78
  template_paths: paths,
77
79
  bindings: bindings,
78
80
  logger: logger,
@@ -2,32 +2,34 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'kubernetes-deploy/render_task'
5
- require 'kubernetes-deploy/options_helper'
6
- require 'kubernetes-deploy/bindings_parser'
5
+ require 'krane/options_helper'
6
+ require 'krane/bindings_parser'
7
7
 
8
8
  require 'optparse'
9
9
 
10
10
  template_dir = []
11
11
  bindings = {}
12
+ current_sha = ENV["REVISION"]
12
13
 
13
14
  ARGV.options do |opts|
14
- parser = KubernetesDeploy::BindingsParser.new
15
+ parser = Krane::BindingsParser.new
15
16
  opts.on("--bindings=BINDINGS", "Expose additional variables to ERB templates " \
16
17
  "(format: k1=v1,k2=v2, JSON string or file (JSON or YAML) path prefixed by '@')") { |b| parser.add(b) }
17
18
  opts.on("--template-dir=DIR", "Set the template dir (default: config/deploy/$ENVIRONMENT).") do |d|
18
19
  template_dir = [d]
19
20
  end
21
+ opts.on("--current-sha=CURRENT_SHA", "Expose SHA `current_sha` in ERB bindings") { |r| current_sha = r }
20
22
  opts.parse!
21
23
  bindings = parser.parse
22
24
  end
23
25
 
24
26
  templates = ARGV
25
- logger = KubernetesDeploy::FormattedLogger.build(verbose_prefix: false)
27
+ logger = Krane::FormattedLogger.build(verbose_prefix: false)
26
28
 
27
29
  begin
28
- KubernetesDeploy::OptionsHelper.with_processed_template_paths(template_dir) do |dir|
30
+ Krane::OptionsHelper.with_processed_template_paths(template_dir) do |dir|
29
31
  runner = KubernetesDeploy::RenderTask.new(
30
- current_sha: ENV["REVISION"],
32
+ current_sha: current_sha,
31
33
  template_dir: dir.first,
32
34
  bindings: bindings,
33
35
  )
@@ -35,7 +37,7 @@ begin
35
37
  success = runner.run(STDOUT, templates)
36
38
  exit(1) unless success
37
39
  end
38
- rescue KubernetesDeploy::OptionsHelper::OptionsError => e
40
+ rescue Krane::OptionsHelper::OptionsError => e
39
41
  logger.error(e.message)
40
42
  exit(1)
41
43
  end
@@ -4,8 +4,8 @@
4
4
  require 'optparse'
5
5
 
6
6
  require 'kubernetes-deploy/restart_task'
7
- require 'kubernetes-deploy/options_helper'
8
- require 'kubernetes-deploy/label_selector'
7
+ require 'krane/options_helper'
8
+ require 'krane/label_selector'
9
9
 
10
10
  raw_deployments = nil
11
11
  max_watch_seconds = nil
@@ -14,7 +14,7 @@ ARGV.options do |opts|
14
14
  opts.on("--deployments=LIST") { |v| raw_deployments = v.split(",") }
15
15
  opts.on("--max-watch-seconds=seconds") { |t| max_watch_seconds = t.to_i }
16
16
  opts.on("--selector=SELECTOR", "Restarts deployments matching selector (format: k1=v1,k2=v2)") do |s|
17
- selector = KubernetesDeploy::LabelSelector.parse(s)
17
+ selector = Krane::LabelSelector.parse(s)
18
18
  end
19
19
  opts.parse!
20
20
  end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'kubernetes-deploy/runner_task'
5
- require 'kubernetes-deploy/options_helper'
5
+ require 'krane/options_helper'
6
6
  require 'optparse'
7
7
 
8
8
  template = "task-runner-template"
@@ -2,11 +2,11 @@
2
2
  # frozen_string_literal: true
3
3
  lib = File.expand_path('../lib', __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'kubernetes-deploy/version'
5
+ require 'krane/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "kubernetes-deploy"
9
- spec.version = KubernetesDeploy::VERSION
9
+ spec.version = Krane::VERSION
10
10
  spec.authors = ["Katrina Verey", "Kir Shatrov"]
11
11
  spec.email = ["ops-accounts+shipit@shopify.com"]
12
12
 
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency("googleauth", "~> 0.8.0")
29
29
  spec.add_dependency("ejson", "~> 1.0")
30
30
  spec.add_dependency("colorize", "~> 0.8")
31
- spec.add_dependency("statsd-instrument", '~> 2.3.2')
31
+ spec.add_dependency("statsd-instrument", ['>= 2.8', "< 3.1"])
32
32
  spec.add_dependency("oj", "~> 3.0")
33
33
  spec.add_dependency("concurrent-ruby", "~> 1.1")
34
34
  spec.add_dependency("jsonpath", "~> 0.9.6")
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require 'kubernetes-deploy/common'
3
2
 
4
- module Krane
5
- end
3
+ require 'krane/deploy_task'
4
+ require 'krane/render_task'
5
+ require 'krane/restart_task'
6
+ require 'krane/runner_task'
7
+ require 'krane/global_deploy_task'
@@ -3,7 +3,7 @@ require 'json'
3
3
  require 'yaml'
4
4
  require 'csv'
5
5
 
6
- module KubernetesDeploy
6
+ module Krane
7
7
  class BindingsParser
8
8
  def self.parse(string)
9
9
  new(string).parse
@@ -13,8 +13,9 @@ module Krane
13
13
  "bindings" => { type: :array, banner: "foo=bar abc=def",
14
14
  desc: "Expose additional variables to ERB templates (format: k1=v1 k2=v2, JSON string or file "\
15
15
  "(JSON or YAML) path prefixed by '@')" },
16
- "filenames" => { type: :string, banner: '/tmp/my-resource.yml', aliases: :f, required: true,
17
- desc: "Path to file or directory that contains the configuration to apply" },
16
+ "filenames" => { type: :array, banner: 'config/deploy/production config/deploy/my-extra-resource.yml',
17
+ aliases: :f, required: true,
18
+ desc: "Directories and files that contains the configuration to apply" },
18
19
  "global-timeout" => { type: :string, banner: "duration", default: DEFAULT_DEPLOY_TIMEOUT,
19
20
  desc: "Max duration to monitor workloads correctly deployed" },
20
21
  "protected-namespaces" => { type: :array, banner: "namespace1 namespace2 namespaceN",
@@ -30,20 +31,22 @@ module Krane
30
31
  default: true },
31
32
  "verify-result" => { type: :boolean, default: true,
32
33
  desc: "Verify workloads correctly deployed" },
34
+ "current-sha" => { type: :string, banner: "SHA", desc: "Expose SHA `current_sha` in ERB bindings" },
35
+
33
36
  }
34
37
 
35
38
  def self.from_options(namespace, context, options)
36
39
  require 'krane/deploy_task'
37
- require 'kubernetes-deploy/options_helper'
38
- require 'kubernetes-deploy/bindings_parser'
39
- require 'kubernetes-deploy/label_selector'
40
+ require 'krane/options_helper'
41
+ require 'krane/bindings_parser'
42
+ require 'krane/label_selector'
40
43
 
41
- bindings_parser = KubernetesDeploy::BindingsParser.new
44
+ bindings_parser = ::Krane::BindingsParser.new
42
45
  options[:bindings]&.each { |binding_pair| bindings_parser.add(binding_pair) }
43
46
 
44
- selector = KubernetesDeploy::LabelSelector.parse(options[:selector]) if options[:selector]
47
+ selector = ::Krane::LabelSelector.parse(options[:selector]) if options[:selector]
45
48
 
46
- logger = KubernetesDeploy::FormattedLogger.build(namespace, context,
49
+ logger = ::Krane::FormattedLogger.build(namespace, context,
47
50
  verbose_prefix: options['verbose-log-prefix'])
48
51
 
49
52
  protected_namespaces = options['protected-namespaces']
@@ -51,16 +54,16 @@ module Krane
51
54
  protected_namespaces = []
52
55
  end
53
56
 
54
- KubernetesDeploy::OptionsHelper.with_processed_template_paths([options[:filenames]],
57
+ ::Krane::OptionsHelper.with_processed_template_paths(options[:filenames],
55
58
  require_explicit_path: true) do |paths|
56
59
  deploy = ::Krane::DeployTask.new(
57
60
  namespace: namespace,
58
61
  context: context,
59
- current_sha: ENV["REVISION"],
62
+ current_sha: options['current-sha'],
60
63
  template_paths: paths,
61
64
  bindings: bindings_parser.parse,
62
65
  logger: logger,
63
- max_watch_seconds: KubernetesDeploy::DurationParser.new(options["global-timeout"]).parse!.to_i,
66
+ max_watch_seconds: ::Krane::DurationParser.new(options["global-timeout"]).parse!.to_i,
64
67
  selector: selector,
65
68
  protected_namespaces: protected_namespaces,
66
69
  )
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Krane
4
+ module CLI
5
+ class GlobalDeployCommand
6
+ DEFAULT_DEPLOY_TIMEOUT = '300s'
7
+ OPTIONS = {
8
+ "filenames" => { type: :array, banner: 'config/deploy/production config/deploy/my-extra-resource.yml',
9
+ aliases: :f, required: true,
10
+ desc: "Directories and files that contains the configuration to apply" },
11
+ "global-timeout" => { type: :string, banner: "duration", default: DEFAULT_DEPLOY_TIMEOUT,
12
+ desc: "Max duration to monitor workloads correctly deployed" },
13
+ "verify-result" => { type: :boolean, default: true,
14
+ desc: "Verify workloads correctly deployed" },
15
+ "selector" => { type: :string, banner: "'label=value'", required: true,
16
+ desc: "Select workloads owned by selector(s)" },
17
+ "prune" => { type: :boolean, desc: "Enable deletion of resources that match"\
18
+ " the provided selector and do not appear in the provided templates",
19
+ default: true },
20
+ }
21
+
22
+ def self.from_options(context, options)
23
+ require 'krane/global_deploy_task'
24
+ require 'krane/options_helper'
25
+ require 'krane/label_selector'
26
+ require 'krane/duration_parser'
27
+
28
+ selector = ::Krane::LabelSelector.parse(options[:selector])
29
+
30
+ ::Krane::OptionsHelper.with_processed_template_paths(options[:filenames],
31
+ require_explicit_path: true) do |paths|
32
+ deploy = ::Krane::GlobalDeployTask.new(
33
+ context: context,
34
+ filenames: paths,
35
+ global_timeout: ::Krane::DurationParser.new(options["global-timeout"]).parse!.to_i,
36
+ selector: selector,
37
+ )
38
+
39
+ deploy.run!(
40
+ verify_result: options["verify-result"],
41
+ prune: options[:prune],
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -7,6 +7,7 @@ require 'krane/cli/restart_command'
7
7
  require 'krane/cli/run_command'
8
8
  require 'krane/cli/render_command'
9
9
  require 'krane/cli/deploy_command'
10
+ require 'krane/cli/global_deploy_command'
10
11
 
11
12
  module Krane
12
13
  module CLI
@@ -58,6 +59,14 @@ module Krane
58
59
  end
59
60
  end
60
61
 
62
+ desc("global-deploy CONTEXT", "Ship non-namespaced resources to a cluster")
63
+ expand_options(GlobalDeployCommand::OPTIONS)
64
+ def global_deploy(context)
65
+ rescue_and_exit do
66
+ GlobalDeployCommand.from_options(context, options)
67
+ end
68
+ end
69
+
61
70
  def self.exit_on_failure?
62
71
  true
63
72
  end
@@ -66,11 +75,11 @@ module Krane
66
75
 
67
76
  def rescue_and_exit
68
77
  yield
69
- rescue KubernetesDeploy::DeploymentTimeoutError
78
+ rescue ::Krane::DeploymentTimeoutError
70
79
  exit(TIMEOUT_EXIT_CODE)
71
- rescue KubernetesDeploy::FatalDeploymentError
80
+ rescue ::Krane::FatalDeploymentError
72
81
  exit(FAILURE_EXIT_CODE)
73
- rescue KubernetesDeploy::DurationParser::ParsingError => e
82
+ rescue ::Krane::DurationParser::ParsingError => e
74
83
  STDERR.puts(<<~ERROR_MESSAGE)
75
84
  Error parsing duration
76
85
  #{e.message}. Duration must be a full ISO8601 duration or time value (e.g. 300s, 10m, 1h)
@@ -4,21 +4,23 @@ module Krane
4
4
  module CLI
5
5
  class RenderCommand
6
6
  OPTIONS = {
7
- bindings: { type: :array, desc: 'Bindings for erb' },
8
- filenames: { type: :array, required: true, aliases: 'f', desc: 'Directories and files to render' },
7
+ bindings: { type: :array, banner: "foo=bar abc=def", desc: 'Bindings for erb' },
8
+ filenames: { type: :array, banner: 'config/deploy/production config/deploy/my-extra-resource.yml',
9
+ required: true, aliases: 'f', desc: 'Directories and files to render' },
10
+ 'current-sha': { type: :string, banner: "SHA", desc: "Expose SHA `current_sha` in ERB bindings" },
9
11
  }
10
12
 
11
13
  def self.from_options(options)
12
- require 'kubernetes-deploy/render_task'
13
- require 'kubernetes-deploy/bindings_parser'
14
- require 'kubernetes-deploy/options_helper'
14
+ require 'krane/render_task'
15
+ require 'krane/bindings_parser'
16
+ require 'krane/options_helper'
15
17
 
16
- bindings_parser = KubernetesDeploy::BindingsParser.new
18
+ bindings_parser = ::Krane::BindingsParser.new
17
19
  options[:bindings]&.each { |b| bindings_parser.add(b) }
18
20
 
19
- KubernetesDeploy::OptionsHelper.with_processed_template_paths(options[:filenames]) do |paths|
20
- runner = KubernetesDeploy::RenderTask.new(
21
- current_sha: ENV["REVISION"],
21
+ ::Krane::OptionsHelper.with_processed_template_paths(options[:filenames]) do |paths|
22
+ runner = ::Krane::RenderTask.new(
23
+ current_sha: options['current-sha'],
22
24
  template_paths: paths,
23
25
  bindings: bindings_parser.parse,
24
26
  )