Skip to content

feat(api): enforce overrides validation and expand tests#132

Merged
fernando-villalba merged 1 commit intomainfrom
feat/cel-validation
Jan 22, 2026
Merged

feat(api): enforce overrides validation and expand tests#132
fernando-villalba merged 1 commit intomainfrom
feat/cel-validation

Conversation

@fernando-villalba
Copy link
Collaborator

The API previously allowed ambiguous configurations where both spec and overrides could be defined, and CEL validation rules lacked comprehensive testing coverage.

  • Added CEL rules to CellConfig and ShardConfig to strictly enforce mutual exclusion between spec and overrides
  • Renamed pkg/webhook/overrides_validation_test.go to pkg/webhook/cel_validation_test.go
  • Added comprehensive test cases for MultigresCluster, TopoServer, TableGroup, and Shard validation rules

Eliminates configuration ambiguity and ensures 100% test coverage for all API validation logic.

The API previously allowed ambiguous configurations where both `spec`
and `overrides` could be defined, and CEL validation rules lacked
comprehensive testing coverage.

- Added CEL rules to CellConfig and ShardConfig to strictly enforce
  mutual exclusion between `spec` and `overrides`
- Renamed pkg/webhook/overrides_validation_test.go to
  pkg/webhook/cel_validation_test.go
- Added comprehensive test cases for MultigresCluster, TopoServer,
  TableGroup, and Shard validation rules

Eliminates configuration ambiguity and ensures 100% test coverage for
all API validation logic.
@github-actions
Copy link

🔬 Go Test Coverage Report

Summary

Coverage Type Result
Threshold 0%
Previous Test Coverage 0.0%
New Test Coverage 33.6%

Status

✅ PASS

Detail

Show New Coverage
github.com/numtide/multigres-operator/api/v1alpha1/cell_types.go:161:			init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/celltemplate_types.go:63:		init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/coretemplate_types.go:64:		init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/multigrescluster_types.go:380:	init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/shard_types.go:208:			init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/shardtemplate_types.go:64:		init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/tablegroup_types.go:125:		init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/toposerver_types.go:214:		init				0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:14:		DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:23:		DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:33:		DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:41:		DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:56:		DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:66:		DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:76:		DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:86:		DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:97:		DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:107:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:121:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:131:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:139:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:149:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:159:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:178:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:188:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:200:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:210:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:215:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:225:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:233:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:243:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:251:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:265:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:275:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:283:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:298:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:308:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:318:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:328:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:334:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:344:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:352:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:362:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:370:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:384:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:394:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:402:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:417:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:427:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:439:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:449:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:454:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:464:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:476:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:486:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:496:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:506:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:511:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:521:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:536:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:546:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:561:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:571:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:581:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:591:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:602:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:612:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:621:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:631:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:639:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:653:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:663:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:671:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:702:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:712:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:738:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:748:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:772:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:782:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:791:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:801:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:809:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:824:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:834:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:844:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:854:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:867:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:877:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:891:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:901:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:909:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:926:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:936:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:949:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:959:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:974:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:984:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1001:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1011:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1019:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1029:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1037:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1051:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1061:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1069:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1086:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1096:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1126:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1136:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1146:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1156:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1165:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1175:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1183:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1195:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1205:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1219:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1229:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1237:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1251:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1261:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1273:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1283:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1288:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1298:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1307:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1317:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1325:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1339:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1349:	DeepCopyObject			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1357:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1367:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1377:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1389:	DeepCopy			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1399:	DeepCopyInto			0.0%
github.com/numtide/multigres-operator/api/v1alpha1/zz_generated.deepcopy.go:1404:	DeepCopy			0.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/generator.go:46:			GenerateCA			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/generator.go:102:		GenerateServerCert		100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/generator.go:163:		ParseCA				100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:54:			NewManager			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:63:			Bootstrap			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:74:			Start				100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:101:			reconcilePKI			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:119:			ensureCA			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:177:			ensureServerCert		100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:265:			waitForKubelet			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:293:			setOwner			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:308:			findOperatorDeployment		100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:338:			patchWebhooks			100.0%
github.com/numtide/multigres-operator/pkg/webhook/cert/manager.go:374:			recorderEvent			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/defaulter.go:24:		NewMultigresClusterDefaulter	100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/defaulter.go:31:		Default				100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:31:		NewMultigresClusterValidator	100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:35:		ValidateCreate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:42:		ValidateUpdate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:49:		ValidateDelete			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:56:		validate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:73:		validateTemplatesExist		100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:134:		NewTemplateValidator		100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:138:		ValidateCreate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:145:		ValidateUpdate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:152:		ValidateDelete			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:181:		isTemplateInUse			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:235:		NewChildResourceValidator	100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:241:		ValidateCreate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:248:		ValidateUpdate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:255:		ValidateDelete			100.0%
github.com/numtide/multigres-operator/pkg/webhook/handlers/validator.go:262:		validate			100.0%
github.com/numtide/multigres-operator/pkg/webhook/setup.go:24:				Setup				100.0%
total:											(statements)			33.6%

@fernando-villalba fernando-villalba merged commit 3706cba into main Jan 22, 2026
3 checks passed
@fernando-villalba fernando-villalba deleted the feat/cel-validation branch January 22, 2026 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant