tobsch-krane 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []