diff --git a/internal/knowledge/kpis/plugins/infrastructure/shared.go b/internal/knowledge/kpis/plugins/infrastructure/shared.go index 4647cc28f..656756073 100644 --- a/internal/knowledge/kpis/plugins/infrastructure/shared.go +++ b/internal/knowledge/kpis/plugins/infrastructure/shared.go @@ -7,7 +7,6 @@ import ( "fmt" "regexp" "strconv" - "strings" "github.com/cobaltcore-dev/cortex/internal/knowledge/extractor/plugins/compute" hv1 "github.com/cobaltcore-dev/openstack-hypervisor-operator/api/v1" @@ -69,6 +68,7 @@ var vmwareHostLabels = []string{ var kvmHostLabels = []string{ "compute_host", + "compute_cluster", "availability_zone", "building_block", "cpu_architecture", @@ -95,11 +95,14 @@ func (h kvmHost) getHostLabels() []string { availabilityZone = "unknown" } - buildingBlock := "unknown" - // Assuming hypervisor names are in the format nodeXXX-bbYY - parts := strings.Split(h.Name, "-") - if len(parts) > 1 { - buildingBlock = parts[1] + buildingBlock := h.Labels["kubernetes.metal.cloud.sap/bb"] + if buildingBlock == "" { + buildingBlock = "unknown" + } + + computeCluster := h.Labels["kubernetes.metal.cloud.sap/cluster"] + if computeCluster == "" { + computeCluster = "unknown" } osVersion := h.Status.OperatingSystem.Version @@ -124,6 +127,7 @@ func (h kvmHost) getHostLabels() []string { return []string{ h.Name, + computeCluster, availabilityZone, buildingBlock, cpuArchitecture, diff --git a/internal/knowledge/kpis/plugins/infrastructure/shared_test.go b/internal/knowledge/kpis/plugins/infrastructure/shared_test.go index 68d5941f0..3fb8f47c2 100644 --- a/internal/knowledge/kpis/plugins/infrastructure/shared_test.go +++ b/internal/knowledge/kpis/plugins/infrastructure/shared_test.go @@ -4,7 +4,6 @@ package infrastructure import ( - "strings" "testing" "github.com/cobaltcore-dev/cortex/internal/knowledge/extractor/plugins/compute" @@ -13,15 +12,11 @@ import ( ) func mockKVMHostLabels(host, az string) map[string]string { - bb := "unknown" - parts := strings.Split(host, "-") - if len(parts) > 1 { - bb = parts[1] - } return map[string]string{ "compute_host": host, + "compute_cluster": "unknown", "availability_zone": az, - "building_block": bb, + "building_block": "unknown", "cpu_architecture": "cascade-lake", "workload_type": "general-purpose", "enabled": "true", @@ -126,7 +121,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { host: kvmHost{hv1.Hypervisor{ ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "false", "false", "false"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "false", "false", "false", "unknown"}, }, { name: "availability zone from label", @@ -136,14 +131,20 @@ func TestKVMHost_GetHostLabels(t *testing.T) { Labels: map[string]string{"topology.kubernetes.io/zone": "az1"}, }, }}, - want: []string{"node001-bb01", "az1", "bb01", "cascade-lake", "general-purpose", "true", "false", "false", "false"}, + want: []string{"node001-bb01", "unknown", "az1", "unknown", "cascade-lake", "general-purpose", "true", "false", "false", "false", "unknown"}, }, { - name: "name without dash results in unknown building block", + name: "bb and cluster from labels", host: kvmHost{hv1.Hypervisor{ - ObjectMeta: metav1.ObjectMeta{Name: "nodewithoutdash"}, + ObjectMeta: metav1.ObjectMeta{ + Name: "node001-bb01", + Labels: map[string]string{ + "kubernetes.metal.cloud.sap/bb": "bb01", + "kubernetes.metal.cloud.sap/cluster": "cluster-a", + }, + }, }}, - want: []string{"nodewithoutdash", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "false", "false", "false"}, + want: []string{"node001-bb01", "cluster-a", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "false", "false", "false", "unknown"}, }, { name: "sapphire rapids trait", @@ -151,7 +152,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Status: hv1.HypervisorStatus{Traits: []string{"CUSTOM_HW_SAPPHIRE_RAPIDS"}}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "sapphire-rapids", "general-purpose", "true", "false", "false", "false"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "sapphire-rapids", "general-purpose", "true", "false", "false", "false", "unknown"}, }, { name: "hana exclusive host trait", @@ -159,7 +160,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Status: hv1.HypervisorStatus{Traits: []string{"CUSTOM_HANA_EXCLUSIVE_HOST"}}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "hana", "true", "false", "false", "false"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "hana", "true", "false", "false", "false", "unknown"}, }, { name: "decommissioning trait", @@ -167,7 +168,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Status: hv1.HypervisorStatus{Traits: []string{"CUSTOM_DECOMMISSIONING"}}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "true", "false", "false"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "true", "false", "false", "unknown"}, }, { name: "external customer exclusive trait", @@ -175,7 +176,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Status: hv1.HypervisorStatus{Traits: []string{"CUSTOM_EXTERNAL_CUSTOMER_EXCLUSIVE"}}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "false", "true", "false"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "false", "true", "false", "unknown"}, }, { name: "maintenance set", @@ -183,14 +184,18 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Spec: hv1.HypervisorSpec{Maintenance: hv1.MaintenanceManual}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "false", "false", "true"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "false", "false", "true", "unknown"}, }, { name: "all traits and maintenance set", host: kvmHost{hv1.Hypervisor{ ObjectMeta: metav1.ObjectMeta{ - Name: "node001-bb42", - Labels: map[string]string{"topology.kubernetes.io/zone": "az3"}, + Name: "node001-bb42", + Labels: map[string]string{ + "topology.kubernetes.io/zone": "az3", + "kubernetes.metal.cloud.sap/bb": "bb42", + "kubernetes.metal.cloud.sap/cluster": "cluster-b", + }, }, Spec: hv1.HypervisorSpec{Maintenance: hv1.MaintenanceAuto}, Status: hv1.HypervisorStatus{Traits: []string{ @@ -200,7 +205,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { "CUSTOM_EXTERNAL_CUSTOMER_EXCLUSIVE", }}, }}, - want: []string{"node001-bb42", "az3", "bb42", "sapphire-rapids", "hana", "true", "true", "true", "true"}, + want: []string{"node001-bb42", "cluster-b", "az3", "bb42", "sapphire-rapids", "hana", "true", "true", "true", "true", "unknown"}, }, { name: "os version set", @@ -208,7 +213,7 @@ func TestKVMHost_GetHostLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "node001-bb01"}, Status: hv1.HypervisorStatus{OperatingSystem: hv1.OperatingSystemStatus{Version: "1.1.1"}}, }}, - want: []string{"node001-bb01", "unknown", "bb01", "cascade-lake", "general-purpose", "true", "false", "false", "false", "1.1.1"}, + want: []string{"node001-bb01", "unknown", "unknown", "unknown", "cascade-lake", "general-purpose", "true", "false", "false", "false", "1.1.1"}, }, }