Skip to content

Commit 73cc4a1

Browse files
authored
use kubernetes.io as default label (#97)
Signed-off-by: Felix Breuer <f.breuer94@gmail.com>
1 parent 248d13f commit 73cc4a1

File tree

9 files changed

+37
-34
lines changed

9 files changed

+37
-34
lines changed

docs/stackit-iaas-api-analysis.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -213,21 +213,17 @@ Example: `stackit://my-project-123/550e8400-e29b-41d4-a716-446655440000`
213213

214214
Use the `labels` field for MCM identification and mapping:
215215

216-
| Label Key | Value | Purpose |
217-
| --------------------------------- | ----------------- | ----------------------------------------------- |
218-
| `mcm.gardener.cloud/cluster` | Cluster ID | Identify which cluster owns this server |
219-
| `mcm.gardener.cloud/machine` | Machine CR name | Map server to Kubernetes Machine |
220-
| `mcm.gardener.cloud/machineclass` | MachineClass name | Map server to MachineClass for orphan detection |
221-
| `mcm.gardener.cloud/role` | "node" | Identify as cluster node |
216+
| Label Key | Value | Purpose |
217+
| ---------------------------- | ----------------- | ----------------------------------------------- |
218+
| `kubernetes.io/machine` | Machine CR name | Map server to Kubernetes Machine |
219+
| `kubernetes.io/machineclass` | MachineClass name | Map server to MachineClass for orphan detection |
222220

223221
Example labels:
224222

225223
```json
226224
{
227-
"mcm.gardener.cloud/cluster": "shoot-dev-01",
228-
"mcm.gardener.cloud/machine": "worker-pool-a-12345",
229-
"mcm.gardener.cloud/machineclass": "worker-pool-a",
230-
"mcm.gardener.cloud/role": "node"
225+
"kubernetes.io/machine": "worker-pool-a-12345",
226+
"kubernetes.io/machineclass": "worker-pool-a"
231227
}
232228
```
233229

pkg/client/sdk_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,14 @@ var _ = Describe("SDK Type Conversion Helpers", func() {
116116

117117
It("should convert labels with special characters", func() {
118118
labels := map[string]string{
119-
"mcm.gardener.cloud/machine": "test-machine",
120-
"kubernetes.io/role": "node",
119+
"kubernetes.io/machine": "test-machine",
121120
}
122121

123122
result := convertLabelsToSDK(labels)
124123

125124
Expect(result).NotTo(BeNil())
126125
Expect(result).To(HaveLen(2))
127-
Expect(result["mcm.gardener.cloud/machine"]).To(Equal("test-machine"))
128-
Expect(result["kubernetes.io/role"]).To(Equal("node"))
126+
Expect(result["kubernetes.io/machine"]).To(Equal("test-machine"))
129127
})
130128
})
131129

pkg/provider/apis/validation/validation.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ var regionRegex = regexp.MustCompile(`^[a-z0-9]+$`)
3838
// Pattern: lowercase letters/digits followed by digits, dash, then digit(s) (e.g., eu01-1, eu01-2)
3939
var availabilityZoneRegex = regexp.MustCompile(`^[a-z0-9]+-\d+$`)
4040

41-
// labelKeyRegex validates Kubernetes label keys (must start/end with alphanumeric, can contain -, _, .)
41+
// labelKeyRegex validates Kubernetes label keys (must start/end with alphanumeric, can contain -, _, ., /)
4242
// Maximum length: 63 characters
43-
var labelKeyRegex = regexp.MustCompile(`^[a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?$`)
43+
var labelKeyRegex = regexp.MustCompile(`^[a-zA-Z0-9]([-a-zA-Z0-9_./]*[a-zA-Z0-9])?$`)
4444

4545
// labelValueRegex validates Kubernetes label values (must start/end with alphanumeric, can contain -, _, ., can be empty)
4646
// Maximum length: 63 characters
@@ -113,7 +113,7 @@ func ValidateProviderSpecNSecret(spec *api.ProviderSpec, secrets *corev1.Secret)
113113
errors = append(errors, fmt.Errorf("providerSpec.labels key '%s' exceeds maximum length of 63 characters", key))
114114
}
115115
if !labelKeyRegex.MatchString(key) {
116-
errors = append(errors, fmt.Errorf("providerSpec.labels key '%s' has invalid format (must start/end with alphanumeric, can contain -, _, .)", key))
116+
errors = append(errors, fmt.Errorf("providerSpec.labels key '%s' has invalid format (must start/end with alphanumeric, can contain -, _, ., /)", key))
117117
}
118118
if len(value) > 63 {
119119
errors = append(errors, fmt.Errorf("providerSpec.labels value for key '%s' exceeds maximum length of 63 characters", key))

pkg/provider/apis/validation/validation_core_labels_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ var _ = Describe("ValidateProviderSpecNSecret", func() {
106106
"app.kubernetes.io_component": "worker",
107107
"environment-type": "prod",
108108
"version": "v1.2.3",
109+
"app/component": "core",
109110
}
110111
errors := ValidateProviderSpecNSecret(providerSpec, secret)
111112
Expect(errors).To(BeEmpty())
@@ -172,6 +173,16 @@ var _ = Describe("ValidateProviderSpecNSecret", func() {
172173
Expect(errors[0].Error()).To(ContainSubstring("invalid format"))
173174
})
174175

176+
It("should succeed with label keys containing slashes", func() {
177+
providerSpec.Labels = map[string]string{
178+
"mycompany.com/environment": "prod",
179+
"app.io/version": "v2",
180+
"team/project/name": "web",
181+
}
182+
errors := ValidateProviderSpecNSecret(providerSpec, secret)
183+
Expect(errors).To(BeEmpty())
184+
})
185+
175186
It("should fail when label key contains invalid characters", func() {
176187
providerSpec.Labels = map[string]string{
177188
"invalid@key": "value",

pkg/provider/core.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ import (
1111

1212
const (
1313
StackitProviderName = "stackit"
14-
StackitMachineLabel = "mcm.gardener.cloud/machine"
15-
StackitMachineClassLabel = "mcm.gardener.cloud/machineclass"
16-
StackitRoleLabel = "mcm.gardener.cloud/role"
14+
StackitMachineLabel = "kubernetes.io/machine"
15+
StackitMachineClassLabel = "kubernetes.io/machineclass"
1716
)
1817

1918
// GetVolumeIDs extracts volume IDs from PersistentVolume specs

pkg/provider/create.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/base64"
66
"fmt"
7+
"maps"
78
"slices"
89

910
"github.com/gardener/machine-controller-manager/pkg/util/provider/driver"
@@ -94,16 +95,15 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR
9495
func (p *Provider) createServerRequest(req *driver.CreateMachineRequest, providerSpec *api.ProviderSpec) *client.CreateServerRequest {
9596
// Build labels: merge ProviderSpec labels with MCM-specific labels
9697
labels := make(map[string]string)
98+
9799
// Start with user-provided labels from ProviderSpec
98100
if providerSpec.Labels != nil {
99-
for k, v := range providerSpec.Labels {
100-
labels[k] = v
101-
}
101+
maps.Copy(labels, providerSpec.Labels)
102102
}
103+
103104
// Add MCM-specific labels for server identification and orphan VM detection
104105
labels[StackitMachineLabel] = req.Machine.Name
105106
labels[StackitMachineClassLabel] = req.MachineClass.Name
106-
labels[StackitRoleLabel] = "node"
107107

108108
// Create server request
109109
createReq := &client.CreateServerRequest{

pkg/provider/list.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
// ListMachines lists all STACKIT servers that belong to the specified MachineClass
1414
//
1515
// This method retrieves all servers in the STACKIT project and filters them based on
16-
// the "mcm.gardener.cloud/machineclass" label. This enables the MCM safety controller
16+
// the "kubernetes.io/machineclass" label. This enables the MCM safety controller
1717
// to detect and clean up orphan VMs that are not backed by Machine CRs.
1818
//
1919
// Returns:
@@ -51,7 +51,7 @@ func (p *Provider) ListMachines(ctx context.Context, req *driver.ListMachinesReq
5151
}
5252

5353
// Filter servers by MachineClass label
54-
// We use the "mcm.gardener.cloud/machineclass" label to identify which servers belong to this MachineClass
54+
// We use the "kubernetes.io/machineclass" label to identify which servers belong to this MachineClass
5555
machineList := make(map[string]string)
5656
for _, server := range servers {
5757
// Generate ProviderID in format: stackit://<projectId>/<serverId>

pkg/provider/list_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,23 @@ var _ = Describe("ListMachines", func() {
7171
Context("with valid inputs", func() {
7272
It("should list machines filtered by MachineClass label", func() {
7373
mockClient.ListServersFunc = func(_ context.Context, _, _ string, selector map[string]string) ([]*client.Server, error) {
74-
Expect(selector["mcm.gardener.cloud/machineclass"]).To(Equal("test-machine-class"))
74+
Expect(selector["kubernetes.io/machineclass"]).To(Equal("test-machine-class"))
7575

7676
return []*client.Server{
7777
{
7878
ID: "server-1",
7979
Name: "machine-1",
8080
Labels: map[string]string{
81-
"mcm.gardener.cloud/machineclass": "test-machine-class",
82-
"mcm.gardener.cloud/machine": "machine-1",
81+
"kubernetes.io/machineclass": "test-machine-class",
82+
"kubernetes.io/machine": "machine-1",
8383
},
8484
},
8585
{
8686
ID: "server-2",
8787
Name: "machine-2",
8888
Labels: map[string]string{
89-
"mcm.gardener.cloud/machineclass": "test-machine-class",
90-
"mcm.gardener.cloud/machine": "machine-2",
89+
"kubernetes.io/machineclass": "test-machine-class",
90+
"kubernetes.io/machine": "machine-2",
9191
},
9292
},
9393
}, nil

test/e2e/e2e_labels_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,8 @@ spec:
515515

516516
// Verify that MCM-generated labels would still be sent (check provider behavior)
517517
// Even without user labels, the provider should add MCM labels like:
518-
// - mcm.gardener.cloud/machineclass
519-
// - mcm.gardener.cloud/machine
520-
// - mcm.gardener.cloud/role
518+
// - kubernetes.io/machineclass
519+
// - kubernetes.io/machine
521520
By("verifying provider handles missing labels gracefully")
522521

523522
// Check provider logs for any errors related to missing labels

0 commit comments

Comments
 (0)