kubernetes-deploy 0.15.2 → 0.16.0

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
  SHA1:
3
- metadata.gz: c48f0cc4be05113a752768e19118a03d26c3505a
4
- data.tar.gz: 2d51f6e48f927cbbf44a277e600bd728f09a1025
3
+ metadata.gz: 6184836f627f154591e094a5d5311614b1a35d71
4
+ data.tar.gz: e17050ecc7698c759e9669e0b52327ff67c038c5
5
5
  SHA512:
6
- metadata.gz: d87392236bf5d4ceea11ad27ede7248abc611869b983f4eff8ecf8c43c4d09dc6164f36c5ce1ef7efa6022eaddee3791898e2f4b09e113ea63dc9c89b47ccd8a
7
- data.tar.gz: f31edab5e0c2afd6e89cc81df85dba6e271040ffb932a83e79117da109b7353b95e17dbfe36c158d6a37ea42bc245a13af7eda92c3cd882c1766bc32c9619950
6
+ metadata.gz: f43cef2d6cf0aa8454ae2c46f47a9095c65f9faf13c235a0cd29e74d23518cb5575bb927bfba084190af55d9db1e325259ce6bce9596a9218a29ee7b74bee721
7
+ data.tar.gz: bdbac63fceea6418db1e30dc12e115782c26ffb17ce04437ec5992d3c3695ad6fc8cca10e7ae33cd22c9f95f91789732b290627446dd3f52be89536fbaf42895
@@ -26,10 +26,3 @@
26
26
  env:
27
27
  LOGGING_LEVEL: 4
28
28
  KUBERNETES_VERSION: v1.7-latest
29
- - name: 'Run Test Suite (:kubernetes: 1.6.4)'
30
- command: bin/ci
31
- agents:
32
- queue: minikube-ci
33
- env:
34
- LOGGING_LEVEL: 4
35
- KUBERNETES_VERSION: v1.6.4
@@ -1,21 +1,21 @@
1
- - name: 'Run Test Suite (:kubernetes: 1.8-latest)'
1
+ - name: 'Run Test Suite (:kubernetes: 1.9-latest)'
2
2
  command: bin/ci
3
3
  agents:
4
4
  queue: minikube-ci
5
5
  env:
6
6
  LOGGING_LEVEL: 4
7
- KUBERNETES_VERSION: v1.8-latest
8
- - name: 'Run Test Suite (:kubernetes: 1.7-latest)'
7
+ KUBERNETES_VERSION: v1.9-latest
8
+ - name: 'Run Test Suite (:kubernetes: 1.8-latest)'
9
9
  command: bin/ci
10
10
  agents:
11
11
  queue: minikube-ci
12
12
  env:
13
13
  LOGGING_LEVEL: 4
14
- KUBERNETES_VERSION: v1.7-latest
15
- - name: 'Run Test Suite (:kubernetes: 1.6.4)'
14
+ KUBERNETES_VERSION: v1.8-latest
15
+ - name: 'Run Test Suite (:kubernetes: 1.7-latest)'
16
16
  command: bin/ci
17
17
  agents:
18
18
  queue: minikube-ci
19
19
  env:
20
20
  LOGGING_LEVEL: 4
