Skip to content

Commit 2a6f5ab

Browse files
authored
fix: ensure unique condition.ValidationRule names across different rule types (#377)
## Issue Resolves #376 ## Description This PR ensures that the validation rule type is a part of the validation results rule name.
1 parent c44ce5d commit 2a6f5ab

8 files changed

Lines changed: 40 additions & 36 deletions

File tree

pkg/validate/validate_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TestValidate(t *testing.T) {
4242
},
4343
}),
4444
},
45-
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-cluster-dc0-c0","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
45+
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vsphere-privileges-cluster-dc0-c0","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
4646
},
4747
{
4848
name: "Cluster_Fail",
@@ -59,7 +59,7 @@ func TestValidate(t *testing.T) {
5959
},
6060
}),
6161
},
62-
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-cluster-dc0-c0","message":"One or more required privileges was not found, or a condition was not met for account: admin@vsphere.local","failures":["user: admin@vsphere.local does not have privilege: Nonexistent on entity type: Cluster with name: DC0_C0"],"status":"False","lastValidationTime":null},"State":"Failed"}],"ValidationRuleErrors":[null]}`,
62+
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vsphere-privileges-cluster-dc0-c0","message":"One or more required privileges was not found, or a condition was not met for account: admin@vsphere.local","failures":["user: admin@vsphere.local does not have privilege: Nonexistent on entity type: Cluster with name: DC0_C0"],"status":"False","lastValidationTime":null},"State":"Failed"}],"ValidationRuleErrors":[null]}`,
6363
},
6464
{
6565
name: "Root_Pass",
@@ -76,7 +76,7 @@ func TestValidate(t *testing.T) {
7676
},
7777
}),
7878
},
79-
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vcenter-root","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
79+
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vsphere-privileges-vcenter-root","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
8080
},
8181
{
8282
name: "Datastore_Pass",
@@ -93,7 +93,7 @@ func TestValidate(t *testing.T) {
9393
},
9494
}),
9595
},
96-
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-datastore-localds-0","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
96+
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vsphere-privileges-datastore-localds-0","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
9797
},
9898
{
9999
name: "Network_Pass",
@@ -110,7 +110,7 @@ func TestValidate(t *testing.T) {
110110
},
111111
}),
112112
},
113-
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-network-vm-network","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
113+
expected: `{"ValidationRuleResults":[{"Condition":{"validationType":"vsphere-privileges","validationRule":"validation-vsphere-privileges-network-vm-network","message":"All required vsphere-privileges permissions were found for account: admin@vsphere.local","status":"True","lastValidationTime":null},"State":"Succeeded"}],"ValidationRuleErrors":[null]}`,
114114
},
115115
// DistributedVirtualSwitch not yet supported in govmomi
116116
// {

pkg/validators/computeresources/computeresources.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ type resourceRequirement struct {
5252
DiskSpace resource.Quantity
5353
}
5454

