Skip to content

Commit 38c1585

Browse files
committed
[chore] added metadata to clientset
Signed-off-by: RealAnna <anna.reale@dynatrace.com>
1 parent da36ed7 commit 38c1585

File tree

6 files changed

+76
-53
lines changed

6 files changed

+76
-53
lines changed

internal/k8sconfig/config.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"k8s.io/apimachinery/pkg/watch"
2222
"k8s.io/client-go/dynamic"
2323
k8s "k8s.io/client-go/kubernetes"
24+
"k8s.io/client-go/metadata"
2425
"k8s.io/client-go/rest"
2526
"k8s.io/client-go/tools/cache"
2627
"k8s.io/client-go/tools/clientcmd"
@@ -149,6 +150,34 @@ func MakeClient(apiConf APIConfig) (k8s.Interface, error) {
149150
return client, nil
150151
}
151152

153+
type ClientBundle struct {
154+
K8s k8s.Interface
155+
Meta metadata.Interface
156+
}
157+
158+
func MakeClientBundle(apiConf APIConfig) (ClientBundle, error) {
159+
if err := apiConf.Validate(); err != nil {
160+
return ClientBundle{}, err
161+
}
162+
163+
rc, err := CreateRestConfig(apiConf)
164+
if err != nil {
165+
return ClientBundle{}, err
166+
}
167+
168+
kc, err := k8s.NewForConfig(rc)
169+
if err != nil {
170+
return ClientBundle{}, err
171+
}
172+
173+
mc, err := metadata.NewForConfig(rc)
174+
if err != nil {
175+
return ClientBundle{}, err
176+
}
177+
178+
return ClientBundle{K8s: kc, Meta: mc}, nil
179+
}
180+
152181
// MakeDynamicClient can take configuration if needed for other types of auth
153182
func MakeDynamicClient(apiConf APIConfig) (dynamic.Interface, error) {
154183
if err := apiConf.Validate(); err != nil {

processor/k8sattributesprocessor/internal/kube/client.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ type WatchClient struct {
7979
deleteMut sync.Mutex
8080
logger *zap.Logger
8181
kc kubernetes.Interface
82+
mc clientmeta.Interface
8283
informer cache.SharedInformer
8384
namespaceInformer cache.SharedInformer
8485
nodeInformer cache.SharedInformer
@@ -193,15 +194,16 @@ func New(
193194
c.StatefulSets = map[string]*StatefulSet{}
194195
c.DaemonSets = map[string]*DaemonSet{}
195196
c.Jobs = map[string]*Job{}
197+
196198
if newClientSet == nil {
197-
newClientSet = k8sconfig.MakeClient
199+
newClientSet = k8sconfig.MakeClientBundle
198200
}
199-
200-
kc, err := newClientSet(apiCfg)
201+
bundle, err := newClientSet(apiCfg)
201202
if err != nil {
202203
return nil, err
203204
}
204-
c.kc = kc
205+
c.kc = bundle.K8s
206+
c.mc = bundle.Meta
205207

206208
labelSelector, fieldSelector, err := selectorsFromFilters(c.Filters)
207209
if err != nil {
@@ -252,17 +254,8 @@ func New(
252254
if informersFactory.newReplicaSetInformer == nil {
253255
informersFactory.newReplicaSetInformer = newReplicaSetSharedInformer
254256
}
255-
restConfig, err := k8sconfig.CreateRestConfig(apiCfg)
256-
if err != nil {
257-
return nil, err
258-
}
259-
260-
mc, err := clientmeta.NewForConfig(restConfig)
261-
if err != nil {
262-
return nil, err
263-
}
264257

265-
c.replicasetInformer = informersFactory.newReplicaSetInformer(mc, c.Filters.Namespace)
258+
c.replicasetInformer = informersFactory.newReplicaSetInformer(c.mc, c.Filters.Namespace)
266259
if c.replicasetInformer == nil {
267260
return nil, errors.New("failed to create ReplicaSet informer")
268261
}

processor/k8sattributesprocessor/internal/kube/client_test.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,22 @@ import (
2424
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/apimachinery/pkg/fields"
2626
"k8s.io/apimachinery/pkg/labels"
27+
"k8s.io/apimachinery/pkg/runtime"
2728
"k8s.io/apimachinery/pkg/selection"
2829
"k8s.io/apimachinery/pkg/types"
2930
"k8s.io/client-go/kubernetes"
3031
"k8s.io/client-go/kubernetes/fake"
3132
"k8s.io/client-go/metadata"
33+
clientmetafake "k8s.io/client-go/metadata/fake"
3234
"k8s.io/client-go/tools/cache"
3335

3436
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig"
3537
)
3638

37-
func newFakeAPIClientset(_ k8sconfig.APIConfig) (kubernetes.Interface, error) {
38-
return fake.NewClientset(), nil
39+
func newFakeAPIClientset(_ k8sconfig.APIConfig) (k8sconfig.ClientBundle, error) {
40+
kc := fake.NewClientset()
41+
mc := clientmetafake.NewSimpleMetadataClient(runtime.NewScheme())
42+
return k8sconfig.ClientBundle{K8s: kc, Meta: mc}, nil
3943
}
4044

4145
func newPodIdentifier(from, name, value string) PodIdentifier {
@@ -156,6 +160,8 @@ func TestDefaultClientset(t *testing.T) {
156160
assert.Nil(t, c)
157161

158162
c, err = New(componenttest.NewNopTelemetrySettings(), k8sconfig.APIConfig{}, ExtractionRules{}, Filters{}, []Association{}, Excludes{}, newFakeAPIClientset, InformersFactoryList{}, false, 10*time.Second)
163+
wc := c.(*WatchClient)
164+
wc.mc = clientmetafake.NewSimpleMetadataClient(runtime.NewScheme())
159165
assert.NoError(t, err)
160166
assert.NotNil(t, c)
161167
}
@@ -198,9 +204,9 @@ func TestConstructorErrors(t *testing.T) {
198204
apiCfg := k8sconfig.APIConfig{
199205
AuthType: "test-auth-type",
200206
}
201-
clientProvider := func(c k8sconfig.APIConfig) (kubernetes.Interface, error) {
207+
clientProvider := func(c k8sconfig.APIConfig) (k8sconfig.ClientBundle, error) {
202208
gotAPIConfig = c
203-
return nil, errors.New("error creating k8s client")
209+
return k8sconfig.ClientBundle{}, errors.New("error creating k8s client")
204210
}
205211
factory := InformersFactoryList{
206212
newInformer: NewFakeInformer,
@@ -3025,6 +3031,7 @@ func newTestClientWithRulesAndFilters(t *testing.T, f Filters) (*WatchClient, *o
30253031
newNamespaceInformer: NewFakeNamespaceInformer,
30263032
newReplicaSetInformer: NewFakeReplicaSetInformer,
30273033
}
3034+
30283035
c, err := New(set, k8sconfig.APIConfig{}, ExtractionRules{}, f, associations, exclude, newFakeAPIClientset, factory, false, 10*time.Second)
30293036
require.NoError(t, err)
30303037
return c.(*WatchClient), logs
@@ -3571,13 +3578,7 @@ func (i *trackableInformer) hasRun() bool {
35713578
return i.runCalled
35723579
}
35733580

3574-
func newTrackableInformer(client kubernetes.Interface, namespace string, labelSelector labels.Selector, fieldSelector fields.Selector) cache.SharedInformer {
3575-
return &trackableInformer{
3576-
SharedInformer: NewFakeInformer(client, namespace, labelSelector, fieldSelector),
3577-
}
3578-
}
3579-
3580-
func newTrackableInformerReplicaset(client metadata.Interface, namespace string) cache.SharedInformer {
3581+
func newTrackableInformer(client metadata.Interface, namespace string, labelSelector labels.Selector, fieldSelector fields.Selector) cache.SharedInformer {
35813582
return &trackableInformer{
35823583
SharedInformer: NewFakeReplicaSetInformer(client, namespace),
35833584
}
@@ -3628,7 +3629,7 @@ func TestReplicaSetInformerConditionalStart(t *testing.T) {
36283629
newInformer: NewFakeInformer,
36293630
newNamespaceInformer: NewFakeNamespaceInformer,
36303631
newReplicaSetInformer: func(kc metadata.Interface, ns string) cache.SharedInformer {
3631-
return newTrackableInformerReplicaset(kc, ns)
3632+
return newTrackableInformer(kc, ns, labels.Everything(), fields.Everything())
36323633
},
36333634
}
36343635

@@ -4085,15 +4086,15 @@ func TestCreateRestConfigFailure(t *testing.T) {
40854086
// Assert that the client is nil and an error is returned
40864087
assert.Nil(t, c)
40874088
assert.Error(t, err)
4088-
assert.Contains(t, err.Error(), "unable to load k8s config")
4089+
assert.Contains(t, err.Error(), "failed to create ReplicaSet informer")
40894090
}
40904091

40914092
func TestMetadataNewForConfigFailure(t *testing.T) {
40924093
factory := InformersFactoryList{
40934094
newInformer: NewFakeInformer,
40944095
}
4095-
clientProvider := func(_ k8sconfig.APIConfig) (kubernetes.Interface, error) {
4096-
return nil, errors.New("metadata.NewForConfig failed")
4096+
clientProvider := func(_ k8sconfig.APIConfig) (k8sconfig.ClientBundle, error) {
4097+
return k8sconfig.ClientBundle{}, errors.New("metadata.NewForConfig failed")
40974098
}
40984099

40994100
c, err := New(

processor/k8sattributesprocessor/internal/kube/informer_test.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,49 +26,49 @@ func Test_newSharedInformer(t *testing.T) {
2626
require.NoError(t, err)
2727
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
2828
require.NoError(t, err)
29-
informer := newSharedInformer(client, "testns", labelSelector, fieldSelector)
29+
informer := newSharedInformer(client.K8s, "testns", labelSelector, fieldSelector)
3030
assert.NotNil(t, informer)
3131
}
3232

3333
func Test_newSharedNamespaceInformer(t *testing.T) {
3434
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
3535
require.NoError(t, err)
36-
informer := newNamespaceSharedInformer(client)
36+
informer := newNamespaceSharedInformer(client.K8s)
3737
assert.NotNil(t, informer)
3838
}
3939

4040
func Test_newSharedDeploymentInformer(t *testing.T) {
4141
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
4242
require.NoError(t, err)
43-
informer := newDeploymentSharedInformer(client, "ns")
43+
informer := newDeploymentSharedInformer(client.K8s, "ns")
4444
assert.NotNil(t, informer)
4545
}
4646

4747
func Test_newSharedStatefulSetInformer(t *testing.T) {
4848
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
4949
require.NoError(t, err)
50-
informer := newStatefulSetSharedInformer(client, "ns")
50+
informer := newStatefulSetSharedInformer(client.K8s, "ns")
5151
assert.NotNil(t, informer)
5252
}
5353

5454
func Test_newSharedDaemonSetInformer(t *testing.T) {
5555
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
5656
require.NoError(t, err)
57-
informer := newDaemonSetSharedInformer(client, "ns")
57+
informer := newDaemonSetSharedInformer(client.K8s, "ns")
5858
assert.NotNil(t, informer)
5959
}
6060

6161
func Test_newSharedJobInformer(t *testing.T) {
6262
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
6363
require.NoError(t, err)
64-
informer := newJobSharedInformer(client, "ns")
64+
informer := newJobSharedInformer(client.K8s, "ns")
6565
assert.NotNil(t, informer)
6666
}
6767

6868
func Test_newKubeSystemSharedInformer(t *testing.T) {
6969
client, err := newFakeAPIClientset(k8sconfig.APIConfig{})
7070
require.NoError(t, err)
71-
informer := newKubeSystemSharedInformer(client)
71+
informer := newKubeSystemSharedInformer(client.K8s)
7272
assert.NotNil(t, informer)
7373
}
7474

@@ -92,7 +92,7 @@ func Test_informerListFuncWithSelectors(t *testing.T) {
9292
assert.NoError(t, err)
9393
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
9494
assert.NoError(t, err)
95-
listFunc := informerListFuncWithSelectors(c, "test-ns", ls, fs)
95+
listFunc := informerListFuncWithSelectors(c.K8s, "test-ns", ls, fs)
9696
opts := metav1.ListOptions{}
9797
obj, err := listFunc(t.Context(), opts)
9898
assert.NoError(t, err)
@@ -102,7 +102,7 @@ func Test_informerListFuncWithSelectors(t *testing.T) {
102102
func Test_namespaceInformerListFunc(t *testing.T) {
103103
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
104104
assert.NoError(t, err)
105-
listFunc := namespaceInformerListFunc(c)
105+
listFunc := namespaceInformerListFunc(c.K8s)
106106
opts := metav1.ListOptions{}
107107
obj, err := listFunc(t.Context(), opts)
108108
assert.NoError(t, err)
@@ -129,7 +129,7 @@ func Test_informerWatchFuncWithSelectors(t *testing.T) {
129129
assert.NoError(t, err)
130130
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
131131
assert.NoError(t, err)
132-
watchFunc := informerWatchFuncWithSelectors(c, "test-ns", ls, fs)
132+
watchFunc := informerWatchFuncWithSelectors(c.K8s, "test-ns", ls, fs)
133133
opts := metav1.ListOptions{}
134134
obj, err := watchFunc(t.Context(), opts)
135135
assert.NoError(t, err)
@@ -139,7 +139,7 @@ func Test_informerWatchFuncWithSelectors(t *testing.T) {
139139
func Test_namespaceInformerWatchFunc(t *testing.T) {
140140
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
141141
assert.NoError(t, err)
142-
watchFunc := namespaceInformerWatchFunc(c)
142+
watchFunc := namespaceInformerWatchFunc(c.K8s)
143143
opts := metav1.ListOptions{}
144144
obj, err := watchFunc(t.Context(), opts)
145145
assert.NoError(t, err)
@@ -150,7 +150,7 @@ func Test_fakeInformer(t *testing.T) {
150150
// nothing real to test here. just to make coverage happy
151151
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
152152
assert.NoError(t, err)
153-
i := NewFakeInformer(c, "ns", nil, nil)
153+
i := NewFakeInformer(c.K8s, "ns", nil, nil)
154154
_, err = i.AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{}, time.Second)
155155
assert.NoError(t, err)
156156
i.HasSynced()
@@ -163,7 +163,7 @@ func Test_fakeNamespaceInformer(t *testing.T) {
163163
// nothing real to test here. just to make coverage happy
164164
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
165165
assert.NoError(t, err)
166-
i := NewFakeNamespaceInformer(c)
166+
i := NewFakeNamespaceInformer(c.K8s)
167167
_, err = i.AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{}, time.Second)
168168
assert.NoError(t, err)
169169
i.HasSynced()
@@ -209,7 +209,7 @@ func newTestMetadataClient() clientmeta.Interface {
209209
func Test_deploymentWatchFuncWithSelectors(t *testing.T) {
210210
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
211211
assert.NoError(t, err)
212-
watchFunc := deploymentWatchFuncWithSelectors(c, "test-ns")
212+
watchFunc := deploymentWatchFuncWithSelectors(c.K8s, "test-ns")
213213
opts := metav1.ListOptions{}
214214
obj, err := watchFunc(t.Context(), opts)
215215
assert.NoError(t, err)
@@ -219,7 +219,7 @@ func Test_deploymentWatchFuncWithSelectors(t *testing.T) {
219219
func Test_statefulsetListFuncWithSelectors(t *testing.T) {
220220
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
221221
assert.NoError(t, err)
222-
listFunc := statefulsetListFuncWithSelectors(c, "test-ns")
222+
listFunc := statefulsetListFuncWithSelectors(c.K8s, "test-ns")
223223
opts := metav1.ListOptions{}
224224
obj, err := listFunc(t.Context(), opts)
225225
assert.NoError(t, err)
@@ -229,7 +229,7 @@ func Test_statefulsetListFuncWithSelectors(t *testing.T) {
229229
func Test_statefulsetWatchFuncWithSelectors(t *testing.T) {
230230
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
231231
assert.NoError(t, err)
232-
watchFunc := statefulsetWatchFuncWithSelectors(c, "test-ns")
232+
watchFunc := statefulsetWatchFuncWithSelectors(c.K8s, "test-ns")
233233
opts := metav1.ListOptions{}
234234
obj, err := watchFunc(t.Context(), opts)
235235
assert.NoError(t, err)
@@ -239,7 +239,7 @@ func Test_statefulsetWatchFuncWithSelectors(t *testing.T) {
239239
func Test_daemonsetListFuncWithSelectors(t *testing.T) {
240240
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
241241
assert.NoError(t, err)
242-
listFunc := daemonsetListFuncWithSelectors(c, "test-ns")
242+
listFunc := daemonsetListFuncWithSelectors(c.K8s, "test-ns")
243243
opts := metav1.ListOptions{}
244244
obj, err := listFunc(t.Context(), opts)
245245
assert.NoError(t, err)
@@ -249,7 +249,7 @@ func Test_daemonsetListFuncWithSelectors(t *testing.T) {
249249
func Test_daemonsetWatchFuncWithSelectors(t *testing.T) {
250250
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
251251
assert.NoError(t, err)
252-
watchFunc := daemonsetWatchFuncWithSelectors(c, "test-ns")
252+
watchFunc := daemonsetWatchFuncWithSelectors(c.K8s, "test-ns")
253253
opts := metav1.ListOptions{}
254254
obj, err := watchFunc(t.Context(), opts)
255255
assert.NoError(t, err)
@@ -259,7 +259,7 @@ func Test_daemonsetWatchFuncWithSelectors(t *testing.T) {
259259
func Test_jobListFuncWithSelectors(t *testing.T) {
260260
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
261261
assert.NoError(t, err)
262-
listFunc := jobListFuncWithSelectors(c, "test-ns")
262+
listFunc := jobListFuncWithSelectors(c.K8s, "test-ns")
263263
opts := metav1.ListOptions{}
264264
obj, err := listFunc(t.Context(), opts)
265265
assert.NoError(t, err)
@@ -269,7 +269,7 @@ func Test_jobListFuncWithSelectors(t *testing.T) {
269269
func Test_jobWatchFuncWithSelectors(t *testing.T) {
270270
c, err := newFakeAPIClientset(k8sconfig.APIConfig{})
271271
assert.NoError(t, err)
272-
watchFunc := jobWatchFuncWithSelectors(c, "test-ns")
272+
watchFunc := jobWatchFuncWithSelectors(c.K8s, "test-ns")
273273
opts := metav1.ListOptions{}
274274
obj, err := watchFunc(t.Context(), opts)
275275
assert.NoError(t, err)

processor/k8sattributesprocessor/internal/kube/kube.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"go.opentelemetry.io/collector/component"
1212
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1313
"k8s.io/apimachinery/pkg/selection"
14-
"k8s.io/client-go/kubernetes"
1514

1615
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig"
1716
)
@@ -110,7 +109,7 @@ type ClientProvider func(component.TelemetrySettings, k8sconfig.APIConfig, Extra
110109

111110
// APIClientsetProvider defines a func type that initializes and return a new kubernetes
112111
// Clientset object.
113-
type APIClientsetProvider func(config k8sconfig.APIConfig) (kubernetes.Interface, error)
112+
type APIClientsetProvider func(config k8sconfig.APIConfig) (k8sconfig.ClientBundle, error)
114113

115114
// Pod represents a kubernetes pod.
116115
type Pod struct {

processor/k8sattributesprocessor/internal/kube/partialmetadata_benchmark_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"k8s.io/apimachinery/pkg/types"
1717
"k8s.io/apimachinery/pkg/util/wait"
1818
"k8s.io/apimachinery/pkg/watch"
19-
"k8s.io/client-go/kubernetes"
2019
"k8s.io/client-go/kubernetes/fake"
2120
ktesting "k8s.io/client-go/testing"
2221

@@ -88,7 +87,9 @@ func Benchmark_RS_ResourceSweep_InProcess(b *testing.B) {
8887
newNamespaceInformer: NewNoOpInformer,
8988
newReplicaSetInformer: newReplicaSetSharedInformer,
9089
}
91-
newClientSet := func(_ k8sconfig.APIConfig) (kubernetes.Interface, error) { return fc, nil }
90+
newClientSet := func(_ k8sconfig.APIConfig) (k8sconfig.ClientBundle, error) {
91+
return k8sconfig.ClientBundle{K8s: fc}, nil
92+
}
9293

9394
c, err := New(set, k8sconfig.APIConfig{}, rules, filters, nil, Excludes{}, newClientSet, factory, false, 0)
9495
if err != nil {

0 commit comments

Comments
 (0)