21
- KUBERNETES_VERSION: v1.6.4
21
+ KUBERNETES_VERSION: v1.7-latest
@@ -1,3 +1,12 @@
1
+ ### 0.16.0
2
+ **Important:** This release changes the officially supported Kubernetes versions to v1.7 through v1.9. Other versions may continue to work, but we are no longer running our test suite against them.
3
+
4
+ *Features*
5
+ - Support partials to reduce duplication in yaml files ([#207](https://github.com/Shopify/kubernetes-deploy/pull/207))
6
+
7
+ *Bug Fixes*
8
+ - Handle podless deamon sets properly ([#242](https://github.com/Shopify/kubernetes-deploy/pull/242))
9
+
1
10
  ### 0.15.2
2
11
  *Enhancements*
3
12
  - Print warnings if kubernetes server version is not supported ([#237](https://github.com/Shopify/kubernetes-deploy/pull/237)).
data/Gemfile CHANGED
@@ -12,3 +12,4 @@ gem 'byebug'
12
12
  gem 'codecov', require: false
13
13
  gem 'ruby-prof', require: false
14
14
  gem 'ruby-prof-flamegraph', require: false
15
+ gem 'minitest-reporters'
data/README.md CHANGED
@@ -68,17 +68,19 @@ This repo also includes related tools for [running tasks](#kubernetes-run) and [
68
68
  ## Prerequisites
69
69
 
70
70
  * Ruby 2.3+
71
- * Your cluster must be running Kubernetes v1.6.0 or higher
71
+ * Your cluster must be running Kubernetes v1.7.0 or higher<sup>1</sup>
72
72
  * Each app must have a deploy directory containing its Kubernetes templates (see [Templates](#templates))
73
73
  * You must remove the` kubectl.kubernetes.io/last-applied-configuration` annotation from any resources in the namespace that are not included in your deploy directory. This annotation is added automatically when you create resources with `kubectl apply`. `kubernetes-deploy` will prune any resources that have this annotation and are not in the deploy directory.**
74
- * Each app managed by `kubernetes-deploy` must have its own exclusive Kubernetes namespace.**
74
+ * Each app managed by `kubernetes-deploy` must have its own exclusive Kubernetes namespace.<sup>2</sup>
75
75
 
76
+ <sup>1</sup> We run integration tests against these Kubernetes versions. Kubernetes v1.6 was officially supported in gem versions < 0.16. Kubernetes v1.5 was officially supported in gem versions < 0.12.
77
+
78
+ <sup>2</sup> This requirement can be bypassed with the `--no-prune` option, but it is not recommended.
76
79
 
77
- **This requirement can be bypassed with the `--no-prune` option, but it is not recommended.
78
80
 
79
81
  ## Installation
80
82
 
81
- 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.6.0 or higher) and make sure it is available in your $PATH
83
+ 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.7.0 or higher) and make sure it is available in your $PATH
82
84
  2. Set up your [kubeconfig file](https://kubernetes.io/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) for access to your cluster(s).
83
85
  3. `gem install kubernetes-deploy`
84
86
 
@@ -120,6 +122,92 @@ All templates must be YAML formatted. You can also use ERB. The following local
120
122
 
121
123
  You can add additional variables using the `--bindings=BINDINGS` option. For example, `kubernetes-deploy my-app cluster1 --bindings=color=blue,size=large` will expose `color` and `size` in your templates.
122
124
 
125
+ #### Using partials
126
+
127
+ `kubernetes-deploy` supports composing templates from so called partials in order to reduce duplication in Kubernetes YAML files. Given a template directory `DIR`, partials are searched for in `DIR/partials`and in 'DIR/../partials', in that order. They can be embedded in other ERB templates using the helper method `partial`. For example, let's assume an application needs a number of different CronJob resources, one could place a template called `cron` in one of those directories and then use it in the main deployment.yaml.erb like so:
128
+
129
+ ```yaml
130
+ <%= partial "cron", name: "cleanup", schedule: "0 0 * * *", args: %w(cleanup), cpu: "100m", memory: "100Mi" %>
131
+ <%= partial "cron", name: "send-mail", schedule: "0 0 * * *", args: %w(send-mails), cpu: "200m", memory: "256Mi" %>
132
+ ```
133
+
134
+ Inside a partial, parameters can be accessed as normal variables, or via a hash called `locals`. Thus, the `cron` template could like this:
135
+
136
+ ```yaml
137
+ ---
138
+ apiVersion: batch/v1beta1
139
+ kind: CronJob
140
+ metadata:
141
+ name: cron-<%= name %>
142
+ spec:
143
+ schedule: <%= schedule %>
144
+ successfulJobsHistoryLimit: 3
145
+ failedJobsHistoryLimit: 3
146
+ concurrencyPolicy: Forbid
147
+ jobTemplate:
148
+ spec:
149
+ template:
150
+ spec:
151
+ containers:
152
+ - name: cron-<%= name %>
153
+ image: ...
154
+ args: <%= args %>
155
+ resources:
156
+ requests:
157
+ cpu: "<%= cpu %>"
158
+ memory: <%= memory %>
159
+ restartPolicy: OnFailure
160
+ ```
161
+
162
+ Both `.yaml.erb` and `.yml.erb` file extensions are supported. Templates must refer to the bare filename (e.g. use `partial: 'cron'` to reference `cron.yaml.erb`).
163
+
164
+ ##### Limitations when using partials
165
+
166
+ Partials can be included almost everywhere in ERB templates, with one notable exception: you cannot use a partial to define a subset of fields. For example, given a partial `p` defining two fields 'a' and 'b',
167
+
168
+ ```yaml
169
+ a: 1
170
+ b: 2
171
+ ```
172
+
173
+ you cannot do this:
174
+
175
+ ```yaml
176
+ x: yz
177
+ <%= partial 'p' %>
178
+ ```
179
+
180
+ hoping to get
181
+
182
+ ```yaml
183
+ x: yz
184
+ a: 1
185
+ b: 2
186
+ ```
187
+
188
+ but you can do:
189
+
190
+ ```yaml
191
+ x:
192
+ <%= partial 'p' %>
193
+ ```
194
+
195
+ or even
196
+
197
+ ```yaml
198
+ x: <%= partial 'p' %>
199
+ ```
200
+
201
+ which both will result in
202
+
203
+ ```yaml
204
+ x:
205
+ a: 1
206
+ b: 2
207
+ ```
208
+
209
+ This is a limitation of the current implementation.
210
+
123
211
 
124
212
  ### Customizing behaviour with annotations
125
213
  - `kubernetes-deploy.shopify.io/timeout-override`: Override the tool's hard timeout for one specific resource. Both full ISO8601 durations and the time portion of ISO8601 durations are valid. Value must be between 1 second and 24 hours.
@@ -137,7 +225,6 @@ before the deployment is considered successful.
137
225
  - Percent (e.g. 90%): The deploy is successful when the number of new pods that are ready is equal to
138
226
  `spec.replicas` * Percent.
139
227
 
140
-
141
228
  ### Running tasks at the beginning of a deploy
142
229
 
143
230
  To run a task in your cluster at the beginning of every deploy, simply include a `Pod` template in your deploy directory. `kubernetes-deploy` will first deploy any `ConfigMap` and `PersistentVolumeClaim` resources in your template set, followed by any such pods. If the command run by one of these pods fails (i.e. exits with a non-zero status), the overall deploy will fail at this step (no other resources will be deployed).
@@ -249,7 +336,7 @@ With this done, you can use the following command to restart all of them:
249
336
 
250
337
  ## Prerequisites
251
338
 
252
- * You've already deployed a [`PodTemplate`](https://kubernetes.io/docs/api-reference/v1.6/#podtemplate-v1-core) object with field `template` containing a `Pod` specification that does not include the `apiVersion` or `kind` parameters. An example is provided in this repo in `test/fixtures/hello-cloud/template-runner.yml`.
339
+ * You've already deployed a [`PodTemplate`](https://kubernetes.io/docs/api-reference/v1.9/#podtemplate-v1-core) object with field `template` containing a `Pod` specification that does not include the `apiVersion` or `kind` parameters. An example is provided in this repo in `test/fixtures/hello-cloud/template-runner.yml`.
253
340
  * The `Pod` specification in that template has a container named `task-runner`.
254
341
 
255
342
  Based on this specification `kubernetes-run` will create a new pod with the entrypoint of the `task-runner ` container overridden with the supplied arguments.
@@ -275,7 +362,7 @@ Based on this specification `kubernetes-run` will create a new pod with the entr
275
362
 
276
363
  If you work for Shopify, just run `dev up`, but otherwise:
277
364
 
278
- 1. [Install kubectl version 1.6.0 or higher](https://kubernetes.io/docs/user-guide/prereqs/) and make sure it is in your path
365
+ 1. [Install kubectl version 1.7.0 or higher](https://kubernetes.io/docs/user-guide/prereqs/) and make sure it is in your path
279
366
  2. [Install minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation) (required to run the test suite)
280
367
  3. Check out the repo
281
368
  4. Run `bin/setup` to install dependencies
data/Rakefile CHANGED
@@ -2,10 +2,28 @@
2
2
  require "bundler/gem_tasks"
3
3
  require "rake/testtask"
4
4
 
5
- Rake::TestTask.new(:test) do |t|
5
+ desc "Run integration tests that can be run in parallel"
6
+ Rake::TestTask.new(:integration_test) do |t|
6
7
  t.libs << "test"
7
8
  t.libs << "lib"
8
- t.test_files = FileList['test/**/*_test.rb']
9
+ t.test_files = FileList['test/integration/**/*_test.rb']
9
10
  end
10
11
 
12
+ desc "Run integration tests that CANNOT be run in parallel"
13
+ Rake::TestTask.new(:serial_integration_test) do |t|
14
+ t.libs << "test"
15
+ t.libs << "lib"
16
+ t.test_files = FileList['test/integration-serial/**/*_test.rb']
17
+ end
18
+
19
+ desc "Run unit tests"
20
+ Rake::TestTask.new(:unit_test) do |t|
21
+ t.libs << "test"
22
+ t.libs << "lib"
23
+ t.test_files = FileList['test/unit/**/*_test.rb']
24
+ end
25
+
26
+ desc "Run all tests"
27
+ task test: %w(unit_test serial_integration_test integration_test)
28
+
11
29
  task default: :test
data/bin/ci CHANGED
@@ -14,6 +14,8 @@ docker run --rm \
14
14
  -e CI=1 \
15
15
  -e CODECOV_TOKEN=$CODECOV_TOKEN \
16
16
  -e COVERAGE=1 \
17
+ -e VERBOSE=1 \
18
+ -e PARALLELISM=$PARALLELISM \
17
19
  -w /usr/src/app \
18
20
  ruby:2.3 \
19
21
  bin/test
data/bin/setup CHANGED
@@ -9,8 +9,8 @@ if [ ! -x "$(which minikube)" ]; then
9
9
  fi
10
10
 
11
11
  if [ ! -x "$(which kubectl)" ]; then
12
- echo -e "\n\033[0;33mPlease install kubectl version 1.6.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
12
+ echo -e "\n\033[0;33mPlease install kubectl version 1.7.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
13
13
  else
14
14
  KUBECTL_VERSION=$(kubectl version --short --client | grep -oe "v[[:digit:]\.]\+")
15
- echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.6.0 or greater.\033[0m"
15
+ echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.7.0 or greater.\033[0m"
16
16
  fi
data/bin/test CHANGED
@@ -1,7 +1,44 @@
1
1
  #!/bin/bash
2
- set -euo pipefail
2
+ set -uo pipefail
3
3
 
4
- echo "--- :ruby: Bundle Install"
5
- bundle install --jobs 4
6
- echo "+++ :kubernetes: Run Tests"
7
- bundle exec rake test TESTOPTS='-v'
4
+ err=0
5
+ trap 'err=1' ERR
6
+ trap 'exit 1' SIGINT
7
+
8
+ function print_header() {
9
+ if [[ ${CI:="0"} == "1" ]]; then
10
+ printf "+++ :kubernetes: %s\n" "${1}"
11
+ else
12
+ printf "\n\n\033[0;35m⎈ %s\033[0m\n" "${1}"
13
+ fi
14
+ }
15
+
16
+ if [[ ${PARALLELISM:=0} -lt 1 ]]; then
17
+ if [[ $(uname) == "Darwin" ]]; then
18
+ num_cpus=$(sysctl -n hw.ncpu)
19
+ else
20
+ num_cpus=$(nproc --all)
21
+ fi
22
+
23
+ if [[ $num_cpus -le 2 ]]; then
24
+ PARALLELISM=1
25
+ else
26
+ (( PARALLELISM=num_cpus/2 ))
27
+ fi
28
+ fi
29
+
30
+ if [[ ${CI:="0"} == "1" ]]; then
31
+ echo "--- :ruby: Bundle Install"
32
+ bundle install --jobs 4
33
+ fi
34
+
35
+ print_header "Run Unit Tests"
36
+ bundle exec rake unit_test
37
+
38
+ print_header "Run Non-Parallel Integration Tests"
39
+ bundle exec rake serial_integration_test
40
+
41
+ print_header "Run Parallel Integration Tests (N=$PARALLELISM)"
42
+ PARALLELIZE_ME=1 N=$PARALLELISM bundle exec rake integration_test
43
+
44
+ test $err -eq 0
data/dev.yml CHANGED
@@ -13,7 +13,7 @@ up:
13
13
  commands:
14
14
  reset-minikube: minikube delete && rm -rf ~/.minikube
15
15
  test:
16
- run: bundle exec rake test
16
+ run: bin/test
17
17
  tophat:
18
18
  run: PRINT_LOGS=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n/${1}/
19
19
  desc: Tophat a change by running a test scenario with logging output enabled.
@@ -21,6 +21,6 @@ require 'kubernetes-deploy/bindings_parser'
21
21
  require 'kubernetes-deploy/duration_parser'
22
22
 
23
23
  module KubernetesDeploy
24
- MIN_KUBE_VERSION = '1.6.0'
24
+ MIN_KUBE_VERSION = '1.7.0'
25
25
  KubernetesDeploy::StatsD.build
26
26
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  require 'open3'
3
- require 'securerandom'
4
- require 'erb'
5
3
  require 'yaml'
6
4
  require 'shellwords'
7
5
  require 'tempfile'
@@ -36,6 +34,7 @@ require 'kubernetes-deploy/resource_watcher'
36
34
  require 'kubernetes-deploy/kubectl'
37
35
  require 'kubernetes-deploy/kubeclient_builder'
38
36
  require 'kubernetes-deploy/ejson_secret_provisioner'
37
+ require 'kubernetes-deploy/renderer'
39
38
 
40
39
  module KubernetesDeploy
41
40
  class DeployTask
@@ -98,9 +97,12 @@ module KubernetesDeploy
98
97
  @template_dir = File.expand_path(template_dir)
99
98
  @logger = logger
100
99
  @kubectl = kubectl_instance
101
- @bindings = bindings
102
- # Max length of podname is only 63chars so try to save some room by truncating sha to 8 chars
103
- @id = current_sha[0...8] + "-#{SecureRandom.hex(4)}" if current_sha
100
+ @renderer = KubernetesDeploy::Renderer.new(
101
+ current_sha: @current_sha,
102
+ template_dir: @template_dir,
103
+ logger: @logger,
104
+ bindings: bindings,
105
+ )
104
106
  end
105
107
 
106
108
  def run(verify_result: true, allow_protected_ns: false, prune: true)
@@ -167,13 +169,6 @@ module KubernetesDeploy
167
169
  success
168
170
  end
169
171
 
170
- def template_variables
171
- {
172
- 'current_sha' => @current_sha,
173
- 'deployment_id' => @id,
174
- }.merge(@bindings)
175
- end
176
-
177
172
  private
178
173
 
179
174
  # Inspect the file referenced in the kubectl stderr
@@ -234,7 +229,7 @@ module KubernetesDeploy
234
229
 
235
230
  def split_templates(filename)
236
231
  file_content = File.read(File.join(@template_dir, filename))
237
- rendered_content = render_template(filename, file_content)
232
+ rendered_content = @renderer.render_template(filename, file_content)
238
233
  YAML.load_stream(rendered_content) do |doc|
239
234
  yield doc unless doc.blank?
240
235
  end
@@ -271,20 +266,6 @@ module KubernetesDeploy
271
266
  " " + str.gsub("\n", "\n ")
272
267
  end
273
268
 
274
- def render_template(filename, raw_template)
275
- return raw_template unless File.extname(filename) == ".erb"
276
-
277
- erb_template = ERB.new(raw_template)
278
- erb_binding = binding
279
- template_variables.each do |var_name, value|
280
- erb_binding.local_variable_set(var_name, value)
281
- end
282
- erb_template.result(erb_binding)
283
- rescue NameError => e
284
- @logger.summary.add_paragraph("Error from renderer:\n #{e.message.tr("\n", ' ')}")
285
- raise FatalDeploymentError, "Template '#{filename}' cannot be rendered"
286
- end
287
-
288
269
  def validate_configuration(allow_protected_ns:, prune:)
289
270
  errors = []
290
271
  if ENV["KUBECONFIG"].blank?
@@ -37,6 +37,7 @@ module KubernetesDeploy
37
37
  end
38
38
 
39
39
  def fetch_logs
40
+ return {} unless @pods.present?
40
41
  most_useful_pod = @pods.find(&:deploy_failed?) || @pods.find(&:deploy_timed_out?) || @pods.first
41
42
  most_useful_pod.fetch_logs
42
43
  end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'securerandom'
5
+ require 'yaml'
6
+ require 'json'
7
+
8
+ module KubernetesDeploy
9
+ class Renderer
10
+ class InvalidPartialError < FatalDeploymentError
11
+ attr_reader :parents
12
+ def initialize(msg, parents = [])
13
+ @parents = parents
14
+ super(msg)
15
+ end
16
+ end
17
+ class PartialNotFound < InvalidPartialError; end
18
+
19
+ def initialize(current_sha:, template_dir:, logger:, bindings: {})
20
+ @current_sha = current_sha
21
+ @template_dir = template_dir
22
+ @partials_dirs =
23
+ %w(partials ../partials).map { |d| File.expand_path(File.join(@template_dir, d)) }
24
+ @logger = logger
25
+ @bindings = bindings
26
+ # Max length of podname is only 63chars so try to save some room by truncating sha to 8 chars
27
+ @id = current_sha[0...8] + "-#{SecureRandom.hex(4)}" if current_sha
28
+ end
29
+
30
+ def render_template(filename, raw_template)
31
+ return raw_template unless File.extname(filename) == ".erb"
32
+
33
+ erb_binding = TemplateContext.new(self).template_binding
34
+ bind_template_variables(erb_binding, template_variables)
35
+
36
+ ERB.new(raw_template, nil, '-').result(erb_binding)
37
+ rescue InvalidPartialError => err
38
+ all_parents = err.parents.dup.unshift(filename)
39
+ raise FatalDeploymentError, "#{err.message} (included from: #{all_parents.join(' -> ')})"
40
+ rescue StandardError => err
41
+ report_template_invalid(err.message, raw_template)
42
+ raise FatalDeploymentError, "Template '#{filename}' cannot be rendered"
43
+ end
44
+
45
+ def render_partial(partial, locals)
46
+ variables = template_variables.merge(locals)
47
+ erb_binding = TemplateContext.new(self).template_binding
48
+ bind_template_variables(erb_binding, variables)
49
+ erb_binding.local_variable_set("locals", locals)
50
+
51
+ partial_path = find_partial(partial)
52
+ template = File.read(partial_path)
53
+ expanded_template = ERB.new(template, nil, '-').result(erb_binding)
54
+
55
+ docs = Psych.parse_stream(expanded_template)
56
+ # If the partial contains multiple documents or has an explicit document header,
57
+ # we know it cannot validly be indented in the parent, so return it immediately.
58
+ return expanded_template unless docs.children.one? && docs.children.first.implicit
59
+ # Make sure indentation isn't a problem by producing a single line of parseable YAML.
60
+ # Note that JSON is a subset of YAML.
61
+ JSON.generate(docs.children.first.to_ruby)
62
+ rescue PartialNotFound => err
63
+ raise InvalidPartialError, err.message
64
+ rescue InvalidPartialError => err
65
+ raise InvalidPartialError.new(err.message, err.parents.dup.unshift(File.basename(partial_path)))
66
+ rescue StandardError => err
67
+ report_template_invalid(err.message, expanded_template)
68
+ raise InvalidPartialError, "Template '#{partial_path}' cannot be rendered"
69
+ end
70
+
71
+ private
72
+
73
+ def template_variables
74
+ {
75
+ 'current_sha' => @current_sha,
76
+ 'deployment_id' => @id,
77
+ }.merge(@bindings)
78
+ end
79
+
80
+ def bind_template_variables(erb_binding, variables)
81
+ variables.each do |var_name, value|
82
+ erb_binding.local_variable_set(var_name, value)
83
+ end
84
+ end
85
+
86
+ def find_partial(name)
87
+ partial_names = [name + '.yaml.erb', name + '.yml.erb']
88
+ @partials_dirs.each do |dir|
89
+ partial_names.each do |partial_name|
90
+ partial_path = File.join(dir, partial_name)
91
+ return partial_path if File.exist?(partial_path)
92
+ end
93
+ end
94
+ raise PartialNotFound, "Could not find partial '#{name}' in any of #{@partials_dirs.join(':')}"
95
+ end
96
+
97
+ def report_template_invalid(message, content)
98
+ @logger.summary.add_paragraph("Error from renderer:\n #{message.tr("\n", ' ')}")
99
+ @logger.summary.add_paragraph("Rendered template content:\n#{content}")
100
+ end
101
+
102
+ class TemplateContext
103
+ def initialize(renderer)
104
+ @_renderer = renderer
105
+ end
106
+
107
+ def template_binding
108
+ binding
109
+ end
110
+
111
+ def partial(partial, locals = {})
112
+ @_renderer.render_partial(partial, locals)
113
+ end
114
+ end
115
+ end
116
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module KubernetesDeploy
3
- VERSION = "0.15.2"
3
+ VERSION = "0.16.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubernetes-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.2
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Verey
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-01-19 00:00:00.000000000 Z
12
+ date: 2018-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -258,6 +258,7 @@ files:
258
258
  - lib/kubernetes-deploy/kubernetes_resource/stateful_set.rb
259
259
  - lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb
260
260
  - lib/kubernetes-deploy/kubernetes_resource/topic.rb
261
+ - lib/kubernetes-deploy/renderer.rb
261
262
  - lib/kubernetes-deploy/resource_watcher.rb
262
263
  - lib/kubernetes-deploy/restart_task.rb
263
264
  - lib/kubernetes-deploy/runner_task.rb