From 29a9e5d02052eff7beebc9a6ef8e4b6ab7010b9f Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Wed, 8 Aug 2018 09:49:44 -0700 Subject: [PATCH 1/5] Replace Apply, for pruning --- lib/kubernetes-deploy/deploy_task.rb | 4 +++- lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 7c4ba7445..48f36ed3f 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -359,12 +359,14 @@ def deploy_resources(resources, prune: false, verify:, record_summary: true) # Apply can be done in one large batch, the rest have to be done individually applyables, individuals = resources.partition { |r| r.deploy_method == :apply } + # For resources that need to be done individually, but should also be pruned + applyables += resources.select { |r| r.deploy_method == :replace_apply } individuals.each do |r| @logger.info("- #{r.id} (#{r.pretty_timeout_type})") if resources.length > 1 r.deploy_started_at = Time.now.utc case r.deploy_method - when :replace + when :replace, :replace_apply _, _, replace_st = kubectl.run("replace", "-f", r.file_path, log_failure: false) when :replace_force _, _, replace_st = kubectl.run("replace", "--force", "--cascade", "-f", r.file_path, diff --git a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb index 4b92d4073..24fd9b34d 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb @@ -23,7 +23,7 @@ def deploy_failed? end def deploy_method - :replace + :replace_apply end private From c462ac2c434a8598400233846a6a29690395c3eb Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Wed, 8 Aug 2018 11:17:41 -0700 Subject: [PATCH 2/5] Just use everything thats pruneable --- lib/kubernetes-deploy/deploy_task.rb | 7 ++++--- lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb | 2 +- test/integration-serial/run_serial_test.rb | 7 +++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 48f36ed3f..851ca1c9b 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -359,14 +359,15 @@ def deploy_resources(resources, prune: false, verify:, record_summary: true) # Apply can be done in one large batch, the rest have to be done individually applyables, individuals = resources.partition { |r| r.deploy_method == :apply } - # For resources that need to be done individually, but should also be pruned - applyables += resources.select { |r| r.deploy_method == :replace_apply } + # Prunable resources should also applied so that they can be pruned + pruneable_types = prune_whitelist.map { |t| t.split("/").last } + applyables += individuals.select { |r| pruneable_types.include?(r.type) } individuals.each do |r| @logger.info("- #{r.id} (#{r.pretty_timeout_type})") if resources.length > 1 r.deploy_started_at = Time.now.utc case r.deploy_method - when :replace, :replace_apply + when :replace _, _, replace_st = kubectl.run("replace", "-f", r.file_path, log_failure: false) when :replace_force _, _, replace_st = kubectl.run("replace", "--force", "--cascade", "-f", r.file_path, diff --git a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb index 24fd9b34d..4b92d4073 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb @@ -23,7 +23,7 @@ def deploy_failed? end def deploy_method - :replace_apply + :replace end private diff --git a/test/integration-serial/run_serial_test.rb b/test/integration-serial/run_serial_test.rb index 14bac51f9..f4be1989c 100644 --- a/test/integration-serial/run_serial_test.rb +++ b/test/integration-serial/run_serial_test.rb @@ -146,6 +146,13 @@ def test_crd_can_fail end def test_crd_pruning + widget = Class.new(KubernetesDeploy::KubernetesResource) do + def deploy_method + :replace + end + end + KubernetesDeploy.const_set("Widget", widget) + assert_deploy_success(deploy_fixtures("crd", subset: %w(mail.yml widgets.yml))) assert_logs_match_all([ "Phase 1: Initializing deploy", From b9aefc57356acb0a486c9f0df4f2a443e8274eda Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Thu, 9 Aug 2018 08:52:50 -0700 Subject: [PATCH 3/5] CR's no longer need to use replace --- .../kubernetes_resource/bucket.rb | 4 ---- .../kubernetes_resource/cloudsql.rb | 4 ---- .../kubernetes_resource/elasticsearch.rb | 4 ---- .../kubernetes_resource/memcached.rb | 4 ---- .../kubernetes_resource/redis.rb | 4 ---- .../kubernetes_resource/topic.rb | 4 ---- test/fixtures/crd/mail_cr.yml | 2 ++ test/integration-serial/run_serial_test.rb | 18 ++++++++++++++++++ 8 files changed, 20 insertions(+), 24 deletions(-) diff --git a/lib/kubernetes-deploy/kubernetes_resource/bucket.rb b/lib/kubernetes-deploy/kubernetes_resource/bucket.rb index 9dd2abdcd..aebc57e38 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/bucket.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/bucket.rb @@ -18,9 +18,5 @@ def status def deploy_failed? false end - - def deploy_method - :replace - end end end diff --git a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb index 4b92d4073..0853645ae 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/cloudsql.rb @@ -22,10 +22,6 @@ def deploy_failed? false end - def deploy_method - :replace - end - private def proxy_deployment_ready? diff --git a/lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb b/lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb index 52caa9df3..06f6708e0 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/elasticsearch.rb @@ -8,9 +8,5 @@ def deploy_succeeded? def deploy_failed? false end - - def deploy_method - :replace - end end end diff --git a/lib/kubernetes-deploy/kubernetes_resource/memcached.rb b/lib/kubernetes-deploy/kubernetes_resource/memcached.rb index 2a10ad1b5..3086995ee 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/memcached.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/memcached.rb @@ -24,10 +24,6 @@ def deploy_failed? false end - def deploy_method - :replace - end - private def deployment_ready? diff --git a/lib/kubernetes-deploy/kubernetes_resource/redis.rb b/lib/kubernetes-deploy/kubernetes_resource/redis.rb index cfc64d11d..651af05f4 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/redis.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/redis.rb @@ -27,10 +27,6 @@ def deploy_failed? false end - def deploy_method - :replace - end - private def deployment_ready? diff --git a/lib/kubernetes-deploy/kubernetes_resource/topic.rb b/lib/kubernetes-deploy/kubernetes_resource/topic.rb index ced805018..f410c7426 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/topic.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/topic.rb @@ -8,9 +8,5 @@ def deploy_succeeded? def deploy_failed? false end - - def deploy_method - :replace - end end end diff --git a/test/fixtures/crd/mail_cr.yml b/test/fixtures/crd/mail_cr.yml index 5582f16ad..9e82aa84f 100644 --- a/test/fixtures/crd/mail_cr.yml +++ b/test/fixtures/crd/mail_cr.yml @@ -2,3 +2,5 @@ apiVersion: "stable.example.io/v1" kind: Mail metadata: name: my-first-mail +spec: + something: 7 diff --git a/test/integration-serial/run_serial_test.rb b/test/integration-serial/run_serial_test.rb index f4be1989c..d779318f8 100644 --- a/test/integration-serial/run_serial_test.rb +++ b/test/integration-serial/run_serial_test.rb @@ -119,6 +119,18 @@ def test_multiple_configuration_files ENV['KUBECONFIG'] = old_config end + def test_cr_merging + assert_deploy_success(deploy_fixtures("crd", subset: %w(mail.yml))) + assert_deploy_success(deploy_fixtures("crd", subset: %w(mail_cr.yml))) + result = deploy_fixtures("crd", subset: %w(mail_cr.yml)) do |f| + mail = f.dig("mail_cr.yml", "Mail").first + mail["spec"]["something"] = 5 + end + assert_deploy_success(result) + ensure + apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("mail.stable.example.io") + end + def test_crd_can_fail result = deploy_fixtures("crd", subset: %w(mail.yml)) do |f| crd = f.dig("mail.yml", "CustomResourceDefinition").first @@ -172,6 +184,12 @@ def deploy_method /The following resources were pruned: widget(.stable.example.io)? "my-first-widget"/, "Pruned 1 resource and successfully deployed 2 resource" ]) + + result = deploy_fixtures("crd", subset: %w(mail_cr.yml)) do |f| + mail = f.dig("mail_cr.yml", "Mail").first + mail["spec"]["something"] = 5 + end + assert_deploy_success(result) ensure apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("mail.stable.example.io") apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("widgets.stable.example.io") From cf2271b1822f60349fccc19dc4e28c5c256f00c4 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Thu, 9 Aug 2018 09:01:20 -0700 Subject: [PATCH 4/5] Prune pdb --- lib/kubernetes-deploy/deploy_task.rb | 1 + test/integration-serial/run_serial_test.rb | 13 ------------- test/integration/kubernetes_deploy_test.rb | 9 ++++++++- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 851ca1c9b..c81d69c25 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -82,6 +82,7 @@ def prune_whitelist extensions/v1beta1/Ingress apps/v1beta1/StatefulSet autoscaling/v1/HorizontalPodAutoscaler + policy/v1beta1/PodDisruptionBudget ) if server_version >= Gem::Version.new('1.8.0') wl << "batch/v1beta1/CronJob" diff --git a/test/integration-serial/run_serial_test.rb b/test/integration-serial/run_serial_test.rb index d779318f8..66cc553e2 100644 --- a/test/integration-serial/run_serial_test.rb +++ b/test/integration-serial/run_serial_test.rb @@ -158,13 +158,6 @@ def test_crd_can_fail end def test_crd_pruning - widget = Class.new(KubernetesDeploy::KubernetesResource) do - def deploy_method - :replace - end - end - KubernetesDeploy.const_set("Widget", widget) - assert_deploy_success(deploy_fixtures("crd", subset: %w(mail.yml widgets.yml))) assert_logs_match_all([ "Phase 1: Initializing deploy", @@ -184,12 +177,6 @@ def deploy_method /The following resources were pruned: widget(.stable.example.io)? "my-first-widget"/, "Pruned 1 resource and successfully deployed 2 resource" ]) - - result = deploy_fixtures("crd", subset: %w(mail_cr.yml)) do |f| - mail = f.dig("mail_cr.yml", "Mail").first - mail["spec"]["something"] = 5 - end - assert_deploy_success(result) ensure apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("mail.stable.example.io") apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("widgets.stable.example.io") diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index d90fee430..919907b81 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -73,8 +73,9 @@ def test_pruning_works 'daemonset(\.extensions)? "ds-app"', 'statefulset(\.apps)? "stateful-busybox"', 'job(\.batch)? "hello-job"', + 'poddisruptionbudget(.policy)? "test"', ] # not necessarily listed in this order - expected_msgs = [/Pruned 9 resources and successfully deployed 6 resources/] + expected_msgs = [/Pruned 10 resources and successfully deployed 6 resources/] expected_pruned.map do |resource| expected_msgs << /The following resources were pruned:.*#{resource}/ end @@ -1070,4 +1071,10 @@ def test_hpa_can_be_pruned assert_deploy_success(deploy_fixtures("hpa", subset: ["deployment.yml"])) assert_logs_match_all([/The following resources were pruned: horizontalpodautoscaler(.autoscaling)? "hello-hpa"/]) end + + def test_not_apply_resource_can_be_pruned + assert_deploy_success(deploy_fixtures("hello-cloud", subset: %w(disruption-budgets.yml configmap-data.yml))) + assert_deploy_success(deploy_fixtures("hello-cloud", subset: %w(configmap-data.yml))) + assert_logs_match_all([/The following resources were pruned: poddisruptionbudget(.policy)? "test"/]) + end end From 5155ac4a5b831cb0f3d55da02df15f8ee72660d7 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Mon, 10 Sep 2018 09:10:44 -0700 Subject: [PATCH 5/5] Apply for Statefulservice, which isn't StatefulSet --- lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb b/lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb index 4971a175c..b07a1a7a5 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/statefulservice.rb @@ -8,9 +8,5 @@ def deploy_succeeded? def deploy_failed? false end - - def deploy_method - :replace - end end end