From ba66e36c5efc03d08db7d8034e8b48c98f9970b4 Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Thu, 11 Jan 2018 09:10:29 -0800 Subject: [PATCH 1/3] New tests --- test/fixtures/slow-cloud/web.yml.erb | 19 +++++++--------- test/integration/kubernetes_deploy_test.rb | 26 ++++++++++++++++------ test/integration/restart_task_test.rb | 9 ++++++-- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/test/fixtures/slow-cloud/web.yml.erb b/test/fixtures/slow-cloud/web.yml.erb index 12c233599..52f5ca8c9 100644 --- a/test/fixtures/slow-cloud/web.yml.erb +++ b/test/fixtures/slow-cloud/web.yml.erb @@ -6,32 +6,29 @@ metadata: shipit.shopify.io/restart: "true" kubernetes-deploy.shopify.io/required-rollout: maxUnavailable spec: - replicas: 3 + replicas: 2 + selector: + matchLabels: + name: web + app: slow-cloud strategy: type: RollingUpdate rollingUpdate: - maxSurge: 1 + maxSurge: 0 maxUnavailable: 1 template: metadata: labels: name: web app: slow-cloud + sha: "<%= current_sha %>" spec: + terminationGracePeriodSeconds: 0 containers: - name: app - readinessProbe: - exec: - command: - - sleep - - '7' - timeoutSeconds: 10 image: busybox imagePullPolicy: IfNotPresent command: ["tail", "-f", "/dev/null"] ports: - containerPort: 80 name: http - env: - - name: GITHUB_REV - value: <%= current_sha %> diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 30ac70f7d..0f31d634d 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -689,15 +689,27 @@ def test_can_deploy_deployment_with_zero_replicas end def test_deploy_successful_with_partial_availability - result = deploy_fixtures("slow-cloud") - assert_deploy_success(result) + result = deploy_fixtures("slow-cloud", sha: "deploy1") + assert_deploy_success(result) - result = deploy_fixtures("slow-cloud") - assert_deploy_success(result) + result = deploy_fixtures("slow-cloud", sha: "deploy2") do |fixtures| + dep = fixtures["web.yml.erb"]["Deployment"].first + container = dep["spec"]["template"]["spec"]["containers"].first + container["readinessProbe"] = { + "exec" => { "command" => %w(sleep 5) }, + "timeoutSeconds" => 6 + } + end + assert_deploy_success(result) - assert_logs_match_all( - [%r{Deployment\/web\s+[34] replicas, 3 updatedReplicas, 2 availableReplicas, [12] unavailableReplica}] - ) + new_pods = kubeclient.get_pods(namespace: @namespace, label_selector: 'name=web,app=slow-cloud,sha=deploy2') + assert new_pods.length >= 1, "Expected at least one new pod, saw #{new_pods.length}" + + new_ready_pods = new_pods.select do |pod| + pod.status.phase == "Running" && + pod.status.conditions.any? { |condition| condition["type"] == "Ready" && condition["status"] == "True" } + end + assert_equal 1, new_ready_pods.length, "Expected exactly one new pod to be ready, saw #{new_ready_pods.length}" end def test_deploy_aborts_immediately_if_metadata_name_missing diff --git a/test/integration/restart_task_test.rb b/test/integration/restart_task_test.rb index 4cb67dbb2..55b3d899b 100644 --- a/test/integration/restart_task_test.rb +++ b/test/integration/restart_task_test.rb @@ -209,7 +209,12 @@ def test_restart_failure def test_restart_successful_with_partial_availability result = deploy_fixtures("slow-cloud") do |fixtures| web = fixtures["web.yml.erb"]["Deployment"].first - web["spec"]["strategy"]['rollingUpdate']['maxUnavailable'] = '34%' + web["spec"]["strategy"]['rollingUpdate']['maxUnavailable'] = '50%' + container = web["spec"]["template"]["spec"]["containers"].first + container["readinessProbe"] = { + "exec" => { "command" => %w(sleep 5) }, + "timeoutSeconds" => 6 + } end assert_deploy_success(result) @@ -223,7 +228,7 @@ def test_restart_successful_with_partial_availability %r{Successfully restarted in \d+\.\d+s: Deployment/web}, "Result: SUCCESS", "Successfully restarted 1 resource", - %r{Deployment\/web\s+[34] replicas, 3 updatedReplicas, 2 availableReplicas, [12] unavailableReplica} + %r{Deployment\/web\s+2 replicas, [12] updatedReplicas?, [12] availableReplicas?, 1 unavailableReplica} ], in_order: true) From 480d41b10adf37aff8deead364251bcd8a7c35fc Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Thu, 11 Jan 2018 11:11:52 -0800 Subject: [PATCH 2/3] Rework restart test --- test/integration/kubernetes_deploy_test.rb | 36 +++++++++++----------- test/integration/restart_task_test.rb | 20 ++++++------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/test/integration/kubernetes_deploy_test.rb b/test/integration/kubernetes_deploy_test.rb index 0f31d634d..3239fb8b8 100644 --- a/test/integration/kubernetes_deploy_test.rb +++ b/test/integration/kubernetes_deploy_test.rb @@ -689,27 +689,27 @@ def test_can_deploy_deployment_with_zero_replicas end def test_deploy_successful_with_partial_availability - result = deploy_fixtures("slow-cloud", sha: "deploy1") - assert_deploy_success(result) + result = deploy_fixtures("slow-cloud", sha: "deploy1") + assert_deploy_success(result) - result = deploy_fixtures("slow-cloud", sha: "deploy2") do |fixtures| - dep = fixtures["web.yml.erb"]["Deployment"].first - container = dep["spec"]["template"]["spec"]["containers"].first - container["readinessProbe"] = { - "exec" => { "command" => %w(sleep 5) }, - "timeoutSeconds" => 6 - } - end - assert_deploy_success(result) + result = deploy_fixtures("slow-cloud", sha: "deploy2") do |fixtures| + dep = fixtures["web.yml.erb"]["Deployment"].first + container = dep["spec"]["template"]["spec"]["containers"].first + container["readinessProbe"] = { + "exec" => { "command" => %w(sleep 5) }, + "timeoutSeconds" => 6 + } + end + assert_deploy_success(result) - new_pods = kubeclient.get_pods(namespace: @namespace, label_selector: 'name=web,app=slow-cloud,sha=deploy2') - assert new_pods.length >= 1, "Expected at least one new pod, saw #{new_pods.length}" + new_pods = kubeclient.get_pods(namespace: @namespace, label_selector: 'name=web,app=slow-cloud,sha=deploy2') + assert new_pods.length >= 1, "Expected at least one new pod, saw #{new_pods.length}" - new_ready_pods = new_pods.select do |pod| - pod.status.phase == "Running" && - pod.status.conditions.any? { |condition| condition["type"] == "Ready" && condition["status"] == "True" } - end - assert_equal 1, new_ready_pods.length, "Expected exactly one new pod to be ready, saw #{new_ready_pods.length}" + new_ready_pods = new_pods.select do |pod| + pod.status.phase == "Running" && + pod.status.conditions.any? { |condition| condition["type"] == "Ready" && condition["status"] == "True" } + end + assert_equal 1, new_ready_pods.length, "Expected exactly one new pod to be ready, saw #{new_ready_pods.length}" end def test_deploy_aborts_immediately_if_metadata_name_missing diff --git a/test/integration/restart_task_test.rb b/test/integration/restart_task_test.rb index 55b3d899b..9626a17b3 100644 --- a/test/integration/restart_task_test.rb +++ b/test/integration/restart_task_test.rb @@ -221,16 +221,16 @@ def test_restart_successful_with_partial_availability restart = build_restart_task assert_restart_success(restart.perform(["web"])) - assert_logs_match_all([ - "Configured to restart deployments by name: web", - "Triggered `web` restart", - "Waiting for rollout", - %r{Successfully restarted in \d+\.\d+s: Deployment/web}, - "Result: SUCCESS", - "Successfully restarted 1 resource", - %r{Deployment\/web\s+2 replicas, [12] updatedReplicas?, [12] availableReplicas?, 1 unavailableReplica} - ], - in_order: true) + pods = kubeclient.get_pods(namespace: @namespace, label_selector: 'name=web,app=slow-cloud') + new_pods = pods.select { |pod| pod.spec.containers.select { |c| c["name"] == "app" && c.env&.find { |n| n.name == "RESTARTED_AT" } } } + assert new_pods.length >= 1, "Expected at least one new pod, saw #{new_pods.length}" + + new_ready_pods = new_pods.select do |pod| + pod.status.phase == "Running" && + pod.status.conditions.any? { |condition| condition["type"] == "Ready" && condition["status"] == "True" } && + pod.spec.containers.detect { |c| c["name"] == "app" && c.env&.find { |n| n.name == "RESTARTED_AT" } } + end + assert_equal 1, new_ready_pods.length, "Expected exactly one new pod to be ready, saw #{new_ready_pods.length}" assert fetch_restarted_at("web"), "RESTARTED_AT is present after the restart" end From 5447bc67016478b5c6898da9ea625f3f9e18926a Mon Sep 17 00:00:00 2001 From: Daniel Turner Date: Thu, 11 Jan 2018 11:15:00 -0800 Subject: [PATCH 3/3] line length --- test/integration/restart_task_test.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/restart_task_test.rb b/test/integration/restart_task_test.rb index 9626a17b3..bae924ddd 100644 --- a/test/integration/restart_task_test.rb +++ b/test/integration/restart_task_test.rb @@ -222,7 +222,9 @@ def test_restart_successful_with_partial_availability assert_restart_success(restart.perform(["web"])) pods = kubeclient.get_pods(namespace: @namespace, label_selector: 'name=web,app=slow-cloud') - new_pods = pods.select { |pod| pod.spec.containers.select { |c| c["name"] == "app" && c.env&.find { |n| n.name == "RESTARTED_AT" } } } + new_pods = pods.select do |pod| + pod.spec.containers.select { |c| c["name"] == "app" && c.env&.find { |n| n.name == "RESTARTED_AT" } } + ebd assert new_pods.length >= 1, "Expected at least one new pod, saw #{new_pods.length}" new_ready_pods = new_pods.select do |pod|