@@ -39,18 +39,17 @@ func (f *fakeDiscovery) OpenAPISchema() (*openapi_v2.Document, error) {
3939 return f .schema , nil
4040}
4141
42- func loadHTTPProxySchema (t * testing.T ) * openapi_v2.Document {
42+ func loadCRDSchema (t * testing.T , path string ) * openapi_v2.Document {
4343 t .Helper ()
4444
45- data , err := os .ReadFile ("testdata/httpproxy_openapi_v2.yaml" )
45+ data , err := os .ReadFile (path )
4646 require .NoError (t , err )
4747
4848 jsonData , err := yaml .YAMLToJSON (data )
4949 require .NoError (t , err )
5050
5151 doc , err := openapi_v2 .ParseDocument (jsonData )
5252 require .NoError (t , err )
53- fmt .Printf ("definitions: %+v\n " , doc .Definitions )
5453
5554 return doc
5655}
@@ -541,7 +540,7 @@ func TestNormalizeTargetResourcesWithList(t *testing.T) {
541540 }
542541
543542 t .Run ("will properly ignore nested fields within arrays" , func (t * testing.T ) {
544- doc := loadHTTPProxySchema ( t )
543+ doc := loadCRDSchema ( t , "testdata/httpproxy_openapi_v2.yaml" )
545544 disco := & fakeDiscovery {schema : doc }
546545 oapiGetter := openapi .NewOpenAPIGetter (disco )
547546 oapiResources , err := openapi .NewOpenAPIParser (oapiGetter ).Parse ()
@@ -710,7 +709,7 @@ func TestNormalizeTargetResourcesWithList(t *testing.T) {
710709 })
711710
712711 t .Run ("patches ignored differences in individual array elements of HTTPProxy CRD" , func (t * testing.T ) {
713- doc := loadHTTPProxySchema ( t )
712+ doc := loadCRDSchema ( t , "testdata/httpproxy_openapi_v2.yaml" )
714713 disco := & fakeDiscovery {schema : doc }
715714 oapiGetter := openapi .NewOpenAPIGetter (disco )
716715 oapiResources , err := openapi .NewOpenAPIParser (oapiGetter ).Parse ()
@@ -753,6 +752,85 @@ func TestNormalizeTargetResourcesWithList(t *testing.T) {
753752 })
754753}
755754
755+ func TestNormalizeTargetResourcesCRDs (t * testing.T ) {
756+ type fixture struct {
757+ comparisonResult * comparisonResult
758+ }
759+ setupHTTPProxy := func (t * testing.T , ignores []v1alpha1.ResourceIgnoreDifferences ) * fixture {
760+ t .Helper ()
761+ dc , err := diff .NewDiffConfigBuilder ().
762+ WithDiffSettings (ignores , nil , true , normalizers.IgnoreNormalizerOpts {}).
763+ WithNoCache ().
764+ Build ()
765+ require .NoError (t , err )
766+ live := test .YamlToUnstructured (testdata .SimpleAppLiveYaml )
767+ target := test .YamlToUnstructured (testdata .SimpleAppTargetYaml )
768+ return & fixture {
769+ & comparisonResult {
770+ reconciliationResult : sync.ReconciliationResult {
771+ Live : []* unstructured.Unstructured {live },
772+ Target : []* unstructured.Unstructured {target },
773+ },
774+ diffConfig : dc ,
775+ },
776+ }
777+ }
778+
779+ t .Run ("sample-app" , func (t * testing.T ) {
780+ doc := loadCRDSchema (t , "testdata/simple-app.yaml" )
781+ disco := & fakeDiscovery {schema : doc }
782+ oapiGetter := openapi .NewOpenAPIGetter (disco )
783+ oapiResources , err := openapi .NewOpenAPIParser (oapiGetter ).Parse ()
784+ require .NoError (t , err )
785+
786+ ignores := []v1alpha1.ResourceIgnoreDifferences {
787+ {
788+ Group : "example.com" ,
789+ Kind : "SimpleApp" ,
790+ JQPathExpressions : []string {".spec.servers[1].enabled" , ".spec.servers[0].port" },
791+ },
792+ }
793+
794+ f := setupHTTPProxy (t , ignores )
795+
796+ target := test .YamlToUnstructured (testdata .SimpleAppTargetYaml )
797+ f .comparisonResult .reconciliationResult .Target = []* unstructured.Unstructured {target }
798+
799+ live := test .YamlToUnstructured (testdata .SimpleAppLiveYaml )
800+ f .comparisonResult .reconciliationResult .Live = []* unstructured.Unstructured {live }
801+
802+ patchedTargets , err := normalizeTargetResources (oapiResources , f .comparisonResult )
803+ require .NoError (t , err )
804+ require .Len (t , patchedTargets , 1 )
805+
806+ patched := patchedTargets [0 ]
807+ require .NotNil (t , patched )
808+
809+ // 'spec.servers' array has length 2
810+ servers := dig (patched .Object , "spec" , "servers" ).([]any )
811+ require .Len (t , servers , 2 )
812+
813+ // first server's 'name' is 'server1'
814+ name1 := dig (patched .Object , "spec" , "servers" , 0 , "name" ).(string )
815+ assert .Equal (t , "server1" , name1 )
816+
817+ assert .Equal (t , int64 (8081 ), dig (patched .Object , "spec" , "servers" , 0 , "port" ).(int64 ))
818+ assert .Equal (t , int64 (9090 ), dig (patched .Object , "spec" , "servers" , 1 , "port" ).(int64 ))
819+
820+ // first server's 'enabled' should be true
821+ enabled1 := dig (patched .Object , "spec" , "servers" , 0 , "enabled" ).(bool )
822+ assert .True (t , enabled1 )
823+
824+ // second server's 'name' should be 'server2'
825+ name2 := dig (patched .Object , "spec" , "servers" , 1 , "name" ).(string )
826+ assert .Equal (t , "server2" , name2 )
827+
828+ // second server's 'enabled' should be true (respected from live due to ignoreDifferences)
829+ enabled2 := dig (patched .Object , "spec" , "servers" , 1 , "enabled" ).(bool )
830+ assert .True (t , enabled2 )
831+ })
832+ }
833+
756834func TestDeriveServiceAccountMatchingNamespaces (t * testing.T ) {
757835 t .Parallel ()
758836
0 commit comments