Skip to content

Commit c3acaeb

Browse files
dilyevskyclaude
andcommitted
[apiserver] validate DomainRecord metadata.name matches derived name
PrepareForCreate now only sets metadata.name when the user omits it. When explicitly provided, Validate rejects names that don't match the expected derived form (spec.name + target field key). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 465dceb commit c3acaeb

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

api/core/v1alpha3/domainrecord_validate.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,13 @@ func (r *DomainRecord) Default() {
2222

2323
var _ resourcestrategy.PrepareForCreater = &DomainRecord{}
2424

25-
// PrepareForCreate generates metadata.name from spec.name and the target field key.
25+
// PrepareForCreate derives metadata.name from spec when the user omits it.
2626
func (r *DomainRecord) PrepareForCreate(ctx context.Context) {
27-
suffix := "ref"
28-
if r.Spec.Target.DNS != nil {
29-
if key := r.Spec.Target.DNS.DNSFieldKey(); key != "" {
30-
suffix = key
31-
}
32-
}
33-
r.Name = fmt.Sprintf("%s--%s", r.Spec.Name, suffix)
3427
r.GenerateName = ""
28+
if r.Name != "" {
29+
return // user provided a name; Validate will check it
30+
}
31+
r.Name = r.derivedName()
3532
}
3633

3734
var _ resourcestrategy.Validater = &DomainRecord{}
@@ -74,6 +71,21 @@ func (r *DomainRecord) ValidateUpdate(ctx context.Context, obj runtime.Object) f
7471
return errs
7572
}
7673

74+
// derivedName returns the expected metadata.name for the record,
75+
// derived from spec.name and the target field key.
76+
func (r *DomainRecord) derivedName() string {
77+
if r.Spec.Name == "" {
78+
return ""
79+
}
80+
suffix := "ref"
81+
if r.Spec.Target.DNS != nil {
82+
if key := r.Spec.Target.DNS.DNSFieldKey(); key != "" {
83+
suffix = key
84+
}
85+
}
86+
return fmt.Sprintf("%s--%s", r.Spec.Name, suffix)
87+
}
88+
7789
// targetFieldKey returns the target field key for a DomainRecord.
7890
func targetFieldKey(r *DomainRecord) string {
7991
if r.Spec.Target.Ref != nil {
@@ -105,6 +117,16 @@ func (r *DomainRecord) validate() field.ErrorList {
105117
}
106118
}
107119

120+
// metadata.name must match the derived name when explicitly set.
121+
expectedName := r.derivedName()
122+
if expectedName != "" && r.Name != expectedName {
123+
errs = append(errs, field.Invalid(
124+
field.NewPath("metadata", "name"),
125+
r.Name,
126+
fmt.Sprintf("must be %q (derived from spec)", expectedName),
127+
))
128+
}
129+
108130
// TTL range validation.
109131
if r.Spec.TTL != nil {
110132
if *r.Spec.TTL < 0 || *r.Spec.TTL > 86400 {

0 commit comments

Comments
 (0)