diff --git a/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient.go b/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient.go index 85ec8cb8b8be..8a36a35bbf5f 100644 --- a/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient.go +++ b/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient.go @@ -9,11 +9,14 @@ import ( "go.uber.org/zap" corev1 "k8s.io/api/core/v1" + "k8s.io/utils/net" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet" ) +var kubeletNewClientProvider = kubelet.NewClientProvider + type KubeletClient struct { KubeIP string Port string @@ -26,7 +29,11 @@ func NewKubeletClient(kubeIP string, port string, logger *zap.Logger) (*KubeletC KubeIP: kubeIP, } - endpoint := kubeIP + ":" + port + endpoint := kubeIP + if net.IsIPv6String(kubeIP) { + endpoint = "[" + endpoint + "]" + } + endpoint = endpoint + ":" + port // use service account for authentication clientConfig := &kubelet.ClientConfig{ @@ -35,7 +42,7 @@ func NewKubeletClient(kubeIP string, port string, logger *zap.Logger) (*KubeletC }, } - clientProvider, err := kubelet.NewClientProvider(endpoint, clientConfig, logger) + clientProvider, err := kubeletNewClientProvider(endpoint, clientConfig, logger) if err != nil { return nil, err } diff --git a/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient_test.go b/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient_test.go new file mode 100644 index 000000000000..1ec0b691f173 --- /dev/null +++ b/receiver/awscontainerinsightreceiver/internal/stores/kubeletutil/kubeletclient_test.go @@ -0,0 +1,72 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package kubeletutil + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap" + + kube "github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet" +) + +type mockClientProvider struct { + endpoint string + cfg *kube.ClientConfig +} + +func (cp *mockClientProvider) BuildClient() (kube.Client, error) { + return &fakeClient{ + endpoint: cp.endpoint, + }, nil +} + +type fakeClient struct { + endpoint string +} + +func (f *fakeClient) Get(path string) ([]byte, error) { + return []byte(path), nil +} + +func TestNewKubeletClient(t *testing.T) { + kubeletNewClientProvider = func(endpoint string, cfg *kube.ClientConfig, logger *zap.Logger) (kube.ClientProvider, error) { + return &mockClientProvider{ + endpoint: endpoint, + cfg: cfg, + }, nil + } + + tests := []struct { + kubeIP string + port string + wantEndpoint string + }{ + { + kubeIP: "0.0.0.0", + port: "8000", + wantEndpoint: "0.0.0.0:8000", + }, + { + kubeIP: "2001:db8:3333:4444:5555:6666:7777:8888", + port: "8000", + wantEndpoint: "[2001:db8:3333:4444:5555:6666:7777:8888]:8000", + }, + { + kubeIP: "2001:db8:3333:4444:5555:6666:1.2.3.4", + port: "8000", + wantEndpoint: "[2001:db8:3333:4444:5555:6666:1.2.3.4]:8000", + }, + } + for _, tt := range tests { + client, err := NewKubeletClient(tt.kubeIP, tt.port, zap.NewNop()) + require.NoError(t, err) + assert.Equal(t, client.KubeIP, tt.kubeIP) + fc := (client.restClient).(*fakeClient) + assert.NotNil(t, fc) + assert.Equal(t, fc.endpoint, tt.wantEndpoint) + } +}