kubernetes-deploy 0.1.4 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 229024d6a43f085c767d9943c3cb06ae3f965995
4
- data.tar.gz: b5a48ab5bd5dd40ae1bf1d628f9c159083964e6a
3
+ metadata.gz: 29573aea8ad1792ad61ec614c01d86b8a1a4b42c
4
+ data.tar.gz: c626801864c77a1879d922c9140c16f1e8d203d6
5
5
  SHA512:
6
- metadata.gz: d62b6779527427b81fd95ecd6bc421177ef16637d9bf227c400848971a5f3fe484cb54473adde550f97112b999366b5e0346740b8f8e648fa26e6c0e38582f36
7
- data.tar.gz: 0a6625137be4640bbe140bcbbed8012ebd3e36442dc1b6ecbc0ea5cb6e5e844ee931eff4df4314f3c0d65fb94c64ccd9c9f43b38ac1093aec0e42753d7797c7b
6
+ metadata.gz: 4ba1893e0ff7cdf82eaffec1ded3cd3efe46409f0c05d8e9a2f67cca6f0777798f8184351c64bd922de651a2ef51b78d480edf677741a0b6cb392b1fee102156
7
+ data.tar.gz: 12761dfb12a052f1cc8971e10c881c36fcdfb4c69c7bb8aa492fa6b36b4b6e5f9a23cb47b53030097af21438fa2489ac04f7c0cb29e97fabde293ecc94ee9157
@@ -1,6 +1,7 @@
1
1
  require 'active_support/core_ext/object/blank'
2
2
  require 'active_support/core_ext/hash/slice'
3
3
  require 'active_support/core_ext/numeric/time'
4
+ require 'active_support/core_ext/string/inflections'
4
5
 
5
6
  require 'logger'
6
7
  require 'kubernetes-deploy/runner'
@@ -12,6 +12,7 @@ module KubernetesDeploy
12
12
 
13
13
  def self.for_type(type, name, namespace, file)
14
14
  case type
15
+ when 'cloudsql' then Cloudsql.new(name, namespace, file)
15
16
  when 'configmap' then ConfigMap.new(name, namespace, file)
16
17
  when 'deployment' then Deployment.new(name, namespace, file)
17
18
  when 'pod' then Pod.new(name, namespace, file)
@@ -69,6 +70,10 @@ module KubernetesDeploy
69
70
  !deploy_succeeded? && !deploy_failed? && (Time.now.utc - @deploy_started > self.class::TIMEOUT)
70
71
  end
71
72
 
73
+ def tpr?
74
+ false
75
+ end
76
+
72
77
  def status_data
