tobsch-krane 1.0.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 (99) hide show
  1. checksums.yaml +7 -0
  2. data/.buildkite/pipeline.nightly.yml +43 -0
  3. data/.github/probots.yml +2 -0
  4. data/.gitignore +20 -0
  5. data/.rubocop.yml +17 -0
  6. data/.shopify-build/VERSION +1 -0
  7. data/.shopify-build/kubernetes-deploy.yml +53 -0
  8. data/1.0-Upgrade.md +185 -0
  9. data/CHANGELOG.md +431 -0
  10. data/CODE_OF_CONDUCT.md +46 -0
  11. data/CONTRIBUTING.md +164 -0
  12. data/Gemfile +16 -0
  13. data/ISSUE_TEMPLATE.md +25 -0
  14. data/LICENSE.txt +21 -0
  15. data/README.md +655 -0
  16. data/Rakefile +36 -0
  17. data/bin/ci +21 -0
  18. data/bin/setup +16 -0
  19. data/bin/test +47 -0
  20. data/dev.yml +28 -0
  21. data/dev/flamegraph-from-tests +35 -0
  22. data/exe/krane +5 -0
  23. data/krane.gemspec +44 -0
  24. data/lib/krane.rb +7 -0
  25. data/lib/krane/bindings_parser.rb +88 -0
  26. data/lib/krane/cli/deploy_command.rb +75 -0
  27. data/lib/krane/cli/global_deploy_command.rb +54 -0
  28. data/lib/krane/cli/krane.rb +91 -0
  29. data/lib/krane/cli/render_command.rb +41 -0
  30. data/lib/krane/cli/restart_command.rb +34 -0
  31. data/lib/krane/cli/run_command.rb +54 -0
  32. data/lib/krane/cli/version_command.rb +13 -0
  33. data/lib/krane/cluster_resource_discovery.rb +113 -0
  34. data/lib/krane/common.rb +23 -0
  35. data/lib/krane/concerns/template_reporting.rb +29 -0
  36. data/lib/krane/concurrency.rb +18 -0
  37. data/lib/krane/container_logs.rb +106 -0
  38. data/lib/krane/deferred_summary_logging.rb +95 -0
  39. data/lib/krane/delayed_exceptions.rb +14 -0
  40. data/lib/krane/deploy_task.rb +363 -0
  41. data/lib/krane/deploy_task_config_validator.rb +29 -0
  42. data/lib/krane/duration_parser.rb +27 -0
  43. data/lib/krane/ejson_secret_provisioner.rb +154 -0
  44. data/lib/krane/errors.rb +28 -0
  45. data/lib/krane/formatted_logger.rb +57 -0
  46. data/lib/krane/global_deploy_task.rb +210 -0
  47. data/lib/krane/global_deploy_task_config_validator.rb +12 -0
  48. data/lib/krane/kubeclient_builder.rb +156 -0
  49. data/lib/krane/kubectl.rb +120 -0
  50. data/lib/krane/kubernetes_resource.rb +621 -0
  51. data/lib/krane/kubernetes_resource/cloudsql.rb +43 -0
  52. data/lib/krane/kubernetes_resource/config_map.rb +22 -0
  53. data/lib/krane/kubernetes_resource/cron_job.rb +18 -0
  54. data/lib/krane/kubernetes_resource/custom_resource.rb +87 -0
  55. data/lib/krane/kubernetes_resource/custom_resource_definition.rb +98 -0
  56. data/lib/krane/kubernetes_resource/daemon_set.rb +90 -0
  57. data/lib/krane/kubernetes_resource/deployment.rb +213 -0
  58. data/lib/krane/kubernetes_resource/horizontal_pod_autoscaler.rb +65 -0
  59. data/lib/krane/kubernetes_resource/ingress.rb +18 -0
  60. data/lib/krane/kubernetes_resource/job.rb +60 -0
  61. data/lib/krane/kubernetes_resource/network_policy.rb +22 -0
  62. data/lib/krane/kubernetes_resource/persistent_volume_claim.rb +80 -0
  63. data/lib/krane/kubernetes_resource/pod.rb +269 -0
  64. data/lib/krane/kubernetes_resource/pod_disruption_budget.rb +23 -0
  65. data/lib/krane/kubernetes_resource/pod_set_base.rb +71 -0
  66. data/lib/krane/kubernetes_resource/pod_template.rb +20 -0
  67. data/lib/krane/kubernetes_resource/replica_set.rb +92 -0
  68. data/lib/krane/kubernetes_resource/resource_quota.rb +22 -0
  69. data/lib/krane/kubernetes_resource/role.rb +22 -0
  70. data/lib/krane/kubernetes_resource/role_binding.rb +22 -0
  71. data/lib/krane/kubernetes_resource/secret.rb +24 -0
  72. data/lib/krane/kubernetes_resource/service.rb +104 -0
  73. data/lib/krane/kubernetes_resource/service_account.rb +22 -0
  74. data/lib/krane/kubernetes_resource/stateful_set.rb +70 -0
  75. data/lib/krane/label_selector.rb +42 -0
  76. data/lib/krane/oj.rb +4 -0
  77. data/lib/krane/options_helper.rb +39 -0
  78. data/lib/krane/remote_logs.rb +60 -0
  79. data/lib/krane/render_task.rb +118 -0
  80. data/lib/krane/renderer.rb +118 -0
  81. data/lib/krane/resource_cache.rb +68 -0
  82. data/lib/krane/resource_deployer.rb +265 -0
  83. data/lib/krane/resource_watcher.rb +171 -0
  84. data/lib/krane/restart_task.rb +228 -0
  85. data/lib/krane/rollout_conditions.rb +103 -0
  86. data/lib/krane/runner_task.rb +212 -0
  87. data/lib/krane/runner_task_config_validator.rb +18 -0
  88. data/lib/krane/statsd.rb +65 -0
  89. data/lib/krane/task_config.rb +22 -0
  90. data/lib/krane/task_config_validator.rb +96 -0
  91. data/lib/krane/template_sets.rb +173 -0
  92. data/lib/krane/version.rb +4 -0
  93. data/pull_request_template.md +8 -0
  94. data/screenshots/deploy-demo.gif +0 -0
  95. data/screenshots/migrate-logs.png +0 -0
  96. data/screenshots/missing-secret-fail.png +0 -0
  97. data/screenshots/success.png +0 -0
  98. data/screenshots/test-output.png +0 -0
  99. metadata +375 -0
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+ require 'krane/delayed_exceptions'
3
+ require 'krane/ejson_secret_provisioner'
4
+
5
+ module Krane
6
+ class TemplateSets
7
+ include DelayedExceptions
8
+ VALID_TEMPLATES = %w(.yml.erb .yml .yaml .yaml.erb)
9
+ # private inner class
10
+ class TemplateSet
11
+ include DelayedExceptions
12
+ attr_reader :render_erb
13
+ def initialize(template_dir:, file_whitelist: [], logger:, render_erb: true)
14
+ @template_dir = template_dir
15
+ @files = file_whitelist
16
+ @logger = logger
17
+ @render_erb = render_erb
18
+ end
19
+
20
+ def with_resource_definitions_and_filename(current_sha: nil, bindings: nil, raw: false)
21
+ if @render_erb
22
+ @renderer = Renderer.new(
23
+ template_dir: @template_dir,
24
+ logger: @logger,
25
+ current_sha: current_sha,
26
+ bindings: bindings,
27
+ )
28
+ end
29
+ with_delayed_exceptions(@files, Krane::InvalidTemplateError) do |filename|
30
+ next if filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
31
+ templates(filename: filename, raw: raw) { |r_def| yield r_def, filename }
32
+ end
33
+ end
34
+
35
+ def ejson_secrets_file
36
+ @ejson_secrets_file ||= begin
37
+ secret_file = @files.find { |f| f == EjsonSecretProvisioner::EJSON_SECRETS_FILE }
38
+ File.join(@template_dir, secret_file) if secret_file
39
+ end
40
+ end
41
+
42
+ def validate
43
+ errors = []
44
+ supported_extensions = if @render_erb
45
+ TemplateSets::VALID_TEMPLATES
46
+ else
47
+ TemplateSets::VALID_TEMPLATES.reject { |extension| extension.include?('erb') }
48
+ end
49
+
50
+ if Dir.entries(@template_dir).none? do |filename|
51
+ filename.end_with?(*supported_extensions) ||
52
+ filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
53
+ end
54
+ return errors << "Template directory #{@template_dir} does not contain any valid templates (supported " \
55
+ "suffixes: #{supported_extensions.join(', ')}, or #{EjsonSecretProvisioner::EJSON_SECRETS_FILE})"
56
+ end
57
+
58
+ @files.each do |filename|
59
+ filename = File.join(@template_dir, filename)
60
+ if !File.exist?(filename)
61
+ errors << "File #{filename} does not exist"
62
+ elsif !filename.end_with?(*supported_extensions) &&
63
+ !filename.end_with?(EjsonSecretProvisioner::EJSON_SECRETS_FILE)
64
+ errors << "File #{filename} does not have valid suffix (supported suffixes: " \
65
+ "#{supported_extensions.join(', ')}, or #{EjsonSecretProvisioner::EJSON_SECRETS_FILE})"
66
+ end
67
+ end
68
+ errors
69
+ end
70
+
71
+ def deploying_with_erb_files?
72
+ @files.any? { |file| file.end_with?("erb") }
73
+ end
74
+
75
+ private
76
+
77
+ def templates(filename:, raw:)
78
+ file_content = File.read(File.join(@template_dir, filename))
79
+ rendered_content = @renderer ? @renderer.render_template(filename, file_content) : file_content
80
+ YAML.load_stream(rendered_content, "<rendered> #{filename}") do |doc|
81
+ next if doc.blank?
82
+ unless doc.is_a?(Hash)
83
+ raise InvalidTemplateError.new("Template is not a valid Kubernetes manifest",
84
+ filename: filename, content: doc)
85
+ end
86
+ yield doc unless raw
87
+ end
88
+ yield rendered_content if raw
89
+ rescue InvalidTemplateError => err
90
+ err.filename ||= filename
91
+ raise err
92
+ rescue Psych::SyntaxError => err
93
+ raise InvalidTemplateError.new(err.message, filename: filename, content: rendered_content)
94
+ end
95
+ end
96
+ private_constant :TemplateSet
97
+
98
+ class << self
99
+ def from_dirs_and_files(paths:, logger:, render_erb: true)
100
+ resource_templates = {}
101
+ dir_paths, file_paths = paths.partition { |path| File.directory?(path) }
102
+
103
+ # Directory paths
104
+ dir_paths.each do |template_dir|
105
+ resource_templates[template_dir] = Dir.foreach(template_dir).select do |filename|
106
+ filename.end_with?(*VALID_TEMPLATES) || filename == EjsonSecretProvisioner::EJSON_SECRETS_FILE
107
+ end
108
+ end
109
+
110
+ # Filename paths
111
+ file_paths.each do |filename|
112
+ dir_name = File.dirname(filename)
113
+ resource_templates[dir_name] ||= []
114
+ resource_templates[dir_name] << File.basename(filename) unless resource_templates[dir_name].include?(filename)
115
+ end
116
+
117
+ template_sets = []
118
+ resource_templates.each do |template_dir, files|
119
+ template_sets << TemplateSet.new(template_dir: template_dir, file_whitelist: files, logger: logger,
120
+ render_erb: render_erb)
121
+ end
122
+ TemplateSets.new(template_sets: template_sets)
123
+ end
124
+ end
125
+
126
+ def with_resource_definitions_and_filename(current_sha: nil, bindings: nil, raw: false)
127
+ with_delayed_exceptions(@template_sets, Krane::InvalidTemplateError) do |template_set|
128
+ template_set.with_resource_definitions_and_filename(
129
+ current_sha: current_sha,
130
+ bindings: bindings,
131
+ raw: raw
132
+ ) do |r_def, filename|
133
+ yield r_def, filename
134
+ end
135
+ end
136
+ end
137
+
138
+ def with_resource_definitions(current_sha: nil, bindings: nil, raw: false)
139
+ with_resource_definitions_and_filename(current_sha: current_sha, bindings: bindings, raw: raw) do |r_def, _|
140
+ yield r_def
141
+ end
142
+ end
143
+
144
+ def ejson_secrets_files
145
+ @template_sets.map(&:ejson_secrets_file).compact
146
+ end
147
+
148
+ def validate
149
+ errors = @template_sets.flat_map(&:validate)
150
+
151
+ if rendering_erb_disabled? && deploying_with_erb_files?
152
+ errors << "ERB template discovered with rendering disabled. If you were trying to render ERB and " \
153
+ "deploy the result, try piping the output of `krane render` to `krane-deploy` with the --stdin flag"
154
+ end
155
+
156
+ errors
157
+ end
158
+
159
+ private
160
+
161
+ def deploying_with_erb_files?
162
+ @template_sets.any?(&:deploying_with_erb_files?)
163
+ end
164
+
165
+ def rendering_erb_disabled?
166
+ !@template_sets.any?(&:render_erb)
167
+ end
168
+
169
+ def initialize(template_sets: [])
170
+ @template_sets = template_sets
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module Krane
3
+ VERSION = "1.0.0"
4
+ end
@@ -0,0 +1,8 @@
1
+ **What are you trying to accomplish with this PR?**
2
+ ...
3
+
4
+ **How is this accomplished?**
5
+ ...
6
+
7
+ **What could go wrong?**
8
+ ...
Binary file
metadata ADDED
@@ -0,0 +1,375 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tobsch-krane
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Katrina Verey
8
+ - Daniel Turner
9
+ - Kir Shatrov
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2019-11-28 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '5.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '5.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: kubeclient
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '4.3'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.3'
43
+ - !ruby/object:Gem::Dependency
44
+ name: googleauth
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 0.8.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.8.0
57
+ - !ruby/object:Gem::Dependency
58
+ name: ejson
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: colorize
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.8'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.8'
85
+ - !ruby/object:Gem::Dependency
86
+ name: statsd-instrument
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '2.8'
92
+ - - "<"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.1'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '2.8'
102
+ - - "<"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.1'
105
+ - !ruby/object:Gem::Dependency
106
+ name: oj
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '3.0'
112
+ type: :runtime
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '3.0'
119
+ - !ruby/object:Gem::Dependency
120
+ name: concurrent-ruby
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.1'
126
+ type: :runtime
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1.1'
133
+ - !ruby/object:Gem::Dependency
134
+ name: jsonpath
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 0.9.6
140
+ type: :runtime
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 0.9.6
147
+ - !ruby/object:Gem::Dependency
148
+ name: thor
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 0.20.3
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.20.3
161
+ - !ruby/object:Gem::Dependency
162
+ name: bundler
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: rake
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '10.0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '10.0'
189
+ - !ruby/object:Gem::Dependency
190
+ name: minitest
191
+ requirement: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '5.0'
196
+ type: :development
197
+ prerelease: false
198
+ version_requirements: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '5.0'
203
+ - !ruby/object:Gem::Dependency
204
+ name: minitest-stub-const
205
+ requirement: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '0.6'
210
+ type: :development
211
+ prerelease: false
212
+ version_requirements: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: '0.6'
217
+ - !ruby/object:Gem::Dependency
218
+ name: webmock
219
+ requirement: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: '3.0'
224
+ type: :development
225
+ prerelease: false
226
+ version_requirements: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: '3.0'
231
+ - !ruby/object:Gem::Dependency
232
+ name: mocha
233
+ requirement: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: '1.5'
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: '1.5'
245
+ description: A command line tool that helps you ship changes to a Kubernetes namespace
246
+ and understand the result
247
+ email:
248
+ - ops-accounts+shipit@shopify.com
249
+ executables:
250
+ - krane
251
+ extensions: []
252
+ extra_rdoc_files: []
253
+ files:
254
+ - ".buildkite/pipeline.nightly.yml"
255
+ - ".github/probots.yml"
256
+ - ".gitignore"
257
+ - ".rubocop.yml"
258
+ - ".shopify-build/VERSION"
259
+ - ".shopify-build/kubernetes-deploy.yml"
260
+ - 1.0-Upgrade.md
261
+ - CHANGELOG.md
262
+ - CODE_OF_CONDUCT.md
263
+ - CONTRIBUTING.md
264
+ - Gemfile
265
+ - ISSUE_TEMPLATE.md
266
+ - LICENSE.txt
267
+ - README.md
268
+ - Rakefile
269
+ - bin/ci
270
+ - bin/setup
271
+ - bin/test
272
+ - dev.yml
273
+ - dev/flamegraph-from-tests
274
+ - exe/krane
275
+ - krane.gemspec
276
+ - lib/krane.rb
277
+ - lib/krane/bindings_parser.rb
278
+ - lib/krane/cli/deploy_command.rb
279
+ - lib/krane/cli/global_deploy_command.rb
280
+ - lib/krane/cli/krane.rb
281
+ - lib/krane/cli/render_command.rb
282
+ - lib/krane/cli/restart_command.rb
283
+ - lib/krane/cli/run_command.rb
284
+ - lib/krane/cli/version_command.rb
285
+ - lib/krane/cluster_resource_discovery.rb
286
+ - lib/krane/common.rb
287
+ - lib/krane/concerns/template_reporting.rb
288
+ - lib/krane/concurrency.rb
289
+ - lib/krane/container_logs.rb
290
+ - lib/krane/deferred_summary_logging.rb
291
+ - lib/krane/delayed_exceptions.rb
292
+ - lib/krane/deploy_task.rb
293
+ - lib/krane/deploy_task_config_validator.rb
294
+ - lib/krane/duration_parser.rb
295
+ - lib/krane/ejson_secret_provisioner.rb
296
+ - lib/krane/errors.rb
297
+ - lib/krane/formatted_logger.rb
298
+ - lib/krane/global_deploy_task.rb
299
+ - lib/krane/global_deploy_task_config_validator.rb
300
+ - lib/krane/kubeclient_builder.rb
301
+ - lib/krane/kubectl.rb
302
+ - lib/krane/kubernetes_resource.rb
303
+ - lib/krane/kubernetes_resource/cloudsql.rb
304
+ - lib/krane/kubernetes_resource/config_map.rb
305
+ - lib/krane/kubernetes_resource/cron_job.rb
306
+ - lib/krane/kubernetes_resource/custom_resource.rb
307
+ - lib/krane/kubernetes_resource/custom_resource_definition.rb
308
+ - lib/krane/kubernetes_resource/daemon_set.rb
309
+ - lib/krane/kubernetes_resource/deployment.rb
310
+ - lib/krane/kubernetes_resource/horizontal_pod_autoscaler.rb
311
+ - lib/krane/kubernetes_resource/ingress.rb
312
+ - lib/krane/kubernetes_resource/job.rb
313
+ - lib/krane/kubernetes_resource/network_policy.rb
314
+ - lib/krane/kubernetes_resource/persistent_volume_claim.rb
315
+ - lib/krane/kubernetes_resource/pod.rb
316
+ - lib/krane/kubernetes_resource/pod_disruption_budget.rb
317
+ - lib/krane/kubernetes_resource/pod_set_base.rb
318
+ - lib/krane/kubernetes_resource/pod_template.rb
319
+ - lib/krane/kubernetes_resource/replica_set.rb
320
+ - lib/krane/kubernetes_resource/resource_quota.rb
321
+ - lib/krane/kubernetes_resource/role.rb
322
+ - lib/krane/kubernetes_resource/role_binding.rb
323
+ - lib/krane/kubernetes_resource/secret.rb
324
+ - lib/krane/kubernetes_resource/service.rb
325
+ - lib/krane/kubernetes_resource/service_account.rb
326
+ - lib/krane/kubernetes_resource/stateful_set.rb
327
+ - lib/krane/label_selector.rb
328
+ - lib/krane/oj.rb
329
+ - lib/krane/options_helper.rb
330
+ - lib/krane/remote_logs.rb
331
+ - lib/krane/render_task.rb
332
+ - lib/krane/renderer.rb
333
+ - lib/krane/resource_cache.rb
334
+ - lib/krane/resource_deployer.rb
335
+ - lib/krane/resource_watcher.rb
336
+ - lib/krane/restart_task.rb
337
+ - lib/krane/rollout_conditions.rb
338
+ - lib/krane/runner_task.rb
339
+ - lib/krane/runner_task_config_validator.rb
340
+ - lib/krane/statsd.rb
341
+ - lib/krane/task_config.rb
342
+ - lib/krane/task_config_validator.rb
343
+ - lib/krane/template_sets.rb
344
+ - lib/krane/version.rb
345
+ - pull_request_template.md
346
+ - screenshots/deploy-demo.gif
347
+ - screenshots/migrate-logs.png
348
+ - screenshots/missing-secret-fail.png
349
+ - screenshots/success.png
350
+ - screenshots/test-output.png
351
+ homepage: https://github.com/Shopify/krane
352
+ licenses:
353
+ - MIT
354
+ metadata: {}
355
+ post_install_message:
356
+ rdoc_options: []
357
+ require_paths:
358
+ - lib
359
+ required_ruby_version: !ruby/object:Gem::Requirement
360
+ requirements:
361
+ - - ">="
362
+ - !ruby/object:Gem::Version
363
+ version: 2.4.0
364
+ required_rubygems_version: !ruby/object:Gem::Requirement
365
+ requirements:
366
+ - - ">="
367
+ - !ruby/object:Gem::Version
368
+ version: '0'
369
+ requirements: []
370
+ rubygems_version: 3.0.6
371
+ signing_key:
372
+ specification_version: 4
373
+ summary: A command line tool that helps you ship changes to a Kubernetes namespace
374
+ and understand the result
375
+ test_files: []