55-
func buildValidationResult(rule v1alpha1.ComputeResourceRule, validationType string) *types.ValidationRuleResult {
55+
func buildValidationResult(rule v1alpha1.ComputeResourceRule) *types.ValidationRuleResult {
5656
state := vapi.ValidationSucceeded
57+
validationType := constants.ValidationTypeComputeResources
5758

58-
validationRule := fmt.Sprintf("%s-%s-%s", vapiconstants.ValidationRulePrefix, rule.Scope, rule.EntityName)
59+
validationRule := fmt.Sprintf("%s-%s-%s-%s", vapiconstants.ValidationRulePrefix, validationType, rule.Scope, rule.EntityName)
5960

6061
latestCondition := vapi.DefaultValidationCondition()
6162
latestCondition.Message = "All required compute resources were satisfied"
@@ -109,7 +110,7 @@ type Usage struct {
109110
// ReconcileComputeResourceValidationRule reconciles the compute resource rule
110111
func (c *ValidationService) ReconcileComputeResourceValidationRule(rule v1alpha1.ComputeResourceRule, finder *find.Finder, driver *vsphere.VCenterDriver, seenScopes map[string]bool) (*types.ValidationRuleResult, error) {
111112

112-
vr := buildValidationResult(rule, constants.ValidationTypeComputeResources)
113+
vr := buildValidationResult(rule)
113114

114115
key, err := GetScopeKey(rule)
115116
if err != nil {

pkg/validators/computeresources/computeresources_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
6868
},
6969
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
7070
ValidationType: "vsphere-compute-resources",
71-
ValidationRule: "validation-cluster-dc0-c0",
71+
ValidationRule: "validation-vsphere-compute-resources-cluster-dc0-c0",
7272
Message: "All required compute resources were satisfied",
7373
Details: []string{},
7474
Failures: nil,
@@ -103,7 +103,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
103103
},
104104
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
105105
ValidationType: "vsphere-compute-resources",
106-
ValidationRule: "validation-cluster-dc0-c0",
106+
ValidationRule: "validation-vsphere-compute-resources-cluster-dc0-c0",
107107
Message: "One or more resource requirements were not satisfied",
108108
Details: []string{},
109109
Failures: []string{"Not enough resources available. CPU available: false, Memory available: true, Storage available: true"},
@@ -138,7 +138,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
138138
},
139139
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
140140
ValidationType: "vsphere-compute-resources",
141-
ValidationRule: "validation-cluster-dc0-c0",
141+
ValidationRule: "validation-vsphere-compute-resources-cluster-dc0-c0",
142142
Message: "One or more resource requirements were not satisfied",
143143
Details: []string{},
144144
Failures: []string{"Not enough resources available. CPU available: true, Memory available: false, Storage available: true"},
@@ -173,7 +173,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
173173
},
174174
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
175175
ValidationType: "vsphere-compute-resources",
176-
ValidationRule: "validation-cluster-dc0-c0",
176+
ValidationRule: "validation-vsphere-compute-resources-cluster-dc0-c0",
177177
Message: "One or more resource requirements were not satisfied",
178178
Details: []string{},
179179
Failures: []string{"Not enough resources available. CPU available: true, Memory available: true, Storage available: false"},
@@ -207,7 +207,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
207207
},
208208
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
209209
ValidationType: "vsphere-compute-resources",
210-
ValidationRule: "validation-esxi-host-dc0-c0-h0",
210+
ValidationRule: "validation-vsphere-compute-resources-esxi-host-dc0-c0-h0",
211211
Message: "All required compute resources were satisfied",
212212
Details: []string{},
213213
Failures: nil,
@@ -241,7 +241,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
241241
},
242242
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
243243
ValidationType: "vsphere-compute-resources",
244-
ValidationRule: "validation-esxi-host-dc0-c0-h0",
244+
ValidationRule: "validation-vsphere-compute-resources-esxi-host-dc0-c0-h0",
245245
Message: "One or more resource requirements were not satisfied",
246246
Details: []string{},
247247
Failures: []string{"Not enough resources available. CPU available: false, Memory available: true, Storage available: true"},
@@ -275,7 +275,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
275275
},
276276
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
277277
ValidationType: "vsphere-compute-resources",
278-
ValidationRule: "validation-esxi-host-dc0-c0-h0",
278+
ValidationRule: "validation-vsphere-compute-resources-esxi-host-dc0-c0-h0",
279279
Message: "One or more resource requirements were not satisfied",
280280
Details: []string{},
281281
Failures: []string{"Not enough resources available. CPU available: true, Memory available: false, Storage available: true"},
@@ -309,7 +309,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
309309
},
310310
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
311311
ValidationType: "vsphere-compute-resources",
312-
ValidationRule: "validation-esxi-host-dc0-c0-h0",
312+
ValidationRule: "validation-vsphere-compute-resources-esxi-host-dc0-c0-h0",
313313
Message: "One or more resource requirements were not satisfied",
314314
Details: []string{},
315315
Failures: []string{"Not enough resources available. CPU available: true, Memory available: true, Storage available: false"},
@@ -344,7 +344,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
344344
},
345345
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
346346
ValidationType: "vsphere-compute-resources",
347-
ValidationRule: "validation-resource-pool-dc0-c0-rp0",
347+
ValidationRule: "validation-vsphere-compute-resources-resource-pool-dc0-c0-rp0",
348348
Message: "All required compute resources were satisfied",
349349
Details: []string{},
350350
Failures: nil,
@@ -379,7 +379,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
379379
},
380380
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
381381
ValidationType: "vsphere-compute-resources",
382-
ValidationRule: "validation-resource-pool-dc0-c0-rp0",
382+
ValidationRule: "validation-vsphere-compute-resources-resource-pool-dc0-c0-rp0",
383383
Message: "One or more resource requirements were not satisfied",
384384
Details: []string{},
385385
Failures: []string{"Not enough resources available. CPU available: false, Memory available: true, Storage available: true"},
@@ -414,7 +414,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
414414
},
415415
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
416416
ValidationType: "vsphere-compute-resources",
417-
ValidationRule: "validation-resource-pool-dc0-c0-rp0",
417+
ValidationRule: "validation-vsphere-compute-resources-resource-pool-dc0-c0-rp0",
418418
Message: "One or more resource requirements were not satisfied",
419419
Details: []string{},
420420
Failures: []string{"Not enough resources available. CPU available: true, Memory available: false, Storage available: true"},
@@ -449,7 +449,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
449449
},
450450
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
451451
ValidationType: "vsphere-compute-resources",
452-
ValidationRule: "validation-resource-pool-dc0-c0-rp0",
452+
ValidationRule: "validation-vsphere-compute-resources-resource-pool-dc0-c0-rp0",
453453
Message: "One or more resource requirements were not satisfied",
454454
Details: []string{},
455455
Failures: []string{"Not enough resources available. CPU available: true, Memory available: true, Storage available: false"},
@@ -484,7 +484,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
484484
},
485485
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
486486
ValidationType: "vsphere-compute-resources",
487-
ValidationRule: "validation-resource-pool-dc0-c1-rp0",
487+
ValidationRule: "validation-vsphere-compute-resources-resource-pool-dc0-c1-rp0",
488488
Message: "Rule for scope already processed",
489489
Details: []string{},
490490
Failures: []string{"Rule for scope resource-pool-dc0-c1 already processed"},
@@ -518,7 +518,7 @@ func TestReconcileComputeResourceValidationRule(t *testing.T) {
518518
},
519519
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
520520
ValidationType: "vsphere-compute-resources",
521-
ValidationRule: "validation-cluster-dc0-c1",
521+
ValidationRule: "validation-vsphere-compute-resources-cluster-dc0-c1",
522522
Message: "Rule for scope already processed",
523523
Details: []string{},
524524
Failures: []string{"Rule for scope cluster-dc0-c1 already processed"},

