From c24d09aa03b5ec864e9a8bb3f4ae3002a023293d Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Tue, 5 Jun 2018 12:10:05 -0500 Subject: [PATCH 1/6] Resource and tests --- lib/kubernetes-deploy/deploy_task.rb | 1 + lib/kubernetes-deploy/kubeclient_builder.rb | 8 ++++++ .../custom_resource_definition.rb | 26 +++++++++++++++++++ test/fixtures/hello-cloud/crd.yml | 13 ++++++++++ test/helpers/fixture_set.rb | 6 +++++ test/helpers/fixture_sets/hello_cloud.rb | 5 ++++ test/helpers/kubeclient_helper.rb | 4 +++ test/integration/kubernetes_deploy_test.rb | 18 ++++++++++++- 8 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb create mode 100644 test/fixtures/hello-cloud/crd.yml diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 9e1681f72..230b4a6bb 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -28,6 +28,7 @@ stateful_set cron_job job + custom_resource_definition ).each do |subresource| require "kubernetes-deploy/kubernetes_resource/#{subresource}" end diff --git a/lib/kubernetes-deploy/kubeclient_builder.rb b/lib/kubernetes-deploy/kubeclient_builder.rb index a0f560ab4..d8d3c873b 100644 --- a/lib/kubernetes-deploy/kubeclient_builder.rb +++ b/lib/kubernetes-deploy/kubeclient_builder.rb @@ -60,6 +60,14 @@ def build_apps_v1beta1_kubeclient(context) ) end + def build_apiextensions_v1beta1_kubeclient(context) + _build_kubeclient( + api_version: "v1beta1", + context: context, + endpoint_path: "/apis/apiextensions.k8s.io" + ) + end + def _build_kubeclient(api_version:, context:, endpoint_path: nil) # Find a context defined in kube conf files that matches the input context by name friendly_configs = config_files.map { |f| GoogleFriendlyConfig.read(f) } diff --git a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb new file mode 100644 index 000000000..1482eb70f --- /dev/null +++ b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +module KubernetesDeploy + class CustomResourceDefinition < KubernetesResource + TIMEOUT = 30.seconds + + def deploy_succeeded? + names_accepted_status == "True" + end + + def deploy_failed? + names_accepted_status == "False" + end + + def timeout_message + UNUSUAL_FAILURE_MESSAGE + end + + private + + def names_accepted_status + conditions = @instance_data.dig("status", "conditions") || [] + names_accepted = conditions.detect { |c| c["type"] == "NamesAccepted" } || {} + names_accepted["status"] + end + end +end diff --git a/test/fixtures/hello-cloud/crd.yml b/test/fixtures/hello-cloud/crd.yml new file mode 100644 index 000000000..97c58aa30 --- /dev/null +++ b/test/fixtures/hello-cloud/crd.yml @@ -0,0 +1,13 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: mails.stable.example.io +spec: + group: stable.example.io + names: + kind: Mail + listKind: MailList + plural: mails + singular: mail + scope: Namespaced + version: v1 diff --git a/test/helpers/fixture_set.rb b/test/helpers/fixture_set.rb index af404e8bf..577ee8d01 100644 --- a/test/helpers/fixture_set.rb +++ b/test/helpers/fixture_set.rb @@ -159,6 +159,12 @@ def assert_stateful_set_present(name) desired = stateful_sets.find { |ss| ss.metadata.name == name } assert desired.present?, "Stateful set #{name} does not exist" end + + def assert_crd_present(name) + crds = apiextensions_v1beta1_kubeclient.get_custom_resource_definitions + desired = crds.find { |crd| crd.metadata.name == name } + assert desired.present?, "CRD #{name} does not exist" + end end end diff --git a/test/helpers/fixture_sets/hello_cloud.rb b/test/helpers/fixture_sets/hello_cloud.rb index 5b7d5972b..36c4799f5 100644 --- a/test/helpers/fixture_sets/hello_cloud.rb +++ b/test/helpers/fixture_sets/hello_cloud.rb @@ -18,6 +18,7 @@ def assert_all_up assert_daemon_set_up assert_stateful_set_up assert_job_up + assert_crd_up end def assert_unmanaged_pod_statuses(status, count = 1) @@ -99,5 +100,9 @@ def assert_stateful_set_up def assert_job_up assert_job_exists("hello-job") end + + def assert_crd_up + assert_crd_present("mails.stable.example.io") + end end end diff --git a/test/helpers/kubeclient_helper.rb b/test/helpers/kubeclient_helper.rb index 7df14b32b..b04b931be 100644 --- a/test/helpers/kubeclient_helper.rb +++ b/test/helpers/kubeclient_helper.rb @@ -29,4 +29,8 @@ def batch_v1beta1_kubeclient def batch_v1_kubeclient @batch_v1_kubeclient ||= build_batch_v1_kubeclient(MINIKUBE_CONTEXT) end + + def apiextensions_v1beta1_kubeclient + @apiextensions_v1beta1_kubeclient ||= build_apiextensions_v1beta1_kubeclient(MINIKUBE_CONTEXT) + end end diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 7259f8afb..4ae19c9c6 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -23,7 +23,8 @@ def test_full_hello_cloud_set_deploy_succeeds %r{StatefulSet/stateful-busybox}, %r{Service/redis-external\s+Doesn't require any endpoint}, "- Job/hello-job (timeout: 600s)", - %r{Job/hello-job\s+(Succeeded|Started)} + %r{Job/hello-job\s+(Succeeded|Started)}, + %r{CustomResourceDefinition/mails.stable.example.io\s+Exists}, ]) # Verify that success section isn't duplicated for predeployed resources @@ -1053,4 +1054,19 @@ def test_raise_on_yaml_missing_kind " datapoint: value1" ], in_order: true) end + + def test_crd_can_be_successful + assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) + end + + def test_crd_can_fail + assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) + result = deploy_fixtures("hello-cloud", subset: ["crd.yml"]) do |f| + crd = f.dig("crd.yml", "CustomResourceDefinition").first + names = crd.dig("spec", "names") + crd["metadata"]["name"] = 'mis-matched.stable.example.io' + names["plural"] = 'mis-matched' + end + assert_deploy_failure(result) + end end From 250f143805a8c833e3c1dd4c93b281b704fcd431 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Mon, 16 Jul 2018 16:49:49 -0700 Subject: [PATCH 2/6] PR fix up --- .../custom_resource_definition.rb | 19 ++++++++++++++++--- test/integration/kubernetes_deploy_test.rb | 11 ++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb index 1482eb70f..2ed302bb9 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb @@ -15,12 +15,25 @@ def timeout_message UNUSUAL_FAILURE_MESSAGE end + def status + if !exists? + super + elsif deploy_succeeded? + "Succeeded" + else + names_accepted_condition["reason"] + end + end + private - def names_accepted_status + def names_accepted_condition conditions = @instance_data.dig("status", "conditions") || [] - names_accepted = conditions.detect { |c| c["type"] == "NamesAccepted" } || {} - names_accepted["status"] + conditions.detect { |c| c["type"] == "NamesAccepted" } || {} + end + + def names_accepted_status + names_accepted_condition["status"] end end end diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 4ae19c9c6..2190ad7ac 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -24,7 +24,7 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Service/redis-external\s+Doesn't require any endpoint}, "- Job/hello-job (timeout: 600s)", %r{Job/hello-job\s+(Succeeded|Started)}, - %r{CustomResourceDefinition/mails.stable.example.io\s+Exists}, + %r{CustomResourceDefinition/mails.stable.example.io\s+Succeeded}, ]) # Verify that success section isn't duplicated for predeployed resources @@ -1057,6 +1057,10 @@ def test_raise_on_yaml_missing_kind def test_crd_can_be_successful assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) + assert_logs_match_all([ + "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 30s)", + %r{CustomResourceDefinition/mails.stable.example.io\s+Succeeded} + ]) end def test_crd_can_fail @@ -1068,5 +1072,10 @@ def test_crd_can_fail names["plural"] = 'mis-matched' end assert_deploy_failure(result) + assert_logs_match_all([ + "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 30s)", + "CustomResourceDefinition/mis-matched.stable.example.io: FAILED", + "Final status: ListKindConflict" + ]) end end From b8a631d6244f379527669ac834e06b428fa792ee Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Tue, 17 Jul 2018 10:05:48 -0700 Subject: [PATCH 3/6] Add warning about non-global resource --- lib/kubernetes-deploy/deploy_task.rb | 4 ++++ lib/kubernetes-deploy/kubernetes_resource.rb | 5 +++++ .../kubernetes_resource/custom_resource_definition.rb | 1 + test/integration/kubernetes_deploy_test.rb | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 230b4a6bb..9285b57a8 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -249,6 +249,10 @@ def discover_resources @logger.info " - #{r.id}" end end + if (global = resources.select(&:global?).presence) + @logger.info("Detected non-namespaced #{'resouce'.pluralize(global.count)} which will never be pruned:") + global.each { |r| @logger.info(" - #{r.id}") } + end resources end diff --git a/lib/kubernetes-deploy/kubernetes_resource.rb b/lib/kubernetes-deploy/kubernetes_resource.rb index 1bcefa45d..af602932a 100644 --- a/lib/kubernetes-deploy/kubernetes_resource.rb +++ b/lib/kubernetes-deploy/kubernetes_resource.rb @@ -8,6 +8,7 @@ class KubernetesResource attr_reader :name, :namespace, :context attr_writer :type, :deploy_started_at + GLOBAL = false TIMEOUT = 5.minutes LOG_LINE_COUNT = 250 @@ -315,6 +316,10 @@ def to_s end end + def global? + self.class::GLOBAL + end + private def validate_timeout_annotation diff --git a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb index 2ed302bb9..f0da2c84d 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb @@ -2,6 +2,7 @@ module KubernetesDeploy class CustomResourceDefinition < KubernetesResource TIMEOUT = 30.seconds + GLOBAL = true def deploy_succeeded? names_accepted_status == "True" diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 2190ad7ac..cb612ff59 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -1058,6 +1058,10 @@ def test_raise_on_yaml_missing_kind def test_crd_can_be_successful assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) assert_logs_match_all([ + "Phase 1: Initializing deploy", + "Detected non-namespaced resouce which will never be pruned:", + " - CustomResourceDefinition/mails.stable.example.io", + "Phase 2: Checking initial resource statuses", "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 30s)", %r{CustomResourceDefinition/mails.stable.example.io\s+Succeeded} ]) From 49b57f63fac9489fde3eb0a286c832e3e96a9dd3 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Fri, 20 Jul 2018 13:28:33 -0700 Subject: [PATCH 4/6] PR feedback to provide better cli text --- lib/kubernetes-deploy/deploy_task.rb | 4 ++-- .../custom_resource_definition.rb | 8 ++++---- test/integration/kubernetes_deploy_test.rb | 13 ++++++------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/kubernetes-deploy/deploy_task.rb b/lib/kubernetes-deploy/deploy_task.rb index 9285b57a8..318b36f3c 100644 --- a/lib/kubernetes-deploy/deploy_task.rb +++ b/lib/kubernetes-deploy/deploy_task.rb @@ -250,8 +250,8 @@ def discover_resources end end if (global = resources.select(&:global?).presence) - @logger.info("Detected non-namespaced #{'resouce'.pluralize(global.count)} which will never be pruned:") - global.each { |r| @logger.info(" - #{r.id}") } + @logger.warn("Detected non-namespaced #{'resource'.pluralize(global.count)} which will never be pruned:") + global.each { |r| @logger.warn(" - #{r.id}") } end resources end diff --git a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb index f0da2c84d..9d7767d9a 100644 --- a/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb +++ b/lib/kubernetes-deploy/kubernetes_resource/custom_resource_definition.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module KubernetesDeploy class CustomResourceDefinition < KubernetesResource - TIMEOUT = 30.seconds + TIMEOUT = 2.minutes GLOBAL = true def deploy_succeeded? @@ -13,16 +13,16 @@ def deploy_failed? end def timeout_message - UNUSUAL_FAILURE_MESSAGE + "The names this CRD is attempting to register were neither accepted nor rejected in time" end def status if !exists? super elsif deploy_succeeded? - "Succeeded" + "Names accepted" else - names_accepted_condition["reason"] + "#{names_accepted_condition['reason']} (#{names_accepted_condition['message']})" end end diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index cb612ff59..240516c56 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -24,7 +24,7 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Service/redis-external\s+Doesn't require any endpoint}, "- Job/hello-job (timeout: 600s)", %r{Job/hello-job\s+(Succeeded|Started)}, - %r{CustomResourceDefinition/mails.stable.example.io\s+Succeeded}, + %r{CustomResourceDefinition/mails.stable.example.io\s+Names Accepted}, ]) # Verify that success section isn't duplicated for predeployed resources @@ -1059,16 +1059,15 @@ def test_crd_can_be_successful assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) assert_logs_match_all([ "Phase 1: Initializing deploy", - "Detected non-namespaced resouce which will never be pruned:", + "Detected non-namespaced resource which will never be pruned:", " - CustomResourceDefinition/mails.stable.example.io", "Phase 2: Checking initial resource statuses", - "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 30s)", - %r{CustomResourceDefinition/mails.stable.example.io\s+Succeeded} + "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 120s)", + %r{CustomResourceDefinition/mails.stable.example.io\s+Names Accepted} ]) end def test_crd_can_fail - assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) result = deploy_fixtures("hello-cloud", subset: ["crd.yml"]) do |f| crd = f.dig("crd.yml", "CustomResourceDefinition").first names = crd.dig("spec", "names") @@ -1077,9 +1076,9 @@ def test_crd_can_fail end assert_deploy_failure(result) assert_logs_match_all([ - "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 30s)", + "Deploying CustomResourceDefinition/mis-matched.stable.example.io (timeout: 120s)", "CustomResourceDefinition/mis-matched.stable.example.io: FAILED", - "Final status: ListKindConflict" + 'Final status: ListKindConflict ("MailList" is already in use)' ]) end end From 04734e90629c91c8c5c14bcaf08cb5d9423524c1 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Fri, 20 Jul 2018 15:52:53 -0700 Subject: [PATCH 5/6] Fix up tests --- test/fixtures/hello-cloud/crd.yml | 13 --------- test/fixtures/hello-cloud/crd.yml.erb | 13 +++++++++ test/helpers/fixture_set.rb | 2 +- test/helpers/fixture_sets/hello_cloud.rb | 3 +- test/integration/kubernetes_deploy_test.rb | 34 +++++++++++++--------- 5 files changed, 36 insertions(+), 29 deletions(-) delete mode 100644 test/fixtures/hello-cloud/crd.yml create mode 100644 test/fixtures/hello-cloud/crd.yml.erb diff --git a/test/fixtures/hello-cloud/crd.yml b/test/fixtures/hello-cloud/crd.yml deleted file mode 100644 index 97c58aa30..000000000 --- a/test/fixtures/hello-cloud/crd.yml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: mails.stable.example.io -spec: - group: stable.example.io - names: - kind: Mail - listKind: MailList - plural: mails - singular: mail - scope: Namespaced - version: v1 diff --git a/test/fixtures/hello-cloud/crd.yml.erb b/test/fixtures/hello-cloud/crd.yml.erb new file mode 100644 index 000000000..81919aff6 --- /dev/null +++ b/test/fixtures/hello-cloud/crd.yml.erb @@ -0,0 +1,13 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: mails-<%= deployment_id %>.stable.example.io +spec: + group: stable.example.io + names: + kind: Mail-<%= deployment_id %> + listKind: MailList-<%= deployment_id %> + plural: mails-<%= deployment_id %> + singular: mail-<%= deployment_id %> + scope: Namespaced + version: v1 diff --git a/test/helpers/fixture_set.rb b/test/helpers/fixture_set.rb index 577ee8d01..6b8501658 100644 --- a/test/helpers/fixture_set.rb +++ b/test/helpers/fixture_set.rb @@ -162,7 +162,7 @@ def assert_stateful_set_present(name) def assert_crd_present(name) crds = apiextensions_v1beta1_kubeclient.get_custom_resource_definitions - desired = crds.find { |crd| crd.metadata.name == name } + desired = crds.find { |crd| crd.metadata.name =~ name } assert desired.present?, "CRD #{name} does not exist" end end diff --git a/test/helpers/fixture_sets/hello_cloud.rb b/test/helpers/fixture_sets/hello_cloud.rb index 36c4799f5..82f4cb3b6 100644 --- a/test/helpers/fixture_sets/hello_cloud.rb +++ b/test/helpers/fixture_sets/hello_cloud.rb @@ -102,7 +102,8 @@ def assert_job_up end def assert_crd_up - assert_crd_present("mails.stable.example.io") + crd_name = /mails[-\w]+.stable.example.io/ + assert_crd_present(crd_name) end end end diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 240516c56..dec0cc702 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -12,7 +12,7 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Deploying Pod/unmanaged-pod-[-\w]+ \(timeout: 60s\)}, # annotation timeout override "Hello from the command runner!", # unmanaged pod logs "Result: SUCCESS", - "Successfully deployed 19 resources" + "Successfully deployed 20 resources" ], in_order: true) assert_logs_match_all([ @@ -24,7 +24,7 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Service/redis-external\s+Doesn't require any endpoint}, "- Job/hello-job (timeout: 600s)", %r{Job/hello-job\s+(Succeeded|Started)}, - %r{CustomResourceDefinition/mails.stable.example.io\s+Names Accepted}, + %r{CustomResourceDefinition/mails[-\w]+.stable.example.io\s+Names accepted}, ]) # Verify that success section isn't duplicated for predeployed resources @@ -73,7 +73,7 @@ def test_pruning_works 'ingress(\.extensions)? "web"', 'daemonset(\.extensions)? "ds-app"', 'statefulset(\.apps)? "stateful-busybox"', - 'job "hello-job"', + 'job(\.batch)? "hello-job"', ] # not necessarily listed in this order expected_msgs = [/Pruned 9 resources and successfully deployed 6 resources/] expected_pruned.map do |resource| @@ -1056,29 +1056,35 @@ def test_raise_on_yaml_missing_kind end def test_crd_can_be_successful - assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml"])) + assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"])) assert_logs_match_all([ "Phase 1: Initializing deploy", "Detected non-namespaced resource which will never be pruned:", - " - CustomResourceDefinition/mails.stable.example.io", + %r{ - CustomResourceDefinition/mails[-\w]+.stable.example.io}, "Phase 2: Checking initial resource statuses", - "Deploying CustomResourceDefinition/mails.stable.example.io (timeout: 120s)", - %r{CustomResourceDefinition/mails.stable.example.io\s+Names Accepted} + %r{Deploying CustomResourceDefinition/mails[-\w]+.stable.example.io \(timeout: 120s\)}, + %r{CustomResourceDefinition/mails[-\w]+.stable.example.io\s+Names accepted} ]) end def test_crd_can_fail - result = deploy_fixtures("hello-cloud", subset: ["crd.yml"]) do |f| - crd = f.dig("crd.yml", "CustomResourceDefinition").first + result = deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"]) do |f| + crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first names = crd.dig("spec", "names") - crd["metadata"]["name"] = 'mis-matched.stable.example.io' - names["plural"] = 'mis-matched' + names["listKind"] = 'Conflict' + end + assert_deploy_success(result) + + result = deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"]) do |f| + crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first + names = crd.dig("spec", "names") + names["listKind"] = 'Conflict' end assert_deploy_failure(result) assert_logs_match_all([ - "Deploying CustomResourceDefinition/mis-matched.stable.example.io (timeout: 120s)", - "CustomResourceDefinition/mis-matched.stable.example.io: FAILED", - 'Final status: ListKindConflict ("MailList" is already in use)' + %r{Deploying CustomResourceDefinition/mails[-\w]+.stable.example.io \(timeout: 120s\)}, + %r{CustomResourceDefinition/mails[-\w]+.stable.example.io: FAILED}, + 'Final status: ListKindConflict ("Conflict" is already in use)' ]) end end From c46d44f7e5f3495a4f7358cdae463325bd8a3e15 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Tue, 31 Jul 2018 13:49:19 -0700 Subject: [PATCH 6/6] Make tests run serially --- test/fixtures/crd/crd.yml.erb | 13 +++++++ test/fixtures/hello-cloud/crd.yml.erb | 13 ------- test/helpers/fixture_set.rb | 6 ---- test/helpers/fixture_sets/hello_cloud.rb | 6 ---- test/integration-serial/run_serial_test.rb | 40 ++++++++++++++++++++++ test/integration/kubernetes_deploy_test.rb | 36 +------------------ 6 files changed, 54 insertions(+), 60 deletions(-) create mode 100644 test/fixtures/crd/crd.yml.erb delete mode 100644 test/fixtures/hello-cloud/crd.yml.erb diff --git a/test/fixtures/crd/crd.yml.erb b/test/fixtures/crd/crd.yml.erb new file mode 100644 index 000000000..f8b9a1c4d --- /dev/null +++ b/test/fixtures/crd/crd.yml.erb @@ -0,0 +1,13 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: mail.stable.example.io +spec: + group: stable.example.io + names: + kind: Mail + listKind: MailList + plural: mail + singular: mail + scope: Namespaced + version: v1 diff --git a/test/fixtures/hello-cloud/crd.yml.erb b/test/fixtures/hello-cloud/crd.yml.erb deleted file mode 100644 index 81919aff6..000000000 --- a/test/fixtures/hello-cloud/crd.yml.erb +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: mails-<%= deployment_id %>.stable.example.io -spec: - group: stable.example.io - names: - kind: Mail-<%= deployment_id %> - listKind: MailList-<%= deployment_id %> - plural: mails-<%= deployment_id %> - singular: mail-<%= deployment_id %> - scope: Namespaced - version: v1 diff --git a/test/helpers/fixture_set.rb b/test/helpers/fixture_set.rb index 6b8501658..af404e8bf 100644 --- a/test/helpers/fixture_set.rb +++ b/test/helpers/fixture_set.rb @@ -159,12 +159,6 @@ def assert_stateful_set_present(name) desired = stateful_sets.find { |ss| ss.metadata.name == name } assert desired.present?, "Stateful set #{name} does not exist" end - - def assert_crd_present(name) - crds = apiextensions_v1beta1_kubeclient.get_custom_resource_definitions - desired = crds.find { |crd| crd.metadata.name =~ name } - assert desired.present?, "CRD #{name} does not exist" - end end end diff --git a/test/helpers/fixture_sets/hello_cloud.rb b/test/helpers/fixture_sets/hello_cloud.rb index 82f4cb3b6..5b7d5972b 100644 --- a/test/helpers/fixture_sets/hello_cloud.rb +++ b/test/helpers/fixture_sets/hello_cloud.rb @@ -18,7 +18,6 @@ def assert_all_up assert_daemon_set_up assert_stateful_set_up assert_job_up - assert_crd_up end def assert_unmanaged_pod_statuses(status, count = 1) @@ -100,10 +99,5 @@ def assert_stateful_set_up def assert_job_up assert_job_exists("hello-job") end - - def assert_crd_up - crd_name = /mails[-\w]+.stable.example.io/ - assert_crd_present(crd_name) - end end end diff --git a/test/integration-serial/run_serial_test.rb b/test/integration-serial/run_serial_test.rb index d1eb16363..16213a685 100644 --- a/test/integration-serial/run_serial_test.rb +++ b/test/integration-serial/run_serial_test.rb @@ -118,4 +118,44 @@ def test_multiple_configuration_files ensure ENV['KUBECONFIG'] = old_config end + + def test_crd_can_be_successful + assert_deploy_success(deploy_fixtures("crd")) + assert_logs_match_all([ + "Phase 1: Initializing deploy", + "Detected non-namespaced resource which will never be pruned:", + " - CustomResourceDefinition/mail.stable.example.io", + "Phase 2: Checking initial resource statuses", + "Deploying CustomResourceDefinition/mail.stable.example.io (timeout: 120s)", + %r{CustomResourceDefinition/mail.stable.example.io\s+Names accepted} + ]) + ensure + apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("mail.stable.example.io") + end + + def test_crd_can_fail + result = deploy_fixtures("crd") do |f| + crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first + names = crd.dig("spec", "names") + names["listKind"] = 'Conflict' + end + assert_deploy_success(result) + + result = deploy_fixtures("crd") do |f| + crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first + names = crd.dig("spec", "names") + names["listKind"] = "Conflict" + names["plural"] = "others" + crd["metadata"]["name"] = "others.stable.example.io" + end + assert_deploy_failure(result) + assert_logs_match_all([ + "Deploying CustomResourceDefinition/others.stable.example.io (timeout: 120s)", + "CustomResourceDefinition/others.stable.example.io: FAILED", + 'Final status: ListKindConflict ("Conflict" is already in use)' + ]) + ensure + apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("mail.stable.example.io") + apiextensions_v1beta1_kubeclient.delete_custom_resource_definition("others.stable.example.io") + end end diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index dec0cc702..55663a38f 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -12,7 +12,7 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Deploying Pod/unmanaged-pod-[-\w]+ \(timeout: 60s\)}, # annotation timeout override "Hello from the command runner!", # unmanaged pod logs "Result: SUCCESS", - "Successfully deployed 20 resources" + "Successfully deployed 19 resources" ], in_order: true) assert_logs_match_all([ @@ -24,7 +24,6 @@ def test_full_hello_cloud_set_deploy_succeeds %r{Service/redis-external\s+Doesn't require any endpoint}, "- Job/hello-job (timeout: 600s)", %r{Job/hello-job\s+(Succeeded|Started)}, - %r{CustomResourceDefinition/mails[-\w]+.stable.example.io\s+Names accepted}, ]) # Verify that success section isn't duplicated for predeployed resources @@ -1054,37 +1053,4 @@ def test_raise_on_yaml_missing_kind " datapoint: value1" ], in_order: true) end - - def test_crd_can_be_successful - assert_deploy_success(deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"])) - assert_logs_match_all([ - "Phase 1: Initializing deploy", - "Detected non-namespaced resource which will never be pruned:", - %r{ - CustomResourceDefinition/mails[-\w]+.stable.example.io}, - "Phase 2: Checking initial resource statuses", - %r{Deploying CustomResourceDefinition/mails[-\w]+.stable.example.io \(timeout: 120s\)}, - %r{CustomResourceDefinition/mails[-\w]+.stable.example.io\s+Names accepted} - ]) - end - - def test_crd_can_fail - result = deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"]) do |f| - crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first - names = crd.dig("spec", "names") - names["listKind"] = 'Conflict' - end - assert_deploy_success(result) - - result = deploy_fixtures("hello-cloud", subset: ["crd.yml.erb"]) do |f| - crd = f.dig("crd.yml.erb", "CustomResourceDefinition").first - names = crd.dig("spec", "names") - names["listKind"] = 'Conflict' - end - assert_deploy_failure(result) - assert_logs_match_all([ - %r{Deploying CustomResourceDefinition/mails[-\w]+.stable.example.io \(timeout: 120s\)}, - %r{CustomResourceDefinition/mails[-\w]+.stable.example.io: FAILED}, - 'Final status: ListKindConflict ("Conflict" is already in use)' - ]) - end end