Skip to content

Commit 1e0b216

Browse files
willkutleropenshift-merge-robot
authored andcommitted
validate resource names for dns compliance
Signed-off-by: Will Kutler <[email protected]>
1 parent 49e1893 commit 1e0b216

File tree

3 files changed

+308
-12
lines changed

3 files changed

+308
-12
lines changed

internal/plugin.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
yaml "gopkg.in/yaml.v3"
1515
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
16+
"k8s.io/apimachinery/pkg/util/validation"
1617
"open-cluster-management.io/ocm-kustomize-generator-plugins/internal/types"
1718
)
1819

@@ -30,6 +31,8 @@ const (
3031
placementAPIVersion = "cluster.open-cluster-management.io/v1beta1"
3132
placementKind = "Placement"
3233
maxObjectNameLength = 63
34+
dnsReference = "https://kubernetes.io/docs/concepts/overview/working-with-objects/names/" +
35+
"#dns-subdomain-names"
3336
)
3437

3538
// Plugin is used to store the PolicyGenerator configuration and the methods to generate the
@@ -648,6 +651,41 @@ func (p *Plugin) assertValidConfig() error {
648651
)
649652
}
650653

654+
// validate placement and binding names are DNS compliant
655+
defPlrName := p.PolicyDefaults.Placement.PlacementRuleName
656+
if defPlrName != "" && len(validation.IsDNS1123Subdomain(defPlrName)) > 0 {
657+
return fmt.Errorf(
658+
"PolicyDefaults.Placement.PlacementRuleName placement name `%s` is not DNS compliant. See %s",
659+
defPlrName,
660+
dnsReference,
661+
)
662+
}
663+
664+
defPlcmtPlName := p.PolicyDefaults.Placement.PlacementName
665+
if defPlcmtPlName != "" && len(validation.IsDNS1123Subdomain(defPlcmtPlName)) > 0 {
666+
return fmt.Errorf(
667+
"PolicyDefaults.Placement.PlacementName `%s` is not DNS compliant. See %s",
668+
defPlcmtPlName,
669+
dnsReference,
670+
)
671+
}
672+
673+
defPlName := p.PolicyDefaults.Placement.Name
674+
if defPlName != "" && len(validation.IsDNS1123Subdomain(defPlName)) > 0 {
675+
return fmt.Errorf(
676+
"PolicyDefaults.Placement.Name `%s` is not DNS compliant. See %s", defPlName, dnsReference,
677+
)
678+
}
679+
680+
if p.PlacementBindingDefaults.Name != "" &&
681+
len(validation.IsDNS1123Subdomain(p.PlacementBindingDefaults.Name)) > 0 {
682+
return fmt.Errorf(
683+
"PlacementBindingDefaults.Name `%s` is not DNS compliant. See %s",
684+
p.PlacementBindingDefaults.Name,
685+
dnsReference,
686+
)
687+
}
688+
651689
defaultPlacementOptions := 0
652690
if len(p.PolicyDefaults.Placement.LabelSelector) != 0 || len(p.PolicyDefaults.Placement.ClusterSelectors) != 0 {
653691
defaultPlacementOptions++
@@ -685,6 +723,12 @@ func (p *Plugin) assertValidConfig() error {
685723
)
686724
}
687725

