@@ -162,11 +162,41 @@ func NewABCController(opts ...qtransform.ControllerOption) *ABController {
162162 },
163163 append (
164164 opts ,
165- qtransform .WithExtraMappedInput (func (_ context.Context , _ * zap.Logger , _ controller.QRuntime , c * C ) ([]resource.Pointer , error ) {
166- return []resource.Pointer {
167- NewA (c .Metadata ().ID (), ASpec {}).Metadata (),
168- }, nil
169- }),
165+ qtransform.WithExtraMappedInput [* C ](qtransform .MapperSameID [* A ]()),
166+ )... ,
167+ )
168+ }
169+
170+ func NewABCLabelsController (opts ... qtransform.ControllerOption ) * ABController {
171+ return qtransform .NewQController (
172+ qtransform.Settings [* A , * B ]{
173+ Name : "QTransformABCController" ,
174+ MapMetadataFunc : func (in * A ) * B {
175+ return NewB ("transformed-" + in .Metadata ().ID (), BSpec {})
176+ },
177+ UnmapMetadataFunc : func (in * B ) * A {
178+ return NewA (strings .TrimPrefix (in .Metadata ().ID (), "transformed-" ), ASpec {})
179+ },
180+ TransformFunc : func (ctx context.Context , r controller.Reader , _ * zap.Logger , in * A , out * B ) error {
181+ cList , err := safe .ReaderListAll [* C ](ctx , r , state .WithLabelQuery (resource .LabelEqual ("a" , in .Metadata ().ID ())))
182+ if err != nil && ! state .IsNotFoundError (err ) {
183+ return err
184+ }
185+
186+ out .TypedSpec ().Out = fmt .Sprintf ("%q-%d" , in .TypedSpec ().Str , in .TypedSpec ().Int )
187+
188+ for c := range cList .All () {
189+ out .TypedSpec ().Out += fmt .Sprintf ("-%d" , c .TypedSpec ().Aux )
190+ }
191+
192+ out .TypedSpec ().TransformCount ++
193+
194+ return nil
195+ },
196+ },
197+ append (
198+ opts ,
199+ qtransform.WithExtraMappedInput [* C ](qtransform.MapExtractLabelValue [* A ]("a" )),
170200 )... ,
171201 )
172202}
@@ -722,6 +752,19 @@ func TestRemappedInput(t *testing.T) {
722752 assert .Equal (`"baz"-3` , r .TypedSpec ().Out )
723753 }
724754 })
755+
756+ require .NoError (t , st .Destroy (ctx , NewC ("1" , CSpec {}).Metadata ()))
757+
758+ rtestutils .AssertResources (ctx , t , st , []resource.ID {"transformed-1" , "transformed-2" , "transformed-3" }, func (r * B , assert * assert.Assertions ) {
759+ switch r .Metadata ().ID () {
760+ case "transformed-1" :
761+ assert .Equal (`"foo"-1` , r .TypedSpec ().Out )
762+ case "transformed-2" :
763+ assert .Equal (`"bar"-2-22` , r .TypedSpec ().Out )
764+ case "transformed-3" :
765+ assert .Equal (`"baz"-3` , r .TypedSpec ().Out )
766+ }
767+ })
725768 })
726769}
727770
@@ -767,6 +810,84 @@ func TestRequeueErrorBackoff(t *testing.T) {
767810 })
768811}
769812
813+ func TestMappedByLabelInput (t * testing.T ) {
814+ setup (t , func (ctx context.Context , st state.State , runtime * runtime.Runtime ) {
815+ require .NoError (t , runtime .RegisterQController (NewABCLabelsController ()))
816+
817+ for _ , a := range []* A {
818+ NewA ("1" , ASpec {Str : "foo" , Int : 1 }),
819+ NewA ("2" , ASpec {Str : "bar" , Int : 2 }),
820+ NewA ("3" , ASpec {Str : "baz" , Int : 3 }),
821+ } {
822+ require .NoError (t , st .Create (ctx , a ))
823+ }
824+
825+ rtestutils .AssertResources (ctx , t , st , []resource.ID {"transformed-1" , "transformed-2" , "transformed-3" }, func (r * B , assert * assert.Assertions ) {
826+ switch r .Metadata ().ID () {
827+ case "transformed-1" :
828+ assert .Equal (`"foo"-1` , r .TypedSpec ().Out )
829+ case "transformed-2" :
830+ assert .Equal (`"bar"-2` , r .TypedSpec ().Out )
831+ case "transformed-3" :
832+ assert .Equal (`"baz"-3` , r .TypedSpec ().Out )
833+ }
834+ })
835+
836+ c1 := NewC ("cA" , CSpec {Aux : 11 })
837+ c1 .Metadata ().Labels ().Set ("a" , "1" )
838+ require .NoError (t , st .Create (ctx , c1 ))
839+
840+ c2 := NewC ("cB" , CSpec {Aux : 22 })
841+ c2 .Metadata ().Labels ().Set ("a" , "2" )
842+ require .NoError (t , st .Create (ctx , c2 ))
843+
844+ c3 := NewC ("cC" , CSpec {Aux : 33 })
845+ c3 .Metadata ().Labels ().Set ("a" , "1" )
846+ require .NoError (t , st .Create (ctx , c3 ))
847+
848+ rtestutils .AssertResources (ctx , t , st , []resource.ID {"transformed-1" , "transformed-2" , "transformed-3" }, func (r * B , assert * assert.Assertions ) {
849+ switch r .Metadata ().ID () {
850+ case "transformed-1" :
851+ assert .Equal (`"foo"-1-11-33` , r .TypedSpec ().Out )
852+ case "transformed-2" :
853+ assert .Equal (`"bar"-2-22` , r .TypedSpec ().Out )
854+ case "transformed-3" :
855+ assert .Equal (`"baz"-3` , r .TypedSpec ().Out )
856+ }
857+ })
858+
859+ require .NoError (t , st .Destroy (ctx , c2 .Metadata ()))
860+
861+ rtestutils .AssertResources (ctx , t , st , []resource.ID {"transformed-1" , "transformed-2" , "transformed-3" }, func (r * B , assert * assert.Assertions ) {
862+ switch r .Metadata ().ID () {
863+ case "transformed-1" :
864+ assert .Equal (`"foo"-1-11-33` , r .TypedSpec ().Out )
865+ case "transformed-2" :
866+ assert .Equal (`"bar"-2` , r .TypedSpec ().Out )
867+ case "transformed-3" :
868+ assert .Equal (`"baz"-3` , r .TypedSpec ().Out )
869+ }
870+ })
871+
872+ require .NoError (t , st .Destroy (ctx , c1 .Metadata ()))
873+
874+ c4 := NewC ("cD" , CSpec {Aux : 44 })
875+ c4 .Metadata ().Labels ().Set ("a" , "3" )
876+ require .NoError (t , st .Create (ctx , c4 ))
877+
878+ rtestutils .AssertResources (ctx , t , st , []resource.ID {"transformed-1" , "transformed-2" , "transformed-3" }, func (r * B , assert * assert.Assertions ) {
879+ switch r .Metadata ().ID () {
880+ case "transformed-1" :
881+ assert .Equal (`"foo"-1-33` , r .TypedSpec ().Out )
882+ case "transformed-2" :
883+ assert .Equal (`"bar"-2` , r .TypedSpec ().Out )
884+ case "transformed-3" :
885+ assert .Equal (`"baz"-3-44` , r .TypedSpec ().Out )
886+ }
887+ })
888+ })
889+ }
890+
770891func setup (t * testing.T , f func (ctx context.Context , st state.State , rt * runtime.Runtime ), opts ... options.Option ) {
771892 defer goleak .VerifyNone (t , goleak .IgnoreCurrent ())
772893
0 commit comments