kubernetes-deploy 0.20.4 → 0.20.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.buildkite/pipeline.nightly.yml +8 -8
- data/.buildkite/pipeline.yml +8 -0
- data/CHANGELOG.md +10 -2
- data/README.md +4 -0
- data/dev.yml +1 -1
- data/kubernetes-deploy.gemspec +1 -1
- data/lib/kubernetes-deploy/deploy_task.rb +15 -1
- data/lib/kubernetes-deploy/kubeclient_builder.rb +24 -0
- data/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb +55 -0
- data/lib/kubernetes-deploy/kubernetes_resource/horizontal_pod_autoscaler.rb +57 -0
- data/lib/kubernetes-deploy/kubernetes_resource/job.rb +47 -0
- data/lib/kubernetes-deploy/kubernetes_resource.rb +10 -1
- data/lib/kubernetes-deploy/resource_discovery.rb +19 -0
- data/lib/kubernetes-deploy/statsd.rb +1 -1
- data/lib/kubernetes-deploy/sync_mediator.rb +9 -4
- data/lib/kubernetes-deploy/version.rb +1 -1
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b01e4098e730e6ee300284d185adb140cf3cdc80
|
4
|
+
data.tar.gz: 6416b255318a78d3a1b6383263bbecd7b3603a4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aeeb95108945428fe39de942b7285843cd8a3960344089386bfbf1cfc1a551a50c1531d3e7d2082187f67640e6978ad1ab00f8ed7176b14d92bb56410ba78380
|
7
|
+
data.tar.gz: d0c1753242a3131586627252707ef9674ff94d2ac0e8e9f39f6a147dbc05449b5414ce6f26c1e8ede9bb4bd58d5919bf94ed6629f97ff2abc9db5c74e4b70e82
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
steps:
|
2
|
+
- name: 'Run Test Suite (:kubernetes: 1.10-latest)'
|
3
|
+
command: bin/ci
|
4
|
+
agents:
|
5
|
+
queue: minikube-ci
|
6
|
+
env:
|
7
|
+
LOGGING_LEVEL: 4
|
8
|
+
KUBERNETES_VERSION: v1.10-latest
|
9
9
|
- name: 'Run Test Suite (:kubernetes: 1.9-latest)'
|
10
10
|
command: bin/ci
|
11
11
|
agents:
|
data/.buildkite/pipeline.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
### Master
|
2
2
|
|
3
|
+
*Enhancements*
|
4
|
+
- Add Job resource class ([#295](https://github.com/Shopify/kubernetes-deploy/pull/296))
|
5
|
+
- Add CustomResourceDefinition resource class ([#306](https://github.com/Shopify/kubernetes-deploy/pull/306))
|
6
|
+
- Officially support Kubernetes 1.10 ([#308](https://github.com/Shopify/kubernetes-deploy/pull/308))
|
7
|
+
- SyncMediator will only batch fetch resources when there is a sufficiently large enough set of resources
|
8
|
+
being tracked ([#316](https://github.com/Shopify/kubernetes-deploy/pull/316))
|
9
|
+
- Allow CRs to be pruned based on `kubernetes-deploy.shopify.io/prunable` annotation on the custom resource definitions ([312](https://github.com/Shopify/kubernetes-deploy/pull/312))
|
10
|
+
- Add HorizontalPodAutoscaler resource class ([#305](https://github.com/Shopify/kubernetes-deploy/pull/305))
|
11
|
+
|
3
12
|
### 0.20.4
|
13
|
+
*Enhancements*
|
4
14
|
- Don't consider pod preempting a failure ([#317](https://github.com/shopify/kubernetes-deploy/pull/317))
|
5
15
|
|
6
16
|
### 0.20.3
|
@@ -8,7 +18,6 @@
|
|
8
18
|
- Evictions are recoverable so prevent them from triggering fast failure detection ([#293](https://github.com/Shopify/kubernetes-deploy/pull/293)).
|
9
19
|
- Use YAML.safe_load over YAML.load_file ([#295](https://github.com/Shopify/kubernetes-deploy/pull/295)).
|
10
20
|
|
11
|
-
|
12
21
|
*Bug Fixes*
|
13
22
|
- Default rollout strategy is compatible required-rollout annotation ([#289](https://github.com/Shopify/kubernetes-deploy/pull/289)).
|
14
23
|
|
@@ -16,7 +25,6 @@
|
|
16
25
|
*Enhancements*
|
17
26
|
- Emit data dog events when deploys succeed, time out or fail ([#292](https://github.com/Shopify/kubernetes-deploy/pull/292)).
|
18
27
|
### 0.20.1
|
19
|
-
*Features*
|
20
28
|
|
21
29
|
*Bug Fixes*
|
22
30
|
- Display a nice error instead of crashing when a YAML document is missing 'Kind'
|
data/README.md
CHANGED
@@ -241,6 +241,10 @@ before the deployment is considered successful.
|
|
241
241
|
that use the `RollingUpdate` strategy.
|
242
242
|
- Percent (e.g. 90%): The deploy is successful when the number of new pods that are ready is equal to
|
243
243
|
`spec.replicas` * Percent.
|
244
|
+
- `kubernetes-deploy.shopify.io/prunable`: Allows a Custom Resource to be pruned during deployment.
|
245
|
+
- _Compatibility_: Custom Resource Definition
|
246
|
+
- `true`: The custom resource will be pruned if the resource is not in the deploy directory.
|
247
|
+
- All other values: The custom resource will not be pruned.
|
244
248
|
|
245
249
|
### Running tasks at the beginning of a deploy
|
246
250
|
|
data/dev.yml
CHANGED
@@ -8,7 +8,7 @@ up:
|
|
8
8
|
- custom:
|
9
9
|
name: Minikube Cluster
|
10
10
|
met?: test $(minikube status | grep Running | wc -l) -eq 2 && $(minikube status | grep -q 'Correctly Configured')
|
11
|
-
meet: minikube start --kubernetes-version=v1.
|
11
|
+
meet: minikube start --kubernetes-version=v1.10.0 --vm-driver=hyperkit
|
12
12
|
down: minikube stop
|
13
13
|
commands:
|
14
14
|
reset-minikube: minikube delete && rm -rf ~/.minikube
|
data/kubernetes-deploy.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.required_ruby_version = '>= 2.3.0'
|
26
26
|
spec.add_dependency "activesupport", ">= 5.0"
|
27
27
|
spec.add_dependency "kubeclient", "~> 3.0"
|
28
|
-
spec.add_dependency "googleauth", "
|
28
|
+
spec.add_dependency "googleauth", "= 0.6.2" # https://github.com/google/google-auth-library-ruby/issues/153
|
29
29
|
spec.add_dependency "ejson", "1.0.1"
|
30
30
|
spec.add_dependency "colorize", "~> 0.8"
|
31
31
|
spec.add_dependency "statsd-instrument", "~> 2.2"
|
@@ -27,6 +27,9 @@ require 'kubernetes-deploy/kubernetes_resource'
|
|
27
27
|
bucket
|
28
28
|
stateful_set
|
29
29
|
cron_job
|
30
|
+
job
|
31
|
+
custom_resource_definition
|
32
|
+
horizontal_pod_autoscaler
|
30
33
|
).each do |subresource|
|
31
34
|
require "kubernetes-deploy/kubernetes_resource/#{subresource}"
|
32
35
|
end
|
@@ -35,6 +38,7 @@ require 'kubernetes-deploy/kubectl'
|
|
35
38
|
require 'kubernetes-deploy/kubeclient_builder'
|
36
39
|
require 'kubernetes-deploy/ejson_secret_provisioner'
|
37
40
|
require 'kubernetes-deploy/renderer'
|
41
|
+
require 'kubernetes-deploy/resource_discovery'
|
38
42
|
|
39
43
|
module KubernetesDeploy
|
40
44
|
class DeployTask
|
@@ -50,6 +54,7 @@ module KubernetesDeploy
|
|
50
54
|
ServiceAccount
|
51
55
|
Pod
|
52
56
|
)
|
57
|
+
|
53
58
|
PROTECTED_NAMESPACES = %w(
|
54
59
|
default
|
55
60
|
kube-system
|
@@ -63,6 +68,7 @@ module KubernetesDeploy
|
|
63
68
|
# core/v1/ReplicationController -- superseded by deployments/replicasets
|
64
69
|
# extensions/v1beta1/ReplicaSet -- managed by deployments
|
65
70
|
# core/v1/Secret -- should not committed / managed by shipit
|
71
|
+
|
66
72
|
def prune_whitelist
|
67
73
|
wl = %w(
|
68
74
|
core/v1/ConfigMap
|
@@ -80,7 +86,7 @@ module KubernetesDeploy
|
|
80
86
|
if server_version >= Gem::Version.new('1.8.0')
|
81
87
|
wl << "batch/v1beta1/CronJob"
|
82
88
|
end
|
83
|
-
wl
|
89
|
+
wl + cluster_resource_discoverer.crds(@sync_mediator).select(&:prunable?).map(&:group_version_kind)
|
84
90
|
end
|
85
91
|
|
86
92
|
def server_version
|
@@ -198,6 +204,10 @@ module KubernetesDeploy
|
|
198
204
|
|
199
205
|
private
|
200
206
|
|
207
|
+
def cluster_resource_discoverer
|
208
|
+
ResourceDiscovery.new(namespace: @namespace, context: @context, logger: @logger, namespace_tags: @namespace_tags)
|
209
|
+
end
|
210
|
+
|
201
211
|
def deploy_has_priority_resources?(resources)
|
202
212
|
resources.any? { |r| PREDEPLOY_SEQUENCE.include?(r.type) }
|
203
213
|
end
|
@@ -247,6 +257,10 @@ module KubernetesDeploy
|
|
247
257
|
@logger.info " - #{r.id}"
|
248
258
|
end
|
249
259
|
end
|
260
|
+
if (global = resources.select(&:global?).presence)
|
261
|
+
@logger.warn("Detected non-namespaced #{'resource'.pluralize(global.count)} which will never be pruned:")
|
262
|
+
global.each { |r| @logger.warn(" - #{r.id}") }
|
263
|
+
end
|
250
264
|
resources
|
251
265
|
end
|
252
266
|
|
@@ -36,6 +36,14 @@ module KubernetesDeploy
|
|
36
36
|
)
|
37
37
|
end
|
38
38
|
|
39
|
+
def build_batch_v1_kubeclient(context)
|
40
|
+
_build_kubeclient(
|
41
|
+
api_version: "v1",
|
42
|
+
context: context,
|
43
|
+
endpoint_path: "/apis/batch/"
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
39
47
|
def build_policy_v1beta1_kubeclient(context)
|
40
48
|
_build_kubeclient(
|
41
49
|
api_version: "v1beta1",
|
@@ -52,6 +60,22 @@ module KubernetesDeploy
|
|
52
60
|
)
|
53
61
|
end
|
54
62
|
|
63
|
+
def build_apiextensions_v1beta1_kubeclient(context)
|
64
|
+
_build_kubeclient(
|
65
|
+
api_version: "v1beta1",
|
66
|
+
context: context,
|
67
|
+
endpoint_path: "/apis/apiextensions.k8s.io"
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def build_autoscaling_v1_kubeclient(context)
|
72
|
+
_build_kubeclient(
|
73
|
+
api_version: "v2beta1",
|
74
|
+
context: context,
|
75
|
+
endpoint_path: "/apis/autoscaling"
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
55
79
|
def _build_kubeclient(api_version:, context:, endpoint_path: nil)
|
56
80
|
# Find a context defined in kube conf files that matches the input context by name
|
57
81
|
friendly_configs = config_files.map { |f| GoogleFriendlyConfig.read(f) }
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module KubernetesDeploy
|
3
|
+
class CustomResourceDefinition < KubernetesResource
|
4
|
+
TIMEOUT = 2.minutes
|
5
|
+
GLOBAL = true
|
6
|
+
|
7
|
+
def deploy_succeeded?
|
8
|
+
names_accepted_status == "True"
|
9
|
+
end
|
10
|
+
|
11
|
+
def deploy_failed?
|
12
|
+
names_accepted_status == "False"
|
13
|
+
end
|
14
|
+
|
15
|
+
def timeout_message
|
16
|
+
"The names this CRD is attempting to register were neither accepted nor rejected in time"
|
17
|
+
end
|
18
|
+
|
19
|
+
def status
|
20
|
+
if !exists?
|
21
|
+
super
|
22
|
+
elsif deploy_succeeded?
|
23
|
+
"Names accepted"
|
24
|
+
else
|
25
|
+
"#{names_accepted_condition['reason']} (#{names_accepted_condition['message']})"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def group_version_kind
|
30
|
+
group = @definition.dig("spec", "group")
|
31
|
+
version = @definition.dig("spec", "version")
|
32
|
+
"#{group}/#{version}/#{kind}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def kind
|
36
|
+
@definition.dig("spec", "names", "kind")
|
37
|
+
end
|
38
|
+
|
39
|
+
def prunable?
|
40
|
+
prunable = @definition.dig("metadata", "annotations", "kubernetes-deploy.shopify.io/prunable")
|
41
|
+
prunable == "true"
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def names_accepted_condition
|
47
|
+
conditions = @instance_data.dig("status", "conditions") || []
|
48
|
+
conditions.detect { |c| c["type"] == "NamesAccepted" } || {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def names_accepted_status
|
52
|
+
names_accepted_condition["status"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module KubernetesDeploy
|
3
|
+
class HorizontalPodAutoscaler < KubernetesResource
|
4
|
+
TIMEOUT = 3.minutes
|
5
|
+
RECOVERABLE_CONDITIONS = %w(ScalingDisabled FailedGet)
|
6
|
+
|
7
|
+
def deploy_succeeded?
|
8
|
+
scaling_active_condition["status"] == "True"
|
9
|
+
end
|
10
|
+
|
11
|
+
def deploy_failed?
|
12
|
+
return false unless exists?
|
13
|
+
recoverable = RECOVERABLE_CONDITIONS.any? { |c| scaling_active_condition.fetch("reason", "").start_with?(c) }
|
14
|
+
scaling_active_condition["status"] == "False" && !recoverable
|
15
|
+
end
|
16
|
+
|
17
|
+
def kubectl_resource_type
|
18
|
+
'hpa.v2beta1.autoscaling'
|
19
|
+
end
|
20
|
+
|
21
|
+
def status
|
22
|
+
if !exists?
|
23
|
+
super
|
24
|
+
elsif deploy_succeeded?
|
25
|
+
"Configured"
|
26
|
+
elsif scaling_active_condition.present? || able_to_scale_condition.present?
|
27
|
+
condition = scaling_active_condition.presence || able_to_scale_condition
|
28
|
+
condition['reason']
|
29
|
+
else
|
30
|
+
"Unknown"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def failure_message
|
35
|
+
condition = scaling_active_condition.presence || able_to_scale_condition.presence || {}
|
36
|
+
condition['message']
|
37
|
+
end
|
38
|
+
|
39
|
+
def timeout_message
|
40
|
+
failure_message.presence || super
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def conditions
|
46
|
+
@instance_data.dig("status", "conditions") || []
|
47
|
+
end
|
48
|
+
|
49
|
+
def able_to_scale_condition
|
50
|
+
conditions.detect { |c| c["type"] == "AbleToScale" } || {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def scaling_active_condition
|
54
|
+
conditions.detect { |c| c["type"] == "ScalingActive" } || {}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module KubernetesDeploy
|
3
|
+
class Job < KubernetesResource
|
4
|
+
TIMEOUT = 10.minutes
|
5
|
+
|
6
|
+
def deploy_succeeded?
|
7
|
+
# Don't block deploys for long running jobs,
|
8
|
+
# Instead report success when there is at least 1 active
|
9
|
+
return false unless deploy_started?
|
10
|
+
done? || running?
|
11
|
+
end
|
12
|
+
|
13
|
+
def deploy_failed?
|
14
|
+
return false unless deploy_started?
|
15
|
+
return false unless @instance_data.dig("spec", "backoffLimit").present?
|
16
|
+
(@instance_data.dig("status", "failed") || 0) >= @instance_data.dig("spec", "backoffLimit")
|
17
|
+
end
|
18
|
+
|
19
|
+
def status
|
20
|
+
if !exists?
|
21
|
+
super
|
22
|
+
elsif done?
|
23
|
+
"Succeeded"
|
24
|
+
elsif running?
|
25
|
+
"Started"
|
26
|
+
elsif deploy_failed?
|
27
|
+
"Failed"
|
28
|
+
else
|
29
|
+
"Unknown"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def done?
|
36
|
+
(@instance_data.dig("status", "succeeded") || 0) == @instance_data.dig("spec", "completions")
|
37
|
+
end
|
38
|
+
|
39
|
+
def running?
|
40
|
+
now = Time.now.utc
|
41
|
+
start_time = @instance_data.dig("status", "startTime")
|
42
|
+
# Wait 5 seconds to ensure job doesn't immediately fail.
|
43
|
+
return false if !start_time.present? || now - Time.parse(start_time) < 5.second
|
44
|
+
(@instance_data.dig("status", "active") || 0) >= 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -8,6 +8,7 @@ module KubernetesDeploy
|
|
8
8
|
attr_reader :name, :namespace, :context
|
9
9
|
attr_writer :type, :deploy_started_at
|
10
10
|
|
11
|
+
GLOBAL = false
|
11
12
|
TIMEOUT = 5.minutes
|
12
13
|
LOG_LINE_COUNT = 250
|
13
14
|
|
@@ -114,7 +115,7 @@ module KubernetesDeploy
|
|
114
115
|
end
|
115
116
|
|
116
117
|
def sync(mediator)
|
117
|
-
@instance_data = mediator.get_instance(
|
118
|
+
@instance_data = mediator.get_instance(kubectl_resource_type, name)
|
118
119
|
end
|
119
120
|
|
120
121
|
def deploy_failed?
|
@@ -146,6 +147,10 @@ module KubernetesDeploy
|
|
146
147
|
@type || self.class.kind
|
147
148
|
end
|
148
149
|
|
150
|
+
def kubectl_resource_type
|
151
|
+
type
|
152
|
+
end
|
153
|
+
|
149
154
|
def deploy_timed_out?
|
150
155
|
return false unless deploy_started?
|
151
156
|
!deploy_succeeded? && !deploy_failed? && (Time.now.utc - @deploy_started_at > timeout)
|
@@ -315,6 +320,10 @@ module KubernetesDeploy
|
|
315
320
|
end
|
316
321
|
end
|
317
322
|
|
323
|
+
def global?
|
324
|
+
self.class::GLOBAL
|
325
|
+
end
|
326
|
+
|
318
327
|
private
|
319
328
|
|
320
329
|
def validate_timeout_annotation
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module KubernetesDeploy
|
4
|
+
class ResourceDiscovery
|
5
|
+
def initialize(namespace:, context:, logger:, namespace_tags:)
|
6
|
+
@namespace = namespace
|
7
|
+
@context = context
|
8
|
+
@logger = logger
|
9
|
+
@namespace_tags = namespace_tags
|
10
|
+
end
|
11
|
+
|
12
|
+
def crds(sync_mediator)
|
13
|
+
sync_mediator.get_all(CustomResourceDefinition.kind).map do |r_def|
|
14
|
+
CustomResourceDefinition.new(namespace: @namespace, context: @context, logger: @logger,
|
15
|
+
definition: r_def, statsd_tags: @namespace_tags)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -15,7 +15,7 @@ module KubernetesDeploy
|
|
15
15
|
if ENV['STATSD_DEV'].present?
|
16
16
|
::StatsD.backend = ::StatsD::Instrument::Backends::LoggerBackend.new(Logger.new($stderr))
|
17
17
|
elsif ENV['STATSD_ADDR'].present?
|
18
|
-
statsd_impl = ENV['STATSD_IMPLEMENTATION'].
|
18
|
+
statsd_impl = ENV['STATSD_IMPLEMENTATION'].present? ? ENV['STATSD_IMPLEMENTATION'] : "datadog"
|
19
19
|
::StatsD.backend = ::StatsD::Instrument::Backends::UDPBackend.new(ENV['STATSD_ADDR'], statsd_impl)
|
20
20
|
else
|
21
21
|
::StatsD.backend = ::StatsD::Instrument::Backends::NullBackend.new
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module KubernetesDeploy
|
3
3
|
class SyncMediator
|
4
|
+
LARGE_BATCH_THRESHOLD = Concurrency::MAX_THREADS * 3
|
5
|
+
|
4
6
|
def initialize(namespace:, context:, logger:)
|
5
7
|
@namespace = namespace
|
6
8
|
@context = context
|
@@ -29,11 +31,14 @@ module KubernetesDeploy
|
|
29
31
|
|
30
32
|
def sync(resources)
|
31
33
|
clear_cache
|
32
|
-
|
33
|
-
|
34
|
+
|
35
|
+
if resources.count > LARGE_BATCH_THRESHOLD
|
36
|
+
dependencies = resources.map(&:class).uniq.flat_map do |c|
|
37
|
+
c::SYNC_DEPENDENCIES if c.const_defined?('SYNC_DEPENDENCIES')
|
38
|
+
end
|
39
|
+
kinds = (resources.map(&:kubectl_resource_type) + dependencies).compact.uniq
|
40
|
+
kinds.each { |kind| fetch_by_kind(kind) }
|
34
41
|
end
|
35
|
-
kinds = (resources.map(&:type) + dependencies).compact.uniq
|
36
|
-
kinds.each { |kind| fetch_by_kind(kind) }
|
37
42
|
|
38
43
|
KubernetesDeploy::Concurrency.split_across_threads(resources) do |r|
|
39
44
|
r.sync(dup)
|
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.20.
|
4
|
+
version: 0.20.5
|
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-07
|
12
|
+
date: 2018-08-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -43,16 +43,16 @@ dependencies:
|
|
43
43
|
name: googleauth
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - '='
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 0.6.2
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - '='
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 0.6.2
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: ejson
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -227,10 +227,13 @@ files:
|
|
227
227
|
- lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb
|
228
228
|
- lib/kubernetes-deploy/kubernetes_resource/config_map.rb
|
229
229
|
- lib/kubernetes-deploy/kubernetes_resource/cron_job.rb
|
230
|
+
- lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb
|
230
231
|
- lib/kubernetes-deploy/kubernetes_resource/daemon_set.rb
|
231
232
|
- lib/kubernetes-deploy/kubernetes_resource/deployment.rb
|
232
233
|
- lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb
|
234
|
+
- lib/kubernetes-deploy/kubernetes_resource/horizontal_pod_autoscaler.rb
|
233
235
|
- lib/kubernetes-deploy/kubernetes_resource/ingress.rb
|
236
|
+
- lib/kubernetes-deploy/kubernetes_resource/job.rb
|
234
237
|
- lib/kubernetes-deploy/kubernetes_resource/memcached.rb
|
235
238
|
- lib/kubernetes-deploy/kubernetes_resource/persistent_volume_claim.rb
|
236
239
|
- lib/kubernetes-deploy/kubernetes_resource/pod.rb
|
@@ -246,6 +249,7 @@ files:
|
|
246
249
|
- lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb
|
247
250
|
- lib/kubernetes-deploy/kubernetes_resource/topic.rb
|
248
251
|
- lib/kubernetes-deploy/renderer.rb
|
252
|
+
- lib/kubernetes-deploy/resource_discovery.rb
|
249
253
|
- lib/kubernetes-deploy/resource_watcher.rb
|
250
254
|
- lib/kubernetes-deploy/restart_task.rb
|
251
255
|
- lib/kubernetes-deploy/runner_task.rb
|