73
78
  {
74
79
  group: group_name,
@@ -82,7 +87,7 @@ module KubernetesDeploy
82
87
  end
83
88
 
84
89
  def group_name
85
- type + "s"
90
+ type.downcase.pluralize
86
91
  end
87
92
 
88
93
  def run_kubectl(*args)
@@ -0,0 +1,69 @@
1
+ module KubernetesDeploy
2
+ class Cloudsql < KubernetesResource
3
+ TIMEOUT = 5.minutes
4
+
5
+ def initialize(name, namespace, file)
6
+ @name, @namespace, @file = name, namespace, file
7
+ end
8
+
9
+ def sync
10
+ _, st = run_kubectl("get", type, @name)
11
+ @found = st.success?
12
+ @status = if cloudsql_proxy_deployment_exists? && mysql_service_exists?
13
+ "Provisioned"
14
+ else
15
+ "Unknown"
16
+ end
17
+
18
+ log_status
19
+ end
20
+
21
+ def deploy_succeeded?
22
+ cloudsql_proxy_deployment_exists? && mysql_service_exists?
23
+ end
24
+
25
+ def deploy_failed?
26
+ false
27
+ end
28
+
29
+ def tpr?
30
+ true
31
+ end
32
+
33
+ def exists?
34
+ @found
35
+ end
36
+
37
+ private
38
+ def cloudsql_proxy_deployment_exists?
39
+ deployment, st = run_kubectl("get", "deployments", "cloudsql-proxy", "-o=json")
40
+
41
+ if st.success?
42
+ parsed = JSON.parse(deployment)
43
+
44
+ if parsed.fetch("status", {}).fetch("availableReplicas", -1) == parsed.fetch("status", {}).fetch("replicas", 0)
45
+ # all cloudsql-proxy pods are running
46
+ return true
47
+ end
48
+ end
49
+
50
+ false
51
+ end
52
+
53
+ def mysql_service_exists?
54
+ service, st = run_kubectl("get", "services", "mysql", "-o=json")
55
+
56
+ if st.success?
57
+ parsed = JSON.parse(service)
58
+
59
+ if parsed.fetch("spec", {}).fetch("clusterIP", "") != ""
60
+ # the service has an assigned cluster IP and is therefore functioning
61
+ return true
62
+ end
63
+ end
64
+
65
+ false
66
+ end
67
+
68
+ end
69
+ end
@@ -7,6 +7,7 @@ require 'tempfile'
7
7
 
8
8
  require 'kubernetes-deploy/kubernetes_resource'
9
9
  %w(
10
+ cloudsql
10
11
  config_map
11
12
  deployment
12
13
  ingress
@@ -20,6 +21,7 @@ end
20
21
  module KubernetesDeploy
21
22
  class Runner
22
23
  PREDEPLOY_SEQUENCE = %w(
24
+ Cloudsql
23
25
  ConfigMap
24
26
  PersistentVolumeClaim
25
27
  Pod
@@ -59,7 +61,6 @@ MSG
59
61
  @namespace = namespace
60
62
  @context = context
61
63
  @current_sha = current_sha
62
-
63
64
  @template_dir = File.expand_path(template_dir)
64
65
  # Max length of podname is only 63chars so try to save some room by truncating sha to 8 chars
65
66
  @id = current_sha[0...8] + "-#{SecureRandom.hex(4)}" if current_sha
@@ -134,7 +135,7 @@ MSG
134
135
  end
135
136
 
136
137
  def discover_resource_via_dry_run(tempfile)
137
- resource_id, err, st = run_kubectl("apply", "-f", tempfile.path, "--dry-run", "--output=name")
138
+ resource_id, err, st = run_kubectl("create", "-f", tempfile.path, "--dry-run", "--output=name")
138
139
  raise FatalDeploymentError, "Dry run failed for template #{File.basename(tempfile.path)}." unless st.success?
139
140
  resource_id
140
141
  end
@@ -226,10 +227,27 @@ MSG
226
227
  KubernetesDeploy.logger.info("All required parameters and files are present")
227
228
  end
228
229
 
230
+ def update_tprs(resources)
231
+ resources.each do |r|
232
+ KubernetesDeploy.logger.info("- #{r.id}")
233
+ r.deploy_started = Time.now.utc
234
+ _, _, st = run_kubectl("replace", "-f", r.file.path)
235
+
236
+ unless st.success?
237
+ # it doesn't exist so we can't replace it
238
+ run_kubectl("create", "-f", r.file.path)
239
+ end
240
+ end
241
+ end
242
+
229
243
  def deploy_resources(resources, prune: false)
230
- command = ["apply", "--namespace=#{@namespace}"]
244
+ command = ["apply"]
231
245
  KubernetesDeploy.logger.info("Deploying resources:")
232
246
 
247
+ # TPRs must use update for now: https://github.com/kubernetes/kubernetes/issues/39906
248
+ tprs, resources = resources.partition(&:tpr?)
249
+ update_tprs(tprs)
250
+
233
251
  resources.each do |r|
234
252
  KubernetesDeploy.logger.info("- #{r.id}")
235
253
  command.push("-f", r.file.path)
@@ -1,3 +1,3 @@
1
1
  module KubernetesDeploy
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  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.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kir Shatrov
@@ -87,6 +87,7 @@ files:
87
87
  - kubernetes-deploy.gemspec
88
88
  - lib/kubernetes-deploy.rb
89
89
  - lib/kubernetes-deploy/kubernetes_resource.rb
90
+ - lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb
90
91
  - lib/kubernetes-deploy/kubernetes_resource/config_map.rb
91
92
  - lib/kubernetes-deploy/kubernetes_resource/deployment.rb
92
93
  - lib/kubernetes-deploy/kubernetes_resource/ingress.rb
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
116
  version: '0'
116
117
  requirements: []
117
118
  rubyforge_project:
118
- rubygems_version: 2.5.2
119
+ rubygems_version: 2.5.1
119
120
  signing_key:
120
121
  specification_version: 4
121
122
  summary: Kubernetes deploy scripts