forked from grafana/agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkubelet_test.go
114 lines (94 loc) · 2.7 KB
/
kubelet_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//go:build !nonetwork && !nodocker && !race
package operator
import (
"context"
"testing"
"time"
"github.com/grafana/agent/internal/static/operator/logutil"
"github.com/grafana/agent/internal/util"
"github.com/grafana/agent/internal/util/k8s"
"github.com/stretchr/testify/require"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
core_v1 "k8s.io/api/core/v1"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
clog "sigs.k8s.io/controller-runtime/pkg/log"
)
// TestKubelet tests the Kubelet reconciler.
func TestKubelet(t *testing.T) {
l := util.TestLogger(t)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
ctx = clog.IntoContext(ctx, logutil.Wrap(l))
cluster, err := k8s.NewCluster(ctx, k8s.Options{})
require.NoError(t, err)
defer cluster.Stop()
cli := cluster.Client()
nodes := []core_v1.Node{
{
ObjectMeta: meta_v1.ObjectMeta{Name: "node-a"},
Status: core_v1.NodeStatus{
Addresses: []core_v1.NodeAddress{
{Type: core_v1.NodeInternalIP, Address: "10.0.0.10"},
},
},
},
{
ObjectMeta: meta_v1.ObjectMeta{Name: "node-b"},
Status: core_v1.NodeStatus{
Addresses: []core_v1.NodeAddress{
{Type: core_v1.NodeExternalIP, Address: "10.24.0.11"},
},
},
},
{
ObjectMeta: meta_v1.ObjectMeta{Name: "node-c"},
Status: core_v1.NodeStatus{
Addresses: []core_v1.NodeAddress{
{Type: core_v1.NodeExternalIP, Address: "10.24.0.12"},
{Type: core_v1.NodeInternalIP, Address: "10.0.0.12"},
},
},
},
}
for _, n := range nodes {
err := cli.Create(ctx, &n)
require.NoError(t, err)
}
ns := &core_v1.Namespace{
ObjectMeta: meta_v1.ObjectMeta{Name: "kube-system"},
}
_ = cli.Create(ctx, ns)
r := &kubeletReconciler{
Client: cli,
kubeletNamespace: "kube-system",
kubeletName: "kubelet",
}
_, err = r.Reconcile(ctx, reconcile.Request{})
require.NoError(t, err)
var (
eps core_v1.Endpoints
svc core_v1.Service
key = types.NamespacedName{Namespace: r.kubeletNamespace, Name: r.kubeletName}
)
require.NoError(t, cli.Get(ctx, key, &eps))
require.NoError(t, cli.Get(ctx, key, &svc))
require.Len(t, eps.Subsets, 1)
expect := map[string]string{
"node-a": "10.0.0.10",
"node-b": "10.24.0.11",
// When a node has internal and external IPs, use internal first.
"node-c": "10.0.0.12",
}
for nodeName, expectIP := range expect {
var epa *core_v1.EndpointAddress
for _, addr := range eps.Subsets[0].Addresses {
if addr.TargetRef.Name == nodeName {
epa = &addr
break
}
}
require.NotNilf(t, epa, "did not find endpoint address for node %s", nodeName)
require.Equalf(t, expectIP, epa.IP, "node %s had incorrect ip address", nodeName)
}
}