From 1e18a5d34481fab619a09d16c85c2247c2b06f70 Mon Sep 17 00:00:00 2001 From: Bharath Vedartham Date: Sat, 31 Oct 2020 19:17:45 +0530 Subject: [PATCH] rollingupdate_test: add tests for rolling update The tests create a cluster with 2 node instance groups and 1 master and bastion instance groups. Only one node instance group requires rolling update. instanceGroupNodeSpecificErrorClusterValidator mocks a validation failure for a given node group. rolling update should not fail if the cluster validator reports an error in an unrelated instance group. --- pkg/instancegroups/rollingupdate_test.go | 108 +++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/pkg/instancegroups/rollingupdate_test.go b/pkg/instancegroups/rollingupdate_test.go index cafc42f30b..441ec51a53 100644 --- a/pkg/instancegroups/rollingupdate_test.go +++ b/pkg/instancegroups/rollingupdate_test.go @@ -105,6 +105,24 @@ func (*erroringClusterValidator) Validate() (*validation.ValidationCluster, erro return nil, errors.New("testing validation error") } +// instanceGroupNodeSpecificErrorClusterValidator simulates failures in a specific node group in the map of instance groups +type instanceGroupNodeSpecificErrorClusterValidator struct { + InstanceGroup *kopsapi.InstanceGroup +} + +func (igErrorValidator *instanceGroupNodeSpecificErrorClusterValidator) Validate() (*validation.ValidationCluster, error) { + return &validation.ValidationCluster{ + Failures: []*validation.ValidationError{ + { + Kind: "testing", + Name: "testing failure", + Message: "testing failure", + InstanceGroup: igErrorValidator.InstanceGroup, + }, + }, + }, nil +} + type assertNotCalledClusterValidator struct { T *testing.T } @@ -458,6 +476,96 @@ func TestRollingUpdateClusterErrorsValidationAfterOneMaster(t *testing.T) { assertGroupInstanceCount(t, cloud, "bastion-1", 0) } +func TestRollingUpdateNonRelatedInstanceGroupFailure(t *testing.T) { + + c, cloud := getTestSetup() + + groups := make(map[string]*cloudinstances.CloudInstanceGroup) + makeGroup(groups, c.K8sClient, cloud, "node-1", kopsapi.InstanceGroupRoleNode, 3, 3) + makeGroup(groups, c.K8sClient, cloud, "node-2", kopsapi.InstanceGroupRoleNode, 3, 0) + makeGroup(groups, c.K8sClient, cloud, "master-1", kopsapi.InstanceGroupRoleMaster, 2, 0) + makeGroup(groups, c.K8sClient, cloud, "bastion-1", kopsapi.InstanceGroupRoleBastion, 1, 0) + + c.ClusterValidator = &instanceGroupNodeSpecificErrorClusterValidator{ + InstanceGroup: groups["node-2"].InstanceGroup, + } + + err := c.RollingUpdate(groups, &kopsapi.InstanceGroupList{}) + assert.NoError(t, err, "rolling update") + + assertGroupInstanceCount(t, cloud, "node-1", 0) + assertGroupInstanceCount(t, cloud, "node-2", 3) + assertGroupInstanceCount(t, cloud, "master-1", 2) + assertGroupInstanceCount(t, cloud, "bastion-1", 1) +} + +func TestRollingUpdateRelatedInstanceGroupFailure(t *testing.T) { + + c, cloud := getTestSetup() + + groups := make(map[string]*cloudinstances.CloudInstanceGroup) + makeGroup(groups, c.K8sClient, cloud, "node-1", kopsapi.InstanceGroupRoleNode, 3, 3) + makeGroup(groups, c.K8sClient, cloud, "node-2", kopsapi.InstanceGroupRoleNode, 3, 0) + makeGroup(groups, c.K8sClient, cloud, "master-1", kopsapi.InstanceGroupRoleMaster, 2, 0) + makeGroup(groups, c.K8sClient, cloud, "bastion-1", kopsapi.InstanceGroupRoleBastion, 1, 0) + + c.ClusterValidator = &instanceGroupNodeSpecificErrorClusterValidator{ + InstanceGroup: groups["node-1"].InstanceGroup, + } + + err := c.RollingUpdate(groups, &kopsapi.InstanceGroupList{}) + assert.Error(t, err, "rolling update") + + assertGroupInstanceCount(t, cloud, "node-1", 3) + assertGroupInstanceCount(t, cloud, "node-2", 3) + assertGroupInstanceCount(t, cloud, "master-1", 2) + assertGroupInstanceCount(t, cloud, "bastion-1", 1) +} + +func TestRollingUpdateMasterGroupFailure(t *testing.T) { + c, cloud := getTestSetup() + + groups := make(map[string]*cloudinstances.CloudInstanceGroup) + makeGroup(groups, c.K8sClient, cloud, "node-1", kopsapi.InstanceGroupRoleNode, 3, 3) + makeGroup(groups, c.K8sClient, cloud, "node-2", kopsapi.InstanceGroupRoleNode, 3, 0) + makeGroup(groups, c.K8sClient, cloud, "master-1", kopsapi.InstanceGroupRoleMaster, 2, 0) + makeGroup(groups, c.K8sClient, cloud, "bastion-1", kopsapi.InstanceGroupRoleBastion, 1, 0) + + c.ClusterValidator = &instanceGroupNodeSpecificErrorClusterValidator{ + InstanceGroup: groups["master-1"].InstanceGroup, + } + + err := c.RollingUpdate(groups, &kopsapi.InstanceGroupList{}) + assert.Error(t, err, "rolling update") + + assertGroupInstanceCount(t, cloud, "node-1", 3) + assertGroupInstanceCount(t, cloud, "node-2", 3) + assertGroupInstanceCount(t, cloud, "master-1", 2) + assertGroupInstanceCount(t, cloud, "bastion-1", 1) +} + +func TestRollingUpdateValidationErrorInstanceGroupNil(t *testing.T) { + c, cloud := getTestSetup() + + groups := make(map[string]*cloudinstances.CloudInstanceGroup) + makeGroup(groups, c.K8sClient, cloud, "node-1", kopsapi.InstanceGroupRoleNode, 3, 3) + makeGroup(groups, c.K8sClient, cloud, "node-2", kopsapi.InstanceGroupRoleNode, 3, 0) + makeGroup(groups, c.K8sClient, cloud, "master-1", kopsapi.InstanceGroupRoleMaster, 2, 0) + makeGroup(groups, c.K8sClient, cloud, "bastion-1", kopsapi.InstanceGroupRoleBastion, 1, 0) + + c.ClusterValidator = &instanceGroupNodeSpecificErrorClusterValidator{ + InstanceGroup: nil, + } + + err := c.RollingUpdate(groups, &kopsapi.InstanceGroupList{}) + assert.Error(t, err, "rolling update") + + assertGroupInstanceCount(t, cloud, "node-1", 3) + assertGroupInstanceCount(t, cloud, "node-2", 3) + assertGroupInstanceCount(t, cloud, "master-1", 2) + assertGroupInstanceCount(t, cloud, "bastion-1", 1) +} + func TestRollingUpdateClusterFailsValidationAfterOneNode(t *testing.T) { c, cloud := getTestSetup()