ContainerImage.Pinniped/internal/clusterhost/clusterhost_test.go
Margo Crawford dfcc2a1eb8 Introduce clusterhost package to determine whether a cluster has control plane nodes
Also added hasExternalLoadBalancerProvider key to cluster capabilities
for integration testing.

Signed-off-by: Ryan Richard <richardry@vmware.com>
2021-02-09 11:16:01 -08:00

170 lines
4.1 KiB
Go

// Copyright 2021 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package clusterhost
import (
"context"
"errors"
"testing"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/runtime"
kubernetesfake "k8s.io/client-go/kubernetes/fake"
coretesting "k8s.io/client-go/testing"
v1 "k8s.io/api/core/v1"
)
func TestHasControlPlaneNodes(t *testing.T) {
tests := []struct {
name string
nodes []*v1.Node
listNodesErr error
wantErr error
wantReturnValue bool
}{
{
name: "Fetching nodes returns an error",
listNodesErr: errors.New("couldn't get nodes"),
wantErr: errors.New("error fetching nodes: couldn't get nodes"),
},
{
name: "Fetching nodes returns an empty array",
nodes: []*v1.Node{},
wantErr: errors.New("no nodes found"),
},
{
name: "Nodes found, but not control plane nodes",
nodes: []*v1.Node{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
Labels: map[string]string{
"not-control-plane-label": "some-value",
"kubernetes.io/node-role": "worker",
},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-2",
Labels: map[string]string{"node-role.kubernetes.io/worker": ""},
},
},
},
wantReturnValue: false,
},
{
name: "Nodes found, including a control-plane role in node-role.kubernetes.io/<role> format",
nodes: []*v1.Node{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
Labels: map[string]string{"unrelated-label": "some-value"},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-2",
Labels: map[string]string{
"some-other-label": "some-value",
"node-role.kubernetes.io/control-plane": "",
},
},
},
},
wantReturnValue: true,
},
{
name: "Nodes found, including a master role in node-role.kubernetes.io/<role> format",
nodes: []*v1.Node{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
Labels: map[string]string{"unrelated-label": "some-value"},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-2",
Labels: map[string]string{
"some-other-label": "some-value",
"node-role.kubernetes.io/master": "",
},
},
},
},
wantReturnValue: true,
},
{
name: "Nodes found, including a control-plane role in kubernetes.io/node-role=<role> format",
nodes: []*v1.Node{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
Labels: map[string]string{"unrelated-label": "some-value"},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-2",
Labels: map[string]string{
"some-other-label": "some-value",
"kubernetes.io/node-role": "control-plane",
},
},
},
},
wantReturnValue: true,
},
{
name: "Nodes found, including a master role in kubernetes.io/node-role=<role> format",
nodes: []*v1.Node{
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-1",
Labels: map[string]string{"unrelated-label": "some-value"},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "node-2",
Labels: map[string]string{
"some-other-label": "some-value",
"kubernetes.io/node-role": "master",
},
},
},
},
wantReturnValue: true,
},
}
for _, tt := range tests {
test := tt
t.Run(test.name, func(t *testing.T) {
kubeClient := kubernetesfake.NewSimpleClientset()
if test.listNodesErr != nil {
listNodesErr := test.listNodesErr
kubeClient.PrependReactor(
"list",
"nodes",
func(_ coretesting.Action) (bool, runtime.Object, error) {
return true, nil, listNodesErr
},
)
}
for _, node := range test.nodes {
err := kubeClient.Tracker().Add(node)
require.NoError(t, err)
}
clusterHost := New(kubeClient)
hasControlPlaneNodes, err := clusterHost.HasControlPlaneNodes(context.Background())
require.Equal(t, test.wantErr, err)
require.Equal(t, test.wantReturnValue, hasControlPlaneNodes)
})
}
}