Skip to content

Commit a88de45

Browse files
nammnfealebenpae
authored andcommitted
CLOUDP-299552 - Detect rancher and vmware (#4131)
# Summary - adds detection for rancher - refactors detection to also rely on server version if possible ## Proof of Work - unit tests - following the official code to detect rancher: https://github.com/rancher/kubernetes-provider-detector/tree/master/providers - following the hidden docs of vmware for detection: https://vstellar.com/2021/09/upgrade-tanzu-kubernetes-grid-from-v1-3-x-to-1-4-x/#:~:text=NAMESPACE%20STATUS%20CONTROLPLANE%20WORKERS%20KUBERNETES,1%20management%20prod + https://manuals.plus/m/b40c126bfb839c9d3b0b924eca541d644c6e32165341146f5a4cd33e6db82330#:~:text=VMware%20Tanzu%20distributes%20Kubernetes%20software,You ``` 12345 | [root@tkg-bootstrapper ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2+vmware.1", GitCommit:"54e7e68e30dd3f9f7bb4f814c9d112f54f0fb273", GitTreeState:"clean", BuildDate:"2021-06-28T22:17:36Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.5+vmware.2", GitCommit:"13a5d1c1f3860de79bb2aa1448af2025c974d111", GitTreeState:"clean", BuildDate:"2021-05-16T00:39:21Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"} -- | -- ``` ^--- according to the posts ## Checklist - [x] Have you linked a jira ticket and/or is the ticket in the title? - [ ] Have you checked whether your jira ticket required DOCSP changes? - [ ] Have you checked for release_note changes?
1 parent f2955a8 commit a88de45

File tree

3 files changed

+53
-22
lines changed

3 files changed

+53
-22
lines changed

pkg/telemetry/cluster.go

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package telemetry
22

33
import (
44
"context"
5+
"strings"
56
"time"
67

78
"k8s.io/apimachinery/pkg/version"
@@ -16,11 +17,26 @@ import (
1617
const (
1718
unknown = "Unknown"
1819
eks = "AWS (EKS)"
20+
vmware = "VmWare"
1921
gke = "Google (GKE)"
2022
aks = "Azure (AKS)"
2123
openshift = "Openshift"
24+
rke = "RKE"
25+
rke2 = "RKE2"
2226
)
2327

28+
var kubernetesFlavourLabelsMapping = map[string]string{
29+
"eks.amazonaws.com/nodegroup": eks,
30+
"cloud.google.com/gke-nodepool": gke,
31+
"kubernetes.azure.com/agentpool": aks,
32+
"node.openshift.io/os_id": openshift,
33+
}
34+
35+
var kubernetesFlavourAnnotationsMapping = map[string]string{
36+
"rke.cattle.io/external-ip": rke,
37+
"rke.cattle.io/internal-ip": rke,
38+
}
39+
2440
// detectClusterInfo detects the Kubernetes version and cluster flavor
2541
func detectClusterInfos(ctx context.Context, memberClusterMap map[string]ConfigClient) []KubernetesClusterUsageSnapshotProperties {
2642
var clusterProperties []KubernetesClusterUsageSnapshotProperties
@@ -53,7 +69,7 @@ func getKubernetesClusterProperty(ctx context.Context, discoveryClient discovery
5369
}
5470
}
5571

56-
kubernetesFlavour := detectKubernetesFlavour(ctx, uncachedClient)
72+
kubernetesFlavour := detectKubernetesFlavour(ctx, uncachedClient, kubernetesAPIVersion)
5773

5874
property := KubernetesClusterUsageSnapshotProperties{
5975
KubernetesClusterID: kubeClusterUUID,
@@ -74,38 +90,46 @@ func getServerVersion(discoveryClient discovery.DiscoveryInterface) *version.Inf
7490
}
7591

7692
// detectKubernetesFlavour detects the cloud provider based on node labels.
77-
func detectKubernetesFlavour(ctx context.Context, uncachedClient kubeclient.Reader) string {
78-
nodes := &corev1.NodeList{}
79-
// Limit is propagated to the apiserver which propagates to etcd as it is. Thus, there is not a lot of
80-
// work required on the APIServer and ETCD to retrieve that node even in large clusters
81-
listOptions := &kubeclient.ListOptions{
82-
Limit: 1,
93+
func detectKubernetesFlavour(ctx context.Context, uncachedClient kubeclient.Reader, kubeGitApiVersion string) string {
94+
// Check Kubernetes API version for known cloud providers
95+
switch {
96+
case strings.Contains(kubeGitApiVersion, "+rke2"):
97+
return rke2
98+
case strings.Contains(kubeGitApiVersion, "-gke"):
99+
return gke
100+
case strings.Contains(kubeGitApiVersion, "-eks"):
101+
return eks
102+
case strings.Contains(kubeGitApiVersion, "+vmware"):
103+
return vmware
83104
}
84105

85-
if err := uncachedClient.List(ctx, nodes, listOptions); err != nil {
106+
// Limit is propagated to the apiserver which propagates to etcd as it is. Thus, there is not a lot of
107+
// work required on the APIServer and ETCD to retrieve that node even in large clusters
108+
nodes := &corev1.NodeList{}
109+
if err := uncachedClient.List(ctx, nodes, &kubeclient.ListOptions{Limit: 1}); err != nil {
86110
Logger.Debugf("Failed to fetch node to detect the cloud provider: %s", err)
87111
return unknown
88112
}
89-
90113
if len(nodes.Items) == 0 {
91114
Logger.Debugf("No nodes found, returning Unknown")
92115
return unknown
93116
}
94117

95-
labels := nodes.Items[0].Labels
118+
node := nodes.Items[0]
119+
labels, annotations := node.Labels, node.Annotations
96120

97-
if _, ok := labels["eks.amazonaws.com/nodegroup"]; ok {
98-
return eks
99-
}
100-
if _, ok := labels["cloud.google.com/gke-nodepool"]; ok {
101-
return gke
102-
}
103-
if _, ok := labels["kubernetes.azure.com/agentpool"]; ok {
104-
return aks
121+
for key, provider := range kubernetesFlavourLabelsMapping {
122+
if _, exists := labels[key]; exists {
123+
return provider
124+
}
105125
}
106-
if _, ok := labels["node.openshift.io/os_id"]; ok {
107-
return openshift
126+
127+
for key, provider := range kubernetesFlavourAnnotationsMapping {
128+
if _, exists := annotations[key]; exists {
129+
return provider
130+
}
108131
}
132+
109133
return unknown
110134
}
111135

pkg/telemetry/cluster_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ func TestDetectKubernetesFlavour(t *testing.T) {
173173
tests := []struct {
174174
name string
175175
labels map[string]string
176+
gitVersion string
176177
expectedFlavour string
177178
}{
178179
{
@@ -185,6 +186,12 @@ func TestDetectKubernetesFlavour(t *testing.T) {
185186
labels: map[string]string{"something": "default"},
186187
expectedFlavour: unknown,
187188
},
189+
{
190+
name: "based on gitversion",
191+
labels: map[string]string{"something": "default"},
192+
gitVersion: "v123-gke",
193+
expectedFlavour: gke,
194+
},
188195
}
189196

190197
for _, tt := range tests {
@@ -198,7 +205,7 @@ func TestDetectKubernetesFlavour(t *testing.T) {
198205
}
199206

200207
fakeClient := fake.NewClientBuilder().WithObjects(node).Build()
201-
cloudProvider := detectKubernetesFlavour(ctx, fakeClient)
208+
cloudProvider := detectKubernetesFlavour(ctx, fakeClient, tt.gitVersion)
202209

203210
assert.Equal(t, tt.expectedFlavour, cloudProvider)
204211
})

pkg/telemetry/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ var AllEventTypes = []EventType{
6161
Clusters,
6262
}
6363

64-
var EventTypeMappingToEnvVar map[EventType]string = map[EventType]string{
64+
var EventTypeMappingToEnvVar = map[EventType]string{
6565
Deployments: "MDB_OPERATOR_TELEMETRY_COLLECTION_DEPLOYMENTS",
6666
Clusters: "MDB_OPERATOR_TELEMETRY_COLLECTION_CLUSTERS",
6767
Operators: "MDB_OPERATOR_TELEMETRY_COLLECTION_OPERATORS",

0 commit comments

Comments
 (0)