pkg/validators/ntp/ntp.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ func NewValidationService(log logr.Logger, driver *vsphere.VCenterDriver, datace
3434
}
3535
}
3636

37-
func buildValidationResult(rule v1alpha1.NTPValidationRule, validationType string) *types.ValidationRuleResult {
37+
func buildValidationResult(rule v1alpha1.NTPValidationRule) *types.ValidationRuleResult {
3838
state := vapi.ValidationSucceeded
39+
validationType := constants.ValidationTypeNTP
3940

40-
validationRule := fmt.Sprintf("%s-%s", vapiconstants.ValidationRulePrefix, rule.Name())
41+
validationRule := fmt.Sprintf("%s-%s-%s", vapiconstants.ValidationRulePrefix, validationType, rule.Name())
4142

4243
latestCondition := vapi.DefaultValidationCondition()
4344
latestCondition.Message = "All required NTP rules were satisfied"
@@ -50,7 +51,7 @@ func buildValidationResult(rule v1alpha1.NTPValidationRule, validationType strin
5051
// ReconcileNTPRule reconciles the NTP rule
5152
func (n *ValidationService) ReconcileNTPRule(rule v1alpha1.NTPValidationRule, finder *find.Finder) (*types.ValidationRuleResult, error) {
5253
var err error
53-
vr := buildValidationResult(rule, constants.ValidationTypeNTP)
54+
vr := buildValidationResult(rule)
5455

5556
ctx, cancel := context.WithCancel(context.Background())
5657
defer cancel()

pkg/validators/privileges/privilege.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func NewPrivilegeValidationService(log logr.Logger, driver *vsphere.VCenterDrive
4343
// ReconcilePrivilegeRule reconciles a privilege rule
4444
func (s *PrivilegeValidationService) ReconcilePrivilegeRule(rule v1alpha1.PrivilegeValidationRule, finder *find.Finder) (*types.ValidationRuleResult, error) {
4545
var err error
46-
vr := s.buildPrivilegeValidationResult(rule)
46+
vr := buildValidationResult(rule, s.username)
4747

4848
ctx, cancel := context.WithCancel(context.Background())
4949
defer cancel()
@@ -59,18 +59,19 @@ func (s *PrivilegeValidationService) ReconcilePrivilegeRule(rule v1alpha1.Privil
5959
return vr, err
6060
}
6161

62-
func (s *PrivilegeValidationService) buildPrivilegeValidationResult(rule v1alpha1.PrivilegeValidationRule) *types.ValidationRuleResult {
62+
func buildValidationResult(rule v1alpha1.PrivilegeValidationRule, username string) *types.ValidationRuleResult {
6363
state := vapi.ValidationSucceeded
64+
validationType := constants.ValidationTypePrivileges
6465

65-
validationRule := fmt.Sprintf("%s-%s", vapiconstants.ValidationRulePrefix, rule.EntityType)
66+
validationRule := fmt.Sprintf("%s-%s-%s", vapiconstants.ValidationRulePrefix, validationType, rule.EntityType)
6667
if rule.EntityName != "" {
6768
validationRule = fmt.Sprintf("%s-%s", validationRule, rule.EntityName)
6869
}
6970

7071
latestCondition := vapi.DefaultValidationCondition()
71-
latestCondition.Message = fmt.Sprintf("All required %s permissions were found for account: %s", constants.ValidationTypePrivileges, s.username)
72+
latestCondition.Message = fmt.Sprintf("All required %s permissions were found for account: %s", constants.ValidationTypePrivileges, username)
7273
latestCondition.ValidationRule = util.Sanitize(validationRule)
73-
latestCondition.ValidationType = constants.ValidationTypePrivileges
74+
latestCondition.ValidationType = validationType
7475

7576
return &types.ValidationRuleResult{Condition: &latestCondition, State: &state}
7677
}

pkg/validators/privileges/privilege_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func TestPrivilegeValidationService_ReconcilePrivilegeRule(t *testing.T) {
7373
},
7474
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
7575
ValidationType: "vsphere-privileges",
76-
ValidationRule: "validation-cluster-dc0-c0",
76+
ValidationRule: "validation-vsphere-privileges-cluster-dc0-c0",
7777
Message: fmt.Sprintf("All required vsphere-privileges permissions were found for account: %s", username),
7878
Details: []string{},
7979
Failures: []string{},
@@ -97,7 +97,7 @@ func TestPrivilegeValidationService_ReconcilePrivilegeRule(t *testing.T) {
9797
},
9898
expectedResult: types.ValidationRuleResult{Condition: &vapi.ValidationCondition{
9999
ValidationType: "vsphere-privileges",
100-
ValidationRule: "validation-cluster-dc0-c0",
100+
ValidationRule: "validation-vsphere-privileges-cluster-dc0-c0",
101101
Message: fmt.Sprintf("One or more required privileges was not found, or a condition was not met for account: %s", username),
102102
Details: []string{},
103103
Failures: []string{"user: admin2@vsphere.local does not have privilege: VirtualMachine.Config.MagicCarpet on entity type: Cluster with name: DC0_C0"},

pkg/validators/tags/tags.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func NewValidationService(log logr.Logger) *ValidationService {
5656

5757
// ReconcileTagRules reconciles the tag rules
5858
func (s *ValidationService) ReconcileTagRules(tagsManager *tags.Manager, finder *find.Finder, driver *vsphere.VCenterDriver, rule v1alpha1.TagValidationRule) (*vapitypes.ValidationRuleResult, error) {
59-
vr := buildValidationResult(rule, constants.ValidationTypeTag)
59+
vr := buildValidationResult(rule)
6060

6161
valid, err := tagIsValid(tagsManager, finder, driver.Datacenter, rule)
6262
if !valid {
@@ -71,10 +71,11 @@ func (s *ValidationService) ReconcileTagRules(tagsManager *tags.Manager, finder
7171
return vr, nil
7272
}
7373

74-
func buildValidationResult(rule v1alpha1.TagValidationRule, validationType string) *vapitypes.ValidationRuleResult {
74+
func buildValidationResult(rule v1alpha1.TagValidationRule) *vapitypes.ValidationRuleResult {
7575
state := vapi.ValidationSucceeded
76+
validationType := constants.ValidationTypeTag
7677

77-
validationRule := fmt.Sprintf("%s-%s-%s-%s", vapiconstants.ValidationRulePrefix, "tag", rule.EntityType, rule.Tag)
78+
validationRule := fmt.Sprintf("%s-%s-%s-%s", vapiconstants.ValidationRulePrefix, validationType, rule.EntityType, rule.Tag)
7879

7980
latestCondition := vapi.DefaultValidationCondition()
8081
latestCondition.Message = "Required entity tags were found"

0 commit comments

Comments
 (0)