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