726+
if len(validation.IsDNS1123Subdomain(policy.Name)) > 0 {
727+
return fmt.Errorf(
728+
"policy name `%s` is not DNS compliant. See %s", policy.Name, dnsReference,
729+
)
730+
}
731+
688732
if seenPlc[policy.Name] {
689733
return fmt.Errorf(
690734
"each policy must have a unique name set, but found a duplicate name: %s", policy.Name,
@@ -799,6 +843,34 @@ func (p *Plugin) assertValidConfig() error {
799843
)
800844
}
801845

846+
// validate placement names are DNS compliant
847+
plcPlrName := policy.Placement.PlacementRuleName
848+
if plcPlrName != "" && len(validation.IsDNS1123Subdomain(plcPlrName)) > 0 {
849+
return fmt.Errorf(
850+
"policy.Placement.PlacementRuleName `%s` is not DNS compliant. See %s",
851+
plcPlrName,
852+
dnsReference,
853+
)
854+
}
855+
856+
plcPlcmtPlName := policy.Placement.PlacementName
857+
if plcPlcmtPlName != "" && len(validation.IsDNS1123Subdomain(plcPlcmtPlName)) > 0 {
858+
return fmt.Errorf(
859+
"policy.Placement.PlacementRuleName `%s` is not DNS compliant. See %s",
860+
plcPlcmtPlName,
861+
dnsReference,
862+
)
863+
}
864+
865+
plcPlName := policy.Placement.Name
866+
if plcPlName != "" && len(validation.IsDNS1123Subdomain(plcPlName)) > 0 {
867+
return fmt.Errorf(
868+
"policy.Placement.PlacementRuleName `%s` is not DNS compliant. See %s",
869+
plcPlName,
870+
dnsReference,
871+
)
872+
}
873+
802874
policyPlacementOptions := 0
803875
if len(policy.Placement.LabelSelector) != 0 || len(policy.Placement.ClusterSelectors) != 0 {
804876
policyPlacementOptions++
@@ -872,6 +944,12 @@ func (p *Plugin) assertValidConfig() error {
872944
)
873945
}
874946

947+
if len(validation.IsDNS1123Subdomain(plcset.Name)) > 0 {
948+
return fmt.Errorf(
949+
"policy set name `%s` is not DNS compliant. See %s", plcset.Name, dnsReference,
950+
)
951+
}
952+
875953
if seenPlcset[plcset.Name] {
876954
return fmt.Errorf(
877955
"each policySet must have a unique name set, but found a duplicate name: %s", plcset.Name,
@@ -900,6 +978,28 @@ func (p *Plugin) assertValidConfig() error {
900978
)
901979
}
902980

981+
// validate placement names are DNS compliant
982+
plcSetPlrName := plcset.Placement.PlacementRuleName
983+
if plcSetPlrName != "" && len(validation.IsDNS1123Subdomain(plcSetPlrName)) > 0 {
984+
return fmt.Errorf(
985+
"plcset.Placement.PlacementRuleName `%s` is not DNS compliant. See %s", plcSetPlrName, dnsReference,
986+
)
987+
}
988+
989+
plcSetPlcmtPlName := plcset.Placement.PlacementName
990+
if plcSetPlcmtPlName != "" && len(validation.IsDNS1123Subdomain(plcSetPlcmtPlName)) > 0 {
991+
return fmt.Errorf(
992+
"plcset.Placement.PlacementName `%s` is not DNS compliant. See %s", plcSetPlcmtPlName, dnsReference,
993+
)
994+
}
995+
996+
plcSetPlName := plcset.Placement.Name
997+
if plcSetPlName != "" && len(validation.IsDNS1123Subdomain(plcSetPlName)) > 0 {
998+
return fmt.Errorf(
999+
"plcset.Placement.Name `%s` is not DNS compliant. See %s", plcSetPlName, dnsReference,
1000+
)
1001+
}
1002+
9031003
policySetPlacementOptions := 0
9041004
if len(plcset.Placement.LabelSelector) != 0 || len(plcset.Placement.ClusterSelectors) != 0 {
9051005
policySetPlacementOptions++

internal/plugin_config_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ policies:
429429
placement:
430430
clusterSelectors:
431431
cloud: red hat
432-
placementRuleName: plrExistingName
432+
placementRuleName: plrexistingname
433433
manifests:
434434
- path: %s
435435
`,
@@ -497,7 +497,7 @@ policies:
497497
placement:
498498
labelSelector:
499499
cloud: red hat
500-
placementRuleName: plrExistingName
500+
placementRuleName: plrexistingname
501501
manifests:
502502
- path: %s
503503
`,
@@ -565,7 +565,7 @@ policies:
565565
placement:
566566
labelSelector:
567567
cloud: red hat
568-
placementName: plExistingName
568+
placementName: plexistingname
569569
manifests:
570570
- path: %s
571571
`,
@@ -766,7 +766,7 @@ metadata:
766766
policyDefaults:
767767
namespace: my-policies
768768
placement:
769-
placementName: plExistingName
769+
placementName: plexistingname
770770
policies:
771771
- name: policy-app-config
772772
placement:
@@ -1231,7 +1231,7 @@ func TestPolicySetConfig(t *testing.T) {
12311231
{
12321232
Name: "my-policyset",
12331233
Placement: types.PlacementConfig{
1234-
PlacementName: "plExistingName",
1234+
PlacementName: "plexistingname",
12351235
ClusterSelectors: map[string]string{"cloud": "red hat"},
12361236
},
12371237
},
@@ -1263,7 +1263,7 @@ func TestPolicySetConfig(t *testing.T) {
12631263
{
12641264
Name: "my-policyset",
12651265
Placement: types.PlacementConfig{
1266-
PlacementName: "plExistingName",
1266+
PlacementName: "plexistingname",
12671267
LabelSelector: map[string]string{"cloud": "red hat"},
12681268
},
12691269
},
@@ -1295,7 +1295,7 @@ func TestPolicySetConfig(t *testing.T) {
12951295
{
12961296
Name: "my-policyset",
12971297
Placement: types.PlacementConfig{
1298-
PlacementRuleName: "plrExisingName",
1298+
PlacementRuleName: "plrexisingname",
12991299
ClusterSelectors: map[string]string{"cloud": "red hat"},
13001300
},
13011301
},
@@ -1327,7 +1327,7 @@ func TestPolicySetConfig(t *testing.T) {
13271327
{
13281328
Name: "my-policyset",
13291329
Placement: types.PlacementConfig{
1330-
PlacementRuleName: "plrExisingName",
1330+
PlacementRuleName: "plrexisingname",
13311331
LabelSelector: map[string]string{"cloud": "red hat"},
13321332
},
13331333
},

0 commit comments

Comments
 (0)