fix(labels): allow setting 'uncloud.' prefixed labels on services using a client but not CLI or Compose

This commit is contained in:
Pasha Sviderski
2026-11-04 13:51:53 +10:00
parent 78facdfcc6
commit 76b04dd56c
6 changed files with 93 additions and 9 deletions
+3
View File
@@ -130,6 +130,9 @@ func ServiceSpecFromCompose(project *types.Project, serviceName string) (api.Ser
}
if len(service.Deploy.Labels) > 0 {
if err = api.ValidateLabels(service.Deploy.Labels); err != nil {
return spec, fmt.Errorf("invalid deploy.labels: %w", err)
}
spec.Labels = maps.Clone(service.Deploy.Labels)
}
}
+36
View File
@@ -950,6 +950,42 @@ services:
}
}
func TestServiceSpecFromCompose_InvalidServiceLabels(t *testing.T) {
t.Parallel()
tests := []struct {
name string
label string
wantErr string
}{
{name: "reserved prefix", label: api.LabelManaged, wantErr: "reserved prefix"},
{name: "reserved daemon prefix", label: "uncloudd.foo", wantErr: "reserved prefix"},
{name: "managed service", label: api.LabelReservedPrefix + "service.managed", wantErr: "reserved prefix"},
{name: "whitespace in key", label: "my label", wantErr: "must not contain whitespace"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
composeYAML := `
services:
web:
image: nginx
deploy:
labels:
- ` + tt.label + `=value
`
project, err := LoadProjectFromContent(context.Background(), composeYAML)
require.NoError(t, err)
_, err = ServiceSpecFromCompose(project, "web")
require.ErrorContains(t, err, "invalid deploy.labels")
require.ErrorContains(t, err, tt.wantErr)
})
}
}
func TestServiceSpecFromCompose_UpdateConfig(t *testing.T) {
t.Parallel()