Skip to content

Commit

Permalink
Return cluster validation failure if ASG missing
Browse files Browse the repository at this point in the history
  • Loading branch information
johngmyers committed May 12, 2020
1 parent 5e4c48b commit a26757b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 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
}
31 changes: 31 additions & 0 deletions pkg/validation/validate_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,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 a26757b

Please sign in to comment.