Skip to content

Commit

Permalink
Merge pull request #548 from weaveworks/deployment-is-ready-test
Browse files Browse the repository at this point in the history
pkg/canary: add unit test of isDeploymentReady
  • Loading branch information
mathetake authored Apr 4, 2020
2 parents e0b3b71 + bbdac24 commit adae6af
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 12 deletions.
20 changes: 10 additions & 10 deletions pkg/canary/daemonset_ready_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,19 @@ func TestDaemonSetController_isDaemonSetReady(t *testing.T) {
// observed generation is less than desired generation
ds := &appsv1.DaemonSet{Status: appsv1.DaemonSetStatus{}}
ds.Status.ObservedGeneration--
retyable, err := mocks.controller.isDaemonSetReady(cd, ds)
retryable, err := mocks.controller.isDaemonSetReady(cd, ds)
require.Error(t, err)
require.True(t, retyable)
require.True(t, retryable)

// succeeded
ds = &appsv1.DaemonSet{Status: appsv1.DaemonSetStatus{
UpdatedNumberScheduled: 1,
DesiredNumberScheduled: 1,
NumberAvailable: 1,
}}
retyable, err = mocks.controller.isDaemonSetReady(cd, ds)
retryable, err = mocks.controller.isDaemonSetReady(cd, ds)
require.NoError(t, err)
require.True(t, retyable)
require.True(t, retryable)

// deadline exceeded
ds = &appsv1.DaemonSet{Status: appsv1.DaemonSetStatus{
Expand All @@ -51,9 +51,9 @@ func TestDaemonSetController_isDaemonSetReady(t *testing.T) {
}}
cd.Status.LastTransitionTime = metav1.Now()
cd.Spec.ProgressDeadlineSeconds = int32p(-1e6)
retyable, err = mocks.controller.isDaemonSetReady(cd, ds)
retryable, err = mocks.controller.isDaemonSetReady(cd, ds)
require.Error(t, err)
require.False(t, retyable)
require.False(t, retryable)

// only newCond not satisfied
ds = &appsv1.DaemonSet{Status: appsv1.DaemonSetStatus{
Expand All @@ -62,9 +62,9 @@ func TestDaemonSetController_isDaemonSetReady(t *testing.T) {
NumberAvailable: 1,
}}
cd.Spec.ProgressDeadlineSeconds = int32p(1e6)
retyable, err = mocks.controller.isDaemonSetReady(cd, ds)
retryable, err = mocks.controller.isDaemonSetReady(cd, ds)
require.Error(t, err)
require.True(t, retyable)
require.True(t, retryable)
require.True(t, strings.Contains(err.Error(), "new pods"))

// only availableCond not satisfied
Expand All @@ -73,8 +73,8 @@ func TestDaemonSetController_isDaemonSetReady(t *testing.T) {
DesiredNumberScheduled: 1,
NumberAvailable: 0,
}}
retyable, err = mocks.controller.isDaemonSetReady(cd, ds)
retryable, err = mocks.controller.isDaemonSetReady(cd, ds)
require.Error(t, err)
require.True(t, retyable)
require.True(t, retryable)
require.True(t, strings.Contains(err.Error(), "available"))
}
1 change: 0 additions & 1 deletion pkg/canary/deployment_ready.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ func (c *DeploymentController) isDeploymentReady(deployment *appsv1.Deployment,
return retriable, fmt.Errorf("waiting for rollout to finish: %d of %d updated replicas are available",
deployment.Status.AvailableReplicas, deployment.Status.UpdatedReplicas)
}

} else {
return true, fmt.Errorf(
"waiting for rollout to finish: observed deployment generation less then desired generation")
Expand Down
83 changes: 82 additions & 1 deletion pkg/canary/deployment_ready_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package canary

import (
"strings"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestDeploymentController_IsReady(t *testing.T) {
Expand All @@ -17,4 +22,80 @@ func TestDeploymentController_IsReady(t *testing.T) {
require.NoError(t, err)
}

// TODO: more detailed tests as daemonset
func TestDeploymentController_isDeploymentReady(t *testing.T) {
mocks := newDeploymentFixture()

// observed generation is less than desired generation
dp := &appsv1.Deployment{Status: appsv1.DeploymentStatus{ObservedGeneration: -1}}
retryable, err := mocks.controller.isDeploymentReady(dp, 0)
assert.Error(t, err)
assert.True(t, retryable)
assert.True(t, strings.Contains(err.Error(), "generation"))

// ok
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
Replicas: 1,
UpdatedReplicas: 1,
ReadyReplicas: 1,
AvailableReplicas: 1,
}}
retryable, err = mocks.controller.isDeploymentReady(dp, 0)
assert.NoError(t, err)
assert.True(t, retryable)

// old
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
UpdatedReplicas: 1,
}, Spec: appsv1.DeploymentSpec{
Replicas: int32p(2),
}}
_, err = mocks.controller.isDeploymentReady(dp, 0)
assert.Error(t, err)
assert.True(t, strings.Contains(err.Error(), "new replicas"))

// waiting for old replicas to be terminated
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
UpdatedReplicas: 1,
Replicas: 2,
}}
_, err = mocks.controller.isDeploymentReady(dp, 0)
assert.Error(t, err)
assert.True(t, strings.Contains(err.Error(), "termination"))

// waiting for updated ones to be available
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
UpdatedReplicas: 2,
AvailableReplicas: 1,
}}
_, err = mocks.controller.isDeploymentReady(dp, 0)
assert.Error(t, err)
assert.True(t, strings.Contains(err.Error(), "available"))

// ProgressDeadlineExceeded
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
Conditions: []appsv1.DeploymentCondition{
{Type: appsv1.DeploymentProgressing, Reason: "ProgressDeadlineExceeded"}},
}}
retryable, err = mocks.controller.isDeploymentReady(dp, 0)
assert.Error(t, err)
assert.False(t, retryable)
assert.True(t, strings.Contains(err.Error(), "exceeded"))

// deadline exceeded
dp = &appsv1.Deployment{Status: appsv1.DeploymentStatus{
Conditions: []appsv1.DeploymentCondition{
{Type: appsv1.DeploymentProgressing},
{
Type: appsv1.DeploymentAvailable,
Status: "False",
Reason: "MinimumReplicasUnavailable",
LastUpdateTime: v1.NewTime(time.Now().Add(-10 * time.Second)),
},
},
UpdatedReplicas: 2,
AvailableReplicas: 1,
}}
retryable, err = mocks.controller.isDeploymentReady(dp, 5)
assert.Error(t, err)
assert.False(t, retryable)
}

0 comments on commit adae6af

Please sign in to comment.