From 3bc47924a9f1ac2e144453a9859c04afa8b6841d Mon Sep 17 00:00:00 2001 From: Di Xu Date: Wed, 23 Aug 2017 17:25:16 +0800 Subject: [PATCH 1/2] fix bug on kubectl deleting uninitialized resources --- pkg/kubectl/delete.go | 5 +++++ pkg/kubectl/scale.go | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/kubectl/delete.go b/pkg/kubectl/delete.go index f481019075d5..0673b4bde665 100644 --- a/pkg/kubectl/delete.go +++ b/pkg/kubectl/delete.go @@ -404,6 +404,11 @@ func (reaper *DeploymentReaper) Stop(namespace, name string, timeout time.Durati if err != nil { return err } + if deployment.Initializers != nil { + var falseVar = false + nonOrphanOption := metav1.DeleteOptions{OrphanDependents: &falseVar} + return deployments.Delete(name, &nonOrphanOption) + } // Use observedGeneration to determine if the deployment controller noticed the pause. if err := deploymentutil.WaitForObservedDeploymentInternal(func() (*extensions.Deployment, error) { diff --git a/pkg/kubectl/scale.go b/pkg/kubectl/scale.go index 21bbcfe7c8f3..d01a1295563c 100644 --- a/pkg/kubectl/scale.go +++ b/pkg/kubectl/scale.go @@ -305,6 +305,9 @@ func (scaler *ReplicaSetScaler) Scale(namespace, name string, newSize uint, prec if err != nil { return err } + if rs.Initializers != nil { + return nil + } err = wait.Poll(waitForReplicas.Interval, waitForReplicas.Timeout, client.ReplicaSetHasDesiredReplicas(scaler.c, rs)) if err == wait.ErrWaitTimeout { @@ -373,6 +376,9 @@ func (scaler *StatefulSetScaler) Scale(namespace, name string, newSize uint, pre if err != nil { return err } + if job.Initializers != nil { + return nil + } err = wait.Poll(waitForReplicas.Interval, waitForReplicas.Timeout, client.StatefulSetHasDesiredReplicas(scaler.c, job)) if err == wait.ErrWaitTimeout { return fmt.Errorf("timed out waiting for %q to be synced", name) From 5e120cfc6880fcfb9566dd2926f2cc7bc70cd915 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 31 Aug 2017 14:24:24 +0800 Subject: [PATCH 2/2] add tests --- hack/make-rules/test-cmd-util.sh | 27 +++++++++++++++++-- .../testdata/deployment-with-initializer.yaml | 25 +++++++++++++++++ .../testdata/replicaset-with-initializer.yaml | 23 ++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 hack/testdata/deployment-with-initializer.yaml create mode 100644 hack/testdata/replicaset-with-initializer.yaml diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 98029b79bd1e..b97d3914bd46 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -2816,7 +2816,7 @@ run_deployment_tests() { ! kubectl rollout status deployment/nginx --revision=3 cat hack/testdata/deployment-revision1.yaml | $SED "s/name: nginx$/name: nginx2/" | kubectl create -f - "${kube_flags[@]}" # Deletion of both deployments should not be blocked - kubectl delete deployment nginx2 "${kube_flags[@]}" + kubectl delete deployment nginx2 "${kube_flags[@]}" # Clean up kubectl delete deployment nginx "${kube_flags[@]}" @@ -2854,7 +2854,6 @@ run_deployment_tests() { kubectl set image deployment nginx-deployment "*"="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - # Clean up kubectl delete deployment nginx-deployment "${kube_flags[@]}" @@ -2883,6 +2882,18 @@ run_deployment_tests() { kubectl delete configmap test-set-env-config "${kube_flags[@]}" kubectl delete secret test-set-env-secret "${kube_flags[@]}" + ### Delete a deployment with initializer + # Pre-condition: no deployment exists + kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" '' + # Create a deployment + kubectl create --request-timeout=1 -f hack/testdata/deployment-with-initializer.yaml 2>&1 "${kube_flags[@]}" || true + kube::test::get_object_assert 'deployment web' "{{$id_field}}" 'web' + # Delete a deployment + kubectl delete deployment web "${kube_flags[@]}" + # Check Deployment web doesn't exist + output_message=$(! kubectl get deployment web 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" '"web" not found' + set +o nounset set +o errexit } @@ -2995,6 +3006,18 @@ run_rs_tests() { # Post-condition: no replica set exists kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" '' + ### Delete a rs with initializer + # Pre-condition: no rs exists + kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" '' + # Create a rs + kubectl create --request-timeout=1 -f hack/testdata/replicaset-with-initializer.yaml 2>&1 "${kube_flags[@]}" || true + kube::test::get_object_assert 'rs nginx' "{{$id_field}}" 'nginx' + # Delete a rs + kubectl delete rs nginx "${kube_flags[@]}" + # check rs nginx doesn't exist + output_message=$(! kubectl get rs nginx 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" '"nginx" not found' + if kube::test::if_supports_resource "${horizontalpodautoscalers}" ; then ### Auto scale replica set # Pre-condition: no replica set exists diff --git a/hack/testdata/deployment-with-initializer.yaml b/hack/testdata/deployment-with-initializer.yaml new file mode 100644 index 000000000000..2fb81498cc5c --- /dev/null +++ b/hack/testdata/deployment-with-initializer.yaml @@ -0,0 +1,25 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: web + labels: + run: web + initializers: + pending: + - name: podimage.initializer.com +spec: + replicas: 5 + selector: + matchLabels: + run: web + template: + metadata: + labels: + run: web + spec: + containers: + - image: nginx:1.10 + name: web + ports: + - containerPort: 80 + protocol: TCP diff --git a/hack/testdata/replicaset-with-initializer.yaml b/hack/testdata/replicaset-with-initializer.yaml new file mode 100644 index 000000000000..8530faf90ffe --- /dev/null +++ b/hack/testdata/replicaset-with-initializer.yaml @@ -0,0 +1,23 @@ +apiVersion: extensions/v1beta1 +kind: ReplicaSet +metadata: + name: nginx + initializers: + pending: + - name: podimage.initializer.com +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + name: nginx + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.10 + ports: + - containerPort: 80