From 049fdbd5e15273380ef2fd65981bb137cd8486e0 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Tue, 5 May 2026 15:27:05 +0200 Subject: [PATCH 01/16] feat: use Lister from provider instead of all client On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/initializer.go | 6 +- cmd/model_generator.go | 5 +- cmd/system.go | 4 +- cmd/terminator.go | 4 +- go.mod | 20 ++- go.sum | 22 ++- internal/client/all_platformmesh.go | 51 ------ internal/client/kcp_helper.go | 23 ++- .../accountlogicalcluster_controller.go | 3 +- internal/controller/apibinding_controller.go | 10 +- .../controller/apiexportpolicy_controller.go | 22 +-- .../orglogicalcluster_controller.go | 4 +- internal/controller/store_controller.go | 16 +- internal/subroutine/apiexportpolicy.go | 14 +- internal/subroutine/apiexportpolicy_test.go | 137 +++++----------- internal/subroutine/authorization_model.go | 19 +-- .../authorization_model_generation.go | 16 +- .../authorization_model_generation_test.go | 155 +++++++++--------- .../subroutine/authorization_model_test.go | 52 +++--- internal/subroutine/mocks/mock_KcpHelper.go | 60 +++---- internal/subroutine/mocks/mock_Manager.go | 48 +++--- internal/subroutine/store.go | 20 +-- internal/subroutine/store_test.go | 59 +++---- internal/subroutine/tuples.go | 5 +- internal/subroutine/tuples_test.go | 7 +- internal/terminatingworkspaces/provider.go | 92 +++++------ internal/test/integration/suite_test.go | 5 +- 27 files changed, 381 insertions(+), 498 deletions(-) delete mode 100644 internal/client/all_platformmesh.go diff --git a/cmd/initializer.go b/cmd/initializer.go index 816c0cd9..ee494972 100644 --- a/cmd/initializer.go +++ b/cmd/initializer.go @@ -101,10 +101,12 @@ var initializerCmd = &cobra.Command{ initializerCfg.IDP.AdditionalRedirectURLs = []string{} } + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + orgReconciler, err := controller.NewOrgLogicalClusterController(log, orgClient, initializerCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterInitializer", InitializerName: initializerCfg.InitializerName(), - }) + }, kcpClientHelper) if err != nil { setupLog.Error(err, "unable to create LogicalCluster initializer") os.Exit(1) @@ -132,7 +134,7 @@ var initializerCmd = &cobra.Command{ Name: "AccountLogicalClusterInitializer", InitializerName: initializerCfg.InitializerName(), TerminatorName: initializerCfg.TerminatorName(), - }) + }, kcpClientHelper) if err != nil { setupLog.Error(err, "unable to create AccountLogicalCluster reconciler") os.Exit(1) diff --git a/cmd/model_generator.go b/cmd/model_generator.go index d0af3325..628b1670 100644 --- a/cmd/model_generator.go +++ b/cmd/model_generator.go @@ -7,6 +7,7 @@ import ( platformeshcontext "github.com/platform-mesh/golang-commons/context" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" + iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/security-operator/internal/controller" "github.com/spf13/cobra" ctrl "sigs.k8s.io/controller-runtime" @@ -84,7 +85,9 @@ var modelGeneratorCmd = &cobra.Command{ return err } - if err := controller.NewAPIBindingReconciler(ctx, log, mgr, &generatorCfg). + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + + if err := controller.NewAPIBindingReconciler(ctx, log, mgr, &generatorCfg, kcpClientHelper). SetupWithManager(mgr, defaultCfg); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Resource") return err diff --git a/cmd/system.go b/cmd/system.go index 36bf871e..afa16f20 100644 --- a/cmd/system.go +++ b/cmd/system.go @@ -108,7 +108,9 @@ var systemCmd = &cobra.Command{ return err } - if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, &systemCfg, storeIDGetter).SetupWithManager(mgr, defaultCfg, &systemCfg); err != nil { + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + + if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, &systemCfg, storeIDGetter, kcpClientHelper).SetupWithManager(mgr, defaultCfg, &systemCfg); err != nil { log.Error().Err(err).Str("controller", "apiexportpolicy").Msg("unable to create controller") return err } diff --git a/cmd/terminator.go b/cmd/terminator.go index 090100fd..a2dd44af 100644 --- a/cmd/terminator.go +++ b/cmd/terminator.go @@ -107,10 +107,12 @@ var terminatorCmd = &cobra.Command{ log, ) + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + alcReconciler, err := controller.NewAccountLogicalClusterController(log, terminatorCfg, fgaClient, storeIDGetter, mgr, controller.ControllerOptions{ Name: "AccountLogicalClusterTerminator", TerminatorName: terminatorCfg.TerminatorName(), - }) + }, kcpClientHelper) if err != nil { log.Error().Err(err).Msg("unable to create AccountLogicalCluster reconciler") os.Exit(1) diff --git a/go.mod b/go.mod index d945600a..7e72f1b7 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/platform-mesh/security-operator -go 1.26 +go 1.26.0 require ( github.com/coreos/go-oidc v2.5.0+incompatible @@ -11,12 +11,13 @@ require ( github.com/jellydator/ttlcache/v3 v3.4.0 github.com/kcp-dev/logicalcluster/v3 v3.0.5 github.com/kcp-dev/multicluster-provider v0.5.1 + github.com/kcp-dev/multicluster-provider/client v0.0.0-00010101000000-000000000000 github.com/kcp-dev/sdk v0.31.0 github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 github.com/openfga/language/pkg/go v0.2.1 github.com/platform-mesh/account-operator v0.14.3 github.com/platform-mesh/golang-commons v0.15.6 - github.com/platform-mesh/subroutines v0.3.3 + github.com/platform-mesh/subroutines v0.4.3 github.com/rs/zerolog v1.35.0 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 @@ -24,14 +25,14 @@ require ( github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/grpc v1.80.0 - google.golang.org/protobuf v1.36.11 + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af k8s.io/api v0.35.3 k8s.io/apiextensions-apiserver v0.35.3 - k8s.io/apimachinery v0.35.4 + k8s.io/apimachinery v0.36.0 k8s.io/client-go v0.35.3 k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 sigs.k8s.io/controller-runtime v0.23.3 - sigs.k8s.io/multicluster-runtime v0.23.1 + sigs.k8s.io/multicluster-runtime v0.23.3 sigs.k8s.io/yaml v1.6.0 ) @@ -75,7 +76,6 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kcp-dev/apimachinery/v2 v2.31.0 // indirect @@ -128,9 +128,13 @@ require ( gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect ) + +replace github.com/kcp-dev/multicluster-provider => github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87 + +replace github.com/kcp-dev/multicluster-provider/client => github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 diff --git a/go.sum b/go.sum index ad615f8c..a90b1b3d 100644 --- a/go.sum +++ b/go.sum @@ -128,8 +128,6 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY= @@ -140,8 +138,10 @@ github.com/kcp-dev/apimachinery/v2 v2.31.0 h1:N/ALc/v8ZXMxC9a8ovXeQaiFwx8COrqG+F github.com/kcp-dev/apimachinery/v2 v2.31.0/go.mod h1:ta+d3xQkLYWBEEg8ICed+PekW3MckEYqXG4amq6Uk9Y= github.com/kcp-dev/logicalcluster/v3 v3.0.5 h1:JbYakokb+5Uinz09oTXomSUJVQsqfxEvU4RyHUYxHOU= github.com/kcp-dev/logicalcluster/v3 v3.0.5/go.mod h1:EWBUBxdr49fUB1cLMO4nOdBWmYifLbP1LfoL20KkXYY= -github.com/kcp-dev/multicluster-provider v0.5.1 h1:2qMZzLPvzClT2ks+AMyE97PD+2lrDv3r0wDCKBxsr7E= -github.com/kcp-dev/multicluster-provider v0.5.1/go.mod h1:eJohrSXqLmpjfTSFBbZMoq4Osr57UKg9ZokvhCPNmHc= +github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87 h1:42L/Nn5Y3oodjrOoBdtkF8zXFmCPsKc1CVkkdhUKYzU= +github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87/go.mod h1:JB+ntaOpqhRFDRd+O7AYM5QZvt8/I/Xeo7SrW7+77EQ= +github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 h1:XlZ5niiYWAlMmmr8cxWyt5vtXb0MbyktkyDKzfPKmkE= +github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87/go.mod h1:kK9CSLmECoRiOU+xKOhIE4tHpQBcBbBvWOgKORC/eqI= github.com/kcp-dev/sdk v0.31.0 h1:fLqgY6MHVmmBcttqR/V3h2Dnv7xmab84FTKTwV08+Bo= github.com/kcp-dev/sdk v0.31.0/go.mod h1:GpNW9wPULY9+UuLVAaB5z/sJ8r0Jo/l0Jgy4BKnIJTE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= @@ -186,6 +186,8 @@ github.com/platform-mesh/golang-commons v0.15.6 h1:zR8IoHi0OTy4Q/gMIO8+ta+caaluM github.com/platform-mesh/golang-commons v0.15.6/go.mod h1:nZ1oQ0Rk/nrSKYxk5iiG+cO+YSSWPYv8iben3AqPrdE= github.com/platform-mesh/subroutines v0.3.3 h1:WKz0ZJnceC5KvUYrbmAdGTRnECkI6I4YXAEq3vKEV3Q= github.com/platform-mesh/subroutines v0.3.3/go.mod h1:4NmIkZXmbndYu4JzHWPu9JNoDipJcXP4oy4OPnLNT0Q= +github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= +github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -300,6 +302,8 @@ google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -318,6 +322,8 @@ k8s.io/apiextensions-apiserver v0.35.3 h1:2fQUhEO7P17sijylbdwt0nBdXP0TvHrHj0KeqH k8s.io/apiextensions-apiserver v0.35.3/go.mod h1:tK4Kz58ykRpwAEkXUb634HD1ZAegEElktz/B3jgETd8= k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= +k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ= +k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc= k8s.io/apiserver v0.35.3 h1:D2eIcfJ05hEAEewoSDg+05e0aSRwx8Y4Agvd/wiomUI= k8s.io/apiserver v0.35.3/go.mod h1:JI0n9bHYzSgIxgIrfe21dbduJ9NHzKJ6RchcsmIKWKY= k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg= @@ -326,16 +332,20 @@ k8s.io/component-base v0.35.3 h1:mbKbzoIMy7JDWS/wqZobYW1JDVRn/RKRaoMQHP9c4P0= k8s.io/component-base v0.35.3/go.mod h1:IZ8LEG30kPN4Et5NeC7vjNv5aU73ku5MS15iZyvyMYk= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY= k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM= k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/multicluster-runtime v0.23.1 h1:isjVh6zBuk/U1HjYm22knRZmFsn6sFinmyvV+/4puCc= -sigs.k8s.io/multicluster-runtime v0.23.1/go.mod h1:ri1Gvx7Qehy5nis6OnTgSpJIWaf2SuorHDwF/jvbWvM= +sigs.k8s.io/multicluster-runtime v0.23.3 h1:vrzlXRzHTDsjspUAfoW2rCtr0agoI4q20p9x4Fz4png= +sigs.k8s.io/multicluster-runtime v0.23.3/go.mod h1:r/UA4GHgFoXCcR4tcvlZz7SiLx3l1kJKDuBAhILNIHs= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= diff --git a/internal/client/all_platformmesh.go b/internal/client/all_platformmesh.go deleted file mode 100644 index 25960b4d..00000000 --- a/internal/client/all_platformmesh.go +++ /dev/null @@ -1,51 +0,0 @@ -package client - -import ( - "context" - "fmt" - "net/url" - - "sigs.k8s.io/controller-runtime/pkg/client" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/rest" - - "github.com/kcp-dev/logicalcluster/v3" - kcpapisv1alpha1 "github.com/kcp-dev/sdk/apis/apis/v1alpha1" -) - -const ( - platformMeshSystemWorkspace = "root:platform-mesh-system" -) - -// GetAllClient returns a client that can query all resources -// of the APIExportEndpointSlice, based on a given KCP -// base config and APIExportEndpointSlice name -func GetAllClient(ctx context.Context, config *rest.Config, scheme *runtime.Scheme, apiexportEndpointSliceName string) (client.Client, error) { - platformMeshClient, err := NewForLogicalCluster(config, scheme, logicalcluster.Name(platformMeshSystemWorkspace)) - if err != nil { - return nil, fmt.Errorf("creating %s client: %w", platformMeshSystemWorkspace, err) - } - - var apiExportEndpointSlice kcpapisv1alpha1.APIExportEndpointSlice - if err := platformMeshClient.Get(ctx, types.NamespacedName{Name: apiexportEndpointSliceName}, &apiExportEndpointSlice); err != nil { - return nil, fmt.Errorf("getting %s APIExportEndpointSlice: %w", apiexportEndpointSliceName, err) - } - - if len(apiExportEndpointSlice.Status.APIExportEndpoints) == 0 { - return nil, fmt.Errorf("no endpoints found in %s APIExportEndpointSlice", apiexportEndpointSliceName) - } - - virtualWorkspaceUrl, err := url.Parse(apiExportEndpointSlice.Status.APIExportEndpoints[0].URL) - if err != nil { - return nil, fmt.Errorf("parsing virtual workspace URL: %w", err) - } - - path, err := url.JoinPath(virtualWorkspaceUrl.Path, "clusters", logicalcluster.Wildcard.String()) - if err != nil { - return nil, fmt.Errorf("joining path: %w", err) - } - - return clientForPath(config, scheme, path) -} diff --git a/internal/client/kcp_helper.go b/internal/client/kcp_helper.go index 69f29787..8a36edb7 100644 --- a/internal/client/kcp_helper.go +++ b/internal/client/kcp_helper.go @@ -3,32 +3,37 @@ package client import ( "context" - "sigs.k8s.io/controller-runtime/pkg/client" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" "github.com/kcp-dev/logicalcluster/v3" + mcpprovider "github.com/kcp-dev/multicluster-provider/pkg/provider" ) type KcpClientHelper interface { NewClientForLogicalCluster(clusterKey logicalcluster.Name) (client.Client, error) - GetAllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) + List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error } type KcpHelper struct { - config *rest.Config - scheme *runtime.Scheme + config *rest.Config + scheme *runtime.Scheme + provider *mcpprovider.Provider } -func NewKcpHelper(config *rest.Config, scheme *runtime.Scheme) *KcpHelper { - return &KcpHelper{config: config, scheme: scheme} +func NewKcpHelper(config *rest.Config, scheme *runtime.Scheme, provider *mcpprovider.Provider) *KcpHelper { + return &KcpHelper{ + config: config, + scheme: scheme, + provider: provider, + } } func (f *KcpHelper) NewClientForLogicalCluster(clusterKey logicalcluster.Name) (client.Client, error) { return NewForLogicalCluster(f.config, f.scheme, clusterKey) } -func (f *KcpHelper) GetAllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) { - return GetAllClient(ctx, f.config, f.scheme, apiexportEndpointSliceName) +func (f *KcpHelper) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + return f.provider.Lister().List(ctx, list, opts...) } diff --git a/internal/controller/accountlogicalcluster_controller.go b/internal/controller/accountlogicalcluster_controller.go index a1d870c7..10042adc 100644 --- a/internal/controller/accountlogicalcluster_controller.go +++ b/internal/controller/accountlogicalcluster_controller.go @@ -34,13 +34,12 @@ type AccountLogicalClusterController struct { rateLimiter workqueue.TypedRateLimiter[mcreconcile.Request] } -func NewAccountLogicalClusterController(log *logger.Logger, cfg config.Config, fgaClient openfgav1.OpenFGAServiceClient, storeIDGetter fga.StoreIDGetter, mgr mcmanager.Manager, opts ControllerOptions) (*AccountLogicalClusterController, error) { +func NewAccountLogicalClusterController(log *logger.Logger, cfg config.Config, fgaClient openfgav1.OpenFGAServiceClient, storeIDGetter fga.StoreIDGetter, mgr mcmanager.Manager, opts ControllerOptions, kcpClientHelper iclient.KcpClientHelper) (*AccountLogicalClusterController, error) { rl, err := ratelimiter.NewStaticThenExponentialRateLimiter[mcreconcile.Request](ratelimiter.NewConfig()) if err != nil { return nil, fmt.Errorf("creating RateLimiter: %w", err) } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme()) lc := lifecycle.New(mgr, opts.Name, func() client.Object { return &kcpcorev1alpha1.LogicalCluster{} }, subroutine.NewAccountTuplesSubroutine(mgr, fgaClient, storeIDGetter, cfg.FGA.CreatorRelation, cfg.FGA.ParentRelation, cfg.FGA.ObjectType, kcpClientHelper)) diff --git a/internal/controller/apibinding_controller.go b/internal/controller/apibinding_controller.go index 25f9cb8b..81517be4 100644 --- a/internal/controller/apibinding_controller.go +++ b/internal/controller/apibinding_controller.go @@ -10,7 +10,6 @@ import ( "github.com/platform-mesh/security-operator/internal/config" "github.com/platform-mesh/security-operator/internal/subroutine" "github.com/platform-mesh/subroutines/lifecycle" - "github.com/rs/zerolog/log" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -22,15 +21,10 @@ import ( kcpapisv1alpha2 "github.com/kcp-dev/sdk/apis/apis/v1alpha2" ) -func NewAPIBindingReconciler(ctx context.Context, logger *logger.Logger, mcMgr mcmanager.Manager, cfg *config.Config) *APIBindingReconciler { - allclient, err := iclient.GetAllClient(ctx, mcMgr.GetLocalManager().GetConfig(), mcMgr.GetLocalManager().GetScheme(), cfg.APIExportEndpointSlices.CorePlatformMeshIO) - if err != nil { - log.Fatal().Err(err).Msg("unable to create new client") - } - +func NewAPIBindingReconciler(ctx context.Context, logger *logger.Logger, mcMgr mcmanager.Manager, cfg *config.Config, kcpHelper iclient.KcpClientHelper) *APIBindingReconciler { lc := lifecycle.New(mcMgr, "APIBindingReconciler", func() client.Object { return &kcpapisv1alpha2.APIBinding{} - }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, allclient)) + }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, kcpHelper)) return &APIBindingReconciler{ log: logger, diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index 9f224910..be69e1f7 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -25,6 +25,7 @@ import ( mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" "sigs.k8s.io/multicluster-runtime/pkg/handler" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" "k8s.io/apimachinery/pkg/types" @@ -39,12 +40,12 @@ const ( ) type APIExportPolicyReconciler struct { - log *logger.Logger - lifecycle *lifecycle.Lifecycle + log *logger.Logger + lifecycle *lifecycle.Lifecycle + kcpHelper iclient.KcpClientHelper } -func NewAPIExportPolicyReconciler(log *logger.Logger, fgaClient openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, storeIDGetter fga.StoreIDGetter) *APIExportPolicyReconciler { - kcpClientHelper := iclient.NewKcpHelper(mcMgr.GetLocalManager().GetConfig(), mcMgr.GetLocalManager().GetScheme()) +func NewAPIExportPolicyReconciler(log *logger.Logger, fgaClient openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, storeIDGetter fga.StoreIDGetter, kcpClientHelper iclient.KcpClientHelper) *APIExportPolicyReconciler { lc := lifecycle.New(mcMgr, "APIExportPolicyReconciler", func() client.Object { return &corev1alpha1.APIExportPolicy{} }, subroutine.NewAPIExportPolicySubroutine(fgaClient, mcMgr, cfg, storeIDGetter, kcpClientHelper)). @@ -53,6 +54,7 @@ func NewAPIExportPolicyReconciler(log *logger.Logger, fgaClient openfgav1.OpenFG return &APIExportPolicyReconciler{ log: log, lifecycle: lc, + kcpHelper: kcpClientHelper, } } @@ -73,7 +75,7 @@ func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg WithEventFilter(predicate.And(predicates...)). Watches( &kcptenancyv1alpha1.Workspace{}, - func(clusterName string, c cluster.Cluster) ctrhandler.TypedEventHandler[client.Object, mcreconcile.Request] { + func(_ multicluster.ClusterName, _ cluster.Cluster) ctrhandler.TypedEventHandler[client.Object, mcreconcile.Request] { return handler.TypedEnqueueRequestsFromMapFuncWithClusterPreservation(func(ctx context.Context, obj client.Object) []mcreconcile.Request { ws, ok := obj.(*kcptenancyv1alpha1.Workspace) if !ok { @@ -93,14 +95,8 @@ func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg } func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Context, mgr mcmanager.Manager, cfg *config.Config) []mcreconcile.Request { - allClient, err := iclient.GetAllClient(ctx, mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), cfg.APIExportEndpointSlices.SystemPlatformMeshIO) - if err != nil { - r.log.Error().Err(err).Msg("failed to create all-cluster client for APIExportPolicy listing") - return nil - } - var policies corev1alpha1.APIExportPolicyList - if err := allClient.List(ctx, &policies); err != nil { + if err := r.kcpHelper.List(ctx, &policies); err != nil { r.log.Error().Err(err).Msg("failed to list APIExportPolicy resources") return nil } @@ -119,7 +115,7 @@ func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Cont Name: policy.Name, }, }, - ClusterName: clusterName.String(), + ClusterName: multicluster.ClusterName(clusterName.String()), }) break } diff --git a/internal/controller/orglogicalcluster_controller.go b/internal/controller/orglogicalcluster_controller.go index 2f127845..2379db11 100644 --- a/internal/controller/orglogicalcluster_controller.go +++ b/internal/controller/orglogicalcluster_controller.go @@ -40,14 +40,12 @@ type OrgLogicalClusterController struct { rateLimiter workqueue.TypedRateLimiter[mcreconcile.Request] } -func NewOrgLogicalClusterController(log *logger.Logger, orgClient client.Client, cfg config.Config, inClusterClient client.Client, mgr mcmanager.Manager, opts ControllerOptions) (*OrgLogicalClusterController, error) { +func NewOrgLogicalClusterController(log *logger.Logger, orgClient client.Client, cfg config.Config, inClusterClient client.Client, mgr mcmanager.Manager, opts ControllerOptions, kcpClientHelper iclient.KcpClientHelper) (*OrgLogicalClusterController, error) { rl, err := ratelimiter.NewStaticThenExponentialRateLimiter[mcreconcile.Request](ratelimiter.NewConfig()) if err != nil { return nil, fmt.Errorf("creating RateLimiter: %w", err) } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme()) - var subs []subroutines.Subroutine if cfg.Initializer.WorkspaceInitializerEnabled { diff --git a/internal/controller/store_controller.go b/internal/controller/store_controller.go index 2f645eeb..71f8bc22 100644 --- a/internal/controller/store_controller.go +++ b/internal/controller/store_controller.go @@ -23,6 +23,7 @@ import ( mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" "sigs.k8s.io/multicluster-runtime/pkg/handler" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" "k8s.io/apimachinery/pkg/types" @@ -37,17 +38,12 @@ type StoreReconciler struct { lifecycle *lifecycle.Lifecycle } -func NewStoreReconciler(ctx context.Context, log *logger.Logger, fga openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config) *StoreReconciler { - allClient, err := iclient.GetAllClient(ctx, mcMgr.GetLocalManager().GetConfig(), mcMgr.GetLocalManager().GetScheme(), cfg.APIExportEndpointSlices.CorePlatformMeshIO) - if err != nil { - log.Fatal().Err(err).Msg("unable to create new client") - } - +func NewStoreReconciler(ctx context.Context, log *logger.Logger, fga openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, kcpHelper iclient.KcpClientHelper) *StoreReconciler { lc := lifecycle.New(mcMgr, "StoreReconciler", func() client.Object { return &corev1alpha1.Store{} }, - subroutine.NewStoreSubroutine(fga, mcMgr), - subroutine.NewAuthorizationModelSubroutine(fga, mcMgr, allClient, func(cfg *rest.Config) discovery.DiscoveryInterface { + subroutine.NewStoreSubroutine(fga, mcMgr, kcpHelper), + subroutine.NewAuthorizationModelSubroutine(fga, mcMgr, kcpHelper, func(cfg *rest.Config) discovery.DiscoveryInterface { return discovery.NewDiscoveryClientForConfigOrDie(cfg) }, log), subroutine.NewTupleSubroutine(fga, mcMgr), @@ -76,7 +72,7 @@ func (r *StoreReconciler) SetupWithManager(mgr mcmanager.Manager, cfg *platforme return b. Watches( &corev1alpha1.AuthorizationModel{}, - func(clusterName string, c cluster.Cluster) ctrhandler.TypedEventHandler[client.Object, mcreconcile.Request] { + func(_ multicluster.ClusterName, _ cluster.Cluster) ctrhandler.TypedEventHandler[client.Object, mcreconcile.Request] { return handler.TypedEnqueueRequestsFromMapFuncWithClusterPreservation(func(ctx context.Context, obj client.Object) []mcreconcile.Request { model, ok := obj.(*corev1alpha1.AuthorizationModel) if !ok { @@ -90,7 +86,7 @@ func (r *StoreReconciler) SetupWithManager(mgr mcmanager.Manager, cfg *platforme Name: model.Spec.StoreRef.Name, }, }, - ClusterName: model.Spec.StoreRef.Cluster, + ClusterName: multicluster.ClusterName(model.Spec.StoreRef.Cluster), }, } }) diff --git a/internal/subroutine/apiexportpolicy.go b/internal/subroutine/apiexportpolicy.go index 0b0235c9..e77a1908 100644 --- a/internal/subroutine/apiexportpolicy.go +++ b/internal/subroutine/apiexportpolicy.go @@ -78,13 +78,8 @@ func (a *APIExportPolicySubroutine) Process(ctx context.Context, obj client.Obje // for orgs workspace we need to write 1 tuple in every store // for this we need to get cluster id for every org's workspace if workspacePath == orgsWorkspacePath { - allclient, err := a.kcpHelper.GetAllClient(ctx, a.cfg.APIExportEndpointSlices.CorePlatformMeshIO) - if err != nil { - return subroutines.OK(), fmt.Errorf("unable to create all client: %w", err) - } - var accountInfoList accountsv1alpha1.AccountInfoList - if err := allclient.List(ctx, &accountInfoList); err != nil { + if err := a.kcpHelper.List(ctx, &accountInfoList); err != nil { return subroutines.OK(), fmt.Errorf("listing AccountInfo resources: %w", err) } @@ -249,13 +244,8 @@ func (a *APIExportPolicySubroutine) deleteTuplesForExpression(ctx context.Contex } if workspacePath == orgsWorkspacePath { - allclient, err := a.kcpHelper.GetAllClient(ctx, a.cfg.APIExportEndpointSlices.CorePlatformMeshIO) - if err != nil { - return fmt.Errorf("creating all client: %w", err) - } - var accountInfoList accountsv1alpha1.AccountInfoList - if err := allclient.List(ctx, &accountInfoList); err != nil { + if err := a.kcpHelper.List(ctx, &accountInfoList); err != nil { return fmt.Errorf("listing AccountInfo resources for %s: %w", expression, err) } diff --git a/internal/subroutine/apiexportpolicy_test.go b/internal/subroutine/apiexportpolicy_test.go index edec0aa1..838c5de2 100644 --- a/internal/subroutine/apiexportpolicy_test.go +++ b/internal/subroutine/apiexportpolicy_test.go @@ -129,7 +129,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }). Build() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(nil, errors.New("unable to create all client")).Maybe() + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(errors.New("unable to list")).Maybe() }, cfg: &config.Config{}, expectError: true, @@ -465,59 +465,39 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { Build() // All client with AccountInfo list - allClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithLists(&accountsv1alpha1.AccountInfoList{ - Items: []accountsv1alpha1.AccountInfo{ + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + if list, ok := ol.(*accountsv1alpha1.AccountInfoList); ok { + list.Items = []accountsv1alpha1.AccountInfo{ { - ObjectMeta: metav1.ObjectMeta{ - Name: "account-1", - }, + ObjectMeta: metav1.ObjectMeta{Name: "account-1"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{ - Name: "org1-account", - OriginClusterId: "org1-cluster-id", - Type: accountsv1alpha1.AccountTypeOrg, - }, - Organization: accountsv1alpha1.AccountLocation{ - Name: "org1", - }, + Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Organization: accountsv1alpha1.AccountLocation{Name: "org1"}, }, }, { - ObjectMeta: metav1.ObjectMeta{ - Name: "account-2", - }, + ObjectMeta: metav1.ObjectMeta{Name: "account-2"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{ - Name: "org2-account", - OriginClusterId: "org2-cluster-id", - Type: accountsv1alpha1.AccountTypeOrg, - }, - Organization: accountsv1alpha1.AccountLocation{ - Name: "org2", - }, + Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Organization: accountsv1alpha1.AccountLocation{Name: "org2"}, }, }, - }, - }). - Build() + } + } + return nil + }) // Cluster client for status patch clusterClient := fake.NewClientBuilder(). WithScheme(scheme). WithObjects(&corev1alpha1.APIExportPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-policy", - }, + ObjectMeta: metav1.ObjectMeta{Name: "test-policy"}, }). WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { return name.String() == "root:providers:my-provider" })).Return(providerClient, nil) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "org1").Return("store-id-org1", nil) storeIDGetter.EXPECT().Get(mock.Anything, "org2").Return("store-id-org2", nil) @@ -757,62 +737,33 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }, }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { - scheme := getAPIExportPolicyTestScheme() // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + scheme := getAPIExportPolicyTestScheme() + providerClient := newProviderClient(scheme) + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() - // All client with AccountInfo list - allClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithLists(&accountsv1alpha1.AccountInfoList{ - Items: []accountsv1alpha1.AccountInfo{ + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + if list, ok := ol.(*accountsv1alpha1.AccountInfoList); ok { + list.Items = []accountsv1alpha1.AccountInfo{ { - ObjectMeta: metav1.ObjectMeta{ - Name: "account-1", - }, + ObjectMeta: metav1.ObjectMeta{Name: "account-1"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{ - Name: "org1-account", - OriginClusterId: "org1-cluster-id", - Type: accountsv1alpha1.AccountTypeOrg, - }, - Organization: accountsv1alpha1.AccountLocation{ - Name: "org1", - }, + Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Organization: accountsv1alpha1.AccountLocation{Name: "org1"}, }, }, { - ObjectMeta: metav1.ObjectMeta{ - Name: "account-2", - }, + ObjectMeta: metav1.ObjectMeta{Name: "account-2"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{ - Name: "org2-account", - OriginClusterId: "org2-cluster-id", - Type: accountsv1alpha1.AccountTypeOrg, - }, - Organization: accountsv1alpha1.AccountLocation{ - Name: "org2", - }, + Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Organization: accountsv1alpha1.AccountLocation{Name: "org2"}, }, }, - }, - }). - Build() - - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) + } + } + return nil + }) storeIDGetter.EXPECT().Get(mock.Anything, "org1").Return("store-id-org1", nil) storeIDGetter.EXPECT().Get(mock.Anything, "org2").Return("store-id-org2", nil) @@ -985,9 +936,7 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, expectError: true, @@ -1003,9 +952,7 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ {Spec: accountsv1alpha1.AccountInfoSpec{ @@ -1034,9 +981,7 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ {Spec: accountsv1alpha1.AccountInfoSpec{ @@ -1272,7 +1217,7 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(nil, assert.AnError) + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, expectError: true, @@ -1288,9 +1233,7 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, expectError: true, @@ -1306,9 +1249,7 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ {Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "org1"}}}, @@ -1331,9 +1272,7 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() - allClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().GetAllClient(mock.Anything, mock.Anything).Return(allClient, nil) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ {Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "org1"}}}, diff --git a/internal/subroutine/authorization_model.go b/internal/subroutine/authorization_model.go index ca24aadf..aa659e03 100644 --- a/internal/subroutine/authorization_model.go +++ b/internal/subroutine/authorization_model.go @@ -12,6 +12,7 @@ import ( language "github.com/openfga/language/pkg/go/transformer" "github.com/platform-mesh/golang-commons/logger" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" + iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/security-operator/internal/util" "github.com/platform-mesh/subroutines" "google.golang.org/protobuf/encoding/protojson" @@ -77,15 +78,15 @@ type NewDiscoveryClientFunc func(cfg *rest.Config) discovery.DiscoveryInterface type authorizationModelSubroutine struct { fga openfgav1.OpenFGAServiceClient mgr mcmanager.Manager - allClient client.Client + kcpHelper iclient.KcpClientHelper newDiscoveryClientFunc NewDiscoveryClientFunc } -func NewAuthorizationModelSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, allClient client.Client, newDiscoveryClientFunc NewDiscoveryClientFunc, log *logger.Logger) *authorizationModelSubroutine { +func NewAuthorizationModelSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, kcpHelper iclient.KcpClientHelper, newDiscoveryClientFunc NewDiscoveryClientFunc, log *logger.Logger) *authorizationModelSubroutine { return &authorizationModelSubroutine{ fga: fga, mgr: mgr, - allClient: allClient, + kcpHelper: kcpHelper, newDiscoveryClientFunc: newDiscoveryClientFunc, } } @@ -94,29 +95,25 @@ var _ subroutines.Processor = &authorizationModelSubroutine{} func (a *authorizationModelSubroutine) GetName() string { return "AuthorizationModel" } -func getRelatedAuthorizationModels(ctx context.Context, k8s client.Client, store *securityv1alpha1.Store) (securityv1alpha1.AuthorizationModelList, error) { - +func getRelatedAuthorizationModels(ctx context.Context, kcpHelper iclient.KcpClientHelper, store *securityv1alpha1.Store) (securityv1alpha1.AuthorizationModelList, error) { storeClusterKey, ok := mccontext.ClusterFrom(ctx) if !ok { return securityv1alpha1.AuthorizationModelList{}, fmt.Errorf("unable to get cluster key from context") } - allCtx := mccontext.WithCluster(ctx, "") allAuthorizationModels := securityv1alpha1.AuthorizationModelList{} - - if err := k8s.List(allCtx, &allAuthorizationModels); err != nil { + if err := kcpHelper.List(ctx, &allAuthorizationModels); err != nil { return securityv1alpha1.AuthorizationModelList{}, err } var extendingModules securityv1alpha1.AuthorizationModelList for _, model := range allAuthorizationModels.Items { - if model.Spec.StoreRef.Name != store.Name || model.Spec.StoreRef.Cluster != storeClusterKey { + if model.Spec.StoreRef.Name != store.Name || model.Spec.StoreRef.Cluster != string(storeClusterKey) { continue } extendingModules.Items = append(extendingModules.Items, model) } - return extendingModules, nil } @@ -124,7 +121,7 @@ func (a *authorizationModelSubroutine) Process(ctx context.Context, obj client.O log := logger.LoadLoggerFromContext(ctx) store := obj.(*securityv1alpha1.Store) - extendingModules, err := getRelatedAuthorizationModels(ctx, a.allClient, store) + extendingModules, err := getRelatedAuthorizationModels(ctx, a.kcpHelper, store) if err != nil { log.Error().Err(err).Msg("unable to get related authorization models") return subroutines.OK(), err diff --git a/internal/subroutine/authorization_model_generation.go b/internal/subroutine/authorization_model_generation.go index acfb1fec..d2b6d5f5 100644 --- a/internal/subroutine/authorization_model_generation.go +++ b/internal/subroutine/authorization_model_generation.go @@ -11,10 +11,12 @@ import ( accountv1alpha1 "github.com/platform-mesh/account-operator/api/v1alpha1" "github.com/platform-mesh/golang-commons/logger" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" + iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/subroutines" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -37,10 +39,10 @@ func toK8sName(parts ...string) string { return strings.Trim(name, "-") } -func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, allClient client.Client) *AuthorizationModelGenerationSubroutine { +func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, kcpHelper iclient.KcpClientHelper) *AuthorizationModelGenerationSubroutine { return &AuthorizationModelGenerationSubroutine{ mgr: mcMgr, - allClient: allClient, + kcpHelper: kcpHelper, } } @@ -51,7 +53,7 @@ var ( type AuthorizationModelGenerationSubroutine struct { mgr mcmanager.Manager - allClient client.Client + kcpHelper iclient.KcpClientHelper } var modelTpl = template.Must(template.New("model").Parse(`module {{ .Name }} @@ -109,7 +111,7 @@ func (a *AuthorizationModelGenerationSubroutine) Finalize(ctx context.Context, o } var bindings kcpapisv1alpha2.APIBindingList - err = a.allClient.List(ctx, &bindings) + err = a.kcpHelper.List(ctx, &bindings) if err != nil { return subroutines.OK(), fmt.Errorf("listing APIBindings: %w", err) } @@ -127,7 +129,7 @@ func (a *AuthorizationModelGenerationSubroutine) Finalize(ctx context.Context, o continue } - bindingWsCluster, err := a.mgr.GetCluster(ctx, string(logicalcluster.From(&binding))) + bindingWsCluster, err := a.mgr.GetCluster(ctx, multicluster.ClusterName(logicalcluster.From(&binding).String())) if err != nil { return subroutines.OK(), fmt.Errorf("getting cluster for binding: %w", err) } @@ -157,7 +159,7 @@ func (a *AuthorizationModelGenerationSubroutine) Finalize(ctx context.Context, o return subroutines.OK(), nil } - apiExportCluster, err := a.mgr.GetCluster(ctx, bindingToDelete.Status.APIExportClusterName) + apiExportCluster, err := a.mgr.GetCluster(ctx, multicluster.ClusterName(bindingToDelete.Status.APIExportClusterName)) if err != nil { return subroutines.OK(), fmt.Errorf("failed to get cluster %q: %w", bindingToDelete.Status.APIExportClusterName, err) } @@ -235,7 +237,7 @@ func (a *AuthorizationModelGenerationSubroutine) Process(ctx context.Context, ob return subroutines.OK(), fmt.Errorf("getting AccountInfo: %w", err) } - apiExportCluster, err := a.mgr.GetCluster(ctx, binding.Status.APIExportClusterName) + apiExportCluster, err := a.mgr.GetCluster(ctx, multicluster.ClusterName(binding.Status.APIExportClusterName)) if err != nil { return subroutines.OK(), fmt.Errorf("getting APIExport cluster: %w", err) } diff --git a/internal/subroutine/authorization_model_generation_test.go b/internal/subroutine/authorization_model_generation_test.go index 1df2fff4..d6d812e7 100644 --- a/internal/subroutine/authorization_model_generation_test.go +++ b/internal/subroutine/authorization_model_generation_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -55,13 +56,13 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { tests := []struct { name string binding *kcpapisv1alpha2.APIBinding - mockSetup func(*mocks.MockManager, *mocks.MockClient, *mocks.MockCluster, *mocks.MockClient) + mockSetup func(*mocks.MockManager, *mocks.MockKcpHelper, *mocks.MockCluster, *mocks.MockClient) expectError bool }{ { name: "error on ClusterFromContext in Process", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(nil, assert.AnError) }, expectError: true, @@ -70,7 +71,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "early return when accountInfo not found", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return( @@ -81,7 +82,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on getting apiExport", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { @@ -98,7 +99,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error from CreateOrUpdate when creating model", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { @@ -142,7 +143,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -172,7 +173,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process with namespaced scope", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -203,7 +204,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on apiExportClient.Get in Process", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -215,7 +216,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on apiExportClient.Get resource schema in Process", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -233,7 +234,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process with longestRelationName > 50", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -264,7 +265,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on Get accountInfo in Process (not NotFound)", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError) @@ -274,26 +275,26 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on GetCluster for APIExport cluster in Process", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(nil, assert.AnError) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(nil, assert.AnError) }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { manager := mocks.NewMockManager(t) - allClient := mocks.NewMockClient(t) + kcpHelper := mocks.NewMockKcpHelper(t) cluster := mocks.NewMockCluster(t) kcpClient := mocks.NewMockClient(t) if test.mockSetup != nil { - test.mockSetup(manager, allClient, cluster, kcpClient) + test.mockSetup(manager, kcpHelper, cluster, kcpClient) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, allClient) + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, kcpHelper) _, err := sub.Process(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -308,13 +309,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { tests := []struct { name string binding *kcpapisv1alpha2.APIBinding - mockSetup func(*mocks.MockManager, *mocks.MockClient, *kcpapisv1alpha2.APIBinding) + mockSetup func(*mocks.MockManager, *mocks.MockKcpHelper, *kcpapisv1alpha2.APIBinding) expectError bool }{ { name: "bindings with non-matching export are skipped", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -324,7 +325,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("other", "other", "cluster2") @@ -337,7 +338,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -345,7 +346,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -364,7 +365,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on ClusterFromContext in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(nil, assert.AnError) }, }, @@ -372,13 +373,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "early return when accountInfo missing in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -396,7 +397,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "delete returns error in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) @@ -404,7 +405,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -420,14 +421,14 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingCluster, nil) bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) acc.Spec.Organization.Name = "org" acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -445,7 +446,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "skip Finalize if other bindings exist", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster1 := mocks.NewMockCluster(t) @@ -455,7 +456,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("foo", "bar", "cluster2") @@ -468,7 +469,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster1, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -476,7 +477,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster2").Return(bindingWsCluster2, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -489,7 +490,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "delete model in Finalize if last binding", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -499,7 +500,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -515,7 +516,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -523,7 +524,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -541,7 +542,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "delete model in Finalize but model is not found", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -551,7 +552,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -567,7 +568,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -575,7 +576,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -595,26 +596,26 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on List in Finalize", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient).Maybe() - allClient.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, }, { name: "error on getRelatedAuthorizationModels in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -630,7 +631,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "only bindings for same org are counted; delete called if only one, not called if none", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster1 := mocks.NewMockCluster(t) @@ -642,7 +643,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("foo", "bar", "cluster2") @@ -655,7 +656,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster1, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -663,11 +664,11 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster2").Return(bindingWsCluster2, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -685,13 +686,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "error on GetCluster for binding workspace in Finalize loop", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -703,14 +704,14 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(nil, assert.AnError) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(nil, assert.AnError) }, expectError: true, }, { name: "error on Get accountInfo in Finalize loop (not NotFound)", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -718,7 +719,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -730,7 +731,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) }, @@ -739,7 +740,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "bindings with different org are skipped in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -749,7 +750,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -761,7 +762,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -769,7 +770,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "different-org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -788,7 +789,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on GetCluster for APIExport cluster in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -796,7 +797,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -808,7 +809,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -816,14 +817,14 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(nil, assert.AnError) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(nil, assert.AnError) }, }, { name: "error on Get APIExport in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -833,7 +834,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -845,7 +846,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -853,7 +854,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).Return(assert.AnError) }, @@ -862,7 +863,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on Get resource schema in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockClient, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, kcpHelper *mocks.MockKcpHelper, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -872,7 +873,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -884,7 +885,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -892,7 +893,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -906,13 +907,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { manager := mocks.NewMockManager(t) - allClient := mocks.NewMockClient(t) + kcpHelper := mocks.NewMockKcpHelper(t) if test.mockSetup != nil { - test.mockSetup(manager, allClient, test.binding) + test.mockSetup(manager, kcpHelper, test.binding) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, allClient) + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, kcpHelper) _, err := sub.Finalize(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -924,7 +925,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { } func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockClient(t)) + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockKcpHelper(t)) tests := []struct { name string @@ -972,7 +973,7 @@ func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { } func TestAuthorizationModelGenerationSubroutine_GetName(t *testing.T) { - allClient := mocks.NewMockClient(t) - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, allClient) + kcpHelper := mocks.NewMockKcpHelper(t) + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, kcpHelper) assert.Equal(t, "AuthorizationModelGeneration", sub.GetName()) } diff --git a/internal/subroutine/authorization_model_test.go b/internal/subroutine/authorization_model_test.go index 354e049a..8b34fc5c 100644 --- a/internal/subroutine/authorization_model_test.go +++ b/internal/subroutine/authorization_model_test.go @@ -17,6 +17,7 @@ import ( "google.golang.org/protobuf/encoding/protojson" "sigs.k8s.io/controller-runtime/pkg/client" mccontext "sigs.k8s.io/multicluster-runtime/pkg/context" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/discovery" @@ -91,7 +92,7 @@ func TestAuthorizationModelProcess(t *testing.T) { name string store *securityv1alpha1.Store fgaMocks func(*mocks.MockOpenFGAServiceClient) - k8sMocks func(*mocks.MockClient) + kcpHelperMocks func(*mocks.MockKcpHelper) mgrMocks func(*mocks.MockManager) discoveryMocks func(*mocks.MockDiscoveryInterface) expectError bool @@ -109,8 +110,8 @@ func TestAuthorizationModelProcess(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -166,8 +167,8 @@ func TestAuthorizationModelProcess(t *testing.T) { AuthorizationModelID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -247,8 +248,8 @@ type core_namespace AuthorizationModelID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -281,8 +282,8 @@ type core_namespace StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -315,8 +316,8 @@ type core_namespace StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -346,8 +347,8 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) am.Items = []securityv1alpha1.AuthorizationModel{ @@ -380,8 +381,8 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil }, @@ -406,8 +407,8 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil }, @@ -425,8 +426,8 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil }, @@ -446,8 +447,8 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil }, @@ -479,8 +480,9 @@ type core_namespace cluster := mocks.NewMockCluster(t) client := mocks.NewMockClient(t) - if test.k8sMocks != nil { - test.k8sMocks(client) + kcpHelper := mocks.NewMockKcpHelper(t) + if test.kcpHelperMocks != nil { + test.kcpHelperMocks(kcpHelper) } manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil).Maybe() @@ -509,8 +511,8 @@ type core_namespace discoveryMock.EXPECT().ServerResourcesForGroupVersion(mock.Anything).Return(&metav1.APIResourceList{}, nil).Maybe() } - subroutine := subroutine.NewAuthorizationModelSubroutine(fga, manager, client, func(cfg *rest.Config) discovery.DiscoveryInterface { return discoveryMock }, logger.Logger) - ctx := mccontext.WithCluster(context.Background(), string(logicalcluster.Name("path"))) + subroutine := subroutine.NewAuthorizationModelSubroutine(fga, manager, kcpHelper, func(cfg *rest.Config) discovery.DiscoveryInterface { return discoveryMock }, logger.Logger) + ctx := mccontext.WithCluster(context.Background(), multicluster.ClusterName(logicalcluster.Name("path").String())) _, err := subroutine.Process(ctx, test.store) if test.expectError { diff --git a/internal/subroutine/mocks/mock_KcpHelper.go b/internal/subroutine/mocks/mock_KcpHelper.go index 2d694718..74e5e875 100644 --- a/internal/subroutine/mocks/mock_KcpHelper.go +++ b/internal/subroutine/mocks/mock_KcpHelper.go @@ -23,7 +23,7 @@ func NewMockKcpHelper(t interface { return mock } -// MockKcpHelper is an autogenerated mock type for the ClientFactory type +// MockKcpHelper is an autogenerated mock type for the KcpClientHelper type type MockKcpHelper struct { mock.Mock } @@ -86,52 +86,56 @@ func (_c *MockKcpHelper_NewClientForLogicalCluster_Call) RunAndReturn(run func(l return _c } -// GetAllClient provides a mock function for the type MockKcpHelper -func (_mock *MockKcpHelper) GetAllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) { - ret := _mock.Called(ctx, apiexportEndpointSliceName) - - var r0 client.Client - if rf, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { - r0 = rf(ctx, apiexportEndpointSliceName) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } +// List provides a mock function for the type MockKcpHelper +func (_mock *MockKcpHelper) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = rf(ctx, apiexportEndpointSliceName) + var _ca []interface{} + _ca = append(_ca, ctx, list) + _ca = append(_ca, _va...) + ret := _mock.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, client.ObjectList, ...client.ListOption) error); ok { + r0 = rf(ctx, list, opts...) } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } -// MockKcpHelper_GetAllClient_Call is a helper struct to make the mock expectations more readable -type MockKcpHelper_GetAllClient_Call struct { +// MockKcpHelper_List_Call is a helper struct to make the mock expectations more readable +type MockKcpHelper_List_Call struct { *mock.Call } -// GetAllClient is a helper method to define mock expectations -func (_e *MockKcpHelper_Expecter) GetAllClient(ctx interface{}, apiexportEndpointSliceName interface{}) *MockKcpHelper_GetAllClient_Call { - return &MockKcpHelper_GetAllClient_Call{Call: _e.mock.On("GetAllClient", ctx, apiexportEndpointSliceName)} +// List is a helper method to define mock expectations +func (_e *MockKcpHelper_Expecter) List(ctx interface{}, list interface{}, opts ...interface{}) *MockKcpHelper_List_Call { + return &MockKcpHelper_List_Call{Call: _e.mock.On("List", append([]interface{}{ctx, list}, opts...)...)} } -func (_c *MockKcpHelper_GetAllClient_Call) Run(run func(ctx context.Context, apiexportEndpointSliceName string)) *MockKcpHelper_GetAllClient_Call { +func (_c *MockKcpHelper_List_Call) Run(run func(ctx context.Context, list client.ObjectList, opts ...client.ListOption)) *MockKcpHelper_List_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string)) + variadicArgs := make([]client.ListOption, len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(client.ListOption) + } + } + run(args[0].(context.Context), args[1].(client.ObjectList), variadicArgs...) }) return _c } -func (_c *MockKcpHelper_GetAllClient_Call) Return(_a0 client.Client, _a1 error) *MockKcpHelper_GetAllClient_Call { - _c.Call.Return(_a0, _a1) +func (_c *MockKcpHelper_List_Call) Return(_a0 error) *MockKcpHelper_List_Call { + _c.Call.Return(_a0) return _c } -func (_c *MockKcpHelper_GetAllClient_Call) RunAndReturn(run func(context.Context, string) (client.Client, error)) *MockKcpHelper_GetAllClient_Call { +func (_c *MockKcpHelper_List_Call) RunAndReturn(run func(context.Context, client.ObjectList, ...client.ListOption) error) *MockKcpHelper_List_Call { _c.Call.Return(run) return _c } diff --git a/internal/subroutine/mocks/mock_Manager.go b/internal/subroutine/mocks/mock_Manager.go index 5009ffed..08c2dc2c 100644 --- a/internal/subroutine/mocks/mock_Manager.go +++ b/internal/subroutine/mocks/mock_Manager.go @@ -378,16 +378,16 @@ func (_c *MockManager_Elected_Call) RunAndReturn(run func() <-chan struct{}) *Mo } // Engage provides a mock function for the type MockManager -func (_mock *MockManager) Engage(context1 context.Context, s string, cluster1 cluster.Cluster) error { - ret := _mock.Called(context1, s, cluster1) +func (_mock *MockManager) Engage(context1 context.Context, clusterName multicluster.ClusterName, cluster1 cluster.Cluster) error { + ret := _mock.Called(context1, clusterName, cluster1) if len(ret) == 0 { panic("no return value specified for Engage") } var r0 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string, cluster.Cluster) error); ok { - r0 = returnFunc(context1, s, cluster1) + if returnFunc, ok := ret.Get(0).(func(context.Context, multicluster.ClusterName, cluster.Cluster) error); ok { + r0 = returnFunc(context1, clusterName, cluster1) } else { r0 = ret.Error(0) } @@ -407,15 +407,15 @@ func (_e *MockManager_Expecter) Engage(context1 interface{}, s interface{}, clus return &MockManager_Engage_Call{Call: _e.mock.On("Engage", context1, s, cluster1)} } -func (_c *MockManager_Engage_Call) Run(run func(context1 context.Context, s string, cluster1 cluster.Cluster)) *MockManager_Engage_Call { +func (_c *MockManager_Engage_Call) Run(run func(context1 context.Context, clusterName multicluster.ClusterName, cluster1 cluster.Cluster)) *MockManager_Engage_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context if args[0] != nil { arg0 = args[0].(context.Context) } - var arg1 string + var arg1 multicluster.ClusterName if args[1] != nil { - arg1 = args[1].(string) + arg1 = args[1].(multicluster.ClusterName) } var arg2 cluster.Cluster if args[2] != nil { @@ -435,13 +435,13 @@ func (_c *MockManager_Engage_Call) Return(err error) *MockManager_Engage_Call { return _c } -func (_c *MockManager_Engage_Call) RunAndReturn(run func(context1 context.Context, s string, cluster1 cluster.Cluster) error) *MockManager_Engage_Call { +func (_c *MockManager_Engage_Call) RunAndReturn(run func(context1 context.Context, clusterName multicluster.ClusterName, cluster1 cluster.Cluster) error) *MockManager_Engage_Call { _c.Call.Return(run) return _c } // GetCluster provides a mock function for the type MockManager -func (_mock *MockManager) GetCluster(ctx context.Context, clusterName string) (cluster.Cluster, error) { +func (_mock *MockManager) GetCluster(ctx context.Context, clusterName multicluster.ClusterName) (cluster.Cluster, error) { ret := _mock.Called(ctx, clusterName) if len(ret) == 0 { @@ -450,17 +450,17 @@ func (_mock *MockManager) GetCluster(ctx context.Context, clusterName string) (c var r0 cluster.Cluster var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) (cluster.Cluster, error)); ok { + if returnFunc, ok := ret.Get(0).(func(context.Context, multicluster.ClusterName) (cluster.Cluster, error)); ok { return returnFunc(ctx, clusterName) } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) cluster.Cluster); ok { + if returnFunc, ok := ret.Get(0).(func(context.Context, multicluster.ClusterName) cluster.Cluster); ok { r0 = returnFunc(ctx, clusterName) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(cluster.Cluster) } } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { + if returnFunc, ok := ret.Get(1).(func(context.Context, multicluster.ClusterName) error); ok { r1 = returnFunc(ctx, clusterName) } else { r1 = ret.Error(1) @@ -480,15 +480,15 @@ func (_e *MockManager_Expecter) GetCluster(ctx interface{}, clusterName interfac return &MockManager_GetCluster_Call{Call: _e.mock.On("GetCluster", ctx, clusterName)} } -func (_c *MockManager_GetCluster_Call) Run(run func(ctx context.Context, clusterName string)) *MockManager_GetCluster_Call { +func (_c *MockManager_GetCluster_Call) Run(run func(ctx context.Context, clusterName multicluster.ClusterName)) *MockManager_GetCluster_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context if args[0] != nil { arg0 = args[0].(context.Context) } - var arg1 string + var arg1 multicluster.ClusterName if args[1] != nil { - arg1 = args[1].(string) + arg1 = args[1].(multicluster.ClusterName) } run( arg0, @@ -503,7 +503,7 @@ func (_c *MockManager_GetCluster_Call) Return(cluster1 cluster.Cluster, err erro return _c } -func (_c *MockManager_GetCluster_Call) RunAndReturn(run func(ctx context.Context, clusterName string) (cluster.Cluster, error)) *MockManager_GetCluster_Call { +func (_c *MockManager_GetCluster_Call) RunAndReturn(run func(ctx context.Context, clusterName multicluster.ClusterName) (cluster.Cluster, error)) *MockManager_GetCluster_Call { _c.Call.Return(run) return _c } @@ -689,7 +689,7 @@ func (_c *MockManager_GetLogger_Call) RunAndReturn(run func() logr.Logger) *Mock } // GetManager provides a mock function for the type MockManager -func (_mock *MockManager) GetManager(ctx context.Context, clusterName string) (manager0.Manager, error) { +func (_mock *MockManager) GetManager(ctx context.Context, clusterName multicluster.ClusterName) (manager0.Manager, error) { ret := _mock.Called(ctx, clusterName) if len(ret) == 0 { @@ -698,17 +698,17 @@ func (_mock *MockManager) GetManager(ctx context.Context, clusterName string) (m var r0 manager0.Manager var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) (manager0.Manager, error)); ok { + if returnFunc, ok := ret.Get(0).(func(context.Context, multicluster.ClusterName) (manager0.Manager, error)); ok { return returnFunc(ctx, clusterName) } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) manager0.Manager); ok { + if returnFunc, ok := ret.Get(0).(func(context.Context, multicluster.ClusterName) manager0.Manager); ok { r0 = returnFunc(ctx, clusterName) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(manager0.Manager) } } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { + if returnFunc, ok := ret.Get(1).(func(context.Context, multicluster.ClusterName) error); ok { r1 = returnFunc(ctx, clusterName) } else { r1 = ret.Error(1) @@ -728,15 +728,15 @@ func (_e *MockManager_Expecter) GetManager(ctx interface{}, clusterName interfac return &MockManager_GetManager_Call{Call: _e.mock.On("GetManager", ctx, clusterName)} } -func (_c *MockManager_GetManager_Call) Run(run func(ctx context.Context, clusterName string)) *MockManager_GetManager_Call { +func (_c *MockManager_GetManager_Call) Run(run func(ctx context.Context, clusterName multicluster.ClusterName)) *MockManager_GetManager_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context if args[0] != nil { arg0 = args[0].(context.Context) } - var arg1 string + var arg1 multicluster.ClusterName if args[1] != nil { - arg1 = args[1].(string) + arg1 = args[1].(multicluster.ClusterName) } run( arg0, @@ -751,7 +751,7 @@ func (_c *MockManager_GetManager_Call) Return(manager1 manager0.Manager, err err return _c } -func (_c *MockManager_GetManager_Call) RunAndReturn(run func(ctx context.Context, clusterName string) (manager0.Manager, error)) *MockManager_GetManager_Call { +func (_c *MockManager_GetManager_Call) RunAndReturn(run func(ctx context.Context, clusterName multicluster.ClusterName) (manager0.Manager, error)) *MockManager_GetManager_Call { _c.Call.Return(run) return _c } diff --git a/internal/subroutine/store.go b/internal/subroutine/store.go index a703014c..319ccada 100644 --- a/internal/subroutine/store.go +++ b/internal/subroutine/store.go @@ -8,6 +8,7 @@ import ( openfgav1 "github.com/openfga/api/proto/openfga/v1" "github.com/platform-mesh/golang-commons/logger" "github.com/platform-mesh/security-operator/api/v1alpha1" + iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/subroutines" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -16,14 +17,16 @@ import ( ) type storeSubroutine struct { - fga openfgav1.OpenFGAServiceClient - mgr mcmanager.Manager + fga openfgav1.OpenFGAServiceClient + mgr mcmanager.Manager + kcpHelper iclient.KcpClientHelper } -func NewStoreSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager) *storeSubroutine { +func NewStoreSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, kcpHelper iclient.KcpClientHelper) *storeSubroutine { return &storeSubroutine{ - fga: fga, - mgr: mgr, + fga: fga, + mgr: mgr, + kcpHelper: kcpHelper, } } @@ -43,12 +46,7 @@ func (s *storeSubroutine) Finalize(ctx context.Context, obj client.Object) (subr return subroutines.OK(), nil } - cluster, err := s.mgr.ClusterFromContext(ctx) - if err != nil { - return subroutines.OK(), fmt.Errorf("unable to get cluster from context: %w", err) - } - - authorizationModels, err := getRelatedAuthorizationModels(ctx, cluster.GetClient(), store) + authorizationModels, err := getRelatedAuthorizationModels(ctx, s.kcpHelper, store) if err != nil { return subroutines.OK(), err } diff --git a/internal/subroutine/store_test.go b/internal/subroutine/store_test.go index 05100d61..760dd5f4 100644 --- a/internal/subroutine/store_test.go +++ b/internal/subroutine/store_test.go @@ -15,6 +15,7 @@ import ( "google.golang.org/grpc/status" "sigs.k8s.io/controller-runtime/pkg/client" mccontext "sigs.k8s.io/multicluster-runtime/pkg/context" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -22,12 +23,12 @@ import ( ) func TestGetName(t *testing.T) { - subroutine := subroutine.NewStoreSubroutine(nil, nil) + subroutine := subroutine.NewStoreSubroutine(nil, nil, nil) assert.Equal(t, "Store", subroutine.GetName()) } func TestFinalizers(t *testing.T) { - subroutine := subroutine.NewStoreSubroutine(nil, nil) + subroutine := subroutine.NewStoreSubroutine(nil, nil, nil) assert.Equal(t, []string{"core.platform-mesh.io/fga-store"}, subroutine.Finalizers(nil)) } @@ -36,8 +37,6 @@ func TestProcess(t *testing.T) { name string store *securityv1alpha1.Store fgaMocks func(*mocks.MockOpenFGAServiceClient) - k8sMocks func(*mocks.MockClient) - mgrMocks func(*mocks.MockManager) expectError bool }{ { @@ -164,7 +163,8 @@ func TestProcess(t *testing.T) { } manager := mocks.NewMockManager(t) - subroutine := subroutine.NewStoreSubroutine(fga, manager) + kcpHelper := mocks.NewMockKcpHelper(t) + subroutine := subroutine.NewStoreSubroutine(fga, manager, kcpHelper) _, err := subroutine.Process(context.Background(), test.store) if test.expectError { @@ -179,12 +179,11 @@ func TestProcess(t *testing.T) { func TestFinalize(t *testing.T) { tests := []struct { - name string - store *securityv1alpha1.Store - fgaMocks func(*mocks.MockOpenFGAServiceClient) - k8sMocks func(*mocks.MockClient) - mgrMocks func(*mocks.MockManager) - expectError bool + name string + store *securityv1alpha1.Store + fgaMocks func(*mocks.MockOpenFGAServiceClient) + kcpHelperMocks func(*mocks.MockKcpHelper) + expectError bool }{ { name: "should skip reconciliation if .status.storeId is not set", @@ -204,8 +203,8 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { if list, ok := ol.(*securityv1alpha1.AuthorizationModelList); ok { list.Items = []securityv1alpha1.AuthorizationModel{ { @@ -233,8 +232,8 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).Return(errors.New("error")) + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(errors.New("error")) }, expectError: true, }, @@ -248,8 +247,8 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).Return(nil) + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { fga.EXPECT().DeleteStore(mock.Anything, &openfgav1.DeleteStoreRequest{StoreId: "id"}).Return(nil, nil) @@ -265,8 +264,8 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).Return(nil) + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { fga.EXPECT().DeleteStore(mock.Anything, &openfgav1.DeleteStoreRequest{StoreId: "id"}).Return(nil, status.Error(codes.Code(openfgav1.NotFoundErrorCode_store_id_not_found), "not found")) @@ -282,8 +281,8 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - k8sMocks: func(k8s *mocks.MockClient) { - k8s.EXPECT().List(mock.Anything, mock.Anything).Return(nil) + kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { fga.EXPECT().DeleteStore(mock.Anything, &openfgav1.DeleteStoreRequest{StoreId: "id"}).Return(nil, errors.New("error")) @@ -300,20 +299,16 @@ func TestFinalize(t *testing.T) { } manager := mocks.NewMockManager(t) - subroutine := subroutine.NewStoreSubroutine(fga, manager) + kcpHelper := mocks.NewMockKcpHelper(t) - // Only wire cluster/client expectations when Finalize will actually query k8s (i.e., StoreID is set) - if test.store.Status.StoreID != "" { - cluster := mocks.NewMockCluster(t) - client := mocks.NewMockClient(t) - if test.k8sMocks != nil { - test.k8sMocks(client) - } - manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) - cluster.EXPECT().GetClient().Return(client) + // Only wire kcpHelper expectations when Finalize will actually query k8s (i.e., StoreID is set) + if test.store.Status.StoreID != "" && test.kcpHelperMocks != nil { + test.kcpHelperMocks(kcpHelper) } - ctx := mccontext.WithCluster(context.Background(), string(logicalcluster.Name("path"))) + subroutine := subroutine.NewStoreSubroutine(fga, manager, kcpHelper) + + ctx := mccontext.WithCluster(context.Background(), multicluster.ClusterName(logicalcluster.Name("path").String())) _, err := subroutine.Finalize(ctx, test.store) if test.expectError { diff --git a/internal/subroutine/tuples.go b/internal/subroutine/tuples.go index a92a8826..ad468813 100644 --- a/internal/subroutine/tuples.go +++ b/internal/subroutine/tuples.go @@ -12,6 +12,7 @@ import ( "github.com/platform-mesh/subroutines" "sigs.k8s.io/controller-runtime/pkg/client" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" "k8s.io/apimachinery/pkg/types" ) @@ -37,7 +38,7 @@ func (t *tupleSubroutine) Finalize(ctx context.Context, obj client.Object) (subr case *securityv1alpha1.AuthorizationModel: managedTuples = o.Status.ManagedTuples - storeCluster, err := t.mgr.GetCluster(ctx, o.Spec.StoreRef.Cluster) + storeCluster, err := t.mgr.GetCluster(ctx, multicluster.ClusterName(o.Spec.StoreRef.Cluster)) if err != nil { return subroutines.OK(), fmt.Errorf("unable to get store cluster: %w", err) } @@ -97,7 +98,7 @@ func (t *tupleSubroutine) Process(ctx context.Context, obj client.Object) (subro specTuples = o.Spec.Tuples managedTuples = o.Status.ManagedTuples - storeCluster, err := t.mgr.GetCluster(ctx, o.Spec.StoreRef.Cluster) + storeCluster, err := t.mgr.GetCluster(ctx, multicluster.ClusterName(o.Spec.StoreRef.Cluster)) if err != nil { return subroutines.OK(), fmt.Errorf("unable to get store cluster: %w", err) } diff --git a/internal/subroutine/tuples_test.go b/internal/subroutine/tuples_test.go index 681767af..1c42e0b2 100644 --- a/internal/subroutine/tuples_test.go +++ b/internal/subroutine/tuples_test.go @@ -14,6 +14,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) func TestTupleGetName(t *testing.T) { @@ -228,7 +229,7 @@ func TestTupleProcessWithAuthorizationModel(t *testing.T) { mgrMocks: func(mgr *mocks.MockManager) { storeCluster := mocks.NewMockCluster(t) storeClient := mocks.NewMockClient(t) - mgr.EXPECT().GetCluster(mock.Anything, "store-cluster").Return(storeCluster, nil) + mgr.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("store-cluster")).Return(storeCluster, nil) storeCluster.EXPECT().GetClient().Return(storeClient) storeClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { store := o.(*securityv1alpha1.Store) @@ -293,7 +294,7 @@ func TestTupleProcessWithAuthorizationModel(t *testing.T) { mgrMocks: func(mgr *mocks.MockManager) { storeCluster := mocks.NewMockCluster(t) storeClient := mocks.NewMockClient(t) - mgr.EXPECT().GetCluster(mock.Anything, "store-cluster").Return(storeCluster, nil) + mgr.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("store-cluster")).Return(storeCluster, nil) storeCluster.EXPECT().GetClient().Return(storeClient) storeClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { store := o.(*securityv1alpha1.Store) @@ -382,7 +383,7 @@ func TestTupleFinalizationWithAuthorizationModel(t *testing.T) { mgrMocks: func(mgr *mocks.MockManager) { storeCluster := mocks.NewMockCluster(t) storeClient := mocks.NewMockClient(t) - mgr.EXPECT().GetCluster(mock.Anything, "store-cluster").Return(storeCluster, nil) + mgr.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("store-cluster")).Return(storeCluster, nil) storeCluster.EXPECT().GetClient().Return(storeClient) storeClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { store := o.(*securityv1alpha1.Store) diff --git a/internal/terminatingworkspaces/provider.go b/internal/terminatingworkspaces/provider.go index 40a78237..0c20c85d 100644 --- a/internal/terminatingworkspaces/provider.go +++ b/internal/terminatingworkspaces/provider.go @@ -1,23 +1,20 @@ package terminatingworkspaces import ( - "github.com/go-logr/logr" - "sigs.k8s.io/controller-runtime/pkg/cache" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/cluster" - "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/multicluster-runtime/pkg/clusters" - "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + "strings" - "k8s.io/apimachinery/pkg/fields" + "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" "github.com/kcp-dev/logicalcluster/v3" mcpcache "github.com/kcp-dev/multicluster-provider/pkg/cache" "github.com/kcp-dev/multicluster-provider/pkg/events/recorder" + "github.com/kcp-dev/multicluster-provider/pkg/handlers" "github.com/kcp-dev/multicluster-provider/pkg/provider" kcpcorev1alpha1 "github.com/kcp-dev/sdk/apis/core/v1alpha1" kcptenancyv1alpha1 "github.com/kcp-dev/sdk/apis/tenancy/v1alpha1" @@ -31,7 +28,7 @@ var _ multicluster.ProviderRunnable = &Provider{} // It is a slightly modified version of // github.com/kcp-dev/multicluster-provider/initializingworkspaces. type Provider struct { - provider.Factory + *provider.Provider } // Options are the options for creating a new instance of the terminating workspaces provider. @@ -43,61 +40,54 @@ type Options struct { // Log is the logger to use for the provider. If this is nil, it defaults // to the controller-runtime default logger. Log *logr.Logger + + // ObjectToWatch is the object type that the provider watches via a /clusters/* + // wildcard endpoint to extract information about logical clusters joining and + // leaving the "fleet" of (logical) clusters in kcp. If this is nil, it defaults + // to [kcpcorev1alpha1.LogicalCluster]. This might be useful when using this provider + // against custom virtual workspaces that are not the APIExport one but share + // the same endpoint semantics. + ObjectToWatch client.Object + + // Handlers are lifecycle handlers, ran for each logical cluster in the provider represented + // by LogicalCluster object. + Handlers handlers.Handlers } // New creates a new kcp terminating workspaces provider. func New(cfg *rest.Config, workspaceTypeName string, options Options) (*Provider, error) { - // Do the defaulting controller-runtime would do for those fields we need. - if options.Scheme == nil { - options.Scheme = scheme.Scheme + if options.ObjectToWatch == nil { + options.ObjectToWatch = &kcpcorev1alpha1.LogicalCluster{} } if options.Log == nil { options.Log = ptr.To(log.Log.WithName("kcp-terminatingworkspaces-cluster-provider")) } - c, err := cache.New(cfg, cache.Options{ - Scheme: options.Scheme, - ByObject: map[client.Object]cache.ByObject{ - &kcptenancyv1alpha1.WorkspaceType{}: { - Field: fields.SelectorFromSet(fields.Set{"metadata.name": workspaceTypeName}), - }, + p, err := provider.NewProvider(cfg, workspaceTypeName, provider.Options{ + Scheme: options.Scheme, + EndpointSliceObject: &kcptenancyv1alpha1.WorkspaceType{}, + ExtractURLsFromEndpointSlice: func(obj client.Object) ([]string, error) { + wst := obj.(*kcptenancyv1alpha1.WorkspaceType) + var urls []string + for _, endpoint := range wst.Status.VirtualWorkspaces { + if !strings.Contains(endpoint.URL, "/terminatingworkspaces/") { + continue + } + urls = append(urls, endpoint.URL) + } + return urls, nil + }, + ObjectToWatch: options.ObjectToWatch, + Log: options.Log, + Handlers: options.Handlers, + NewCluster: func(cfg *rest.Config, clusterName logicalcluster.Name, wildcardCA mcpcache.WildcardCache, scheme *runtime.Scheme, _ recorder.EventRecorderGetter) (*mcpcache.ScopedCluster, error) { + return mcpcache.NewScopedInitializingCluster(cfg, clusterName, wildcardCA, scheme) }, }) if err != nil { return nil, err } - return &Provider{ - Factory: provider.Factory{ - Clusters: ptr.To(clusters.New[cluster.Cluster]()), - Providers: provider.NewProviders(), - - Log: *options.Log, - - GetVWs: func(obj client.Object) ([]string, error) { - wst := obj.(*kcptenancyv1alpha1.WorkspaceType) - var urls []string - for _, endpoint := range wst.Status.VirtualWorkspaces { - if endpoint.Type != "terminating" { - continue - } - urls = append(urls, endpoint.URL) - } - return urls, nil - }, - - Config: cfg, - Scheme: options.Scheme, - Outer: &kcptenancyv1alpha1.WorkspaceType{}, - Inner: &kcpcorev1alpha1.LogicalCluster{}, - Cache: c, - // ensure the generic provider builds a per-cluster cache instead of a wildcard-based - // cache, since this virtual workspace does not offer anything but logicalclusters on - // the wildcard endpoint - NewCluster: func(cfg *rest.Config, clusterName logicalcluster.Name, wildcardCA mcpcache.WildcardCache, scheme *runtime.Scheme, _ recorder.EventRecorderGetter) (*mcpcache.ScopedCluster, error) { - return mcpcache.NewScopedInitializingCluster(cfg, clusterName, wildcardCA, scheme) - }, - }, - }, nil + return &Provider{Provider: p}, nil } diff --git a/internal/test/integration/suite_test.go b/internal/test/integration/suite_test.go index a6112b23..e421ee21 100644 --- a/internal/test/integration/suite_test.go +++ b/internal/test/integration/suite_test.go @@ -12,6 +12,7 @@ import ( platformeshconfig "github.com/platform-mesh/golang-commons/config" "github.com/platform-mesh/golang-commons/logger" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" + iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/security-operator/internal/config" "github.com/platform-mesh/security-operator/internal/controller" "github.com/stretchr/testify/require" @@ -242,7 +243,9 @@ func (suite *IntegrationSuite) setupControllers(defaultCfg *platformeshconfig.Co }, } - err = controller.NewAPIBindingReconciler(ctx, testLogger, mgr, operatorCfg).SetupWithManager(mgr, defaultCfg) + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + + err = controller.NewAPIBindingReconciler(ctx, testLogger, mgr, operatorCfg, kcpClientHelper).SetupWithManager(mgr, defaultCfg) suite.Require().NoError(err) managerCtx, cancel := context.WithCancel(ctx) From ba79f384f7f7353b8cf7be664866e8882679decd Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 15:21:02 +0200 Subject: [PATCH 02/16] feat: use multi provider to have core cache for apiexportpolicy On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/system.go | 26 +++++++-- internal/config/config.go | 7 +++ .../controller/apiexportpolicy_controller.go | 55 +++++++++++++------ internal/controller/idp_controller.go | 7 ++- 4 files changed, 74 insertions(+), 21 deletions(-) diff --git a/cmd/system.go b/cmd/system.go index afa16f20..4f609a65 100644 --- a/cmd/system.go +++ b/cmd/system.go @@ -7,6 +7,7 @@ import ( openfgav1 "github.com/openfga/api/proto/openfga/v1" platformeshcontext "github.com/platform-mesh/golang-commons/context" iclient "github.com/platform-mesh/security-operator/internal/client" + "github.com/platform-mesh/security-operator/internal/config" "github.com/platform-mesh/security-operator/internal/controller" "github.com/platform-mesh/security-operator/internal/fga" "github.com/spf13/cobra" @@ -21,6 +22,8 @@ import ( "github.com/kcp-dev/logicalcluster/v3" "github.com/kcp-dev/multicluster-provider/apiexport" + pathaware "github.com/kcp-dev/multicluster-provider/path-aware" + multiprovider "sigs.k8s.io/multicluster-runtime/providers/multi" ) var systemCmd = &cobra.Command{ @@ -63,7 +66,7 @@ var systemCmd = &cobra.Command{ opts.LeaderElectionConfig = inClusterCfg } - provider, err := apiexport.New(restCfg, systemCfg.APIExportEndpointSlices.SystemPlatformMeshIO, apiexport.Options{ + systemProvider, err := pathaware.New(restCfg, systemCfg.APIExportEndpointSlices.SystemPlatformMeshIO, apiexport.Options{ Scheme: scheme, }) if err != nil { @@ -71,7 +74,22 @@ var systemCmd = &cobra.Command{ return err } - mgr, err := mcmanager.New(restCfg, provider, opts) + coreProvider, err := pathaware.New(restCfg, systemCfg.APIExportEndpointSlices.CorePlatformMeshIO, apiexport.Options{ + Scheme: scheme, + }) + if err != nil { + setupLog.Error(err, "unable to create core apiexport provider") + return err + } + multiProv := multiprovider.New(multiprovider.Options{}) + if err := multiProv.AddProvider(config.SystemProviderName, systemProvider); err != nil { + return err + } + if err := multiProv.AddProvider(config.CoreProviderName, coreProvider); err != nil { + return err + } + + mgr, err := mcmanager.New(restCfg, multiProv, opts) if err != nil { setupLog.Error(err, "unable to create manager") return err @@ -108,9 +126,9 @@ var systemCmd = &cobra.Command{ return err } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), coreProvider.Provider.Provider) - if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, &systemCfg, storeIDGetter, kcpClientHelper).SetupWithManager(mgr, defaultCfg, &systemCfg); err != nil { + if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, &systemCfg, storeIDGetter, kcpClientHelper).SetupWithManager(mgr, defaultCfg); err != nil { log.Error().Err(err).Str("controller", "apiexportpolicy").Msg("unable to create controller") return err } diff --git a/internal/config/config.go b/internal/config/config.go index 2d02197b..172c51ba 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,6 +7,13 @@ import ( "github.com/spf13/pflag" ) +const ( + CoreProviderName = "core" + SystemProviderName = "system" + ProviderSeparator = "#" + OrgsClusterPath = "root:orgs" +) + type KeycloakConfig struct { BaseURL string ClientID string diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index be69e1f7..114f7701 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -5,6 +5,7 @@ import ( "strings" openfgav1 "github.com/openfga/api/proto/openfga/v1" + accountsv1alpha1 "github.com/platform-mesh/account-operator/api/v1alpha1" platformeshconfig "github.com/platform-mesh/golang-commons/config" "github.com/platform-mesh/golang-commons/controller/filter" "github.com/platform-mesh/golang-commons/logger" @@ -28,10 +29,11 @@ import ( "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "github.com/kcp-dev/logicalcluster/v3" - kcptenancyv1alpha1 "github.com/kcp-dev/sdk/apis/tenancy/v1alpha1" ) const ( @@ -40,9 +42,9 @@ const ( ) type APIExportPolicyReconciler struct { - log *logger.Logger - lifecycle *lifecycle.Lifecycle - kcpHelper iclient.KcpClientHelper + log *logger.Logger + lifecycle *lifecycle.Lifecycle + kcpHelper iclient.KcpClientHelper } func NewAPIExportPolicyReconciler(log *logger.Logger, fgaClient openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, storeIDGetter fga.StoreIDGetter, kcpClientHelper iclient.KcpClientHelper) *APIExportPolicyReconciler { @@ -62,7 +64,7 @@ func (r *APIExportPolicyReconciler) Reconcile(ctx context.Context, req mcreconci return r.lifecycle.Reconcile(ctx, req) } -func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg *platformeshconfig.CommonServiceConfig, operatorCfg *config.Config, evp ...predicate.Predicate) error { +func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg *platformeshconfig.CommonServiceConfig, evp ...predicate.Predicate) error { opts := controller.TypedOptions[mcreconcile.Request]{ MaxConcurrentReconciles: cfg.MaxConcurrentReconciles, } @@ -70,34 +72,49 @@ func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg return mcbuilder.ControllerManagedBy(mgr). Named("apiexportpolicy"). - For(&corev1alpha1.APIExportPolicy{}). + For(&corev1alpha1.APIExportPolicy{}, + mcbuilder.WithClusterFilter(func(clusterName multicluster.ClusterName, _ cluster.Cluster) bool { + return strings.HasPrefix(string(clusterName), config.SystemProviderName) + }), + ). WithOptions(opts). WithEventFilter(predicate.And(predicates...)). Watches( - &kcptenancyv1alpha1.Workspace{}, + &accountsv1alpha1.Account{}, func(_ multicluster.ClusterName, _ cluster.Cluster) ctrhandler.TypedEventHandler[client.Object, mcreconcile.Request] { return handler.TypedEnqueueRequestsFromMapFuncWithClusterPreservation(func(ctx context.Context, obj client.Object) []mcreconcile.Request { - ws, ok := obj.(*kcptenancyv1alpha1.Workspace) + acc, ok := obj.(*accountsv1alpha1.Account) if !ok { return nil } - // we need to enqueue only when a new org appears - if ws.Spec.Type.Path != orgsWorkspacePath || ws.Status.Phase != readyPhase { + // we need to enqueue only when a new org is ready + if acc.Spec.Type != accountsv1alpha1.AccountTypeOrg || meta.FindStatusCondition(acc.GetConditions(), "Ready").Status != metav1.ConditionTrue { return nil } // List all APIExportPolicy resources and enqueue those with root:orgs:* expression - return r.enqueueAllAPIExportPolicies(ctx, mgr, operatorCfg) + return r.enqueueAllAPIExportPolicies(ctx, mgr) }) }, + mcbuilder.WithClusterFilter(func(clusterName multicluster.ClusterName, _ cluster.Cluster) bool { + return strings.HasPrefix(string(clusterName), config.CoreProviderName) + }), ).Complete(r) } -func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Context, mgr mcmanager.Manager, cfg *config.Config) []mcreconcile.Request { +func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Context, mgr mcmanager.Manager) []mcreconcile.Request { var policies corev1alpha1.APIExportPolicyList - if err := r.kcpHelper.List(ctx, &policies); err != nil { - r.log.Error().Err(err).Msg("failed to list APIExportPolicy resources") + + cluster, err := mgr.GetCluster(ctx, multiProviderName(config.SystemProviderName, config.OrgsClusterPath)) + if err != nil { + r.log.Error().Err(err).Msg("failed to get root:orgs cluster") + return nil + } + + err = cluster.GetClient().List(ctx, &policies) + if err != nil { + r.log.Error().Err(err).Msg("failed to list all APIExportPolicies") return nil } @@ -108,14 +125,14 @@ func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Cont trimmedExpr := strings.TrimPrefix(expr, ":") if trimmedExpr == "root:orgs:*" { - clusterName := logicalcluster.From(&policy) + clusterName := multiProviderName(config.SystemProviderName, logicalcluster.From(&policy).String()) requests = append(requests, mcreconcile.Request{ Request: reconcile.Request{ NamespacedName: types.NamespacedName{ Name: policy.Name, }, }, - ClusterName: multicluster.ClusterName(clusterName.String()), + ClusterName: clusterName, }) break } @@ -123,3 +140,9 @@ func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Cont } return requests } + +// multiProviderName returns a cluster name with provider prefix and separator for multi provider. +// The multi.Provider prefixes cluster names as "providerName#clusterName" +func multiProviderName(providerName, clusterName string) multicluster.ClusterName { + return multicluster.ClusterName(providerName + config.ProviderSeparator + clusterName) +} diff --git a/internal/controller/idp_controller.go b/internal/controller/idp_controller.go index 65de344c..c922cd87 100644 --- a/internal/controller/idp_controller.go +++ b/internal/controller/idp_controller.go @@ -3,6 +3,7 @@ package controller import ( "context" "fmt" + "strings" platformeshconfig "github.com/platform-mesh/golang-commons/config" "github.com/platform-mesh/golang-commons/controller/filter" @@ -15,10 +16,12 @@ import ( "github.com/platform-mesh/subroutines/lifecycle" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/predicate" mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" "k8s.io/client-go/util/workqueue" @@ -65,7 +68,9 @@ func (r *IdentityProviderConfigurationReconciler) SetupWithManager(mgr mcmanager predicates := append([]predicate.Predicate{filter.DebugResourcesBehaviourPredicate(cfg.DebugLabelValue)}, evp...) return mcbuilder.ControllerManagedBy(mgr). Named("identityprovider"). - For(&corev1alpha1.IdentityProviderConfiguration{}). + For(&corev1alpha1.IdentityProviderConfiguration{}, mcbuilder.WithClusterFilter(func(clusterName multicluster.ClusterName, _ cluster.Cluster) bool { + return strings.HasPrefix(string(clusterName), config.SystemProviderName) + })). WithOptions(opts). WithEventFilter(predicate.And(predicates...)). Complete(r) From 4c0689bb41b8b0e9e5cbf32342c5e5e73a505e70 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 15:29:40 +0200 Subject: [PATCH 03/16] chore: remove authorization model migration func On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/operator.go | 58 +++++-------------------------------------------- cmd/system.go | 3 ++- 2 files changed, 7 insertions(+), 54 deletions(-) diff --git a/cmd/operator.go b/cmd/operator.go index 3c0fb8e2..6bcedbbe 100644 --- a/cmd/operator.go +++ b/cmd/operator.go @@ -11,7 +11,6 @@ import ( "github.com/platform-mesh/golang-commons/sentry" corev1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" iclient "github.com/platform-mesh/security-operator/internal/client" - "github.com/platform-mesh/security-operator/internal/config" "github.com/platform-mesh/security-operator/internal/controller" fga2 "github.com/platform-mesh/security-operator/internal/fga" "github.com/platform-mesh/security-operator/internal/predicates" @@ -60,13 +59,6 @@ var operatorCmd = &cobra.Command{ return err } - if operatorCfg.MigrateAuthorizationModels { - if err := migrateAuthorizationModels(ctx, restCfg, &operatorCfg, scheme); err != nil { - log.Error().Err(err).Msg("migration failed") - return err - } - } - if defaultCfg.Sentry.Dsn != "" { err := sentry.Start(ctx, defaultCfg.Sentry.Dsn, defaultCfg.Environment, defaultCfg.Region, @@ -150,6 +142,8 @@ var operatorCmd = &cobra.Command{ log, ) + kcpClientHelper := iclient.NewKcpHelper(restCfg, scheme, provider.Provider) + k8sCfg := ctrl.GetConfigOrDie() runtimeClient, err := client.New(k8sCfg, client.Options{Scheme: scheme}) @@ -163,7 +157,7 @@ var operatorCmd = &cobra.Command{ return err } - if err = controller.NewStoreReconciler(ctx, log, fga, mgr, &operatorCfg). + if err = controller.NewStoreReconciler(ctx, log, fga, mgr, &operatorCfg, kcpClientHelper). SetupWithManager(mgr, defaultCfg); err != nil { log.Error().Err(err).Str("controller", "store").Msg("unable to create controller") return err @@ -186,7 +180,7 @@ var operatorCmd = &cobra.Command{ orgReconciler, err := controller.NewOrgLogicalClusterController(log, orgClient, operatorCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterReconciler", - }) + }, kcpClientHelper) if err != nil { log.Error().Err(err).Str("controller", "logicalcluster").Msg("unable to create initializer") return err @@ -201,7 +195,7 @@ var operatorCmd = &cobra.Command{ alcReconciler, err := controller.NewAccountLogicalClusterController(log, operatorCfg, fga, storeIDGetter, mgr, controller.ControllerOptions{ Name: "AccountLogicalClusterReconciler", - }) + }, kcpClientHelper) if err != nil { log.Error().Err(err).Str("controller", "accounttypelogicalcluster").Msg("unable to create reconciler") return err @@ -245,48 +239,6 @@ var operatorCmd = &cobra.Command{ }, } -// this function can be removed after the operator has migrated the authz models in all environments -func migrateAuthorizationModels(ctx context.Context, config *rest.Config, operatorCfg *config.Config, scheme *runtime.Scheme) error { - allClient, err := iclient.GetAllClient(ctx, config, scheme, operatorCfg.APIExportEndpointSlices.CorePlatformMeshIO) - if err != nil { - return fmt.Errorf("failed to create all-cluster client: %w", err) - } - - var models corev1alpha1.AuthorizationModelList - if err := allClient.List(ctx, &models); err != nil { - return fmt.Errorf("failed to list AuthorizationModels: %w", err) - } - - for i := range models.Items { - item := &models.Items[i] - - if item.Spec.StoreRef.Cluster != "" { - continue - } - - if item.Spec.StoreRef.Path == "" { - return fmt.Errorf("AuthorizationModel %s has empty cluster field and no path field to migrate from", item.GetName()) - } - - clusterName := logicalcluster.From(item) - clusterClient, err := iclient.NewForLogicalCluster(config, scheme, clusterName) - if err != nil { - return fmt.Errorf("failed to create cluster client for AuthorizationModel %s (cluster %s): %w", item.GetName(), clusterName, err) - } - - original := item.DeepCopy() - item.Spec.StoreRef.Cluster = item.Spec.StoreRef.Path - - patch := client.MergeFrom(original) - if err := clusterClient.Patch(ctx, item, patch); err != nil { - return fmt.Errorf("failed to patch AuthorizationModel %s: %w", item.GetName(), err) - } - } - - log.Info().Msg("AuthorizationModel migration completed") - return nil -} - func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(kcptenancyv1alpha1.AddToScheme(scheme)) diff --git a/cmd/system.go b/cmd/system.go index 4f609a65..fc396806 100644 --- a/cmd/system.go +++ b/cmd/system.go @@ -81,6 +81,7 @@ var systemCmd = &cobra.Command{ setupLog.Error(err, "unable to create core apiexport provider") return err } + multiProv := multiprovider.New(multiprovider.Options{}) if err := multiProv.AddProvider(config.SystemProviderName, systemProvider); err != nil { return err @@ -126,7 +127,7 @@ var systemCmd = &cobra.Command{ return err } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), coreProvider.Provider.Provider) + kcpClientHelper := iclient.NewKcpHelper(restCfg, scheme, coreProvider.Provider.Provider) if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, &systemCfg, storeIDGetter, kcpClientHelper).SetupWithManager(mgr, defaultCfg); err != nil { log.Error().Err(err).Str("controller", "apiexportpolicy").Msg("unable to create controller") From 270c8ea9d7fa50d6bcce11ee16bd385a81225459 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 15:37:45 +0200 Subject: [PATCH 04/16] chore: update go.mod On-behalf-of: SAP aleh.yarshou@sap.com --- go.mod | 6 +++--- go.sum | 22 ++++++---------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index e2aaf35f..112179c5 100644 --- a/go.mod +++ b/go.mod @@ -26,10 +26,10 @@ require ( golang.org/x/oauth2 v0.36.0 google.golang.org/grpc v1.80.0 google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af - k8s.io/api v0.35.3 - k8s.io/apiextensions-apiserver v0.35.3 + k8s.io/api v0.35.4 + k8s.io/apiextensions-apiserver v0.35.4 k8s.io/apimachinery v0.36.0 - k8s.io/client-go v0.35.3 + k8s.io/client-go v0.35.4 k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 sigs.k8s.io/controller-runtime v0.23.3 sigs.k8s.io/multicluster-runtime v0.23.3 diff --git a/go.sum b/go.sum index 4a5410a6..6c7ac800 100644 --- a/go.sum +++ b/go.sum @@ -186,8 +186,6 @@ github.com/platform-mesh/golang-commons v0.16.9 h1:zrgGt2WYkt6JQO7kTAug3l9oSJq6j github.com/platform-mesh/golang-commons v0.16.9/go.mod h1:NelsVrhXiB9P/4Xa0M1Ejb6mmRfTxBHPdHo9OLHmAs4= github.com/platform-mesh/subroutines v0.3.3 h1:WKz0ZJnceC5KvUYrbmAdGTRnECkI6I4YXAEq3vKEV3Q= github.com/platform-mesh/subroutines v0.3.3/go.mod h1:4NmIkZXmbndYu4JzHWPu9JNoDipJcXP4oy4OPnLNT0Q= -github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= -github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -300,8 +298,6 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -320,22 +316,16 @@ k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988= k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= k8s.io/apiextensions-apiserver v0.35.4 h1:HeP+Upp7ItdvnyGmub0yoix+2z5+ev4M5cE5TCgtOUU= k8s.io/apiextensions-apiserver v0.35.4/go.mod h1:ogQlk+stIE8mnoRthSYCwlOS12fVqgWFiErMwPaXA7c= -k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= -k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= k8s.io/apimachinery v0.36.0 h1:jZyPzhd5Z+3h9vJLt0z9XdzW9VzNzWAUw+P1xZ9PXtQ= k8s.io/apimachinery v0.36.0/go.mod h1:FklypaRJt6n5wUIwWXIP6GJlIpUizTgfo1T/As+Tyxc= -k8s.io/apiserver v0.35.3 h1:D2eIcfJ05hEAEewoSDg+05e0aSRwx8Y4Agvd/wiomUI= -k8s.io/apiserver v0.35.3/go.mod h1:JI0n9bHYzSgIxgIrfe21dbduJ9NHzKJ6RchcsmIKWKY= -k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg= -k8s.io/client-go v0.35.3/go.mod h1:RzoXkc0mzpWIDvBrRnD+VlfXP+lRzqQjCmKtiwZ8Q9c= -k8s.io/component-base v0.35.3 h1:mbKbzoIMy7JDWS/wqZobYW1JDVRn/RKRaoMQHP9c4P0= -k8s.io/component-base v0.35.3/go.mod h1:IZ8LEG30kPN4Et5NeC7vjNv5aU73ku5MS15iZyvyMYk= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/apiserver v0.35.4 h1:vtuFqNFmF9bPRdHDL2lpK6qCTPWDreZJL4LRPwVM6ho= +k8s.io/apiserver v0.35.4/go.mod h1:JnBcb+J8kFXKpZkgcbcUnPBBHi4qgBii1I7dLxFY/oo= +k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8= +k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= +k8s.io/component-base v0.35.4 h1:6n1tNJ87johN0Hif0Fs8K2GMthsaUwMqCebUDLYyv7U= +k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY= -k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM= From 7853ce567c6e88d83329480edb4ec5ff79102eaf Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 15:48:53 +0200 Subject: [PATCH 05/16] chore: bump subroutines version from 0.3.3 to 0.4.3 On-behalf-of: SAP aleh.yarshou@sap.com --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 112179c5..f20c0ceb 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/openfga/language/pkg/go v0.2.1 github.com/platform-mesh/account-operator v0.14.25 github.com/platform-mesh/golang-commons v0.16.9 - github.com/platform-mesh/subroutines v0.3.3 + github.com/platform-mesh/subroutines v0.4.3 github.com/rs/zerolog v1.35.1 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 diff --git a/go.sum b/go.sum index 6c7ac800..98a3b194 100644 --- a/go.sum +++ b/go.sum @@ -186,6 +186,8 @@ github.com/platform-mesh/golang-commons v0.16.9 h1:zrgGt2WYkt6JQO7kTAug3l9oSJq6j github.com/platform-mesh/golang-commons v0.16.9/go.mod h1:NelsVrhXiB9P/4Xa0M1Ejb6mmRfTxBHPdHo9OLHmAs4= github.com/platform-mesh/subroutines v0.3.3 h1:WKz0ZJnceC5KvUYrbmAdGTRnECkI6I4YXAEq3vKEV3Q= github.com/platform-mesh/subroutines v0.3.3/go.mod h1:4NmIkZXmbndYu4JzHWPu9JNoDipJcXP4oy4OPnLNT0Q= +github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= +github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= From b1827de6f6964126a5e433028de5e2b7a31d69f3 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 16:05:13 +0200 Subject: [PATCH 06/16] chore: address linter issues On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/system.go | 3 +-- internal/client/kcp_helper.go | 5 +++-- internal/controller/apiexportpolicy_controller.go | 5 ----- internal/subroutine/apiexportpolicy_test.go | 8 ++++---- internal/subroutine/tuples_test.go | 2 +- internal/terminatingworkspaces/provider.go | 7 ++++--- 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/cmd/system.go b/cmd/system.go index fc396806..384b5d4d 100644 --- a/cmd/system.go +++ b/cmd/system.go @@ -17,13 +17,13 @@ import ( "sigs.k8s.io/controller-runtime/pkg/healthz" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + multiprovider "sigs.k8s.io/multicluster-runtime/providers/multi" "k8s.io/client-go/rest" "github.com/kcp-dev/logicalcluster/v3" "github.com/kcp-dev/multicluster-provider/apiexport" pathaware "github.com/kcp-dev/multicluster-provider/path-aware" - multiprovider "sigs.k8s.io/multicluster-runtime/providers/multi" ) var systemCmd = &cobra.Command{ @@ -81,7 +81,6 @@ var systemCmd = &cobra.Command{ setupLog.Error(err, "unable to create core apiexport provider") return err } - multiProv := multiprovider.New(multiprovider.Options{}) if err := multiProv.AddProvider(config.SystemProviderName, systemProvider); err != nil { return err diff --git a/internal/client/kcp_helper.go b/internal/client/kcp_helper.go index 8a36edb7..80d94ffa 100644 --- a/internal/client/kcp_helper.go +++ b/internal/client/kcp_helper.go @@ -3,9 +3,10 @@ package client import ( "context" + "sigs.k8s.io/controller-runtime/pkg/client" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/client" "github.com/kcp-dev/logicalcluster/v3" mcpprovider "github.com/kcp-dev/multicluster-provider/pkg/provider" @@ -35,5 +36,5 @@ func (f *KcpHelper) NewClientForLogicalCluster(clusterKey logicalcluster.Name) ( } func (f *KcpHelper) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { - return f.provider.Lister().List(ctx, list, opts...) + return f.provider.Lister().List(ctx, list, opts...) } diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index 114f7701..0e7e7542 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -36,11 +36,6 @@ import ( "github.com/kcp-dev/logicalcluster/v3" ) -const ( - orgsWorkspacePath = "root:orgs" - readyPhase = "Ready" -) - type APIExportPolicyReconciler struct { log *logger.Logger lifecycle *lifecycle.Lifecycle diff --git a/internal/subroutine/apiexportpolicy_test.go b/internal/subroutine/apiexportpolicy_test.go index 838c5de2..727db085 100644 --- a/internal/subroutine/apiexportpolicy_test.go +++ b/internal/subroutine/apiexportpolicy_test.go @@ -471,14 +471,14 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { { ObjectMeta: metav1.ObjectMeta{Name: "account-1"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, Organization: accountsv1alpha1.AccountLocation{Name: "org1"}, }, }, { ObjectMeta: metav1.ObjectMeta{Name: "account-2"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, Organization: accountsv1alpha1.AccountLocation{Name: "org2"}, }, }, @@ -749,14 +749,14 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { { ObjectMeta: metav1.ObjectMeta{Name: "account-1"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Account: accountsv1alpha1.AccountLocation{Name: "org1-account", OriginClusterId: "org1-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, Organization: accountsv1alpha1.AccountLocation{Name: "org1"}, }, }, { ObjectMeta: metav1.ObjectMeta{Name: "account-2"}, Spec: accountsv1alpha1.AccountInfoSpec{ - Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, + Account: accountsv1alpha1.AccountLocation{Name: "org2-account", OriginClusterId: "org2-cluster-id", Type: accountsv1alpha1.AccountTypeOrg}, Organization: accountsv1alpha1.AccountLocation{Name: "org2"}, }, }, diff --git a/internal/subroutine/tuples_test.go b/internal/subroutine/tuples_test.go index 1c42e0b2..441992e9 100644 --- a/internal/subroutine/tuples_test.go +++ b/internal/subroutine/tuples_test.go @@ -11,10 +11,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) func TestTupleGetName(t *testing.T) { diff --git a/internal/terminatingworkspaces/provider.go b/internal/terminatingworkspaces/provider.go index 0c20c85d..26edc4d9 100644 --- a/internal/terminatingworkspaces/provider.go +++ b/internal/terminatingworkspaces/provider.go @@ -4,13 +4,14 @@ import ( "strings" "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/rest" - "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/rest" + "k8s.io/utils/ptr" + "github.com/kcp-dev/logicalcluster/v3" mcpcache "github.com/kcp-dev/multicluster-provider/pkg/cache" "github.com/kcp-dev/multicluster-provider/pkg/events/recorder" From 7c36e315bdd91b517ce13eea25da670f3472e58a Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 17:11:04 +0200 Subject: [PATCH 07/16] chore: bump mc provider version from 0.5.1 to 0.7.0 On-behalf-of: SAP aleh.yarshou@sap.com --- go.mod | 8 ++------ go.sum | 6 ++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index f20c0ceb..b4ee717f 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,8 @@ require ( github.com/google/gnostic-models v0.7.1 github.com/jellydator/ttlcache/v3 v3.4.0 github.com/kcp-dev/logicalcluster/v3 v3.0.5 - github.com/kcp-dev/multicluster-provider v0.5.1 - github.com/kcp-dev/multicluster-provider/client v0.0.0-00010101000000-000000000000 + github.com/kcp-dev/multicluster-provider v0.7.0 + github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 github.com/kcp-dev/sdk v0.31.0 github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 github.com/openfga/language/pkg/go v0.2.1 @@ -134,7 +134,3 @@ require ( sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect ) - -replace github.com/kcp-dev/multicluster-provider => github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87 - -replace github.com/kcp-dev/multicluster-provider/client => github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 diff --git a/go.sum b/go.sum index 98a3b194..4b4f7def 100644 --- a/go.sum +++ b/go.sum @@ -138,8 +138,8 @@ github.com/kcp-dev/apimachinery/v2 v2.31.1 h1:CHAPoYy5JEMsby1WUId/JLs1QEPDz1lSwQ github.com/kcp-dev/apimachinery/v2 v2.31.1/go.mod h1:ta+d3xQkLYWBEEg8ICed+PekW3MckEYqXG4amq6Uk9Y= github.com/kcp-dev/logicalcluster/v3 v3.0.5 h1:JbYakokb+5Uinz09oTXomSUJVQsqfxEvU4RyHUYxHOU= github.com/kcp-dev/logicalcluster/v3 v3.0.5/go.mod h1:EWBUBxdr49fUB1cLMO4nOdBWmYifLbP1LfoL20KkXYY= -github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87 h1:42L/Nn5Y3oodjrOoBdtkF8zXFmCPsKc1CVkkdhUKYzU= -github.com/kcp-dev/multicluster-provider v0.0.0-20260430101011-fa033a7d2e87/go.mod h1:JB+ntaOpqhRFDRd+O7AYM5QZvt8/I/Xeo7SrW7+77EQ= +github.com/kcp-dev/multicluster-provider v0.7.0 h1:lO5yhWuf0GcvfG47CWV17iXJqyhXA5UcCbkIpy5x9x0= +github.com/kcp-dev/multicluster-provider v0.7.0/go.mod h1:JB+ntaOpqhRFDRd+O7AYM5QZvt8/I/Xeo7SrW7+77EQ= github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 h1:XlZ5niiYWAlMmmr8cxWyt5vtXb0MbyktkyDKzfPKmkE= github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87/go.mod h1:kK9CSLmECoRiOU+xKOhIE4tHpQBcBbBvWOgKORC/eqI= github.com/kcp-dev/sdk v0.31.0 h1:fLqgY6MHVmmBcttqR/V3h2Dnv7xmab84FTKTwV08+Bo= @@ -184,8 +184,6 @@ github.com/platform-mesh/account-operator v0.14.25 h1:JgyZbo71xj99kn+2V7qwYWUhH4 github.com/platform-mesh/account-operator v0.14.25/go.mod h1:i+bmuGgShn9GppYcbYLzYSo6p2dRcuKN4C/YZWO/mCQ= github.com/platform-mesh/golang-commons v0.16.9 h1:zrgGt2WYkt6JQO7kTAug3l9oSJq6jlHDZ8qcKo1kSq8= github.com/platform-mesh/golang-commons v0.16.9/go.mod h1:NelsVrhXiB9P/4Xa0M1Ejb6mmRfTxBHPdHo9OLHmAs4= -github.com/platform-mesh/subroutines v0.3.3 h1:WKz0ZJnceC5KvUYrbmAdGTRnECkI6I4YXAEq3vKEV3Q= -github.com/platform-mesh/subroutines v0.3.3/go.mod h1:4NmIkZXmbndYu4JzHWPu9JNoDipJcXP4oy4OPnLNT0Q= github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= From 9213932a96b50317d9b1a21030f699a8c2da5509 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Wed, 6 May 2026 21:32:26 +0200 Subject: [PATCH 08/16] chore: little refactoring On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/initializer.go | 2 +- cmd/terminator.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/initializer.go b/cmd/initializer.go index ee494972..e6958bff 100644 --- a/cmd/initializer.go +++ b/cmd/initializer.go @@ -101,7 +101,7 @@ var initializerCmd = &cobra.Command{ initializerCfg.IDP.AdditionalRedirectURLs = []string{} } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + kcpClientHelper := iclient.NewKcpHelper(restCfg, scheme, provider.Provider) orgReconciler, err := controller.NewOrgLogicalClusterController(log, orgClient, initializerCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterInitializer", diff --git a/cmd/terminator.go b/cmd/terminator.go index a2dd44af..5400a2ff 100644 --- a/cmd/terminator.go +++ b/cmd/terminator.go @@ -107,7 +107,7 @@ var terminatorCmd = &cobra.Command{ log, ) - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + kcpClientHelper := iclient.NewKcpHelper(kcpCfg, scheme, provider.Provider) alcReconciler, err := controller.NewAccountLogicalClusterController(log, terminatorCfg, fgaClient, storeIDGetter, mgr, controller.ControllerOptions{ Name: "AccountLogicalClusterTerminator", From 07237083b89cd01dc64eb27808d1726f1404d733 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Thu, 7 May 2026 10:20:01 +0200 Subject: [PATCH 09/16] fix: updated tests On-behalf-of: SAP aleh.yarshou@sap.com --- internal/config/config.go | 9 +- .../controller/apiexportpolicy_controller.go | 10 +- internal/subroutine/apiexportpolicy.go | 4 +- internal/subroutine/apiexportpolicy_test.go | 203 ++++++++---------- 4 files changed, 97 insertions(+), 129 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 172c51ba..2f28730d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -5,12 +5,13 @@ import ( "time" "github.com/spf13/pflag" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) const ( CoreProviderName = "core" SystemProviderName = "system" - ProviderSeparator = "#" + providerSeparator = "#" OrgsClusterPath = "root:orgs" ) @@ -188,3 +189,9 @@ func (config Config) InitializerName() string { func (config Config) TerminatorName() string { return config.WorkspacePath + ":" + config.WorkspaceTypeName } + +// MultiProviderName returns a cluster name with provider prefix and separator for multi provider. +// The multi.Provider prefixes cluster names as "providerName#clusterName" +func MultiProviderName(providerName, clusterName string) multicluster.ClusterName { + return multicluster.ClusterName(providerName + providerSeparator + clusterName) +} diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index 0e7e7542..f6225fde 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -101,7 +101,7 @@ func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Context, mgr mcmanager.Manager) []mcreconcile.Request { var policies corev1alpha1.APIExportPolicyList - cluster, err := mgr.GetCluster(ctx, multiProviderName(config.SystemProviderName, config.OrgsClusterPath)) + cluster, err := mgr.GetCluster(ctx, config.MultiProviderName(config.SystemProviderName, config.OrgsClusterPath)) if err != nil { r.log.Error().Err(err).Msg("failed to get root:orgs cluster") return nil @@ -120,7 +120,7 @@ func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Cont trimmedExpr := strings.TrimPrefix(expr, ":") if trimmedExpr == "root:orgs:*" { - clusterName := multiProviderName(config.SystemProviderName, logicalcluster.From(&policy).String()) + clusterName := config.MultiProviderName(config.SystemProviderName, logicalcluster.From(&policy).String()) requests = append(requests, mcreconcile.Request{ Request: reconcile.Request{ NamespacedName: types.NamespacedName{ @@ -135,9 +135,3 @@ func (r *APIExportPolicyReconciler) enqueueAllAPIExportPolicies(ctx context.Cont } return requests } - -// multiProviderName returns a cluster name with provider prefix and separator for multi provider. -// The multi.Provider prefixes cluster names as "providerName#clusterName" -func multiProviderName(providerName, clusterName string) multicluster.ClusterName { - return multicluster.ClusterName(providerName + config.ProviderSeparator + clusterName) -} diff --git a/internal/subroutine/apiexportpolicy.go b/internal/subroutine/apiexportpolicy.go index e77a1908..26189b70 100644 --- a/internal/subroutine/apiexportpolicy.go +++ b/internal/subroutine/apiexportpolicy.go @@ -177,13 +177,13 @@ func (a *APIExportPolicySubroutine) Finalize(ctx context.Context, obj client.Obj } func (a *APIExportPolicySubroutine) getClusterIDFromPath(ctx context.Context, clusterPath string) (string, error) { - lcClient, err := a.kcpHelper.NewClientForLogicalCluster(logicalcluster.Name(clusterPath)) + cl, err := a.mgr.GetCluster(ctx, config.MultiProviderName(config.CoreProviderName, clusterPath)) if err != nil { return "", fmt.Errorf("getting client for workspace %s: %w", clusterPath, err) } var lc kcpcorev1alpha1.LogicalCluster - if err := lcClient.Get(ctx, client.ObjectKey{Name: "cluster"}, &lc); err != nil { + if err := cl.GetClient().Get(ctx, client.ObjectKey{Name: "cluster"}, &lc); err != nil { return "", fmt.Errorf("getting logical cluster for path %s: %w", clusterPath, err) } diff --git a/internal/subroutine/apiexportpolicy_test.go b/internal/subroutine/apiexportpolicy_test.go index 727db085..0b7657af 100644 --- a/internal/subroutine/apiexportpolicy_test.go +++ b/internal/subroutine/apiexportpolicy_test.go @@ -54,7 +54,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { expectError bool }{ { - name: "should fail when getting provider cluster ID fails - LogicalCluster not found", + name: "should fail when getting provider cluster ID fails - GetCluster fails", policy: &corev1alpha1.APIExportPolicy{ ObjectMeta: metav1.ObjectMeta{ Name: "test-policy", @@ -68,7 +68,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }, }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, errors.New("logical cluster not found")).Maybe() + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(nil, errors.New("cluster not found")) }, cfg: &config.Config{}, expectError: true, @@ -89,6 +89,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() + providerCluster := mocks.NewMockCluster(t) providerClient := fake.NewClientBuilder(). WithScheme(scheme). WithObjects(&kcpcorev1alpha1.LogicalCluster{ @@ -98,13 +99,14 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }, }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() + providerCluster.EXPECT().GetClient().Return(providerClient) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) }, cfg: &config.Config{}, expectError: true, }, { - name: "should handle wildcard expression with root:orgs path - GetAllClient fails", + name: "should handle wildcard expression with root:orgs path - List fails", policy: &corev1alpha1.APIExportPolicy{ ObjectMeta: metav1.ObjectMeta{ Name: "test-policy", @@ -119,6 +121,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() + providerCluster := mocks.NewMockCluster(t) providerClient := fake.NewClientBuilder(). WithScheme(scheme). WithObjects(&kcpcorev1alpha1.LogicalCluster{ @@ -128,7 +131,8 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { }, }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() + providerCluster.EXPECT().GetClient().Return(providerClient) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(errors.New("unable to list")).Maybe() }, cfg: &config.Config{}, @@ -187,13 +191,13 @@ func TestAPIExportPolicySubroutine_Finalize(t *testing.T) { }, }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, errors.New("failed to get clusterID")).Maybe() + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(nil, errors.New("failed to get cluster")) }, cfg: &config.Config{}, expectError: true, }, { - name: "should handle finalize with wildcard expression - GetAllClient fails", + name: "should handle finalize with wildcard expression - NewClientForLogicalCluster fails", policy: &corev1alpha1.APIExportPolicy{ ObjectMeta: metav1.ObjectMeta{ Name: "test-policy", @@ -208,6 +212,7 @@ func TestAPIExportPolicySubroutine_Finalize(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() + providerCluster := mocks.NewMockCluster(t) providerClient := fake.NewClientBuilder(). WithScheme(scheme). WithObjects(&kcpcorev1alpha1.LogicalCluster{ @@ -217,7 +222,9 @@ func TestAPIExportPolicySubroutine_Finalize(t *testing.T) { }, }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() + providerCluster.EXPECT().GetClient().Return(providerClient) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, errors.New("failed to get client")) }, cfg: &config.Config{}, expectError: true, @@ -277,16 +284,9 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) // Target workspace client with AccountInfo targetClient := fake.NewClientBuilder(). @@ -319,9 +319,6 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { return name.String() == "root:orgs:acme" })).Return(targetClient, nil) @@ -365,16 +362,9 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) // Target workspace client with AccountInfo targetClient := fake.NewClientBuilder(). @@ -407,9 +397,6 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { return name.String() == "root:orgs:acme" })).Return(targetClient, nil) @@ -453,16 +440,9 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) // All client with AccountInfo list kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { @@ -495,9 +475,6 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { }). WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "org1").Return("store-id-org1", nil) storeIDGetter.EXPECT().Get(mock.Anything, "org2").Return("store-id-org2", nil) @@ -591,16 +568,9 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) // Target workspace client with AccountInfo targetClient := fake.NewClientBuilder(). @@ -622,9 +592,6 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { return name.String() == "root:orgs:acme" })).Return(targetClient, nil) @@ -665,16 +632,9 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - // Provider cluster client - providerClient := fake.NewClientBuilder(). - WithScheme(scheme). - WithObjects(&kcpcorev1alpha1.LogicalCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "cluster", - Annotations: map[string]string{"kcp.io/cluster": "provider-cluster-id"}, - }, - }). - Build() + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) // Target workspace client with AccountInfo targetClient := fake.NewClientBuilder(). @@ -696,9 +656,6 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:providers:my-provider" - })).Return(providerClient, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { return name.String() == "root:orgs:acme" })).Return(targetClient, nil) @@ -738,10 +695,11 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { - // Provider cluster client scheme := getAPIExportPolicyTestScheme() - providerClient := newProviderClient(scheme) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Maybe() + + // Provider cluster mock + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { if list, ok := ol.(*accountsv1alpha1.AccountInfoList); ok { @@ -840,6 +798,13 @@ func newProviderClient(scheme *runtime.Scheme) client.Client { Build() } +func newProviderCluster(t *testing.T, scheme *runtime.Scheme) *mocks.MockCluster { + cluster := mocks.NewMockCluster(t) + client := newProviderClient(scheme) + cluster.EXPECT().GetClient().Return(client).Maybe() + return cluster +} + func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { tests := []struct { name string @@ -857,8 +822,10 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { + providerCluster := mocks.NewMockCluster(t) providerClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Once() + providerCluster.EXPECT().GetClient().Return(providerClient) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) providerClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, @@ -878,7 +845,9 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { WithScheme(scheme). WithObjects(&kcpcorev1alpha1.LogicalCluster{ObjectMeta: metav1.ObjectMeta{Name: "cluster"}}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(noAnnotationClient, nil).Once() + noAnnotationCluster := mocks.NewMockCluster(t) + noAnnotationCluster.EXPECT().GetClient().Return(noAnnotationClient) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(noAnnotationCluster, nil) }, cfg: &config.Config{}, expectError: true, @@ -893,8 +862,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - providerClient := newProviderClient(scheme) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(providerClient, nil).Once() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil).Times(2) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, assert.AnError).Once() }, cfg: &config.Config{}, @@ -915,9 +884,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(nil, assert.AnError).Once() @@ -935,7 +903,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, @@ -951,7 +920,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ @@ -980,7 +950,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ @@ -1007,9 +978,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(nil, assert.AnError).Once() @@ -1028,9 +998,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() targetClient := mocks.NewMockClient(t) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1054,9 +1023,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "account"}, Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "acme-org"}}, }).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1080,9 +1048,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "account"}, Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "acme-org"}}, }).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1108,9 +1075,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "account"}, Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "acme-org"}}, }).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1139,9 +1105,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }).Build() // Empty cluster client — Status().Patch will fail with NotFound for "test-policy" clusterClient := fake.NewClientBuilder().WithScheme(scheme).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1201,7 +1166,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) }, cfg: &config.Config{}, expectError: true, @@ -1216,7 +1182,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, @@ -1232,7 +1199,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, cfg: &config.Config{}, @@ -1248,7 +1216,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ @@ -1271,7 +1240,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, ol client.ObjectList, _ ...client.ListOption) error { list := ol.(*accountsv1alpha1.AccountInfoList) list.Items = []accountsv1alpha1.AccountInfo{ @@ -1295,9 +1265,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }, setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { scheme := getAPIExportPolicyTestScheme() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(nil, assert.AnError).Once() @@ -1320,9 +1289,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "account"}, Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "acme-org"}}, }).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() @@ -1346,9 +1314,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "account"}, Spec: accountsv1alpha1.AccountInfoSpec{Organization: accountsv1alpha1.AccountLocation{Name: "acme-org"}}, }).Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:providers:my-provider" - })).Return(newProviderClient(scheme), nil).Maybe() + providerCluster := newProviderCluster(t, scheme) + mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { return n.String() == "root:orgs:acme" })).Return(targetClient, nil).Once() From 319d253fffd551761944ffcc6fe4e9120cd223d2 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Thu, 7 May 2026 16:22:52 +0200 Subject: [PATCH 10/16] fix: resolve merge conflicts On-behalf-of: SAP aleh.yarshou@sap.com --- .mockery.yaml | 37 +- cmd/initializer.go | 4 +- cmd/model_generator.go | 5 +- cmd/operator.go | 15 +- cmd/system.go | 4 +- cmd/terminator.go | 5 +- internal/client/kcp_helper.go | 39 +- internal/controller/apibinding_controller.go | 4 +- internal/controller/store_controller.go | 6 +- internal/subroutine/apiexportpolicy.go | 8 +- internal/subroutine/apiexportpolicy_test.go | 68 +-- internal/subroutine/authorization_model.go | 12 +- .../authorization_model_generation.go | 15 +- .../authorization_model_generation_test.go | 172 ++++---- .../subroutine/authorization_model_test.go | 26 +- internal/subroutine/idp/subroutine.go | 8 +- internal/subroutine/idp/subroutine_test.go | 11 +- internal/subroutine/invite/subroutine.go | 2 +- internal/subroutine/mocks/mock_CTRLManager.go | 378 ++++++++--------- .../subroutine/mocks/mock_KCPClientGetter.go | 169 ++++++++ .../mocks/mock_KCPCombinedClientGetter.go | 241 +++++++++++ internal/subroutine/mocks/mock_KCPGetters.go | 394 ------------------ internal/subroutine/mocks/mock_Lister.go | 111 +++++ internal/subroutine/mocks/mock_Manager.go | 10 +- .../subroutine/mocks/mock_StoreIDGetter.go | 50 ++- internal/subroutine/store.go | 4 +- internal/subroutine/store_test.go | 16 +- internal/test/integration/suite_test.go | 5 +- 28 files changed, 985 insertions(+), 834 deletions(-) create mode 100644 internal/subroutine/mocks/mock_KCPClientGetter.go create mode 100644 internal/subroutine/mocks/mock_KCPCombinedClientGetter.go delete mode 100644 internal/subroutine/mocks/mock_KCPGetters.go create mode 100644 internal/subroutine/mocks/mock_Lister.go diff --git a/.mockery.yaml b/.mockery.yaml index ac06cd7d..c0ff417a 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -1,10 +1,10 @@ -pkgname: mocks include-auto-generated: true packages: github.com/openfga/api/proto/openfga/v1: config: dir: internal/subroutine/mocks filename: mock_OpenFGAServiceClient.go + pkgname: mocks interfaces: OpenFGAServiceClient: @@ -12,28 +12,35 @@ packages: config: dir: internal/subroutine/mocks filename: mock_Client.go + pkgname: mocks interfaces: Client: sigs.k8s.io/controller-runtime/pkg/manager: config: dir: internal/subroutine/mocks - filename: mock_CTRLManager.go - structname: CTRLManager + pkgname: mocks interfaces: Manager: + config: + filename: mock_CTRLManager.go + structname: MockCTRLManager sigs.k8s.io/multicluster-runtime/pkg/manager: config: dir: internal/subroutine/mocks - filename: mock_Manager.go + pkgname: mocks interfaces: Manager: + config: + filename: mock_Manager.go + structname: MockManager sigs.k8s.io/controller-runtime/pkg/cluster: config: dir: internal/subroutine/mocks filename: mock_Cluster.go + pkgname: mocks interfaces: Cluster: @@ -41,20 +48,38 @@ packages: config: dir: internal/subroutine/mocks filename: mock_DiscoveryInterface.go + pkgname: mocks interfaces: DiscoveryInterface: github.com/platform-mesh/security-operator/internal/client: config: dir: internal/subroutine/mocks - filename: mock_KCPGetters.go + pkgname: mocks + all: true interfaces: KCPClientGetter: + config: + filename: mock_KCPClientGetter.go KCPCombinedClientGetter: + config: + filename: mock_KCPCombinedClientGetter.go + Lister: + config: + filename: mock_Lister.go github.com/platform-mesh/security-operator/pkg/clientreg: config: dir: internal/subroutine/mocks filename: mock_TokenRefresher.go + pkgname: mocks interfaces: - TokenRefresher: \ No newline at end of file + TokenRefresher: + + github.com/platform-mesh/security-operator/internal/fga: + config: + dir: internal/subroutine/mocks + filename: mock_StoreIDGetter.go + pkgname: mocks + interfaces: + StoreIDGetter: \ No newline at end of file diff --git a/cmd/initializer.go b/cmd/initializer.go index 324dd3a1..d1a8216d 100644 --- a/cmd/initializer.go +++ b/cmd/initializer.go @@ -98,7 +98,7 @@ var initializerCmd = &cobra.Command{ orgReconciler, err := controller.NewOrgLogicalClusterController(log, kcpClientGetter, initializerCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterInitializer", InitializerName: initializerCfg.InitializerName(), - }, kcpClientHelper) + }) if err != nil { setupLog.Error(err, "unable to create LogicalCluster initializer") os.Exit(1) @@ -126,7 +126,7 @@ var initializerCmd = &cobra.Command{ Name: "AccountLogicalClusterInitializer", InitializerName: initializerCfg.InitializerName(), TerminatorName: initializerCfg.TerminatorName(), - }, kcpClientHelper) + }) if err != nil { setupLog.Error(err, "unable to create AccountLogicalCluster reconciler") os.Exit(1) diff --git a/cmd/model_generator.go b/cmd/model_generator.go index f0ed79dd..391875bc 100644 --- a/cmd/model_generator.go +++ b/cmd/model_generator.go @@ -8,7 +8,6 @@ import ( platformeshcontext "github.com/platform-mesh/golang-commons/context" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" iclient "github.com/platform-mesh/security-operator/internal/client" - iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/security-operator/internal/controller" "github.com/spf13/cobra" ctrl "sigs.k8s.io/controller-runtime" @@ -87,7 +86,9 @@ var modelGeneratorCmd = &cobra.Command{ return err } - if err := controller.NewAPIBindingReconciler(log, mgr, iclient.NewConfigSchemeKCPClientGetter(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme()), &generatorCfg). + providerLister := iclient.NewProviderLister(provider.Provider.Provider) + + if err := controller.NewAPIBindingReconciler(log, mgr, providerLister, &generatorCfg). SetupWithManager(mgr, defaultCfg); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Resource") return err diff --git a/cmd/operator.go b/cmd/operator.go index 10b8c6c9..7b82eabd 100644 --- a/cmd/operator.go +++ b/cmd/operator.go @@ -31,7 +31,6 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" - "github.com/kcp-dev/logicalcluster/v3" "github.com/kcp-dev/multicluster-provider/apiexport" pathaware "github.com/kcp-dev/multicluster-provider/path-aware" kcpapisv1alpha1 "github.com/kcp-dev/sdk/apis/apis/v1alpha1" @@ -143,8 +142,6 @@ var operatorCmd = &cobra.Command{ log, ) - kcpClientHelper := iclient.NewKcpHelper(restCfg, scheme, provider.Provider) - k8sCfg := ctrl.GetConfigOrDie() runtimeClient, err := client.New(k8sCfg, client.Options{Scheme: scheme}) @@ -152,8 +149,9 @@ var operatorCmd = &cobra.Command{ log.Error().Err(err).Msg("Failed to create in cluster client") return err } - allClientGetter := iclient.NewConfigSchemeKCPClientGetter(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme()) - if err = controller.NewStoreReconciler(ctx, log, fga, mgr, allClientGetter, &operatorCfg). + providerLister := iclient.NewProviderLister(provider.Provider.Provider) + + if err = controller.NewStoreReconciler(ctx, log, fga, mgr, &operatorCfg, providerLister). SetupWithManager(mgr, defaultCfg); err != nil { log.Error().Err(err).Str("controller", "store").Msg("unable to create controller") return err @@ -164,7 +162,8 @@ var operatorCmd = &cobra.Command{ log.Error().Err(err).Str("controller", "authorizationmodel").Msg("unable to create controller") return err } - kcpClientGetter := iclient.NewManagerKCPClientGetter(mgr) + + kcpClientGetter := iclient.NewManagerKCPClientGetter(mgr, provider.Provider.Provider) inviteReconciler, err := controller.NewInviteReconciler(ctx, mgr, &operatorCfg, log, kcpClientGetter) if err != nil { log.Error().Err(err).Str("controller", "invite").Msg("unable to create reconciler") @@ -176,7 +175,7 @@ var operatorCmd = &cobra.Command{ } orgReconciler, err := controller.NewOrgLogicalClusterController(log, kcpClientGetter, operatorCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterReconciler", - }, kcpClientHelper) + }) if err != nil { log.Error().Err(err).Str("controller", "logicalcluster").Msg("unable to create initializer") return err @@ -191,7 +190,7 @@ var operatorCmd = &cobra.Command{ alcReconciler, err := controller.NewAccountLogicalClusterController(log, operatorCfg, fga, storeIDGetter, mgr, kcpClientGetter, controller.ControllerOptions{ Name: "AccountLogicalClusterReconciler", - }, kcpClientHelper) + }) if err != nil { log.Error().Err(err).Str("controller", "accounttypelogicalcluster").Msg("unable to create reconciler") return err diff --git a/cmd/system.go b/cmd/system.go index 863054f1..9eb253bc 100644 --- a/cmd/system.go +++ b/cmd/system.go @@ -109,7 +109,7 @@ var systemCmd = &cobra.Command{ log, ) - kcpClientGetter := iclient.NewManagerKCPClientGetter(mgr) + kcpClientGetter := iclient.NewManagerKCPClientGetter(mgr, coreProvider.Provider.Provider) idpReconciler, err := controller.NewIdentityProviderConfigurationReconciler(ctx, mgr, kcpClientGetter, &systemCfg, log) if err != nil { log.Error().Err(err).Str("controller", "identityprovider").Msg("unable to create reconciler") @@ -120,7 +120,7 @@ var systemCmd = &cobra.Command{ return err } - if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, kcpClientGetter, &systemCfg, storeIDGetter).SetupWithManager(mgr, defaultCfg, &systemCfg); err != nil { + if err = controller.NewAPIExportPolicyReconciler(log, fgaClient, mgr, kcpClientGetter, &systemCfg, storeIDGetter).SetupWithManager(mgr, defaultCfg); err != nil { log.Error().Err(err).Str("controller", "apiexportpolicy").Msg("unable to create controller") return err } diff --git a/cmd/terminator.go b/cmd/terminator.go index ce9860a3..a4142141 100644 --- a/cmd/terminator.go +++ b/cmd/terminator.go @@ -85,11 +85,12 @@ var terminatorCmd = &cobra.Command{ cmd.Context(), log, ) + kcpClientGetter := iclient.NewConfigSchemeKCPClientGetter(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme()) - alcReconciler, err := controller.NewAccountLogicalClusterController(log, terminatorCfg, fgaClient, storeIDGetter, mgr, controller.ControllerOptions{ + alcReconciler, err := controller.NewAccountLogicalClusterController(log, terminatorCfg, fgaClient, storeIDGetter, mgr, kcpClientGetter, controller.ControllerOptions{ Name: "AccountLogicalClusterTerminator", TerminatorName: terminatorCfg.TerminatorName(), - }, kcpClientHelper) + }) if err != nil { log.Error().Err(err).Msg("unable to create AccountLogicalCluster reconciler") os.Exit(1) diff --git a/internal/client/kcp_helper.go b/internal/client/kcp_helper.go index 0cfd7e82..28c961e2 100644 --- a/internal/client/kcp_helper.go +++ b/internal/client/kcp_helper.go @@ -12,7 +12,8 @@ import ( "k8s.io/client-go/rest" "github.com/kcp-dev/logicalcluster/v3" - mcpprovider "github.com/kcp-dev/multicluster-provider/pkg/provider" + "github.com/kcp-dev/multicluster-provider/pkg/provider" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) type KCPClientGetter interface { @@ -20,27 +21,28 @@ type KCPClientGetter interface { NewClientFromContext(ctx context.Context) (client.Client, error) } -type KCPAllClientGetter interface { - AllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) +type Lister interface { + List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error } type KCPCombinedClientGetter interface { KCPClientGetter - KCPAllClientGetter + Lister } // ManagerKCPClientGetter retrieves cluster clients via the manager and builds // all-Clients via the manager's config and scheme. type ManagerKCPClientGetter struct { - mgr mcmanager.Manager + mgr mcmanager.Manager + provider *provider.Provider } -func NewManagerKCPClientGetter(mgr mcmanager.Manager) *ManagerKCPClientGetter { - return &ManagerKCPClientGetter{mgr: mgr} +func NewManagerKCPClientGetter(mgr mcmanager.Manager, provider *provider.Provider) *ManagerKCPClientGetter { + return &ManagerKCPClientGetter{mgr: mgr, provider: provider} } func (f *ManagerKCPClientGetter) NewClientForLogicalCluster(ctx context.Context, cluster string) (client.Client, error) { - kcpCluster, err := f.mgr.GetCluster(ctx, cluster) + kcpCluster, err := f.mgr.GetCluster(ctx, multicluster.ClusterName(cluster)) if err != nil { return nil, fmt.Errorf("getting cluster: %w", err) } @@ -57,8 +59,21 @@ func (f *ManagerKCPClientGetter) NewClientFromContext(ctx context.Context) (clie return cl.GetClient(), nil } -func (f *ManagerKCPClientGetter) AllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) { - return NewAll(ctx, f.mgr.GetLocalManager().GetConfig(), f.mgr.GetLocalManager().GetScheme(), apiexportEndpointSliceName) +func (f *ManagerKCPClientGetter) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + return f.provider.Lister().List(ctx, list, opts...) +} + +type ProviderLister struct { + provider *provider.Provider +} + +func NewProviderLister(provider *provider.Provider) *ProviderLister { + return &ProviderLister{provider: provider} +} + +// List lists resources across all clusters on all cshards. +func (p *ProviderLister) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + return p.provider.Lister().List(ctx, list, opts...) } // ConfigSchemeKCPClientGetter builds cluster and all-Clients via a given config @@ -88,7 +103,3 @@ func (f *ConfigSchemeKCPClientGetter) NewClientFromContext(ctx context.Context) return NewForLogicalCluster(f.config, f.scheme, logicalcluster.Name(clusterName)) } - -func (f *KcpHelper) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { - return f.provider.Lister().List(ctx, list, opts...) -} diff --git a/internal/controller/apibinding_controller.go b/internal/controller/apibinding_controller.go index 28c71fae..23d9c140 100644 --- a/internal/controller/apibinding_controller.go +++ b/internal/controller/apibinding_controller.go @@ -21,10 +21,10 @@ import ( kcpapisv1alpha2 "github.com/kcp-dev/sdk/apis/apis/v1alpha2" ) -func NewAPIBindingReconciler(logger *logger.Logger, mcMgr mcmanager.Manager, clientGetter iclient.KCPCombinedClientGetter, cfg *config.Config) *APIBindingReconciler { +func NewAPIBindingReconciler(logger *logger.Logger, mcMgr mcmanager.Manager, lister iclient.Lister, cfg *config.Config) *APIBindingReconciler { lc := lifecycle.New(mcMgr, "APIBindingReconciler", func() client.Object { return &kcpapisv1alpha2.APIBinding{} - }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, clientGetter, cfg.APIExportEndpointSlices.CorePlatformMeshIO)) + }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, lister, cfg.APIExportEndpointSlices.CorePlatformMeshIO)) return &APIBindingReconciler{ log: logger, diff --git a/internal/controller/store_controller.go b/internal/controller/store_controller.go index 71f8bc22..adc8898c 100644 --- a/internal/controller/store_controller.go +++ b/internal/controller/store_controller.go @@ -38,12 +38,12 @@ type StoreReconciler struct { lifecycle *lifecycle.Lifecycle } -func NewStoreReconciler(ctx context.Context, log *logger.Logger, fga openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, kcpHelper iclient.KcpClientHelper) *StoreReconciler { +func NewStoreReconciler(ctx context.Context, log *logger.Logger, fga openfgav1.OpenFGAServiceClient, mcMgr mcmanager.Manager, cfg *config.Config, lister iclient.Lister) *StoreReconciler { lc := lifecycle.New(mcMgr, "StoreReconciler", func() client.Object { return &corev1alpha1.Store{} }, - subroutine.NewStoreSubroutine(fga, mcMgr, kcpHelper), - subroutine.NewAuthorizationModelSubroutine(fga, mcMgr, kcpHelper, func(cfg *rest.Config) discovery.DiscoveryInterface { + subroutine.NewStoreSubroutine(fga, mcMgr, lister), + subroutine.NewAuthorizationModelSubroutine(fga, mcMgr, lister, func(cfg *rest.Config) discovery.DiscoveryInterface { return discovery.NewDiscoveryClientForConfigOrDie(cfg) }, log), subroutine.NewTupleSubroutine(fga, mcMgr), diff --git a/internal/subroutine/apiexportpolicy.go b/internal/subroutine/apiexportpolicy.go index f72ec731..f57e0104 100644 --- a/internal/subroutine/apiexportpolicy.go +++ b/internal/subroutine/apiexportpolicy.go @@ -78,7 +78,7 @@ func (a *APIExportPolicySubroutine) Process(ctx context.Context, obj client.Obje // for this we need to get cluster id for every org's workspace if workspacePath == orgsWorkspacePath { var accountInfoList accountsv1alpha1.AccountInfoList - if err := a.kcpHelper.List(ctx, &accountInfoList); err != nil { + if err := a.kcpClientGetter.List(ctx, &accountInfoList); err != nil { return subroutines.OK(), fmt.Errorf("listing AccountInfo resources: %w", err) } @@ -109,7 +109,7 @@ func (a *APIExportPolicySubroutine) Process(ctx context.Context, obj client.Obje // for all valid expressions except of :root:orgs:* // e.g :root:orgs:A:B, find store id // and clusterID of logical cluster where account B lives (logical cluster A) - lcClient, err := a.kcpClientGetter.NewClientForLogicalCluster(ctx, workspacePath) + lcClient, err := a.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, workspacePath))) if err != nil { return subroutines.OK(), fmt.Errorf("getting client: %w", err) } @@ -244,7 +244,7 @@ func (a *APIExportPolicySubroutine) deleteTuplesForExpression(ctx context.Contex if workspacePath == orgsWorkspacePath { var accountInfoList accountsv1alpha1.AccountInfoList - if err := a.kcpHelper.List(ctx, &accountInfoList); err != nil { + if err := a.kcpClientGetter.List(ctx, &accountInfoList); err != nil { return fmt.Errorf("listing AccountInfo resources for %s: %w", expression, err) } @@ -268,7 +268,7 @@ func (a *APIExportPolicySubroutine) deleteTuplesForExpression(ctx context.Contex return nil } - lcClient, err := a.kcpClientGetter.NewClientForLogicalCluster(ctx, workspacePath) + lcClient, err := a.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, workspacePath))) if err != nil { return fmt.Errorf("getting client for workspace %s: %w", workspacePath, err) } diff --git a/internal/subroutine/apiexportpolicy_test.go b/internal/subroutine/apiexportpolicy_test.go index cd46d054..26f71ddb 100644 --- a/internal/subroutine/apiexportpolicy_test.go +++ b/internal/subroutine/apiexportpolicy_test.go @@ -66,7 +66,7 @@ func TestAPIExportPolicySubroutine_Process(t *testing.T) { AllowPathExpressions: []string{"root:orgs:acme"}, }, }, - setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { + setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKCPCombinedClientGetter) { mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(nil, errors.New("cluster not found")) }, cfg: &config.Config{}, @@ -189,7 +189,7 @@ func TestAPIExportPolicySubroutine_Finalize(t *testing.T) { AllowPathExpressions: []string{"root:orgs:acme"}, }, }, - setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { + setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKCPCombinedClientGetter) { mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(nil, errors.New("failed to get cluster")) }, cfg: &config.Config{}, @@ -223,7 +223,7 @@ func TestAPIExportPolicySubroutine_Finalize(t *testing.T) { Build() providerCluster.EXPECT().GetClient().Return(providerClient) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, errors.New("failed to get client")) + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.Anything).Return(nil, errors.New("failed to get client")) }, cfg: &config.Config{}, expectError: true, @@ -318,8 +318,8 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(name string) bool { + return name == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("test-store-id", nil) @@ -396,8 +396,8 @@ func TestAPIExportPolicySubroutine_Process_Success(t *testing.T) { WithStatusSubresource(&corev1alpha1.APIExportPolicy{}). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(name string) bool { + return name == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("test-store-id", nil) @@ -591,8 +591,8 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(name string) bool { + return name == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("test-store-id", nil) @@ -655,8 +655,8 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { }). Build() - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(name logicalcluster.Name) bool { - return name.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(name string) bool { + return name == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil) storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("test-store-id", nil) @@ -692,7 +692,7 @@ func TestAPIExportPolicySubroutine_Finalize_Success(t *testing.T) { AllowPathExpressions: []string{"root:orgs:*"}, }, }, - setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKcpHelper) { + setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, kcpHelper *mocks.MockKCPCombinedClientGetter) { scheme := getAPIExportPolicyTestScheme() @@ -820,7 +820,7 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { AllowPathExpressions: []string{"root:orgs:acme"}, }, }, - setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKcpHelper) { + setupMocks: func(t *testing.T, fga *mocks.MockOpenFGAServiceClient, mgr *mocks.MockManager, storeIDGetter *mocks.MockStoreIDGetter, cluster *mocks.MockCluster, kcpHelper *mocks.MockKCPCombinedClientGetter) { providerCluster := mocks.NewMockCluster(t) providerClient := mocks.NewMockClient(t) providerCluster.EXPECT().GetClient().Return(providerClient) @@ -863,7 +863,7 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { scheme := getAPIExportPolicyTestScheme() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil).Times(2) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything).Return(nil, assert.AnError).Once() + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.Anything).Return(nil, assert.AnError).Once() }, cfg: &config.Config{}, expectError: true, @@ -885,8 +885,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { scheme := getAPIExportPolicyTestScheme() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(nil, assert.AnError).Once() }, cfg: &config.Config{}, @@ -979,8 +979,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { scheme := getAPIExportPolicyTestScheme() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(nil, assert.AnError).Once() }, cfg: &config.Config{}, @@ -999,8 +999,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { targetClient := mocks.NewMockClient(t) providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() targetClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError) }, @@ -1024,8 +1024,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("", assert.AnError) }, @@ -1049,8 +1049,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("store-id", nil) fga.EXPECT().Write(mock.Anything, mock.Anything).Return(nil, assert.AnError) @@ -1076,8 +1076,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { }).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("store-id", nil) fga.EXPECT().Write(mock.Anything, mock.Anything).Return(&openfgav1.WriteResponse{}, nil) @@ -1106,8 +1106,8 @@ func TestAPIExportPolicySubroutine_Process_AdditionalErrorPaths(t *testing.T) { clusterClient := fake.NewClientBuilder().WithScheme(scheme).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("store-id", nil) fga.EXPECT().Write(mock.Anything, mock.Anything).Return(&openfgav1.WriteResponse{}, nil) @@ -1266,8 +1266,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { scheme := getAPIExportPolicyTestScheme() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(nil, assert.AnError).Once() }, cfg: &config.Config{}, @@ -1290,8 +1290,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("", assert.AnError) }, @@ -1315,8 +1315,8 @@ func TestAPIExportPolicySubroutine_Finalize_AdditionalErrorPaths(t *testing.T) { }).Build() providerCluster := newProviderCluster(t, scheme) mgr.EXPECT().GetCluster(mock.Anything, mock.Anything).Return(providerCluster, nil) - kcpHelper.EXPECT().NewClientForLogicalCluster(mock.MatchedBy(func(n logicalcluster.Name) bool { - return n.String() == "root:orgs:acme" + kcpHelper.EXPECT().NewClientForLogicalCluster(mock.Anything, mock.MatchedBy(func(n string) bool { + return n == string(config.MultiProviderName(config.CoreProviderName, "root:orgs:acme")) })).Return(targetClient, nil).Once() storeIDGetter.EXPECT().Get(mock.Anything, "acme-org").Return("store-id", nil) fga.EXPECT().Write(mock.Anything, mock.Anything).Return(nil, assert.AnError) diff --git a/internal/subroutine/authorization_model.go b/internal/subroutine/authorization_model.go index aa659e03..fa41f31d 100644 --- a/internal/subroutine/authorization_model.go +++ b/internal/subroutine/authorization_model.go @@ -78,15 +78,15 @@ type NewDiscoveryClientFunc func(cfg *rest.Config) discovery.DiscoveryInterface type authorizationModelSubroutine struct { fga openfgav1.OpenFGAServiceClient mgr mcmanager.Manager - kcpHelper iclient.KcpClientHelper + lister iclient.Lister newDiscoveryClientFunc NewDiscoveryClientFunc } -func NewAuthorizationModelSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, kcpHelper iclient.KcpClientHelper, newDiscoveryClientFunc NewDiscoveryClientFunc, log *logger.Logger) *authorizationModelSubroutine { +func NewAuthorizationModelSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, lister iclient.Lister, newDiscoveryClientFunc NewDiscoveryClientFunc, log *logger.Logger) *authorizationModelSubroutine { return &authorizationModelSubroutine{ fga: fga, mgr: mgr, - kcpHelper: kcpHelper, + lister: lister, newDiscoveryClientFunc: newDiscoveryClientFunc, } } @@ -95,14 +95,14 @@ var _ subroutines.Processor = &authorizationModelSubroutine{} func (a *authorizationModelSubroutine) GetName() string { return "AuthorizationModel" } -func getRelatedAuthorizationModels(ctx context.Context, kcpHelper iclient.KcpClientHelper, store *securityv1alpha1.Store) (securityv1alpha1.AuthorizationModelList, error) { +func getRelatedAuthorizationModels(ctx context.Context, lister iclient.Lister, store *securityv1alpha1.Store) (securityv1alpha1.AuthorizationModelList, error) { storeClusterKey, ok := mccontext.ClusterFrom(ctx) if !ok { return securityv1alpha1.AuthorizationModelList{}, fmt.Errorf("unable to get cluster key from context") } allAuthorizationModels := securityv1alpha1.AuthorizationModelList{} - if err := kcpHelper.List(ctx, &allAuthorizationModels); err != nil { + if err := lister.List(ctx, &allAuthorizationModels); err != nil { return securityv1alpha1.AuthorizationModelList{}, err } @@ -121,7 +121,7 @@ func (a *authorizationModelSubroutine) Process(ctx context.Context, obj client.O log := logger.LoadLoggerFromContext(ctx) store := obj.(*securityv1alpha1.Store) - extendingModules, err := getRelatedAuthorizationModels(ctx, a.kcpHelper, store) + extendingModules, err := getRelatedAuthorizationModels(ctx, a.lister, store) if err != nil { log.Error().Err(err).Msg("unable to get related authorization models") return subroutines.OK(), err diff --git a/internal/subroutine/authorization_model_generation.go b/internal/subroutine/authorization_model_generation.go index 130d3e07..0e73a19c 100644 --- a/internal/subroutine/authorization_model_generation.go +++ b/internal/subroutine/authorization_model_generation.go @@ -39,10 +39,10 @@ func toK8sName(parts ...string) string { return strings.Trim(name, "-") } -func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, clientGetter iclient.KCPCombinedClientGetter, apiExportEndpointSliceName string) *AuthorizationModelGenerationSubroutine { +func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, lister iclient.Lister, apiExportEndpointSliceName string) *AuthorizationModelGenerationSubroutine { return &AuthorizationModelGenerationSubroutine{ - mgr: mcMgr, - kcpHelper: kcpHelper, + mgr: mcMgr, + lister: lister, } } @@ -53,7 +53,7 @@ var ( type AuthorizationModelGenerationSubroutine struct { mgr mcmanager.Manager - clientGetter iclient.KCPCombinedClientGetter + lister iclient.Lister apiExportEndpointSliceName string } @@ -111,13 +111,8 @@ func (a *AuthorizationModelGenerationSubroutine) Finalize(ctx context.Context, o return subroutines.OK(), fmt.Errorf("unable to get cluster from context: %w", err) } - allClient, err := a.clientGetter.AllClient(ctx, a.apiExportEndpointSliceName) - if err != nil { - return subroutines.OK(), fmt.Errorf("getting all-cluster client: %w", err) - } - var bindings kcpapisv1alpha2.APIBindingList - err = a.kcpHelper.List(ctx, &bindings) + err = a.lister.List(ctx, &bindings) if err != nil { return subroutines.OK(), fmt.Errorf("listing APIBindings: %w", err) } diff --git a/internal/subroutine/authorization_model_generation_test.go b/internal/subroutine/authorization_model_generation_test.go index 27f38b33..5f87e2b3 100644 --- a/internal/subroutine/authorization_model_generation_test.go +++ b/internal/subroutine/authorization_model_generation_test.go @@ -56,13 +56,13 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { tests := []struct { name string binding *kcpapisv1alpha2.APIBinding - mockSetup func(*mocks.MockManager, *mocks.MockKCPCombinedClientGetter, *mocks.MockCluster, *mocks.MockClient) + mockSetup func(*mocks.MockManager, *mocks.MockLister, *mocks.MockCluster, *mocks.MockClient) expectError bool }{ { name: "error on ClusterFromContext in Process", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(nil, assert.AnError) }, expectError: true, @@ -71,7 +71,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "early return when accountInfo not found", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return( @@ -82,7 +82,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on getting apiExport", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { @@ -99,7 +99,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error from CreateOrUpdate when creating model", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { @@ -143,7 +143,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -173,7 +173,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process with namespaced scope", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -204,7 +204,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on apiExportClient.Get in Process", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -216,7 +216,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on apiExportClient.Get resource schema in Process", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -234,7 +234,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { { name: "generate model in Process with longestRelationName > 50", binding: newApiBinding("foo", "bar"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -265,7 +265,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on Get accountInfo in Process (not NotFound)", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) kcpClient.EXPECT().Get(mock.Anything, mock.Anything, mock.Anything).Return(assert.AnError) @@ -275,7 +275,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { name: "error on GetCluster for APIExport cluster in Process", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, cluster *mocks.MockCluster, kcpClient *mocks.MockClient) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil) cluster.EXPECT().GetClient().Return(kcpClient) mockAccountInfo(kcpClient, "org", "origin") @@ -286,15 +286,15 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { manager := mocks.NewMockManager(t) - allClientGetter := mocks.NewMockKCPCombinedClientGetter(t) + lister := mocks.NewMockLister(t) cluster := mocks.NewMockCluster(t) kcpClient := mocks.NewMockClient(t) if test.mockSetup != nil { - test.mockSetup(manager, allClientGetter, cluster, kcpClient) + test.mockSetup(manager, lister, cluster, kcpClient) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, allClientGetter, "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister, "") _, err := sub.Process(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -309,13 +309,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { tests := []struct { name string binding *kcpapisv1alpha2.APIBinding - mockSetup func(*mocks.MockManager, *mocks.MockKCPCombinedClientGetter, *kcpapisv1alpha2.APIBinding) + mockSetup func(*mocks.MockManager, *mocks.MockLister, *kcpapisv1alpha2.APIBinding) expectError bool }{ { name: "bindings with non-matching export are skipped", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) @@ -323,11 +323,9 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("other", "other", "cluster2") @@ -367,7 +365,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on ClusterFromContext in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { manager.EXPECT().ClusterFromContext(mock.Anything).Return(nil, assert.AnError) }, }, @@ -375,15 +373,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "early return when accountInfo missing in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -401,17 +397,15 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "delete returns error in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -427,14 +421,14 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingCluster, nil) bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) acc.Spec.Organization.Name = "org" acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -452,7 +446,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "skip Finalize if other bindings exist", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster1 := mocks.NewMockCluster(t) @@ -460,11 +454,9 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { bindingWsCluster2 := mocks.NewMockCluster(t) bindingWsClient2 := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("foo", "bar", "cluster2") @@ -477,7 +469,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster1, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -485,7 +477,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster2").Return(bindingWsCluster2, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -498,19 +490,17 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "delete model in Finalize if last binding", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -526,7 +516,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -534,7 +524,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -552,19 +542,17 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "delete model in Finalize but model is not found", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -608,28 +596,24 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on List in Finalize", binding: newApiBinding("foo", "bar"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) + lister.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) }, }, { name: "error on getRelatedAuthorizationModels in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := binding.DeepCopy() if b.Annotations == nil { @@ -645,7 +629,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "only bindings for same org are counted; delete called if only one, not called if none", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster1 := mocks.NewMockCluster(t) @@ -654,12 +638,10 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { bindingWsClient2 := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b1 := bindingWithCluster("foo", "bar", "cluster1") b2 := bindingWithCluster("foo", "bar", "cluster2") @@ -672,7 +654,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster1, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -680,11 +662,11 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster2").Return(bindingWsCluster2, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -702,15 +684,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "error on GetCluster for binding workspace in Finalize loop", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -722,24 +702,22 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(nil, assert.AnError) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(nil, assert.AnError) }, expectError: true, }, { name: "error on Get accountInfo in Finalize loop (not NotFound)", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -751,7 +729,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) }, @@ -760,19 +738,17 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { { name: "bindings with different org are skipped in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -784,7 +760,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -792,7 +768,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "different-org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -811,17 +787,15 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on GetCluster for APIExport cluster in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -833,7 +807,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -841,26 +815,24 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(nil, assert.AnError) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(nil, assert.AnError) }, }, { name: "error on Get APIExport in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -872,7 +844,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -880,7 +852,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).Return(assert.AnError) }, @@ -889,19 +861,17 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { name: "error on Get resource schema in Finalize", binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), expectError: true, - mockSetup: func(manager *mocks.MockManager, allClient *mocks.MockKCPCombinedClientGetter, binding *kcpapisv1alpha2.APIBinding) { + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) bindingWsCluster := mocks.NewMockCluster(t) bindingWsClient := mocks.NewMockClient(t) apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - innerClient := mocks.NewMockClient(t) manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) bindingCluster.EXPECT().GetClient().Return(bindingClient) - allClient.EXPECT().AllClient(mock.Anything, mock.Anything).Return(innerClient, nil) - innerClient.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { list := ol.(*kcpapisv1alpha2.APIBindingList) b := bindingWithCluster("foo", "bar", "cluster1") list.Items = []kcpapisv1alpha2.APIBinding{*b} @@ -913,7 +883,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "cluster1").Return(bindingWsCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) @@ -921,7 +891,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { acc.Spec.Organization.GeneratedClusterId = "org-id" return nil }) - manager.EXPECT().GetCluster(mock.Anything, "export-cluster").Return(apiExportCluster, nil) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) apiExportCluster.EXPECT().GetClient().Return(apiExportClient) apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { ae := o.(*kcpapisv1alpha2.APIExport) @@ -935,13 +905,13 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { manager := mocks.NewMockManager(t) - allClientGetter := mocks.NewMockKCPCombinedClientGetter(t) + lister := mocks.NewMockLister(t) if test.mockSetup != nil { - test.mockSetup(manager, allClientGetter, test.binding) + test.mockSetup(manager, lister, test.binding) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, allClientGetter, "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister, "") _, err := sub.Finalize(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -953,7 +923,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { } func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockKCPCombinedClientGetter(t), "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t), "") tests := []struct { name string @@ -1001,6 +971,6 @@ func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { } func TestAuthorizationModelGenerationSubroutine_GetName(t *testing.T) { - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockKCPCombinedClientGetter(t), "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t), "") assert.Equal(t, "AuthorizationModelGeneration", sub.GetName()) } diff --git a/internal/subroutine/authorization_model_test.go b/internal/subroutine/authorization_model_test.go index 8b34fc5c..648c8436 100644 --- a/internal/subroutine/authorization_model_test.go +++ b/internal/subroutine/authorization_model_test.go @@ -92,7 +92,7 @@ func TestAuthorizationModelProcess(t *testing.T) { name string store *securityv1alpha1.Store fgaMocks func(*mocks.MockOpenFGAServiceClient) - kcpHelperMocks func(*mocks.MockKcpHelper) + kcpHelperMocks func(*mocks.MockLister) mgrMocks func(*mocks.MockManager) discoveryMocks func(*mocks.MockDiscoveryInterface) expectError bool @@ -110,7 +110,7 @@ func TestAuthorizationModelProcess(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -167,7 +167,7 @@ func TestAuthorizationModelProcess(t *testing.T) { AuthorizationModelID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -248,7 +248,7 @@ type core_namespace AuthorizationModelID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -282,7 +282,7 @@ type core_namespace StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -316,7 +316,7 @@ type core_namespace StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -347,7 +347,7 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { am := ol.(*securityv1alpha1.AuthorizationModelList) @@ -381,7 +381,7 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil @@ -407,7 +407,7 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil @@ -426,7 +426,7 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil @@ -447,7 +447,7 @@ type core_namespace Spec: securityv1alpha1.StoreSpec{CoreModule: coreModule}, Status: securityv1alpha1.StoreStatus{StoreID: "id"}, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn( func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { return nil @@ -480,7 +480,7 @@ type core_namespace cluster := mocks.NewMockCluster(t) client := mocks.NewMockClient(t) - kcpHelper := mocks.NewMockKcpHelper(t) + kcpHelper := mocks.NewMockLister(t) if test.kcpHelperMocks != nil { test.kcpHelperMocks(kcpHelper) } @@ -490,7 +490,7 @@ type core_namespace logger := testlogger.New() - ctrlManager := mocks.NewCTRLManager(t) + ctrlManager := mocks.NewMockCTRLManager(t) manager.EXPECT().GetLocalManager().Return(ctrlManager).Maybe() ctrlManager.EXPECT().GetConfig().Return(&rest.Config{}).Maybe() diff --git a/internal/subroutine/idp/subroutine.go b/internal/subroutine/idp/subroutine.go index 1aaaa19c..fb6b7918 100644 --- a/internal/subroutine/idp/subroutine.go +++ b/internal/subroutine/idp/subroutine.go @@ -114,7 +114,7 @@ func (s *subroutine) Finalize(ctx context.Context, obj client.Object) (subroutin }, } - orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, "root:orgs") + orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath))) if err != nil { return subroutines.OK(), fmt.Errorf("getting orgs client: %w", err) } @@ -263,7 +263,7 @@ func (s *subroutine) deleteRemovedClients(ctx context.Context, idpConfig *v1alph Namespace: managedClient.SecretRef.Namespace, }, } - orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, "root:orgs") + orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath))) if err != nil { return fmt.Errorf("getting orgs client: %w", err) } @@ -320,7 +320,7 @@ func (s *subroutine) registerOrUpdateClient(ctx context.Context, ipc *v1alpha1.I func (s *subroutine) readRegistrationAccessToken(ctx context.Context, secretRef corev1.SecretReference) (string, error) { secret := &corev1.Secret{} key := client.ObjectKey{Name: secretRef.Name, Namespace: secretRef.Namespace} - orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, "root:orgs") + orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath))) if err != nil { return "", fmt.Errorf("getting orgs client: %w", err) } @@ -342,7 +342,7 @@ func (s *subroutine) createOrUpdateSecret(ctx context.Context, clientConfig *v1a }, } - orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, "root:orgs") + orgsClient, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath))) if err != nil { return fmt.Errorf("getting orgs client: %w", err) } diff --git a/internal/subroutine/idp/subroutine_test.go b/internal/subroutine/idp/subroutine_test.go index ef832b11..dd31caa2 100644 --- a/internal/subroutine/idp/subroutine_test.go +++ b/internal/subroutine/idp/subroutine_test.go @@ -20,6 +20,7 @@ import ( "golang.org/x/oauth2" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -75,7 +76,7 @@ func setupManagerAndCluster(t *testing.T, orgsClient client.Client, initialObjec orgsCluster := mocks.NewMockCluster(t) mgr.EXPECT().ClusterFromContext(mock.Anything).Return(cluster, nil).Maybe() - mgr.EXPECT().GetCluster(mock.Anything, "root:orgs").Return(orgsCluster, nil).Maybe() + mgr.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName(string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath)))).Return(orgsCluster, nil).Maybe() cluster.EXPECT().GetClient().Return(kcpClient).Maybe() orgsCluster.EXPECT().GetClient().Return(orgsClient).Maybe() @@ -909,7 +910,7 @@ func TestSubroutineProcess(t *testing.T) { test.setupK8sMocks(orgsClient, kcpClient) } - s, err := idp.New(ctx, cfg, mgr, iclient.NewManagerKCPClientGetter(mgr)) + s, err := idp.New(ctx, cfg, mgr, iclient.NewManagerKCPClientGetter(mgr, nil)) if test.expectNewErr { assert.Error(t, err) return @@ -1231,10 +1232,10 @@ func TestFinalize(t *testing.T) { cfg := getTestConfig(test.cfg, srv.URL) orgsCluster := mocks.NewMockCluster(t) - mgr.EXPECT().GetCluster(mock.Anything, "root:orgs").Return(orgsCluster, nil).Maybe() + mgr.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName(string(config.MultiProviderName(config.CoreProviderName, config.OrgsClusterPath)))).Return(orgsCluster, nil).Maybe() orgsCluster.EXPECT().GetClient().Return(orgsClient).Maybe() - s, err := idp.New(ctx, cfg, mgr, iclient.NewManagerKCPClientGetter(mgr)) + s, err := idp.New(ctx, cfg, mgr, iclient.NewManagerKCPClientGetter(mgr, nil)) assert.NoError(t, err) l := testlogger.New() @@ -1266,7 +1267,7 @@ func TestHelperFunctions(t *testing.T) { BaseURL: srv.URL, ClientID: "security-operator", }, - }, mgr, iclient.NewManagerKCPClientGetter(mgr)) + }, mgr, iclient.NewManagerKCPClientGetter(mgr, nil)) assert.NoError(t, err) assert.Equal(t, "IdentityProviderConfiguration", s.GetName()) diff --git a/internal/subroutine/invite/subroutine.go b/internal/subroutine/invite/subroutine.go index 54d11a15..5cfca1fa 100644 --- a/internal/subroutine/invite/subroutine.go +++ b/internal/subroutine/invite/subroutine.go @@ -111,7 +111,7 @@ func (s *subroutine) Process(ctx context.Context, obj k8sclient.Object) (subrout return subroutines.OK(), fmt.Errorf("failed to get cluster from context") } - cl, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, clusterName) + cl, err := s.kcpClientGetter.NewClientForLogicalCluster(ctx, string(clusterName)) if err != nil { return subroutines.OK(), fmt.Errorf("failed to get client for cluster %q: %w", clusterName, err) } diff --git a/internal/subroutine/mocks/mock_CTRLManager.go b/internal/subroutine/mocks/mock_CTRLManager.go index fbc68059..389872b1 100644 --- a/internal/subroutine/mocks/mock_CTRLManager.go +++ b/internal/subroutine/mocks/mock_CTRLManager.go @@ -24,13 +24,13 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/conversion" ) -// NewCTRLManager creates a new instance of CTRLManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// NewMockCTRLManager creates a new instance of MockCTRLManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewCTRLManager(t interface { +func NewMockCTRLManager(t interface { mock.TestingT Cleanup(func()) -}) *CTRLManager { - mock := &CTRLManager{} +}) *MockCTRLManager { + mock := &MockCTRLManager{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) @@ -38,21 +38,21 @@ func NewCTRLManager(t interface { return mock } -// CTRLManager is an autogenerated mock type for the Manager type -type CTRLManager struct { +// MockCTRLManager is an autogenerated mock type for the Manager type +type MockCTRLManager struct { mock.Mock } -type CTRLManager_Expecter struct { +type MockCTRLManager_Expecter struct { mock *mock.Mock } -func (_m *CTRLManager) EXPECT() *CTRLManager_Expecter { - return &CTRLManager_Expecter{mock: &_m.Mock} +func (_m *MockCTRLManager) EXPECT() *MockCTRLManager_Expecter { + return &MockCTRLManager_Expecter{mock: &_m.Mock} } -// Add provides a mock function for the type CTRLManager -func (_mock *CTRLManager) Add(runnable manager.Runnable) error { +// Add provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) Add(runnable manager.Runnable) error { ret := _mock.Called(runnable) if len(ret) == 0 { @@ -68,18 +68,18 @@ func (_mock *CTRLManager) Add(runnable manager.Runnable) error { return r0 } -// CTRLManager_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' -type CTRLManager_Add_Call struct { +// MockCTRLManager_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +type MockCTRLManager_Add_Call struct { *mock.Call } // Add is a helper method to define mock.On call // - runnable manager.Runnable -func (_e *CTRLManager_Expecter) Add(runnable interface{}) *CTRLManager_Add_Call { - return &CTRLManager_Add_Call{Call: _e.mock.On("Add", runnable)} +func (_e *MockCTRLManager_Expecter) Add(runnable interface{}) *MockCTRLManager_Add_Call { + return &MockCTRLManager_Add_Call{Call: _e.mock.On("Add", runnable)} } -func (_c *CTRLManager_Add_Call) Run(run func(runnable manager.Runnable)) *CTRLManager_Add_Call { +func (_c *MockCTRLManager_Add_Call) Run(run func(runnable manager.Runnable)) *MockCTRLManager_Add_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 manager.Runnable if args[0] != nil { @@ -92,18 +92,18 @@ func (_c *CTRLManager_Add_Call) Run(run func(runnable manager.Runnable)) *CTRLMa return _c } -func (_c *CTRLManager_Add_Call) Return(err error) *CTRLManager_Add_Call { +func (_c *MockCTRLManager_Add_Call) Return(err error) *MockCTRLManager_Add_Call { _c.Call.Return(err) return _c } -func (_c *CTRLManager_Add_Call) RunAndReturn(run func(runnable manager.Runnable) error) *CTRLManager_Add_Call { +func (_c *MockCTRLManager_Add_Call) RunAndReturn(run func(runnable manager.Runnable) error) *MockCTRLManager_Add_Call { _c.Call.Return(run) return _c } -// AddHealthzCheck provides a mock function for the type CTRLManager -func (_mock *CTRLManager) AddHealthzCheck(name string, check healthz.Checker) error { +// AddHealthzCheck provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) AddHealthzCheck(name string, check healthz.Checker) error { ret := _mock.Called(name, check) if len(ret) == 0 { @@ -119,19 +119,19 @@ func (_mock *CTRLManager) AddHealthzCheck(name string, check healthz.Checker) er return r0 } -// CTRLManager_AddHealthzCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddHealthzCheck' -type CTRLManager_AddHealthzCheck_Call struct { +// MockCTRLManager_AddHealthzCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddHealthzCheck' +type MockCTRLManager_AddHealthzCheck_Call struct { *mock.Call } // AddHealthzCheck is a helper method to define mock.On call // - name string // - check healthz.Checker -func (_e *CTRLManager_Expecter) AddHealthzCheck(name interface{}, check interface{}) *CTRLManager_AddHealthzCheck_Call { - return &CTRLManager_AddHealthzCheck_Call{Call: _e.mock.On("AddHealthzCheck", name, check)} +func (_e *MockCTRLManager_Expecter) AddHealthzCheck(name interface{}, check interface{}) *MockCTRLManager_AddHealthzCheck_Call { + return &MockCTRLManager_AddHealthzCheck_Call{Call: _e.mock.On("AddHealthzCheck", name, check)} } -func (_c *CTRLManager_AddHealthzCheck_Call) Run(run func(name string, check healthz.Checker)) *CTRLManager_AddHealthzCheck_Call { +func (_c *MockCTRLManager_AddHealthzCheck_Call) Run(run func(name string, check healthz.Checker)) *MockCTRLManager_AddHealthzCheck_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 string if args[0] != nil { @@ -149,18 +149,18 @@ func (_c *CTRLManager_AddHealthzCheck_Call) Run(run func(name string, check heal return _c } -func (_c *CTRLManager_AddHealthzCheck_Call) Return(err error) *CTRLManager_AddHealthzCheck_Call { +func (_c *MockCTRLManager_AddHealthzCheck_Call) Return(err error) *MockCTRLManager_AddHealthzCheck_Call { _c.Call.Return(err) return _c } -func (_c *CTRLManager_AddHealthzCheck_Call) RunAndReturn(run func(name string, check healthz.Checker) error) *CTRLManager_AddHealthzCheck_Call { +func (_c *MockCTRLManager_AddHealthzCheck_Call) RunAndReturn(run func(name string, check healthz.Checker) error) *MockCTRLManager_AddHealthzCheck_Call { _c.Call.Return(run) return _c } -// AddMetricsServerExtraHandler provides a mock function for the type CTRLManager -func (_mock *CTRLManager) AddMetricsServerExtraHandler(path string, handler http.Handler) error { +// AddMetricsServerExtraHandler provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) AddMetricsServerExtraHandler(path string, handler http.Handler) error { ret := _mock.Called(path, handler) if len(ret) == 0 { @@ -176,19 +176,19 @@ func (_mock *CTRLManager) AddMetricsServerExtraHandler(path string, handler http return r0 } -// CTRLManager_AddMetricsServerExtraHandler_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddMetricsServerExtraHandler' -type CTRLManager_AddMetricsServerExtraHandler_Call struct { +// MockCTRLManager_AddMetricsServerExtraHandler_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddMetricsServerExtraHandler' +type MockCTRLManager_AddMetricsServerExtraHandler_Call struct { *mock.Call } // AddMetricsServerExtraHandler is a helper method to define mock.On call // - path string // - handler http.Handler -func (_e *CTRLManager_Expecter) AddMetricsServerExtraHandler(path interface{}, handler interface{}) *CTRLManager_AddMetricsServerExtraHandler_Call { - return &CTRLManager_AddMetricsServerExtraHandler_Call{Call: _e.mock.On("AddMetricsServerExtraHandler", path, handler)} +func (_e *MockCTRLManager_Expecter) AddMetricsServerExtraHandler(path interface{}, handler interface{}) *MockCTRLManager_AddMetricsServerExtraHandler_Call { + return &MockCTRLManager_AddMetricsServerExtraHandler_Call{Call: _e.mock.On("AddMetricsServerExtraHandler", path, handler)} } -func (_c *CTRLManager_AddMetricsServerExtraHandler_Call) Run(run func(path string, handler http.Handler)) *CTRLManager_AddMetricsServerExtraHandler_Call { +func (_c *MockCTRLManager_AddMetricsServerExtraHandler_Call) Run(run func(path string, handler http.Handler)) *MockCTRLManager_AddMetricsServerExtraHandler_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 string if args[0] != nil { @@ -206,18 +206,18 @@ func (_c *CTRLManager_AddMetricsServerExtraHandler_Call) Run(run func(path strin return _c } -func (_c *CTRLManager_AddMetricsServerExtraHandler_Call) Return(err error) *CTRLManager_AddMetricsServerExtraHandler_Call { +func (_c *MockCTRLManager_AddMetricsServerExtraHandler_Call) Return(err error) *MockCTRLManager_AddMetricsServerExtraHandler_Call { _c.Call.Return(err) return _c } -func (_c *CTRLManager_AddMetricsServerExtraHandler_Call) RunAndReturn(run func(path string, handler http.Handler) error) *CTRLManager_AddMetricsServerExtraHandler_Call { +func (_c *MockCTRLManager_AddMetricsServerExtraHandler_Call) RunAndReturn(run func(path string, handler http.Handler) error) *MockCTRLManager_AddMetricsServerExtraHandler_Call { _c.Call.Return(run) return _c } -// AddReadyzCheck provides a mock function for the type CTRLManager -func (_mock *CTRLManager) AddReadyzCheck(name string, check healthz.Checker) error { +// AddReadyzCheck provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) AddReadyzCheck(name string, check healthz.Checker) error { ret := _mock.Called(name, check) if len(ret) == 0 { @@ -233,19 +233,19 @@ func (_mock *CTRLManager) AddReadyzCheck(name string, check healthz.Checker) err return r0 } -// CTRLManager_AddReadyzCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddReadyzCheck' -type CTRLManager_AddReadyzCheck_Call struct { +// MockCTRLManager_AddReadyzCheck_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddReadyzCheck' +type MockCTRLManager_AddReadyzCheck_Call struct { *mock.Call } // AddReadyzCheck is a helper method to define mock.On call // - name string // - check healthz.Checker -func (_e *CTRLManager_Expecter) AddReadyzCheck(name interface{}, check interface{}) *CTRLManager_AddReadyzCheck_Call { - return &CTRLManager_AddReadyzCheck_Call{Call: _e.mock.On("AddReadyzCheck", name, check)} +func (_e *MockCTRLManager_Expecter) AddReadyzCheck(name interface{}, check interface{}) *MockCTRLManager_AddReadyzCheck_Call { + return &MockCTRLManager_AddReadyzCheck_Call{Call: _e.mock.On("AddReadyzCheck", name, check)} } -func (_c *CTRLManager_AddReadyzCheck_Call) Run(run func(name string, check healthz.Checker)) *CTRLManager_AddReadyzCheck_Call { +func (_c *MockCTRLManager_AddReadyzCheck_Call) Run(run func(name string, check healthz.Checker)) *MockCTRLManager_AddReadyzCheck_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 string if args[0] != nil { @@ -263,18 +263,18 @@ func (_c *CTRLManager_AddReadyzCheck_Call) Run(run func(name string, check healt return _c } -func (_c *CTRLManager_AddReadyzCheck_Call) Return(err error) *CTRLManager_AddReadyzCheck_Call { +func (_c *MockCTRLManager_AddReadyzCheck_Call) Return(err error) *MockCTRLManager_AddReadyzCheck_Call { _c.Call.Return(err) return _c } -func (_c *CTRLManager_AddReadyzCheck_Call) RunAndReturn(run func(name string, check healthz.Checker) error) *CTRLManager_AddReadyzCheck_Call { +func (_c *MockCTRLManager_AddReadyzCheck_Call) RunAndReturn(run func(name string, check healthz.Checker) error) *MockCTRLManager_AddReadyzCheck_Call { _c.Call.Return(run) return _c } -// Elected provides a mock function for the type CTRLManager -func (_mock *CTRLManager) Elected() <-chan struct{} { +// Elected provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) Elected() <-chan struct{} { ret := _mock.Called() if len(ret) == 0 { @@ -292,35 +292,35 @@ func (_mock *CTRLManager) Elected() <-chan struct{} { return r0 } -// CTRLManager_Elected_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Elected' -type CTRLManager_Elected_Call struct { +// MockCTRLManager_Elected_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Elected' +type MockCTRLManager_Elected_Call struct { *mock.Call } // Elected is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) Elected() *CTRLManager_Elected_Call { - return &CTRLManager_Elected_Call{Call: _e.mock.On("Elected")} +func (_e *MockCTRLManager_Expecter) Elected() *MockCTRLManager_Elected_Call { + return &MockCTRLManager_Elected_Call{Call: _e.mock.On("Elected")} } -func (_c *CTRLManager_Elected_Call) Run(run func()) *CTRLManager_Elected_Call { +func (_c *MockCTRLManager_Elected_Call) Run(run func()) *MockCTRLManager_Elected_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_Elected_Call) Return(valCh <-chan struct{}) *CTRLManager_Elected_Call { +func (_c *MockCTRLManager_Elected_Call) Return(valCh <-chan struct{}) *MockCTRLManager_Elected_Call { _c.Call.Return(valCh) return _c } -func (_c *CTRLManager_Elected_Call) RunAndReturn(run func() <-chan struct{}) *CTRLManager_Elected_Call { +func (_c *MockCTRLManager_Elected_Call) RunAndReturn(run func() <-chan struct{}) *MockCTRLManager_Elected_Call { _c.Call.Return(run) return _c } -// GetAPIReader provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetAPIReader() client.Reader { +// GetAPIReader provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetAPIReader() client.Reader { ret := _mock.Called() if len(ret) == 0 { @@ -338,35 +338,35 @@ func (_mock *CTRLManager) GetAPIReader() client.Reader { return r0 } -// CTRLManager_GetAPIReader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAPIReader' -type CTRLManager_GetAPIReader_Call struct { +// MockCTRLManager_GetAPIReader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAPIReader' +type MockCTRLManager_GetAPIReader_Call struct { *mock.Call } // GetAPIReader is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetAPIReader() *CTRLManager_GetAPIReader_Call { - return &CTRLManager_GetAPIReader_Call{Call: _e.mock.On("GetAPIReader")} +func (_e *MockCTRLManager_Expecter) GetAPIReader() *MockCTRLManager_GetAPIReader_Call { + return &MockCTRLManager_GetAPIReader_Call{Call: _e.mock.On("GetAPIReader")} } -func (_c *CTRLManager_GetAPIReader_Call) Run(run func()) *CTRLManager_GetAPIReader_Call { +func (_c *MockCTRLManager_GetAPIReader_Call) Run(run func()) *MockCTRLManager_GetAPIReader_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetAPIReader_Call) Return(reader client.Reader) *CTRLManager_GetAPIReader_Call { +func (_c *MockCTRLManager_GetAPIReader_Call) Return(reader client.Reader) *MockCTRLManager_GetAPIReader_Call { _c.Call.Return(reader) return _c } -func (_c *CTRLManager_GetAPIReader_Call) RunAndReturn(run func() client.Reader) *CTRLManager_GetAPIReader_Call { +func (_c *MockCTRLManager_GetAPIReader_Call) RunAndReturn(run func() client.Reader) *MockCTRLManager_GetAPIReader_Call { _c.Call.Return(run) return _c } -// GetCache provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetCache() cache.Cache { +// GetCache provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetCache() cache.Cache { ret := _mock.Called() if len(ret) == 0 { @@ -384,35 +384,35 @@ func (_mock *CTRLManager) GetCache() cache.Cache { return r0 } -// CTRLManager_GetCache_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCache' -type CTRLManager_GetCache_Call struct { +// MockCTRLManager_GetCache_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCache' +type MockCTRLManager_GetCache_Call struct { *mock.Call } // GetCache is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetCache() *CTRLManager_GetCache_Call { - return &CTRLManager_GetCache_Call{Call: _e.mock.On("GetCache")} +func (_e *MockCTRLManager_Expecter) GetCache() *MockCTRLManager_GetCache_Call { + return &MockCTRLManager_GetCache_Call{Call: _e.mock.On("GetCache")} } -func (_c *CTRLManager_GetCache_Call) Run(run func()) *CTRLManager_GetCache_Call { +func (_c *MockCTRLManager_GetCache_Call) Run(run func()) *MockCTRLManager_GetCache_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetCache_Call) Return(cache1 cache.Cache) *CTRLManager_GetCache_Call { +func (_c *MockCTRLManager_GetCache_Call) Return(cache1 cache.Cache) *MockCTRLManager_GetCache_Call { _c.Call.Return(cache1) return _c } -func (_c *CTRLManager_GetCache_Call) RunAndReturn(run func() cache.Cache) *CTRLManager_GetCache_Call { +func (_c *MockCTRLManager_GetCache_Call) RunAndReturn(run func() cache.Cache) *MockCTRLManager_GetCache_Call { _c.Call.Return(run) return _c } -// GetClient provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetClient() client.Client { +// GetClient provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetClient() client.Client { ret := _mock.Called() if len(ret) == 0 { @@ -430,35 +430,35 @@ func (_mock *CTRLManager) GetClient() client.Client { return r0 } -// CTRLManager_GetClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetClient' -type CTRLManager_GetClient_Call struct { +// MockCTRLManager_GetClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetClient' +type MockCTRLManager_GetClient_Call struct { *mock.Call } // GetClient is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetClient() *CTRLManager_GetClient_Call { - return &CTRLManager_GetClient_Call{Call: _e.mock.On("GetClient")} +func (_e *MockCTRLManager_Expecter) GetClient() *MockCTRLManager_GetClient_Call { + return &MockCTRLManager_GetClient_Call{Call: _e.mock.On("GetClient")} } -func (_c *CTRLManager_GetClient_Call) Run(run func()) *CTRLManager_GetClient_Call { +func (_c *MockCTRLManager_GetClient_Call) Run(run func()) *MockCTRLManager_GetClient_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetClient_Call) Return(client1 client.Client) *CTRLManager_GetClient_Call { +func (_c *MockCTRLManager_GetClient_Call) Return(client1 client.Client) *MockCTRLManager_GetClient_Call { _c.Call.Return(client1) return _c } -func (_c *CTRLManager_GetClient_Call) RunAndReturn(run func() client.Client) *CTRLManager_GetClient_Call { +func (_c *MockCTRLManager_GetClient_Call) RunAndReturn(run func() client.Client) *MockCTRLManager_GetClient_Call { _c.Call.Return(run) return _c } -// GetConfig provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetConfig() *rest.Config { +// GetConfig provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetConfig() *rest.Config { ret := _mock.Called() if len(ret) == 0 { @@ -476,35 +476,35 @@ func (_mock *CTRLManager) GetConfig() *rest.Config { return r0 } -// CTRLManager_GetConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetConfig' -type CTRLManager_GetConfig_Call struct { +// MockCTRLManager_GetConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetConfig' +type MockCTRLManager_GetConfig_Call struct { *mock.Call } // GetConfig is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetConfig() *CTRLManager_GetConfig_Call { - return &CTRLManager_GetConfig_Call{Call: _e.mock.On("GetConfig")} +func (_e *MockCTRLManager_Expecter) GetConfig() *MockCTRLManager_GetConfig_Call { + return &MockCTRLManager_GetConfig_Call{Call: _e.mock.On("GetConfig")} } -func (_c *CTRLManager_GetConfig_Call) Run(run func()) *CTRLManager_GetConfig_Call { +func (_c *MockCTRLManager_GetConfig_Call) Run(run func()) *MockCTRLManager_GetConfig_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetConfig_Call) Return(config *rest.Config) *CTRLManager_GetConfig_Call { +func (_c *MockCTRLManager_GetConfig_Call) Return(config *rest.Config) *MockCTRLManager_GetConfig_Call { _c.Call.Return(config) return _c } -func (_c *CTRLManager_GetConfig_Call) RunAndReturn(run func() *rest.Config) *CTRLManager_GetConfig_Call { +func (_c *MockCTRLManager_GetConfig_Call) RunAndReturn(run func() *rest.Config) *MockCTRLManager_GetConfig_Call { _c.Call.Return(run) return _c } -// GetControllerOptions provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetControllerOptions() config.Controller { +// GetControllerOptions provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetControllerOptions() config.Controller { ret := _mock.Called() if len(ret) == 0 { @@ -520,35 +520,35 @@ func (_mock *CTRLManager) GetControllerOptions() config.Controller { return r0 } -// CTRLManager_GetControllerOptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetControllerOptions' -type CTRLManager_GetControllerOptions_Call struct { +// MockCTRLManager_GetControllerOptions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetControllerOptions' +type MockCTRLManager_GetControllerOptions_Call struct { *mock.Call } // GetControllerOptions is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetControllerOptions() *CTRLManager_GetControllerOptions_Call { - return &CTRLManager_GetControllerOptions_Call{Call: _e.mock.On("GetControllerOptions")} +func (_e *MockCTRLManager_Expecter) GetControllerOptions() *MockCTRLManager_GetControllerOptions_Call { + return &MockCTRLManager_GetControllerOptions_Call{Call: _e.mock.On("GetControllerOptions")} } -func (_c *CTRLManager_GetControllerOptions_Call) Run(run func()) *CTRLManager_GetControllerOptions_Call { +func (_c *MockCTRLManager_GetControllerOptions_Call) Run(run func()) *MockCTRLManager_GetControllerOptions_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetControllerOptions_Call) Return(controller config.Controller) *CTRLManager_GetControllerOptions_Call { +func (_c *MockCTRLManager_GetControllerOptions_Call) Return(controller config.Controller) *MockCTRLManager_GetControllerOptions_Call { _c.Call.Return(controller) return _c } -func (_c *CTRLManager_GetControllerOptions_Call) RunAndReturn(run func() config.Controller) *CTRLManager_GetControllerOptions_Call { +func (_c *MockCTRLManager_GetControllerOptions_Call) RunAndReturn(run func() config.Controller) *MockCTRLManager_GetControllerOptions_Call { _c.Call.Return(run) return _c } -// GetConverterRegistry provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetConverterRegistry() conversion.Registry { +// GetConverterRegistry provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetConverterRegistry() conversion.Registry { ret := _mock.Called() if len(ret) == 0 { @@ -566,35 +566,35 @@ func (_mock *CTRLManager) GetConverterRegistry() conversion.Registry { return r0 } -// CTRLManager_GetConverterRegistry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetConverterRegistry' -type CTRLManager_GetConverterRegistry_Call struct { +// MockCTRLManager_GetConverterRegistry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetConverterRegistry' +type MockCTRLManager_GetConverterRegistry_Call struct { *mock.Call } // GetConverterRegistry is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetConverterRegistry() *CTRLManager_GetConverterRegistry_Call { - return &CTRLManager_GetConverterRegistry_Call{Call: _e.mock.On("GetConverterRegistry")} +func (_e *MockCTRLManager_Expecter) GetConverterRegistry() *MockCTRLManager_GetConverterRegistry_Call { + return &MockCTRLManager_GetConverterRegistry_Call{Call: _e.mock.On("GetConverterRegistry")} } -func (_c *CTRLManager_GetConverterRegistry_Call) Run(run func()) *CTRLManager_GetConverterRegistry_Call { +func (_c *MockCTRLManager_GetConverterRegistry_Call) Run(run func()) *MockCTRLManager_GetConverterRegistry_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetConverterRegistry_Call) Return(registry conversion.Registry) *CTRLManager_GetConverterRegistry_Call { +func (_c *MockCTRLManager_GetConverterRegistry_Call) Return(registry conversion.Registry) *MockCTRLManager_GetConverterRegistry_Call { _c.Call.Return(registry) return _c } -func (_c *CTRLManager_GetConverterRegistry_Call) RunAndReturn(run func() conversion.Registry) *CTRLManager_GetConverterRegistry_Call { +func (_c *MockCTRLManager_GetConverterRegistry_Call) RunAndReturn(run func() conversion.Registry) *MockCTRLManager_GetConverterRegistry_Call { _c.Call.Return(run) return _c } -// GetEventRecorder provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetEventRecorder(name string) events.EventRecorder { +// GetEventRecorder provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetEventRecorder(name string) events.EventRecorder { ret := _mock.Called(name) if len(ret) == 0 { @@ -612,18 +612,18 @@ func (_mock *CTRLManager) GetEventRecorder(name string) events.EventRecorder { return r0 } -// CTRLManager_GetEventRecorder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEventRecorder' -type CTRLManager_GetEventRecorder_Call struct { +// MockCTRLManager_GetEventRecorder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEventRecorder' +type MockCTRLManager_GetEventRecorder_Call struct { *mock.Call } // GetEventRecorder is a helper method to define mock.On call // - name string -func (_e *CTRLManager_Expecter) GetEventRecorder(name interface{}) *CTRLManager_GetEventRecorder_Call { - return &CTRLManager_GetEventRecorder_Call{Call: _e.mock.On("GetEventRecorder", name)} +func (_e *MockCTRLManager_Expecter) GetEventRecorder(name interface{}) *MockCTRLManager_GetEventRecorder_Call { + return &MockCTRLManager_GetEventRecorder_Call{Call: _e.mock.On("GetEventRecorder", name)} } -func (_c *CTRLManager_GetEventRecorder_Call) Run(run func(name string)) *CTRLManager_GetEventRecorder_Call { +func (_c *MockCTRLManager_GetEventRecorder_Call) Run(run func(name string)) *MockCTRLManager_GetEventRecorder_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 string if args[0] != nil { @@ -636,18 +636,18 @@ func (_c *CTRLManager_GetEventRecorder_Call) Run(run func(name string)) *CTRLMan return _c } -func (_c *CTRLManager_GetEventRecorder_Call) Return(v events.EventRecorder) *CTRLManager_GetEventRecorder_Call { +func (_c *MockCTRLManager_GetEventRecorder_Call) Return(v events.EventRecorder) *MockCTRLManager_GetEventRecorder_Call { _c.Call.Return(v) return _c } -func (_c *CTRLManager_GetEventRecorder_Call) RunAndReturn(run func(name string) events.EventRecorder) *CTRLManager_GetEventRecorder_Call { +func (_c *MockCTRLManager_GetEventRecorder_Call) RunAndReturn(run func(name string) events.EventRecorder) *MockCTRLManager_GetEventRecorder_Call { _c.Call.Return(run) return _c } -// GetEventRecorderFor provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetEventRecorderFor(name string) record.EventRecorder { +// GetEventRecorderFor provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetEventRecorderFor(name string) record.EventRecorder { ret := _mock.Called(name) if len(ret) == 0 { @@ -665,18 +665,18 @@ func (_mock *CTRLManager) GetEventRecorderFor(name string) record.EventRecorder return r0 } -// CTRLManager_GetEventRecorderFor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEventRecorderFor' -type CTRLManager_GetEventRecorderFor_Call struct { +// MockCTRLManager_GetEventRecorderFor_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEventRecorderFor' +type MockCTRLManager_GetEventRecorderFor_Call struct { *mock.Call } // GetEventRecorderFor is a helper method to define mock.On call // - name string -func (_e *CTRLManager_Expecter) GetEventRecorderFor(name interface{}) *CTRLManager_GetEventRecorderFor_Call { - return &CTRLManager_GetEventRecorderFor_Call{Call: _e.mock.On("GetEventRecorderFor", name)} +func (_e *MockCTRLManager_Expecter) GetEventRecorderFor(name interface{}) *MockCTRLManager_GetEventRecorderFor_Call { + return &MockCTRLManager_GetEventRecorderFor_Call{Call: _e.mock.On("GetEventRecorderFor", name)} } -func (_c *CTRLManager_GetEventRecorderFor_Call) Run(run func(name string)) *CTRLManager_GetEventRecorderFor_Call { +func (_c *MockCTRLManager_GetEventRecorderFor_Call) Run(run func(name string)) *MockCTRLManager_GetEventRecorderFor_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 string if args[0] != nil { @@ -689,18 +689,18 @@ func (_c *CTRLManager_GetEventRecorderFor_Call) Run(run func(name string)) *CTRL return _c } -func (_c *CTRLManager_GetEventRecorderFor_Call) Return(eventRecorder record.EventRecorder) *CTRLManager_GetEventRecorderFor_Call { +func (_c *MockCTRLManager_GetEventRecorderFor_Call) Return(eventRecorder record.EventRecorder) *MockCTRLManager_GetEventRecorderFor_Call { _c.Call.Return(eventRecorder) return _c } -func (_c *CTRLManager_GetEventRecorderFor_Call) RunAndReturn(run func(name string) record.EventRecorder) *CTRLManager_GetEventRecorderFor_Call { +func (_c *MockCTRLManager_GetEventRecorderFor_Call) RunAndReturn(run func(name string) record.EventRecorder) *MockCTRLManager_GetEventRecorderFor_Call { _c.Call.Return(run) return _c } -// GetFieldIndexer provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetFieldIndexer() client.FieldIndexer { +// GetFieldIndexer provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetFieldIndexer() client.FieldIndexer { ret := _mock.Called() if len(ret) == 0 { @@ -718,35 +718,35 @@ func (_mock *CTRLManager) GetFieldIndexer() client.FieldIndexer { return r0 } -// CTRLManager_GetFieldIndexer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFieldIndexer' -type CTRLManager_GetFieldIndexer_Call struct { +// MockCTRLManager_GetFieldIndexer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFieldIndexer' +type MockCTRLManager_GetFieldIndexer_Call struct { *mock.Call } // GetFieldIndexer is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetFieldIndexer() *CTRLManager_GetFieldIndexer_Call { - return &CTRLManager_GetFieldIndexer_Call{Call: _e.mock.On("GetFieldIndexer")} +func (_e *MockCTRLManager_Expecter) GetFieldIndexer() *MockCTRLManager_GetFieldIndexer_Call { + return &MockCTRLManager_GetFieldIndexer_Call{Call: _e.mock.On("GetFieldIndexer")} } -func (_c *CTRLManager_GetFieldIndexer_Call) Run(run func()) *CTRLManager_GetFieldIndexer_Call { +func (_c *MockCTRLManager_GetFieldIndexer_Call) Run(run func()) *MockCTRLManager_GetFieldIndexer_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetFieldIndexer_Call) Return(fieldIndexer client.FieldIndexer) *CTRLManager_GetFieldIndexer_Call { +func (_c *MockCTRLManager_GetFieldIndexer_Call) Return(fieldIndexer client.FieldIndexer) *MockCTRLManager_GetFieldIndexer_Call { _c.Call.Return(fieldIndexer) return _c } -func (_c *CTRLManager_GetFieldIndexer_Call) RunAndReturn(run func() client.FieldIndexer) *CTRLManager_GetFieldIndexer_Call { +func (_c *MockCTRLManager_GetFieldIndexer_Call) RunAndReturn(run func() client.FieldIndexer) *MockCTRLManager_GetFieldIndexer_Call { _c.Call.Return(run) return _c } -// GetHTTPClient provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetHTTPClient() *http.Client { +// GetHTTPClient provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetHTTPClient() *http.Client { ret := _mock.Called() if len(ret) == 0 { @@ -764,35 +764,35 @@ func (_mock *CTRLManager) GetHTTPClient() *http.Client { return r0 } -// CTRLManager_GetHTTPClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetHTTPClient' -type CTRLManager_GetHTTPClient_Call struct { +// MockCTRLManager_GetHTTPClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetHTTPClient' +type MockCTRLManager_GetHTTPClient_Call struct { *mock.Call } // GetHTTPClient is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetHTTPClient() *CTRLManager_GetHTTPClient_Call { - return &CTRLManager_GetHTTPClient_Call{Call: _e.mock.On("GetHTTPClient")} +func (_e *MockCTRLManager_Expecter) GetHTTPClient() *MockCTRLManager_GetHTTPClient_Call { + return &MockCTRLManager_GetHTTPClient_Call{Call: _e.mock.On("GetHTTPClient")} } -func (_c *CTRLManager_GetHTTPClient_Call) Run(run func()) *CTRLManager_GetHTTPClient_Call { +func (_c *MockCTRLManager_GetHTTPClient_Call) Run(run func()) *MockCTRLManager_GetHTTPClient_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetHTTPClient_Call) Return(client1 *http.Client) *CTRLManager_GetHTTPClient_Call { +func (_c *MockCTRLManager_GetHTTPClient_Call) Return(client1 *http.Client) *MockCTRLManager_GetHTTPClient_Call { _c.Call.Return(client1) return _c } -func (_c *CTRLManager_GetHTTPClient_Call) RunAndReturn(run func() *http.Client) *CTRLManager_GetHTTPClient_Call { +func (_c *MockCTRLManager_GetHTTPClient_Call) RunAndReturn(run func() *http.Client) *MockCTRLManager_GetHTTPClient_Call { _c.Call.Return(run) return _c } -// GetLogger provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetLogger() logr.Logger { +// GetLogger provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetLogger() logr.Logger { ret := _mock.Called() if len(ret) == 0 { @@ -808,35 +808,35 @@ func (_mock *CTRLManager) GetLogger() logr.Logger { return r0 } -// CTRLManager_GetLogger_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogger' -type CTRLManager_GetLogger_Call struct { +// MockCTRLManager_GetLogger_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogger' +type MockCTRLManager_GetLogger_Call struct { *mock.Call } // GetLogger is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetLogger() *CTRLManager_GetLogger_Call { - return &CTRLManager_GetLogger_Call{Call: _e.mock.On("GetLogger")} +func (_e *MockCTRLManager_Expecter) GetLogger() *MockCTRLManager_GetLogger_Call { + return &MockCTRLManager_GetLogger_Call{Call: _e.mock.On("GetLogger")} } -func (_c *CTRLManager_GetLogger_Call) Run(run func()) *CTRLManager_GetLogger_Call { +func (_c *MockCTRLManager_GetLogger_Call) Run(run func()) *MockCTRLManager_GetLogger_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetLogger_Call) Return(logger logr.Logger) *CTRLManager_GetLogger_Call { +func (_c *MockCTRLManager_GetLogger_Call) Return(logger logr.Logger) *MockCTRLManager_GetLogger_Call { _c.Call.Return(logger) return _c } -func (_c *CTRLManager_GetLogger_Call) RunAndReturn(run func() logr.Logger) *CTRLManager_GetLogger_Call { +func (_c *MockCTRLManager_GetLogger_Call) RunAndReturn(run func() logr.Logger) *MockCTRLManager_GetLogger_Call { _c.Call.Return(run) return _c } -// GetRESTMapper provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetRESTMapper() meta.RESTMapper { +// GetRESTMapper provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetRESTMapper() meta.RESTMapper { ret := _mock.Called() if len(ret) == 0 { @@ -854,35 +854,35 @@ func (_mock *CTRLManager) GetRESTMapper() meta.RESTMapper { return r0 } -// CTRLManager_GetRESTMapper_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRESTMapper' -type CTRLManager_GetRESTMapper_Call struct { +// MockCTRLManager_GetRESTMapper_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRESTMapper' +type MockCTRLManager_GetRESTMapper_Call struct { *mock.Call } // GetRESTMapper is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetRESTMapper() *CTRLManager_GetRESTMapper_Call { - return &CTRLManager_GetRESTMapper_Call{Call: _e.mock.On("GetRESTMapper")} +func (_e *MockCTRLManager_Expecter) GetRESTMapper() *MockCTRLManager_GetRESTMapper_Call { + return &MockCTRLManager_GetRESTMapper_Call{Call: _e.mock.On("GetRESTMapper")} } -func (_c *CTRLManager_GetRESTMapper_Call) Run(run func()) *CTRLManager_GetRESTMapper_Call { +func (_c *MockCTRLManager_GetRESTMapper_Call) Run(run func()) *MockCTRLManager_GetRESTMapper_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetRESTMapper_Call) Return(rESTMapper meta.RESTMapper) *CTRLManager_GetRESTMapper_Call { +func (_c *MockCTRLManager_GetRESTMapper_Call) Return(rESTMapper meta.RESTMapper) *MockCTRLManager_GetRESTMapper_Call { _c.Call.Return(rESTMapper) return _c } -func (_c *CTRLManager_GetRESTMapper_Call) RunAndReturn(run func() meta.RESTMapper) *CTRLManager_GetRESTMapper_Call { +func (_c *MockCTRLManager_GetRESTMapper_Call) RunAndReturn(run func() meta.RESTMapper) *MockCTRLManager_GetRESTMapper_Call { _c.Call.Return(run) return _c } -// GetScheme provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetScheme() *runtime.Scheme { +// GetScheme provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetScheme() *runtime.Scheme { ret := _mock.Called() if len(ret) == 0 { @@ -900,35 +900,35 @@ func (_mock *CTRLManager) GetScheme() *runtime.Scheme { return r0 } -// CTRLManager_GetScheme_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetScheme' -type CTRLManager_GetScheme_Call struct { +// MockCTRLManager_GetScheme_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetScheme' +type MockCTRLManager_GetScheme_Call struct { *mock.Call } // GetScheme is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetScheme() *CTRLManager_GetScheme_Call { - return &CTRLManager_GetScheme_Call{Call: _e.mock.On("GetScheme")} +func (_e *MockCTRLManager_Expecter) GetScheme() *MockCTRLManager_GetScheme_Call { + return &MockCTRLManager_GetScheme_Call{Call: _e.mock.On("GetScheme")} } -func (_c *CTRLManager_GetScheme_Call) Run(run func()) *CTRLManager_GetScheme_Call { +func (_c *MockCTRLManager_GetScheme_Call) Run(run func()) *MockCTRLManager_GetScheme_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetScheme_Call) Return(scheme *runtime.Scheme) *CTRLManager_GetScheme_Call { +func (_c *MockCTRLManager_GetScheme_Call) Return(scheme *runtime.Scheme) *MockCTRLManager_GetScheme_Call { _c.Call.Return(scheme) return _c } -func (_c *CTRLManager_GetScheme_Call) RunAndReturn(run func() *runtime.Scheme) *CTRLManager_GetScheme_Call { +func (_c *MockCTRLManager_GetScheme_Call) RunAndReturn(run func() *runtime.Scheme) *MockCTRLManager_GetScheme_Call { _c.Call.Return(run) return _c } -// GetWebhookServer provides a mock function for the type CTRLManager -func (_mock *CTRLManager) GetWebhookServer() webhook.Server { +// GetWebhookServer provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) GetWebhookServer() webhook.Server { ret := _mock.Called() if len(ret) == 0 { @@ -946,35 +946,35 @@ func (_mock *CTRLManager) GetWebhookServer() webhook.Server { return r0 } -// CTRLManager_GetWebhookServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWebhookServer' -type CTRLManager_GetWebhookServer_Call struct { +// MockCTRLManager_GetWebhookServer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWebhookServer' +type MockCTRLManager_GetWebhookServer_Call struct { *mock.Call } // GetWebhookServer is a helper method to define mock.On call -func (_e *CTRLManager_Expecter) GetWebhookServer() *CTRLManager_GetWebhookServer_Call { - return &CTRLManager_GetWebhookServer_Call{Call: _e.mock.On("GetWebhookServer")} +func (_e *MockCTRLManager_Expecter) GetWebhookServer() *MockCTRLManager_GetWebhookServer_Call { + return &MockCTRLManager_GetWebhookServer_Call{Call: _e.mock.On("GetWebhookServer")} } -func (_c *CTRLManager_GetWebhookServer_Call) Run(run func()) *CTRLManager_GetWebhookServer_Call { +func (_c *MockCTRLManager_GetWebhookServer_Call) Run(run func()) *MockCTRLManager_GetWebhookServer_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *CTRLManager_GetWebhookServer_Call) Return(server webhook.Server) *CTRLManager_GetWebhookServer_Call { +func (_c *MockCTRLManager_GetWebhookServer_Call) Return(server webhook.Server) *MockCTRLManager_GetWebhookServer_Call { _c.Call.Return(server) return _c } -func (_c *CTRLManager_GetWebhookServer_Call) RunAndReturn(run func() webhook.Server) *CTRLManager_GetWebhookServer_Call { +func (_c *MockCTRLManager_GetWebhookServer_Call) RunAndReturn(run func() webhook.Server) *MockCTRLManager_GetWebhookServer_Call { _c.Call.Return(run) return _c } -// Start provides a mock function for the type CTRLManager -func (_mock *CTRLManager) Start(ctx context.Context) error { +// Start provides a mock function for the type MockCTRLManager +func (_mock *MockCTRLManager) Start(ctx context.Context) error { ret := _mock.Called(ctx) if len(ret) == 0 { @@ -990,18 +990,18 @@ func (_mock *CTRLManager) Start(ctx context.Context) error { return r0 } -// CTRLManager_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type CTRLManager_Start_Call struct { +// MockCTRLManager_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type MockCTRLManager_Start_Call struct { *mock.Call } // Start is a helper method to define mock.On call // - ctx context.Context -func (_e *CTRLManager_Expecter) Start(ctx interface{}) *CTRLManager_Start_Call { - return &CTRLManager_Start_Call{Call: _e.mock.On("Start", ctx)} +func (_e *MockCTRLManager_Expecter) Start(ctx interface{}) *MockCTRLManager_Start_Call { + return &MockCTRLManager_Start_Call{Call: _e.mock.On("Start", ctx)} } -func (_c *CTRLManager_Start_Call) Run(run func(ctx context.Context)) *CTRLManager_Start_Call { +func (_c *MockCTRLManager_Start_Call) Run(run func(ctx context.Context)) *MockCTRLManager_Start_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context if args[0] != nil { @@ -1014,12 +1014,12 @@ func (_c *CTRLManager_Start_Call) Run(run func(ctx context.Context)) *CTRLManage return _c } -func (_c *CTRLManager_Start_Call) Return(err error) *CTRLManager_Start_Call { +func (_c *MockCTRLManager_Start_Call) Return(err error) *MockCTRLManager_Start_Call { _c.Call.Return(err) return _c } -func (_c *CTRLManager_Start_Call) RunAndReturn(run func(ctx context.Context) error) *CTRLManager_Start_Call { +func (_c *MockCTRLManager_Start_Call) RunAndReturn(run func(ctx context.Context) error) *MockCTRLManager_Start_Call { _c.Call.Return(run) return _c } diff --git a/internal/subroutine/mocks/mock_KCPClientGetter.go b/internal/subroutine/mocks/mock_KCPClientGetter.go new file mode 100644 index 00000000..1d6d6845 --- /dev/null +++ b/internal/subroutine/mocks/mock_KCPClientGetter.go @@ -0,0 +1,169 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package mocks + +import ( + "context" + + mock "github.com/stretchr/testify/mock" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// NewMockKCPClientGetter creates a new instance of MockKCPClientGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockKCPClientGetter(t interface { + mock.TestingT + Cleanup(func()) +}) *MockKCPClientGetter { + mock := &MockKCPClientGetter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// MockKCPClientGetter is an autogenerated mock type for the KCPClientGetter type +type MockKCPClientGetter struct { + mock.Mock +} + +type MockKCPClientGetter_Expecter struct { + mock *mock.Mock +} + +func (_m *MockKCPClientGetter) EXPECT() *MockKCPClientGetter_Expecter { + return &MockKCPClientGetter_Expecter{mock: &_m.Mock} +} + +// NewClientForLogicalCluster provides a mock function for the type MockKCPClientGetter +func (_mock *MockKCPClientGetter) NewClientForLogicalCluster(ctx context.Context, cluster string) (client.Client, error) { + ret := _mock.Called(ctx, cluster) + + if len(ret) == 0 { + panic("no return value specified for NewClientForLogicalCluster") + } + + var r0 client.Client + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, string) (client.Client, error)); ok { + return returnFunc(ctx, cluster) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { + r0 = returnFunc(ctx, cluster) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Client) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = returnFunc(ctx, cluster) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockKCPClientGetter_NewClientForLogicalCluster_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientForLogicalCluster' +type MockKCPClientGetter_NewClientForLogicalCluster_Call struct { + *mock.Call +} + +// NewClientForLogicalCluster is a helper method to define mock.On call +// - ctx context.Context +// - cluster string +func (_e *MockKCPClientGetter_Expecter) NewClientForLogicalCluster(ctx interface{}, cluster interface{}) *MockKCPClientGetter_NewClientForLogicalCluster_Call { + return &MockKCPClientGetter_NewClientForLogicalCluster_Call{Call: _e.mock.On("NewClientForLogicalCluster", ctx, cluster)} +} + +func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) Run(run func(ctx context.Context, cluster string)) *MockKCPClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) Return(client1 client.Client, err error) *MockKCPClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Return(client1, err) + return _c +} + +func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) RunAndReturn(run func(ctx context.Context, cluster string) (client.Client, error)) *MockKCPClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Return(run) + return _c +} + +// NewClientFromContext provides a mock function for the type MockKCPClientGetter +func (_mock *MockKCPClientGetter) NewClientFromContext(ctx context.Context) (client.Client, error) { + ret := _mock.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for NewClientFromContext") + } + + var r0 client.Client + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context) (client.Client, error)); ok { + return returnFunc(ctx) + } + if returnFunc, ok := ret.Get(0).(func(context.Context) client.Client); ok { + r0 = returnFunc(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Client) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = returnFunc(ctx) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockKCPClientGetter_NewClientFromContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientFromContext' +type MockKCPClientGetter_NewClientFromContext_Call struct { + *mock.Call +} + +// NewClientFromContext is a helper method to define mock.On call +// - ctx context.Context +func (_e *MockKCPClientGetter_Expecter) NewClientFromContext(ctx interface{}) *MockKCPClientGetter_NewClientFromContext_Call { + return &MockKCPClientGetter_NewClientFromContext_Call{Call: _e.mock.On("NewClientFromContext", ctx)} +} + +func (_c *MockKCPClientGetter_NewClientFromContext_Call) Run(run func(ctx context.Context)) *MockKCPClientGetter_NewClientFromContext_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + run( + arg0, + ) + }) + return _c +} + +func (_c *MockKCPClientGetter_NewClientFromContext_Call) Return(client1 client.Client, err error) *MockKCPClientGetter_NewClientFromContext_Call { + _c.Call.Return(client1, err) + return _c +} + +func (_c *MockKCPClientGetter_NewClientFromContext_Call) RunAndReturn(run func(ctx context.Context) (client.Client, error)) *MockKCPClientGetter_NewClientFromContext_Call { + _c.Call.Return(run) + return _c +} diff --git a/internal/subroutine/mocks/mock_KCPCombinedClientGetter.go b/internal/subroutine/mocks/mock_KCPCombinedClientGetter.go new file mode 100644 index 00000000..9ad14115 --- /dev/null +++ b/internal/subroutine/mocks/mock_KCPCombinedClientGetter.go @@ -0,0 +1,241 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package mocks + +import ( + "context" + + mock "github.com/stretchr/testify/mock" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// NewMockKCPCombinedClientGetter creates a new instance of MockKCPCombinedClientGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockKCPCombinedClientGetter(t interface { + mock.TestingT + Cleanup(func()) +}) *MockKCPCombinedClientGetter { + mock := &MockKCPCombinedClientGetter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// MockKCPCombinedClientGetter is an autogenerated mock type for the KCPCombinedClientGetter type +type MockKCPCombinedClientGetter struct { + mock.Mock +} + +type MockKCPCombinedClientGetter_Expecter struct { + mock *mock.Mock +} + +func (_m *MockKCPCombinedClientGetter) EXPECT() *MockKCPCombinedClientGetter_Expecter { + return &MockKCPCombinedClientGetter_Expecter{mock: &_m.Mock} +} + +// List provides a mock function for the type MockKCPCombinedClientGetter +func (_mock *MockKCPCombinedClientGetter) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + var tmpRet mock.Arguments + if len(opts) > 0 { + tmpRet = _mock.Called(ctx, list, opts) + } else { + tmpRet = _mock.Called(ctx, list) + } + ret := tmpRet + + if len(ret) == 0 { + panic("no return value specified for List") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, client.ObjectList, ...client.ListOption) error); ok { + r0 = returnFunc(ctx, list, opts...) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// MockKCPCombinedClientGetter_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' +type MockKCPCombinedClientGetter_List_Call struct { + *mock.Call +} + +// List is a helper method to define mock.On call +// - ctx context.Context +// - list client.ObjectList +// - opts ...client.ListOption +func (_e *MockKCPCombinedClientGetter_Expecter) List(ctx interface{}, list interface{}, opts ...interface{}) *MockKCPCombinedClientGetter_List_Call { + return &MockKCPCombinedClientGetter_List_Call{Call: _e.mock.On("List", + append([]interface{}{ctx, list}, opts...)...)} +} + +func (_c *MockKCPCombinedClientGetter_List_Call) Run(run func(ctx context.Context, list client.ObjectList, opts ...client.ListOption)) *MockKCPCombinedClientGetter_List_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 client.ObjectList + if args[1] != nil { + arg1 = args[1].(client.ObjectList) + } + var arg2 []client.ListOption + var variadicArgs []client.ListOption + if len(args) > 2 { + variadicArgs = args[2].([]client.ListOption) + } + arg2 = variadicArgs + run( + arg0, + arg1, + arg2..., + ) + }) + return _c +} + +func (_c *MockKCPCombinedClientGetter_List_Call) Return(err error) *MockKCPCombinedClientGetter_List_Call { + _c.Call.Return(err) + return _c +} + +func (_c *MockKCPCombinedClientGetter_List_Call) RunAndReturn(run func(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error) *MockKCPCombinedClientGetter_List_Call { + _c.Call.Return(run) + return _c +} + +// NewClientForLogicalCluster provides a mock function for the type MockKCPCombinedClientGetter +func (_mock *MockKCPCombinedClientGetter) NewClientForLogicalCluster(ctx context.Context, cluster string) (client.Client, error) { + ret := _mock.Called(ctx, cluster) + + if len(ret) == 0 { + panic("no return value specified for NewClientForLogicalCluster") + } + + var r0 client.Client + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, string) (client.Client, error)); ok { + return returnFunc(ctx, cluster) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { + r0 = returnFunc(ctx, cluster) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Client) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = returnFunc(ctx, cluster) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientForLogicalCluster' +type MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call struct { + *mock.Call +} + +// NewClientForLogicalCluster is a helper method to define mock.On call +// - ctx context.Context +// - cluster string +func (_e *MockKCPCombinedClientGetter_Expecter) NewClientForLogicalCluster(ctx interface{}, cluster interface{}) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { + return &MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call{Call: _e.mock.On("NewClientForLogicalCluster", ctx, cluster)} +} + +func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) Run(run func(ctx context.Context, cluster string)) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) Return(client1 client.Client, err error) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Return(client1, err) + return _c +} + +func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) RunAndReturn(run func(ctx context.Context, cluster string) (client.Client, error)) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { + _c.Call.Return(run) + return _c +} + +// NewClientFromContext provides a mock function for the type MockKCPCombinedClientGetter +func (_mock *MockKCPCombinedClientGetter) NewClientFromContext(ctx context.Context) (client.Client, error) { + ret := _mock.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for NewClientFromContext") + } + + var r0 client.Client + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context) (client.Client, error)); ok { + return returnFunc(ctx) + } + if returnFunc, ok := ret.Get(0).(func(context.Context) client.Client); ok { + r0 = returnFunc(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(client.Client) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = returnFunc(ctx) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockKCPCombinedClientGetter_NewClientFromContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientFromContext' +type MockKCPCombinedClientGetter_NewClientFromContext_Call struct { + *mock.Call +} + +// NewClientFromContext is a helper method to define mock.On call +// - ctx context.Context +func (_e *MockKCPCombinedClientGetter_Expecter) NewClientFromContext(ctx interface{}) *MockKCPCombinedClientGetter_NewClientFromContext_Call { + return &MockKCPCombinedClientGetter_NewClientFromContext_Call{Call: _e.mock.On("NewClientFromContext", ctx)} +} + +func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) Run(run func(ctx context.Context)) *MockKCPCombinedClientGetter_NewClientFromContext_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + run( + arg0, + ) + }) + return _c +} + +func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) Return(client1 client.Client, err error) *MockKCPCombinedClientGetter_NewClientFromContext_Call { + _c.Call.Return(client1, err) + return _c +} + +func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) RunAndReturn(run func(ctx context.Context) (client.Client, error)) *MockKCPCombinedClientGetter_NewClientFromContext_Call { + _c.Call.Return(run) + return _c +} diff --git a/internal/subroutine/mocks/mock_KCPGetters.go b/internal/subroutine/mocks/mock_KCPGetters.go deleted file mode 100644 index 0aacfdea..00000000 --- a/internal/subroutine/mocks/mock_KCPGetters.go +++ /dev/null @@ -1,394 +0,0 @@ -// Code generated by mockery; DO NOT EDIT. -// github.com/vektra/mockery -// template: testify - -package mocks - -import ( - "context" - - mock "github.com/stretchr/testify/mock" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// NewMockKCPClientGetter creates a new instance of MockKCPClientGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockKCPClientGetter(t interface { - mock.TestingT - Cleanup(func()) -}) *MockKCPClientGetter { - mock := &MockKCPClientGetter{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} - -// MockKCPClientGetter is an autogenerated mock type for the KCPClientGetter type -type MockKCPClientGetter struct { - mock.Mock -} - -type MockKCPClientGetter_Expecter struct { - mock *mock.Mock -} - -func (_m *MockKCPClientGetter) EXPECT() *MockKCPClientGetter_Expecter { - return &MockKCPClientGetter_Expecter{mock: &_m.Mock} -} - -// NewClientForLogicalCluster provides a mock function for the type MockKCPClientGetter -func (_mock *MockKCPClientGetter) NewClientForLogicalCluster(ctx context.Context, cluster string) (client.Client, error) { - ret := _mock.Called(ctx, cluster) - - if len(ret) == 0 { - panic("no return value specified for NewClientForLogicalCluster") - } - - var r0 client.Client - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) (client.Client, error)); ok { - return returnFunc(ctx, cluster) - } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { - r0 = returnFunc(ctx, cluster) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = returnFunc(ctx, cluster) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockKCPClientGetter_NewClientForLogicalCluster_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientForLogicalCluster' -type MockKCPClientGetter_NewClientForLogicalCluster_Call struct { - *mock.Call -} - -// NewClientForLogicalCluster is a helper method to define mock.On call -// - ctx context.Context -// - cluster string -func (_e *MockKCPClientGetter_Expecter) NewClientForLogicalCluster(ctx interface{}, cluster interface{}) *MockKCPClientGetter_NewClientForLogicalCluster_Call { - return &MockKCPClientGetter_NewClientForLogicalCluster_Call{Call: _e.mock.On("NewClientForLogicalCluster", ctx, cluster)} -} - -func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) Run(run func(ctx context.Context, cluster string)) *MockKCPClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - run( - arg0, - arg1, - ) - }) - return _c -} - -func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) Return(client1 client.Client, err error) *MockKCPClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Return(client1, err) - return _c -} - -func (_c *MockKCPClientGetter_NewClientForLogicalCluster_Call) RunAndReturn(run func(ctx context.Context, cluster string) (client.Client, error)) *MockKCPClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Return(run) - return _c -} - -// NewClientFromContext provides a mock function for the type MockKCPClientGetter -func (_mock *MockKCPClientGetter) NewClientFromContext(ctx context.Context) (client.Client, error) { - ret := _mock.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for NewClientFromContext") - } - - var r0 client.Client - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context) (client.Client, error)); ok { - return returnFunc(ctx) - } - if returnFunc, ok := ret.Get(0).(func(context.Context) client.Client); ok { - r0 = returnFunc(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = returnFunc(ctx) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockKCPClientGetter_NewClientFromContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientFromContext' -type MockKCPClientGetter_NewClientFromContext_Call struct { - *mock.Call -} - -// NewClientFromContext is a helper method to define mock.On call -// - ctx context.Context -func (_e *MockKCPClientGetter_Expecter) NewClientFromContext(ctx interface{}) *MockKCPClientGetter_NewClientFromContext_Call { - return &MockKCPClientGetter_NewClientFromContext_Call{Call: _e.mock.On("NewClientFromContext", ctx)} -} - -func (_c *MockKCPClientGetter_NewClientFromContext_Call) Run(run func(ctx context.Context)) *MockKCPClientGetter_NewClientFromContext_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - run( - arg0, - ) - }) - return _c -} - -func (_c *MockKCPClientGetter_NewClientFromContext_Call) Return(client1 client.Client, err error) *MockKCPClientGetter_NewClientFromContext_Call { - _c.Call.Return(client1, err) - return _c -} - -func (_c *MockKCPClientGetter_NewClientFromContext_Call) RunAndReturn(run func(ctx context.Context) (client.Client, error)) *MockKCPClientGetter_NewClientFromContext_Call { - _c.Call.Return(run) - return _c -} - -// NewMockKCPCombinedClientGetter creates a new instance of MockKCPCombinedClientGetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockKCPCombinedClientGetter(t interface { - mock.TestingT - Cleanup(func()) -}) *MockKCPCombinedClientGetter { - mock := &MockKCPCombinedClientGetter{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} - -// MockKCPCombinedClientGetter is an autogenerated mock type for the KCPCombinedClientGetter type -type MockKCPCombinedClientGetter struct { - mock.Mock -} - -type MockKCPCombinedClientGetter_Expecter struct { - mock *mock.Mock -} - -func (_m *MockKCPCombinedClientGetter) EXPECT() *MockKCPCombinedClientGetter_Expecter { - return &MockKCPCombinedClientGetter_Expecter{mock: &_m.Mock} -} - -// AllClient provides a mock function for the type MockKCPCombinedClientGetter -func (_mock *MockKCPCombinedClientGetter) AllClient(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error) { - ret := _mock.Called(ctx, apiexportEndpointSliceName) - - if len(ret) == 0 { - panic("no return value specified for AllClient") - } - - var r0 client.Client - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) (client.Client, error)); ok { - return returnFunc(ctx, apiexportEndpointSliceName) - } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { - r0 = returnFunc(ctx, apiexportEndpointSliceName) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = returnFunc(ctx, apiexportEndpointSliceName) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockKCPCombinedClientGetter_AllClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AllClient' -type MockKCPCombinedClientGetter_AllClient_Call struct { - *mock.Call -} - -// AllClient is a helper method to define mock.On call -// - ctx context.Context -// - apiexportEndpointSliceName string -func (_e *MockKCPCombinedClientGetter_Expecter) AllClient(ctx interface{}, apiexportEndpointSliceName interface{}) *MockKCPCombinedClientGetter_AllClient_Call { - return &MockKCPCombinedClientGetter_AllClient_Call{Call: _e.mock.On("AllClient", ctx, apiexportEndpointSliceName)} -} - -func (_c *MockKCPCombinedClientGetter_AllClient_Call) Run(run func(ctx context.Context, apiexportEndpointSliceName string)) *MockKCPCombinedClientGetter_AllClient_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - run( - arg0, - arg1, - ) - }) - return _c -} - -func (_c *MockKCPCombinedClientGetter_AllClient_Call) Return(client1 client.Client, err error) *MockKCPCombinedClientGetter_AllClient_Call { - _c.Call.Return(client1, err) - return _c -} - -func (_c *MockKCPCombinedClientGetter_AllClient_Call) RunAndReturn(run func(ctx context.Context, apiexportEndpointSliceName string) (client.Client, error)) *MockKCPCombinedClientGetter_AllClient_Call { - _c.Call.Return(run) - return _c -} - -// NewClientForLogicalCluster provides a mock function for the type MockKCPCombinedClientGetter -func (_mock *MockKCPCombinedClientGetter) NewClientForLogicalCluster(ctx context.Context, cluster string) (client.Client, error) { - ret := _mock.Called(ctx, cluster) - - if len(ret) == 0 { - panic("no return value specified for NewClientForLogicalCluster") - } - - var r0 client.Client - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) (client.Client, error)); ok { - return returnFunc(ctx, cluster) - } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) client.Client); ok { - r0 = returnFunc(ctx, cluster) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = returnFunc(ctx, cluster) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientForLogicalCluster' -type MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call struct { - *mock.Call -} - -// NewClientForLogicalCluster is a helper method to define mock.On call -// - ctx context.Context -// - cluster string -func (_e *MockKCPCombinedClientGetter_Expecter) NewClientForLogicalCluster(ctx interface{}, cluster interface{}) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { - return &MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call{Call: _e.mock.On("NewClientForLogicalCluster", ctx, cluster)} -} - -func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) Run(run func(ctx context.Context, cluster string)) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - run( - arg0, - arg1, - ) - }) - return _c -} - -func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) Return(client1 client.Client, err error) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Return(client1, err) - return _c -} - -func (_c *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call) RunAndReturn(run func(ctx context.Context, cluster string) (client.Client, error)) *MockKCPCombinedClientGetter_NewClientForLogicalCluster_Call { - _c.Call.Return(run) - return _c -} - -// NewClientFromContext provides a mock function for the type MockKCPCombinedClientGetter -func (_mock *MockKCPCombinedClientGetter) NewClientFromContext(ctx context.Context) (client.Client, error) { - ret := _mock.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for NewClientFromContext") - } - - var r0 client.Client - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context) (client.Client, error)); ok { - return returnFunc(ctx) - } - if returnFunc, ok := ret.Get(0).(func(context.Context) client.Client); ok { - r0 = returnFunc(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(client.Client) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = returnFunc(ctx) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockKCPCombinedClientGetter_NewClientFromContext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClientFromContext' -type MockKCPCombinedClientGetter_NewClientFromContext_Call struct { - *mock.Call -} - -// NewClientFromContext is a helper method to define mock.On call -// - ctx context.Context -func (_e *MockKCPCombinedClientGetter_Expecter) NewClientFromContext(ctx interface{}) *MockKCPCombinedClientGetter_NewClientFromContext_Call { - return &MockKCPCombinedClientGetter_NewClientFromContext_Call{Call: _e.mock.On("NewClientFromContext", ctx)} -} - -func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) Run(run func(ctx context.Context)) *MockKCPCombinedClientGetter_NewClientFromContext_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - run( - arg0, - ) - }) - return _c -} - -func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) Return(client1 client.Client, err error) *MockKCPCombinedClientGetter_NewClientFromContext_Call { - _c.Call.Return(client1, err) - return _c -} - -func (_c *MockKCPCombinedClientGetter_NewClientFromContext_Call) RunAndReturn(run func(ctx context.Context) (client.Client, error)) *MockKCPCombinedClientGetter_NewClientFromContext_Call { - _c.Call.Return(run) - return _c -} diff --git a/internal/subroutine/mocks/mock_Lister.go b/internal/subroutine/mocks/mock_Lister.go new file mode 100644 index 00000000..10799654 --- /dev/null +++ b/internal/subroutine/mocks/mock_Lister.go @@ -0,0 +1,111 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package mocks + +import ( + "context" + + mock "github.com/stretchr/testify/mock" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// NewMockLister creates a new instance of MockLister. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockLister(t interface { + mock.TestingT + Cleanup(func()) +}) *MockLister { + mock := &MockLister{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// MockLister is an autogenerated mock type for the Lister type +type MockLister struct { + mock.Mock +} + +type MockLister_Expecter struct { + mock *mock.Mock +} + +func (_m *MockLister) EXPECT() *MockLister_Expecter { + return &MockLister_Expecter{mock: &_m.Mock} +} + +// List provides a mock function for the type MockLister +func (_mock *MockLister) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + var tmpRet mock.Arguments + if len(opts) > 0 { + tmpRet = _mock.Called(ctx, list, opts) + } else { + tmpRet = _mock.Called(ctx, list) + } + ret := tmpRet + + if len(ret) == 0 { + panic("no return value specified for List") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, client.ObjectList, ...client.ListOption) error); ok { + r0 = returnFunc(ctx, list, opts...) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// MockLister_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' +type MockLister_List_Call struct { + *mock.Call +} + +// List is a helper method to define mock.On call +// - ctx context.Context +// - list client.ObjectList +// - opts ...client.ListOption +func (_e *MockLister_Expecter) List(ctx interface{}, list interface{}, opts ...interface{}) *MockLister_List_Call { + return &MockLister_List_Call{Call: _e.mock.On("List", + append([]interface{}{ctx, list}, opts...)...)} +} + +func (_c *MockLister_List_Call) Run(run func(ctx context.Context, list client.ObjectList, opts ...client.ListOption)) *MockLister_List_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 client.ObjectList + if args[1] != nil { + arg1 = args[1].(client.ObjectList) + } + var arg2 []client.ListOption + var variadicArgs []client.ListOption + if len(args) > 2 { + variadicArgs = args[2].([]client.ListOption) + } + arg2 = variadicArgs + run( + arg0, + arg1, + arg2..., + ) + }) + return _c +} + +func (_c *MockLister_List_Call) Return(err error) *MockLister_List_Call { + _c.Call.Return(err) + return _c +} + +func (_c *MockLister_List_Call) RunAndReturn(run func(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error) *MockLister_List_Call { + _c.Call.Return(run) + return _c +} diff --git a/internal/subroutine/mocks/mock_Manager.go b/internal/subroutine/mocks/mock_Manager.go index 08c2dc2c..26785e1d 100644 --- a/internal/subroutine/mocks/mock_Manager.go +++ b/internal/subroutine/mocks/mock_Manager.go @@ -401,10 +401,10 @@ type MockManager_Engage_Call struct { // Engage is a helper method to define mock.On call // - context1 context.Context -// - s string +// - clusterName multicluster.ClusterName // - cluster1 cluster.Cluster -func (_e *MockManager_Expecter) Engage(context1 interface{}, s interface{}, cluster1 interface{}) *MockManager_Engage_Call { - return &MockManager_Engage_Call{Call: _e.mock.On("Engage", context1, s, cluster1)} +func (_e *MockManager_Expecter) Engage(context1 interface{}, clusterName interface{}, cluster1 interface{}) *MockManager_Engage_Call { + return &MockManager_Engage_Call{Call: _e.mock.On("Engage", context1, clusterName, cluster1)} } func (_c *MockManager_Engage_Call) Run(run func(context1 context.Context, clusterName multicluster.ClusterName, cluster1 cluster.Cluster)) *MockManager_Engage_Call { @@ -475,7 +475,7 @@ type MockManager_GetCluster_Call struct { // GetCluster is a helper method to define mock.On call // - ctx context.Context -// - clusterName string +// - clusterName multicluster.ClusterName func (_e *MockManager_Expecter) GetCluster(ctx interface{}, clusterName interface{}) *MockManager_GetCluster_Call { return &MockManager_GetCluster_Call{Call: _e.mock.On("GetCluster", ctx, clusterName)} } @@ -723,7 +723,7 @@ type MockManager_GetManager_Call struct { // GetManager is a helper method to define mock.On call // - ctx context.Context -// - clusterName string +// - clusterName multicluster.ClusterName func (_e *MockManager_Expecter) GetManager(ctx interface{}, clusterName interface{}) *MockManager_GetManager_Call { return &MockManager_GetManager_Call{Call: _e.mock.On("GetManager", ctx, clusterName)} } diff --git a/internal/subroutine/mocks/mock_StoreIDGetter.go b/internal/subroutine/mocks/mock_StoreIDGetter.go index 7838fe21..a7f35ca8 100644 --- a/internal/subroutine/mocks/mock_StoreIDGetter.go +++ b/internal/subroutine/mocks/mock_StoreIDGetter.go @@ -1,3 +1,7 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + package mocks import ( @@ -13,7 +17,7 @@ func NewMockStoreIDGetter(t interface { Cleanup(func()) }) *MockStoreIDGetter { mock := &MockStoreIDGetter{} - mock.Test(t) + mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) @@ -37,46 +41,64 @@ func (_m *MockStoreIDGetter) EXPECT() *MockStoreIDGetter_Expecter { func (_mock *MockStoreIDGetter) Get(ctx context.Context, storeName string) (string, error) { ret := _mock.Called(ctx, storeName) + if len(ret) == 0 { + panic("no return value specified for Get") + } + var r0 string - if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { - r0 = rf(ctx, storeName) + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return returnFunc(ctx, storeName) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, string) string); ok { + r0 = returnFunc(ctx, storeName) } else { r0 = ret.Get(0).(string) } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = rf(ctx, storeName) + if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = returnFunc(ctx, storeName) } else { r1 = ret.Error(1) } - return r0, r1 } -// MockStoreIDGetter_Get_Call is a helper struct to make the mock expectations more readable +// MockStoreIDGetter_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' type MockStoreIDGetter_Get_Call struct { *mock.Call } -// Get is a helper method to define mock expectations +// Get is a helper method to define mock.On call +// - ctx context.Context +// - storeName string func (_e *MockStoreIDGetter_Expecter) Get(ctx interface{}, storeName interface{}) *MockStoreIDGetter_Get_Call { return &MockStoreIDGetter_Get_Call{Call: _e.mock.On("Get", ctx, storeName)} } func (_c *MockStoreIDGetter_Get_Call) Run(run func(ctx context.Context, storeName string)) *MockStoreIDGetter_Get_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string)) + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) }) return _c } -func (_c *MockStoreIDGetter_Get_Call) Return(_a0 string, _a1 error) *MockStoreIDGetter_Get_Call { - _c.Call.Return(_a0, _a1) +func (_c *MockStoreIDGetter_Get_Call) Return(s string, err error) *MockStoreIDGetter_Get_Call { + _c.Call.Return(s, err) return _c } -func (_c *MockStoreIDGetter_Get_Call) RunAndReturn(run func(context.Context, string) (string, error)) *MockStoreIDGetter_Get_Call { +func (_c *MockStoreIDGetter_Get_Call) RunAndReturn(run func(ctx context.Context, storeName string) (string, error)) *MockStoreIDGetter_Get_Call { _c.Call.Return(run) return _c } diff --git a/internal/subroutine/store.go b/internal/subroutine/store.go index 319ccada..a02d90d4 100644 --- a/internal/subroutine/store.go +++ b/internal/subroutine/store.go @@ -19,10 +19,10 @@ import ( type storeSubroutine struct { fga openfgav1.OpenFGAServiceClient mgr mcmanager.Manager - kcpHelper iclient.KcpClientHelper + kcpHelper iclient.Lister } -func NewStoreSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, kcpHelper iclient.KcpClientHelper) *storeSubroutine { +func NewStoreSubroutine(fga openfgav1.OpenFGAServiceClient, mgr mcmanager.Manager, kcpHelper iclient.Lister) *storeSubroutine { return &storeSubroutine{ fga: fga, mgr: mgr, diff --git a/internal/subroutine/store_test.go b/internal/subroutine/store_test.go index 760dd5f4..a6c4f2af 100644 --- a/internal/subroutine/store_test.go +++ b/internal/subroutine/store_test.go @@ -163,7 +163,7 @@ func TestProcess(t *testing.T) { } manager := mocks.NewMockManager(t) - kcpHelper := mocks.NewMockKcpHelper(t) + kcpHelper := mocks.NewMockLister(t) subroutine := subroutine.NewStoreSubroutine(fga, manager, kcpHelper) _, err := subroutine.Process(context.Background(), test.store) @@ -182,7 +182,7 @@ func TestFinalize(t *testing.T) { name string store *securityv1alpha1.Store fgaMocks func(*mocks.MockOpenFGAServiceClient) - kcpHelperMocks func(*mocks.MockKcpHelper) + kcpHelperMocks func(*mocks.MockLister) expectError bool }{ { @@ -203,7 +203,7 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { if list, ok := ol.(*securityv1alpha1.AuthorizationModelList); ok { list.Items = []securityv1alpha1.AuthorizationModel{ @@ -232,7 +232,7 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(errors.New("error")) }, expectError: true, @@ -247,7 +247,7 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { @@ -264,7 +264,7 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { @@ -281,7 +281,7 @@ func TestFinalize(t *testing.T) { StoreID: "id", }, }, - kcpHelperMocks: func(kcpHelper *mocks.MockKcpHelper) { + kcpHelperMocks: func(kcpHelper *mocks.MockLister) { kcpHelper.EXPECT().List(mock.Anything, mock.Anything).Return(nil) }, fgaMocks: func(fga *mocks.MockOpenFGAServiceClient) { @@ -299,7 +299,7 @@ func TestFinalize(t *testing.T) { } manager := mocks.NewMockManager(t) - kcpHelper := mocks.NewMockKcpHelper(t) + kcpHelper := mocks.NewMockLister(t) // Only wire kcpHelper expectations when Finalize will actually query k8s (i.e., StoreID is set) if test.store.Status.StoreID != "" && test.kcpHelperMocks != nil { diff --git a/internal/test/integration/suite_test.go b/internal/test/integration/suite_test.go index e5d1859f..e6f03b53 100644 --- a/internal/test/integration/suite_test.go +++ b/internal/test/integration/suite_test.go @@ -13,7 +13,6 @@ import ( "github.com/platform-mesh/golang-commons/logger" securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1" iclient "github.com/platform-mesh/security-operator/internal/client" - iclient "github.com/platform-mesh/security-operator/internal/client" "github.com/platform-mesh/security-operator/internal/config" "github.com/platform-mesh/security-operator/internal/controller" "github.com/stretchr/testify/require" @@ -244,9 +243,9 @@ func (suite *IntegrationSuite) setupControllers(defaultCfg *platformeshconfig.Co }, } - kcpClientHelper := iclient.NewKcpHelper(mgr.GetLocalManager().GetConfig(), mgr.GetLocalManager().GetScheme(), provider.Provider) + providerLister := iclient.NewProviderLister(provider.Provider) - err = controller.NewAPIBindingReconciler(ctx, testLogger, mgr, operatorCfg, kcpClientHelper).SetupWithManager(mgr, defaultCfg) + err = controller.NewAPIBindingReconciler(testLogger, mgr, providerLister, operatorCfg).SetupWithManager(mgr, defaultCfg) suite.Require().NoError(err) managerCtx, cancel := context.WithCancel(ctx) From 40b63860392b10f34376ca6a6ede0ee40dd37ade Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Thu, 7 May 2026 16:33:56 +0200 Subject: [PATCH 11/16] fix: address linter On-behalf-of: SAP aleh.yarshou@sap.com --- internal/client/kcp_helper.go | 2 +- internal/controller/apibinding_controller.go | 2 +- .../authorization_model_generation.go | 7 +- .../authorization_model_generation_test.go | 962 +++++++++--------- 4 files changed, 486 insertions(+), 487 deletions(-) diff --git a/internal/client/kcp_helper.go b/internal/client/kcp_helper.go index 28c961e2..867ebf9d 100644 --- a/internal/client/kcp_helper.go +++ b/internal/client/kcp_helper.go @@ -7,13 +7,13 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" mccontext "sigs.k8s.io/multicluster-runtime/pkg/context" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" "github.com/kcp-dev/logicalcluster/v3" "github.com/kcp-dev/multicluster-provider/pkg/provider" - "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) type KCPClientGetter interface { diff --git a/internal/controller/apibinding_controller.go b/internal/controller/apibinding_controller.go index 23d9c140..61b1524e 100644 --- a/internal/controller/apibinding_controller.go +++ b/internal/controller/apibinding_controller.go @@ -24,7 +24,7 @@ import ( func NewAPIBindingReconciler(logger *logger.Logger, mcMgr mcmanager.Manager, lister iclient.Lister, cfg *config.Config) *APIBindingReconciler { lc := lifecycle.New(mcMgr, "APIBindingReconciler", func() client.Object { return &kcpapisv1alpha2.APIBinding{} - }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, lister, cfg.APIExportEndpointSlices.CorePlatformMeshIO)) + }, subroutine.NewAuthorizationModelGenerationSubroutine(mcMgr, lister)) return &APIBindingReconciler{ log: logger, diff --git a/internal/subroutine/authorization_model_generation.go b/internal/subroutine/authorization_model_generation.go index 0e73a19c..287321a8 100644 --- a/internal/subroutine/authorization_model_generation.go +++ b/internal/subroutine/authorization_model_generation.go @@ -39,7 +39,7 @@ func toK8sName(parts ...string) string { return strings.Trim(name, "-") } -func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, lister iclient.Lister, apiExportEndpointSliceName string) *AuthorizationModelGenerationSubroutine { +func NewAuthorizationModelGenerationSubroutine(mcMgr mcmanager.Manager, lister iclient.Lister) *AuthorizationModelGenerationSubroutine { return &AuthorizationModelGenerationSubroutine{ mgr: mcMgr, lister: lister, @@ -52,9 +52,8 @@ var ( ) type AuthorizationModelGenerationSubroutine struct { - mgr mcmanager.Manager - lister iclient.Lister - apiExportEndpointSliceName string + mgr mcmanager.Manager + lister iclient.Lister } var modelTpl = template.Must(template.New("model").Parse(`module {{ .Name }} diff --git a/internal/subroutine/authorization_model_generation_test.go b/internal/subroutine/authorization_model_generation_test.go index 5f87e2b3..a0d83342 100644 --- a/internal/subroutine/authorization_model_generation_test.go +++ b/internal/subroutine/authorization_model_generation_test.go @@ -294,7 +294,7 @@ func TestAuthorizationModelGeneration_Process(t *testing.T) { test.mockSetup(manager, lister, cluster, kcpClient) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister, "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister) _, err := sub.Process(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -323,15 +323,15 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b1 := bindingWithCluster("foo", "bar", "cluster1") - b2 := bindingWithCluster("other", "other", "cluster2") - list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} - return nil - }) + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b1 := bindingWithCluster("foo", "bar", "cluster1") + b2 := bindingWithCluster("other", "other", "cluster2") + list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} + return nil + }) bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) acc.Spec.Organization.Name = "org" @@ -377,20 +377,20 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { bindingCluster := mocks.NewMockCluster(t) bindingClient := mocks.NewMockClient(t) - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := binding.DeepCopy() - if b.Annotations == nil { - b.Annotations = make(map[string]string) - } - b.Annotations["kcp.io/cluster"] = "cluster1" - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( - kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := binding.DeepCopy() + if b.Annotations == nil { + b.Annotations = make(map[string]string) + } + b.Annotations["kcp.io/cluster"] = "cluster1" + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( + kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) }, }, { @@ -403,44 +403,44 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { apiExportCluster := mocks.NewMockCluster(t) apiExportClient := mocks.NewMockClient(t) - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := binding.DeepCopy() - if b.Annotations == nil { - b.Annotations = make(map[string]string) - } - b.Annotations["kcp.io/cluster"] = "cluster1" - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingCluster, nil) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - ae := o.(*kcpapisv1alpha2.APIExport) - ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} - return nil - }) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - rs := o.(*kcpapisv1alpha1.APIResourceSchema) - rs.Spec.Names.Plural = "foos" - return nil - }) - apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(assert.AnError) + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := binding.DeepCopy() + if b.Annotations == nil { + b.Annotations = make(map[string]string) + } + b.Annotations["kcp.io/cluster"] = "cluster1" + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingCluster, nil) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + ae := o.(*kcpapisv1alpha2.APIExport) + ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} + return nil + }) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + rs := o.(*kcpapisv1alpha1.APIResourceSchema) + rs.Spec.Names.Plural = "foos" + return nil + }) + apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(assert.AnError) }, }, { @@ -454,114 +454,114 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { bindingWsCluster2 := mocks.NewMockCluster(t) bindingWsClient2 := mocks.NewMockClient(t) - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b1 := bindingWithCluster("foo", "bar", "cluster1") - b2 := bindingWithCluster("foo", "bar", "cluster2") - list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) - bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) - bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) - bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) - bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - }, - }, - { - name: "delete model in Finalize if last binding", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := binding.DeepCopy() - if b.Annotations == nil { - b.Annotations = make(map[string]string) - } - b.Annotations["kcp.io/cluster"] = "cluster1" - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - ae := o.(*kcpapisv1alpha2.APIExport) - ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} - return nil - }) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - rs := o.(*kcpapisv1alpha1.APIResourceSchema) - rs.Spec.Names.Plural = "foos" - return nil - }) - apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) - }, - }, - { - name: "delete model in Finalize but model is not found", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := binding.DeepCopy() - if b.Annotations == nil { - b.Annotations = make(map[string]string) - } - b.Annotations["kcp.io/cluster"] = "cluster1" - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b1 := bindingWithCluster("foo", "bar", "cluster1") + b2 := bindingWithCluster("foo", "bar", "cluster2") + list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) + bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) + bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) + bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) + bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + }, + }, + { + name: "delete model in Finalize if last binding", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := binding.DeepCopy() + if b.Annotations == nil { + b.Annotations = make(map[string]string) + } + b.Annotations["kcp.io/cluster"] = "cluster1" + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + ae := o.(*kcpapisv1alpha2.APIExport) + ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} + return nil + }) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + rs := o.(*kcpapisv1alpha1.APIResourceSchema) + rs.Spec.Names.Plural = "foos" + return nil + }) + apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) + }, + }, + { + name: "delete model in Finalize but model is not found", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := binding.DeepCopy() + if b.Annotations == nil { + b.Annotations = make(map[string]string) + } + b.Annotations["kcp.io/cluster"] = "cluster1" + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { acc := o.(*accountv1alpha1.AccountInfo) acc.Spec.Organization.Name = "org" @@ -593,314 +593,314 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { }, }, { - name: "error on List in Finalize", - binding: newApiBinding("foo", "bar"), - expectError: true, - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - lister.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) - }, - }, - { - name: "error on getRelatedAuthorizationModels in Finalize", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - expectError: true, - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := binding.DeepCopy() - if b.Annotations == nil { - b.Annotations = make(map[string]string) - } - b.Annotations["kcp.io/cluster"] = "cluster1" - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) - }, - }, - { - name: "only bindings for same org are counted; delete called if only one, not called if none", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster1 := mocks.NewMockCluster(t) - bindingWsClient1 := mocks.NewMockClient(t) - bindingWsCluster2 := mocks.NewMockCluster(t) - bindingWsClient2 := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b1 := bindingWithCluster("foo", "bar", "cluster1") - b2 := bindingWithCluster("foo", "bar", "cluster2") - list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) - bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) - bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) - bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) - bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( - kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - ae := o.(*kcpapisv1alpha2.APIExport) - ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} - return nil - }) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - rs := o.(*kcpapisv1alpha1.APIResourceSchema) - rs.Spec.Names.Plural = "foos" - return nil - }) - apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) - }, - }, - { - name: "error on GetCluster for binding workspace in Finalize loop", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(nil, assert.AnError) - }, - expectError: true, - }, - { - name: "error on Get accountInfo in Finalize loop (not NotFound)", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) - }, - expectError: true, - }, - { - name: "bindings with different org are skipped in Finalize", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "different-org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - ae := o.(*kcpapisv1alpha2.APIExport) - ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} - return nil - }) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - rs := o.(*kcpapisv1alpha1.APIResourceSchema) - rs.Spec.Names.Plural = "foos" - return nil - }) - apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) - }, - }, - { - name: "error on GetCluster for APIExport cluster in Finalize", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - expectError: true, - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(nil, assert.AnError) - }, - }, - { - name: "error on Get APIExport in Finalize", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - expectError: true, - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).Return(assert.AnError) - }, - }, - { - name: "error on Get resource schema in Finalize", - binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), - expectError: true, - mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { - bindingCluster := mocks.NewMockCluster(t) - bindingClient := mocks.NewMockClient(t) - bindingWsCluster := mocks.NewMockCluster(t) - bindingWsClient := mocks.NewMockClient(t) - apiExportCluster := mocks.NewMockCluster(t) - apiExportClient := mocks.NewMockClient(t) - - manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) - bindingCluster.EXPECT().GetClient().Return(bindingClient) - lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { - list := ol.(*kcpapisv1alpha2.APIBindingList) - b := bindingWithCluster("foo", "bar", "cluster1") - list.Items = []kcpapisv1alpha2.APIBinding{*b} - return nil - }) - bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) - bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) - bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - acc := o.(*accountv1alpha1.AccountInfo) - acc.Spec.Organization.Name = "org" - acc.Spec.Organization.GeneratedClusterId = "org-id" - return nil - }) - manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) - apiExportCluster.EXPECT().GetClient().Return(apiExportClient) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { - ae := o.(*kcpapisv1alpha2.APIExport) - ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} - return nil - }) - apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).Return(assert.AnError) - }, - }, + name: "error on List in Finalize", + binding: newApiBinding("foo", "bar"), + expectError: true, + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + lister.EXPECT().List(mock.Anything, mock.Anything).Return(assert.AnError) + }, + }, + { + name: "error on getRelatedAuthorizationModels in Finalize", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + expectError: true, + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := binding.DeepCopy() + if b.Annotations == nil { + b.Annotations = make(map[string]string) + } + b.Annotations["kcp.io/cluster"] = "cluster1" + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) + }, + }, + { + name: "only bindings for same org are counted; delete called if only one, not called if none", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster1 := mocks.NewMockCluster(t) + bindingWsClient1 := mocks.NewMockClient(t) + bindingWsCluster2 := mocks.NewMockCluster(t) + bindingWsClient2 := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b1 := bindingWithCluster("foo", "bar", "cluster1") + b2 := bindingWithCluster("foo", "bar", "cluster2") + list.Items = []kcpapisv1alpha2.APIBinding{*b1, *b2} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster1, nil) + bindingWsCluster1.EXPECT().GetClient().Return(bindingWsClient1) + bindingWsClient1.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster2")).Return(bindingWsCluster2, nil) + bindingWsCluster2.EXPECT().GetClient().Return(bindingWsClient2) + bindingWsClient2.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return( + kerrors.NewNotFound(schema.GroupResource{Group: "account.platform-mesh.org", Resource: "accountinfos"}, "account")) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + ae := o.(*kcpapisv1alpha2.APIExport) + ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} + return nil + }) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + rs := o.(*kcpapisv1alpha1.APIResourceSchema) + rs.Spec.Names.Plural = "foos" + return nil + }) + apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) + }, + }, + { + name: "error on GetCluster for binding workspace in Finalize loop", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(nil, assert.AnError) + }, + expectError: true, + }, + { + name: "error on Get accountInfo in Finalize loop (not NotFound)", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).Return(assert.AnError) + }, + expectError: true, + }, + { + name: "bindings with different org are skipped in Finalize", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "different-org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + ae := o.(*kcpapisv1alpha2.APIExport) + ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} + return nil + }) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + rs := o.(*kcpapisv1alpha1.APIResourceSchema) + rs.Spec.Names.Plural = "foos" + return nil + }) + apiExportClient.EXPECT().Delete(mock.Anything, mock.Anything).Return(nil) + }, + }, + { + name: "error on GetCluster for APIExport cluster in Finalize", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + expectError: true, + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(nil, assert.AnError) + }, + }, + { + name: "error on Get APIExport in Finalize", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + expectError: true, + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).Return(assert.AnError) + }, + }, + { + name: "error on Get resource schema in Finalize", + binding: bindingWithApiExportCluster("foo", "bar", "export-cluster"), + expectError: true, + mockSetup: func(manager *mocks.MockManager, lister *mocks.MockLister, binding *kcpapisv1alpha2.APIBinding) { + bindingCluster := mocks.NewMockCluster(t) + bindingClient := mocks.NewMockClient(t) + bindingWsCluster := mocks.NewMockCluster(t) + bindingWsClient := mocks.NewMockClient(t) + apiExportCluster := mocks.NewMockCluster(t) + apiExportClient := mocks.NewMockClient(t) + + manager.EXPECT().ClusterFromContext(mock.Anything).Return(bindingCluster, nil) + bindingCluster.EXPECT().GetClient().Return(bindingClient) + lister.EXPECT().List(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, ol client.ObjectList, lo ...client.ListOption) error { + list := ol.(*kcpapisv1alpha2.APIBindingList) + b := bindingWithCluster("foo", "bar", "cluster1") + list.Items = []kcpapisv1alpha2.APIBinding{*b} + return nil + }) + bindingClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("cluster1")).Return(bindingWsCluster, nil) + bindingWsCluster.EXPECT().GetClient().Return(bindingWsClient) + bindingWsClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "account"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + acc := o.(*accountv1alpha1.AccountInfo) + acc.Spec.Organization.Name = "org" + acc.Spec.Organization.GeneratedClusterId = "org-id" + return nil + }) + manager.EXPECT().GetCluster(mock.Anything, multicluster.ClusterName("export-cluster")).Return(apiExportCluster, nil) + apiExportCluster.EXPECT().GetClient().Return(apiExportClient) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "foo"}, mock.Anything).RunAndReturn(func(ctx context.Context, nn types.NamespacedName, o client.Object, opts ...client.GetOption) error { + ae := o.(*kcpapisv1alpha2.APIExport) + ae.Spec.Resources = []kcpapisv1alpha2.ResourceSchema{{Schema: "schema1"}} + return nil + }) + apiExportClient.EXPECT().Get(mock.Anything, types.NamespacedName{Name: "schema1"}, mock.Anything).Return(assert.AnError) + }, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -911,7 +911,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { test.mockSetup(manager, lister, test.binding) } - sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister, "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(manager, lister) _, err := sub.Finalize(context.Background(), test.binding) if test.expectError { assert.NotNil(t, err) @@ -923,7 +923,7 @@ func TestAuthorizationModelGeneration_Finalize(t *testing.T) { } func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t), "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t)) tests := []struct { name string @@ -971,6 +971,6 @@ func TestAuthorizationModelGeneration_Finalizers(t *testing.T) { } func TestAuthorizationModelGenerationSubroutine_GetName(t *testing.T) { - sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t), "") + sub := subroutine.NewAuthorizationModelGenerationSubroutine(nil, mocks.NewMockLister(t)) assert.Equal(t, "AuthorizationModelGeneration", sub.GetName()) } From a6c65a7762523e2ba62197e1a25466c58a21c99f Mon Sep 17 00:00:00 2001 From: Oleg Ershov <97069709+OlegErshov@users.noreply.github.com> Date: Fri, 8 May 2026 09:29:13 +0200 Subject: [PATCH 12/16] Update internal/controller/apiexportpolicy_controller.go Co-authored-by: Aaron Schweig <42006873+aaronschweig@users.noreply.github.com> --- internal/controller/apiexportpolicy_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index f5230963..f4c128bb 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -84,7 +84,7 @@ func (r *APIExportPolicyReconciler) SetupWithManager(mgr mcmanager.Manager, cfg } // we need to enqueue only when a new org is ready - if acc.Spec.Type != accountsv1alpha1.AccountTypeOrg || meta.FindStatusCondition(acc.GetConditions(), "Ready").Status != metav1.ConditionTrue { + if acc.Spec.Type != accountsv1alpha1.AccountTypeOrg || !meta.IsStatusConditionTrue(acc.GetConditions(), "Ready") { return nil } From 528c90c6b17c812629cb3c43d5fdee07f4cace96 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Fri, 8 May 2026 09:34:11 +0200 Subject: [PATCH 13/16] chore: remove unused import On-behalf-of: SAP aleh.yarshou@sap.com --- internal/controller/apiexportpolicy_controller.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/controller/apiexportpolicy_controller.go b/internal/controller/apiexportpolicy_controller.go index f4c128bb..721c0f57 100644 --- a/internal/controller/apiexportpolicy_controller.go +++ b/internal/controller/apiexportpolicy_controller.go @@ -30,7 +30,6 @@ import ( mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "github.com/kcp-dev/logicalcluster/v3" From a584896005810439ca5556314e8f5f9b489d76c5 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Fri, 8 May 2026 09:58:35 +0200 Subject: [PATCH 14/16] chore: bump kcp-dev/sdk version to 0.31.1 On-behalf-of: SAP aleh.yarshou@sap.com --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 7c7c5ba8..86f14a20 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/kcp-dev/logicalcluster/v3 v3.0.5 github.com/kcp-dev/multicluster-provider v0.7.0 github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 - github.com/kcp-dev/sdk v0.31.0 + github.com/kcp-dev/sdk v0.31.1 github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 github.com/openfga/language/pkg/go v0.2.1 github.com/platform-mesh/account-operator v0.14.26 diff --git a/go.sum b/go.sum index 58a80caa..4eebf708 100644 --- a/go.sum +++ b/go.sum @@ -142,10 +142,10 @@ github.com/kcp-dev/multicluster-provider v0.7.0 h1:lO5yhWuf0GcvfG47CWV17iXJqyhXA github.com/kcp-dev/multicluster-provider v0.7.0/go.mod h1:JB+ntaOpqhRFDRd+O7AYM5QZvt8/I/Xeo7SrW7+77EQ= github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87 h1:XlZ5niiYWAlMmmr8cxWyt5vtXb0MbyktkyDKzfPKmkE= github.com/kcp-dev/multicluster-provider/client v0.0.0-20260430101011-fa033a7d2e87/go.mod h1:kK9CSLmECoRiOU+xKOhIE4tHpQBcBbBvWOgKORC/eqI= -github.com/kcp-dev/sdk v0.31.0 h1:fLqgY6MHVmmBcttqR/V3h2Dnv7xmab84FTKTwV08+Bo= -github.com/kcp-dev/sdk v0.31.0/go.mod h1:GpNW9wPULY9+UuLVAaB5z/sJ8r0Jo/l0Jgy4BKnIJTE= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kcp-dev/sdk v0.31.1 h1:d6OJhRLoD0UKfHXWOEwflDk4SMh1C9PlhE2VcDONBvo= +github.com/kcp-dev/sdk v0.31.1/go.mod h1:FeeJoxqqpDwvEqzuFKcp/IkSlj/KyZRKbiAud1IHUYU= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= From bc4ade1ed99bbb48cc8abbfd6f0d390f8ffd01a7 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Fri, 8 May 2026 13:27:05 +0200 Subject: [PATCH 15/16] fix: use config based client instead of the manager On-behalf-of: SAP aleh.yarshou@sap.com --- cmd/operator.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/operator.go b/cmd/operator.go index 7b82eabd..a6e9043a 100644 --- a/cmd/operator.go +++ b/cmd/operator.go @@ -164,6 +164,8 @@ var operatorCmd = &cobra.Command{ } kcpClientGetter := iclient.NewManagerKCPClientGetter(mgr, provider.Provider.Provider) + kcpClientGetterWithConfig := iclient.NewConfigSchemeKCPClientGetter(restCfg, scheme) + inviteReconciler, err := controller.NewInviteReconciler(ctx, mgr, &operatorCfg, log, kcpClientGetter) if err != nil { log.Error().Err(err).Str("controller", "invite").Msg("unable to create reconciler") @@ -173,7 +175,7 @@ var operatorCmd = &cobra.Command{ log.Error().Err(err).Str("controller", "invite").Msg("unable to create controller") return err } - orgReconciler, err := controller.NewOrgLogicalClusterController(log, kcpClientGetter, operatorCfg, runtimeClient, mgr, controller.ControllerOptions{ + orgReconciler, err := controller.NewOrgLogicalClusterController(log, kcpClientGetterWithConfig, operatorCfg, runtimeClient, mgr, controller.ControllerOptions{ Name: "OrgLogicalClusterReconciler", }) if err != nil { @@ -188,7 +190,7 @@ var operatorCmd = &cobra.Command{ return err } - alcReconciler, err := controller.NewAccountLogicalClusterController(log, operatorCfg, fga, storeIDGetter, mgr, kcpClientGetter, controller.ControllerOptions{ + alcReconciler, err := controller.NewAccountLogicalClusterController(log, operatorCfg, fga, storeIDGetter, mgr, kcpClientGetterWithConfig, controller.ControllerOptions{ Name: "AccountLogicalClusterReconciler", }) if err != nil { From 97acc7062e2b21b69ecdc70cb2b2fb5eca9cef95 Mon Sep 17 00:00:00 2001 From: OlegErshov Date: Mon, 11 May 2026 09:53:39 +0200 Subject: [PATCH 16/16] chore: fix go mod On-behalf-of: SAP aleh.yarshou@sap.com --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index da89daf1..3016bab0 100644 --- a/go.mod +++ b/go.mod @@ -16,8 +16,8 @@ require ( github.com/openfga/api/proto v0.0.0-20260319214821-f153694bfc20 github.com/openfga/language/pkg/go v0.2.1 github.com/platform-mesh/account-operator v0.14.26 - github.com/platform-mesh/subroutines v0.4.3 github.com/platform-mesh/golang-commons v0.16.11 + github.com/platform-mesh/subroutines v0.4.3 github.com/rs/zerolog v1.35.1 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 @@ -25,7 +25,7 @@ require ( github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/grpc v1.81.0 - google.golang.org/protobuf v1.36.11 + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af k8s.io/api v0.35.4 k8s.io/apiextensions-apiserver v0.35.4 k8s.io/apimachinery v0.36.0 diff --git a/go.sum b/go.sum index fda29767..f8126d98 100644 --- a/go.sum +++ b/go.sum @@ -182,10 +182,10 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/platform-mesh/account-operator v0.14.26 h1:UEWBci52h2sSTwnEreQsZXegPZqWopThDi37JuBlkYc= github.com/platform-mesh/account-operator v0.14.26/go.mod h1:Zxn12XJvjMj6nUR1M707uWyRwXB63yc3argc4FM2Cdk= -github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= -github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/platform-mesh/golang-commons v0.16.11 h1:9hm7et+HRJ/ev8c1inEPmeBgfaqCfTt1NUFw5mEK/C8= github.com/platform-mesh/golang-commons v0.16.11/go.mod h1:JDkPVJIRAsBW5noWNCA5RCEh8KthRC+W5Y1w3+65s5M= +github.com/platform-mesh/subroutines v0.4.3 h1:b/Op25a+N2x9H09Gmzyjl7/8HkHiJ5YEzCur95eU37c= +github.com/platform-mesh/subroutines v0.4.3/go.mod h1:z8nW91Y/vuhaE1gNC6Tt3ZDlPX0czS1aUV/J7dnYhaM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -297,8 +297,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=