Skip to content

Commit

Permalink
Merge pull request #9118 from johngmyers/validate-missing-asg
Browse files Browse the repository at this point in the history
Return cluster validation failure if ASG missing
  • Loading branch information
k8s-ci-robot committed May 13, 2020
2 parents 130e4f0 + 23d48f0 commit a454f0f
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 15 deletions.
17 changes: 15 additions & 2 deletions pkg/validation/validate_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ func (v *clusterValidatorImpl) Validate() (*ValidationCluster, error) {
if err != nil {
return nil, err
}
readyNodes := validation.validateNodes(cloudGroups)
readyNodes := validation.validateNodes(cloudGroups, v.instanceGroups)

if err := validation.collectComponentFailures(ctx, v.k8sClient); err != nil {
return nil, fmt.Errorf("cannot get component status for %q: %v", clusterName, err)
Expand Down Expand Up @@ -286,13 +286,16 @@ func (v *ValidationCluster) collectPodFailures(ctx context.Context, client kuber
return nil
}

func (v *ValidationCluster) validateNodes(cloudGroups map[string]*cloudinstances.CloudInstanceGroup) []v1.Node {
func (v *ValidationCluster) validateNodes(cloudGroups map[string]*cloudinstances.CloudInstanceGroup, groups []*kops.InstanceGroup) []v1.Node {
var readyNodes []v1.Node
groupsSeen := map[string]bool{}

for _, cloudGroup := range cloudGroups {
var allMembers []*cloudinstances.CloudInstanceGroupMember
allMembers = append(allMembers, cloudGroup.Ready...)
allMembers = append(allMembers, cloudGroup.NeedUpdate...)

groupsSeen[cloudGroup.InstanceGroup.Name] = true
numNodes := 0
for _, m := range allMembers {
if !m.Detached {
Expand Down Expand Up @@ -374,5 +377,15 @@ func (v *ValidationCluster) validateNodes(cloudGroups map[string]*cloudinstances
}
}

for _, ig := range groups {
if !groupsSeen[ig.Name] {
v.addError(&ValidationError{
Kind: "InstanceGroup",
Name: ig.Name,
Message: fmt.Sprintf("InstanceGroup %q is missing from the cloud provider", ig.Name),
})
}
}

return readyNodes
}
72 changes: 59 additions & 13 deletions pkg/validation/validate_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,34 @@ func testValidate(t *testing.T, groups map[string]*cloudinstances.CloudInstanceG
ObjectMeta: metav1.ObjectMeta{Name: "testcluster.k8s.local"},
}

if len(groups) == 0 {
groups = make(map[string]*cloudinstances.CloudInstanceGroup)
groups["master-1"] = &cloudinstances.CloudInstanceGroup{
InstanceGroup: &kopsapi.InstanceGroup{
ObjectMeta: metav1.ObjectMeta{
Name: "master-1",
},
Spec: kopsapi.InstanceGroupSpec{
Role: kopsapi.InstanceGroupRoleMaster,
},
},
MinSize: 1,
Ready: []*cloudinstances.CloudInstanceGroupMember{
{
ID: "i-00001",
Node: &v1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "master-1a"},
Status: v1.NodeStatus{
Conditions: []v1.NodeCondition{
{Type: "Ready", Status: v1.ConditionTrue},
},
},
},
},
},
}
}

instanceGroups := make([]kopsapi.InstanceGroup, 0, len(groups))
objects = append([]runtime.Object(nil), objects...)
for _, g := range groups {
Expand All @@ -91,19 +119,6 @@ func testValidate(t *testing.T, groups map[string]*cloudinstances.CloudInstanceG
}
}

if len(instanceGroups) == 0 {
instanceGroups = []kopsapi.InstanceGroup{
{
ObjectMeta: metav1.ObjectMeta{
Name: "master-1",
},
Spec: kopsapi.InstanceGroupSpec{
Role: kopsapi.InstanceGroupRoleMaster,
},
},
}
}

mockcloud := BuildMockCloud(t, groups, cluster, instanceGroups)

validator, err := NewClusterValidator(cluster, mockcloud, &kopsapi.InstanceGroupList{Items: instanceGroups}, fake.NewSimpleClientset(objects...))
Expand All @@ -113,6 +128,37 @@ func testValidate(t *testing.T, groups map[string]*cloudinstances.CloudInstanceG
return validator.Validate()
}

func Test_ValidateCloudGroupMissing(t *testing.T) {
cluster := &kopsapi.Cluster{
ObjectMeta: metav1.ObjectMeta{Name: "testcluster.k8s.local"},
}
instanceGroups := []kopsapi.InstanceGroup{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
},
Spec: kopsapi.InstanceGroupSpec{
Role: kopsapi.InstanceGroupRoleNode,
},
},
}

mockcloud := BuildMockCloud(t, nil, cluster, instanceGroups)

validator, err := NewClusterValidator(cluster, mockcloud, &kopsapi.InstanceGroupList{Items: instanceGroups}, fake.NewSimpleClientset())
require.NoError(t, err)
v, err := validator.Validate()
require.NoError(t, err)
if !assert.Len(t, v.Failures, 1) ||
!assert.Equal(t, &ValidationError{
Kind: "InstanceGroup",
Name: "node-1",
Message: "InstanceGroup \"node-1\" is missing from the cloud provider",
}, v.Failures[0]) {
printDebug(t, v)
}
}

func Test_ValidateNodesNotEnough(t *testing.T) {
groups := make(map[string]*cloudinstances.CloudInstanceGroup)
groups["node-1"] = &cloudinstances.CloudInstanceGroup{
Expand Down

0 comments on commit a454f0f

Please sign in to comment.