diff --git a/codegen/istio_groups.go b/codegen/istio_groups.go
index 53c2fe3..82e424e 100644
--- a/codegen/istio_groups.go
+++ b/codegen/istio_groups.go
@@ -1,13 +1,16 @@
 package codegen
 
 import (
+	operator "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	"github.com/solo-io/skv2/codegen/model"
 	extensionsv1alpha1 "istio.io/client-go/pkg/apis/extensions/v1alpha1"
+	networkingv1 "istio.io/client-go/pkg/apis/networking/v1"
 	networkingv1alpha3 "istio.io/client-go/pkg/apis/networking/v1alpha3"
 	networkingv1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1"
+	securityv1 "istio.io/client-go/pkg/apis/security/v1"
 	"istio.io/client-go/pkg/apis/security/v1beta1"
+	istiotelemetryv1 "istio.io/client-go/pkg/apis/telemetry/v1"
 	istiotelemetryv1alpha1 "istio.io/client-go/pkg/apis/telemetry/v1alpha1"
-	operator "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
 )
 
 func init() {
@@ -54,6 +57,36 @@ func istioGroups() []model.Group {
 			ApiRoot:               istioApiRoot,
 			PointerSlices:         true,
 		},
+		{
+			GroupVersion: networkingv1.SchemeGroupVersion,
+			Module:       istioModule,
+			Resources: []model.Resource{
+				{
+					Kind: "DestinationRule",
+				},
+				{
+					Kind: "Gateway",
+				},
+				{
+					Kind: "ServiceEntry",
+				},
+				{
+					Kind: "WorkloadEntry",
+				},
+				{
+					Kind: "WorkloadGroup",
+				},
+				{
+					Kind: "VirtualService",
+				},
+				{
+					Kind: "Sidecar",
+				},
+			},
+			CustomTypesImportPath: "istio.io/client-go/pkg/apis/networking/v1",
+			ApiRoot:               istioApiRoot,
+			PointerSlices:         true,
+		},
 		{
 			GroupVersion: networkingv1alpha3.SchemeGroupVersion,
 			Module:       istioModule,
@@ -84,6 +117,24 @@ func istioGroups() []model.Group {
 			ApiRoot:               istioApiRoot,
 			PointerSlices:         true,
 		},
+		{
+			GroupVersion: securityv1.SchemeGroupVersion,
+			Module:       istioModule,
+			Resources: []model.Resource{
+				{
+					Kind: "AuthorizationPolicy",
+				},
+				{
+					Kind: "PeerAuthentication",
+				},
+				{
+					Kind: "RequestAuthentication",
+				},
+			},
+			CustomTypesImportPath: "istio.io/client-go/pkg/apis/security/v1",
+			ApiRoot:               istioApiRoot,
+			PointerSlices:         true,
+		},
 		{
 			GroupVersion: operator.SchemeGroupVersion,
 			Module:       "install.istio.io",
@@ -92,9 +143,21 @@ func istioGroups() []model.Group {
 					Kind: "IstioOperator",
 				},
 			},
-			CustomTypesImportPath: "istio.io/istio/operator/pkg/apis/istio/v1alpha1",
+			CustomTypesImportPath: "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1",
 			ApiRoot:               istioApiRoot,
 		},
+		{
+			GroupVersion: istiotelemetryv1.SchemeGroupVersion,
+			Module:       istioModule,
+			Resources: []model.Resource{
+				{
+					Kind: "Telemetry",
+				},
+			},
+			CustomTypesImportPath: "istio.io/client-go/pkg/apis/telemetry/v1",
+			ApiRoot:               istioApiRoot,
+			PointerSlices:         true,
+		},
 		{
 			GroupVersion: istiotelemetryv1alpha1.SchemeGroupVersion,
 			Module:       istioModule,
diff --git a/go.mod b/go.mod
index a4c7a5d..fcab5c7 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/solo-io/external-apis
 
-go 1.22.2
+go 1.23.2
 
 require (
 	github.com/aws/aws-app-mesh-controller-for-k8s v1.1.1
@@ -9,70 +9,71 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/rotisserie/eris v0.1.1
 	github.com/servicemeshinterface/smi-sdk-go v0.4.1
-	github.com/solo-io/skv2 v0.39.1
-	istio.io/client-go v1.20.1
-	istio.io/istio v0.0.0-20231207195727-552626bd81f6
-	k8s.io/api v0.29.2
-	k8s.io/apiextensions-apiserver v0.29.2
-	k8s.io/apimachinery v0.29.2
-	k8s.io/client-go v0.29.2
-	sigs.k8s.io/controller-runtime v0.17.4
-	sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016
+	github.com/solo-io/istio-operator-legacy v1.23.3
+	github.com/solo-io/skv2 v0.41.0
+	istio.io/client-go v1.24.0
+	k8s.io/api v0.31.1
+	k8s.io/apiextensions-apiserver v0.31.1
+	k8s.io/apimachinery v0.31.1
+	k8s.io/client-go v0.31.1
+	sigs.k8s.io/controller-runtime v0.19.0
+	sigs.k8s.io/gateway-api v1.2.0
 )
 
 require (
-	github.com/BurntSushi/toml v1.2.1 // indirect
+	dario.cat/mergo v1.0.1 // indirect
+	github.com/BurntSushi/toml v1.3.2 // indirect
 	github.com/Masterminds/goutils v1.1.1 // indirect
 	github.com/Masterminds/semver v1.4.2 // indirect
-	github.com/Masterminds/semver/v3 v3.2.1 // indirect
-	github.com/Masterminds/sprig/v3 v3.2.3 // indirect
+	github.com/Masterminds/semver/v3 v3.3.0 // indirect
+	github.com/Masterminds/sprig/v3 v3.3.0 // indirect
 	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/blang/semver/v4 v4.0.0 // indirect
-	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 	github.com/cilium/ebpf v0.12.2 // indirect
 	github.com/cilium/proxy v0.0.0-20231018073547-ab187719b71b // indirect
 	github.com/cockroachdb/apd/v2 v2.0.1 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
-	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+	github.com/emicklei/go-restful/v3 v3.12.0 // indirect
 	github.com/emicklei/proto v1.6.15 // indirect
-	github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect
-	github.com/evanphx/json-patch/v5 v5.8.0 // indirect
+	github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect
+	github.com/evanphx/json-patch/v5 v5.9.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/gertd/go-pluralize v0.1.1 // indirect
 	github.com/getkin/kin-openapi v0.123.0 // indirect
 	github.com/ghodss/yaml v1.0.0 // indirect
-	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/go-openapi/analysis v0.21.4 // indirect
 	github.com/go-openapi/errors v0.20.4 // indirect
-	github.com/go-openapi/jsonpointer v0.20.2 // indirect
-	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.21.0 // indirect
 	github.com/go-openapi/loads v0.21.2 // indirect
 	github.com/go-openapi/runtime v0.26.0 // indirect
 	github.com/go-openapi/spec v0.20.9 // indirect
 	github.com/go-openapi/strfmt v0.21.7 // indirect
-	github.com/go-openapi/swag v0.22.8 // indirect
+	github.com/go-openapi/swag v0.23.0 // indirect
 	github.com/go-openapi/validate v0.22.1 // indirect
 	github.com/gobuffalo/envy v1.8.1 // indirect
 	github.com/gobuffalo/packd v0.3.0 // indirect
 	github.com/gobuffalo/packr v1.30.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
-	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/uuid v1.4.0 // indirect
+	github.com/google/uuid v1.6.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/hashicorp/hcl v1.0.0 // indirect
-	github.com/huandu/xstrings v1.4.0 // indirect
+	github.com/huandu/xstrings v1.5.0 // indirect
 	github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect
-	github.com/iancoleman/strcase v0.2.0 // indirect
-	github.com/imdario/mergo v1.0.0 // indirect
+	github.com/iancoleman/strcase v0.3.0 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/invopop/jsonschema v0.7.0 // indirect
 	github.com/invopop/yaml v0.2.0 // indirect
@@ -80,6 +81,7 @@ require (
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/k0kubun/pp v2.3.0+incompatible // indirect
+	github.com/klauspost/compress v1.17.9 // indirect
 	github.com/kr/pretty v0.3.1 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
@@ -88,7 +90,6 @@ require (
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-zglob v0.0.3 // indirect
-	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
 	github.com/mitchellh/copystructure v1.2.0 // indirect
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
 	github.com/mitchellh/hashstructure v1.0.0 // indirect
@@ -102,72 +103,71 @@ require (
 	github.com/oklog/ulid v1.3.1 // indirect
 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
 	github.com/pborman/uuid v1.2.0 // indirect
-	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
 	github.com/perimeterx/marshmallow v1.1.5 // indirect
 	github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
-	github.com/prometheus/client_golang v1.18.0 // indirect
-	github.com/prometheus/client_model v0.5.0 // indirect
-	github.com/prometheus/common v0.45.0 // indirect
-	github.com/prometheus/procfs v0.12.0 // indirect
+	github.com/prometheus/client_golang v1.20.4 // indirect
+	github.com/prometheus/client_model v0.6.1 // indirect
+	github.com/prometheus/common v0.60.0 // indirect
+	github.com/prometheus/procfs v0.15.1 // indirect
 	github.com/rogpeppe/go-internal v1.12.0 // indirect
-	github.com/sagikazarmark/locafero v0.3.0 // indirect
+	github.com/sagikazarmark/locafero v0.4.0 // indirect
 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
 	github.com/sasha-s/go-deadlock v0.3.1 // indirect
 	github.com/shirou/gopsutil/v3 v3.23.2 // indirect
-	github.com/shopspring/decimal v1.3.1 // indirect
+	github.com/shopspring/decimal v1.4.0 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/solo-io/anyvendor v0.0.4 // indirect
 	github.com/solo-io/cue v0.4.7 // indirect
-	github.com/solo-io/go-utils v0.21.4 // indirect
-	github.com/solo-io/protoc-gen-ext v0.0.18 // indirect
+	github.com/solo-io/go-utils v0.26.0 // indirect
+	github.com/solo-io/protoc-gen-ext v0.0.20 // indirect
 	github.com/sourcegraph/conc v0.3.0 // indirect
-	github.com/spf13/afero v1.10.0 // indirect
-	github.com/spf13/cast v1.5.1 // indirect
-	github.com/spf13/cobra v1.8.0 // indirect
+	github.com/spf13/afero v1.11.0 // indirect
+	github.com/spf13/cast v1.7.0 // indirect
+	github.com/spf13/cobra v1.8.1 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
-	github.com/spf13/viper v1.17.0 // indirect
+	github.com/spf13/viper v1.19.0 // indirect
 	github.com/subosito/gotenv v1.6.0 // indirect
 	github.com/tklauser/go-sysconf v0.3.11 // indirect
 	github.com/tklauser/numcpus v0.6.0 // indirect
 	github.com/ugorji/go/codec v1.2.12 // indirect
-	github.com/vishvananda/netlink v1.2.1-beta.2.0.20231024175852-77df5d35f725 // indirect
+	github.com/vishvananda/netlink v1.2.1-beta.2.0.20240411215012-578e95cc3190 // indirect
 	github.com/vishvananda/netns v0.0.4 // indirect
+	github.com/x448/float16 v0.8.4 // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.mongodb.org/mongo-driver v1.11.3 // indirect
-	go.opentelemetry.io/otel v1.19.0 // indirect
-	go.opentelemetry.io/otel/metric v1.19.0 // indirect
-	go.opentelemetry.io/otel/trace v1.19.0 // indirect
+	go.opentelemetry.io/otel v1.30.0 // indirect
+	go.opentelemetry.io/otel/metric v1.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.30.0 // indirect
 	go.uber.org/dig v1.17.1 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
-	go.uber.org/zap v1.26.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
 	go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect
-	golang.org/x/crypto v0.16.0 // indirect
-	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
-	golang.org/x/mod v0.14.0 // indirect
-	golang.org/x/net v0.19.0 // indirect
-	golang.org/x/oauth2 v0.13.0 // indirect
-	golang.org/x/sync v0.5.0 // indirect
-	golang.org/x/sys v0.16.0 // indirect
-	golang.org/x/term v0.15.0 // indirect
-	golang.org/x/text v0.14.0 // indirect
-	golang.org/x/time v0.3.0 // indirect
+	golang.org/x/crypto v0.27.0 // indirect
+	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
+	golang.org/x/mod v0.20.0 // indirect
+	golang.org/x/net v0.29.0 // indirect
+	golang.org/x/oauth2 v0.23.0 // indirect
+	golang.org/x/sync v0.8.0 // indirect
+	golang.org/x/sys v0.25.0 // indirect
+	golang.org/x/term v0.24.0 // indirect
+	golang.org/x/text v0.18.0 // indirect
+	golang.org/x/time v0.6.0 // indirect
 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
-	google.golang.org/appengine v1.6.8 // indirect
-	google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a // indirect
-	google.golang.org/protobuf v1.31.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f // indirect
+	google.golang.org/protobuf v1.34.2 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	istio.io/api v1.20.1-0.20231207143627-8237149662d6 // indirect
-	k8s.io/component-base v0.29.2 // indirect
-	k8s.io/klog/v2 v2.110.1 // indirect
-	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
-	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
+	istio.io/api v1.24.0 // indirect
+	istio.io/api/123 v0.0.0-00010101000000-000000000000 // indirect
+	k8s.io/klog/v2 v2.130.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 // indirect
+	k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
 	sigs.k8s.io/yaml v1.4.0 // indirect
@@ -177,3 +177,7 @@ require (
 //        module declares its path as: dario.cat/mergo
 //                but was required as: github.com/imdario/mergo
 replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.5
+
+// This is necessary while we still depend on the IstioOperator and related apis, which were removed in 1.24
+// This can be removed once we drop ILM v2 support in GME.
+replace istio.io/api/123 => istio.io/api v1.23.3
diff --git a/go.sum b/go.sum
index 312a0ba..b70234f 100644
--- a/go.sum
+++ b/go.sum
@@ -1,43 +1,11 @@
 bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
+cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y=
+cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
-contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
@@ -52,11 +20,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxB
 github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
 github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
-github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
+github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/DataDog/datadog-go v0.0.0-20180330214955-e67964b4021a/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
 github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
@@ -64,12 +31,11 @@ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86
 github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
 github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
-github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
-github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
+github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
+github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
 github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA=
-github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
-github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
+github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
+github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
 github.com/Masterminds/squirrel v1.2.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA=
 github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
 github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
@@ -77,8 +43,6 @@ github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tT
 github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
-github.com/Netflix/go-expect v0.0.0-20180928190340-9d1f4485533b/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
@@ -90,14 +54,11 @@ github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4Rq
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alexedwards/scs v1.4.1/go.mod h1:JRIFiXthhMSivuGbxpzUa0/hT5rz2hpyw61Bmd+S1bg=
 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
-github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
+github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
+github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
@@ -115,7 +76,6 @@ github.com/aws/aws-app-mesh-controller-for-k8s v1.1.1 h1:VZWD/7wBnxT+xUJtDae75Hl
 github.com/aws/aws-app-mesh-controller-for-k8s v1.1.1/go.mod h1:Y4i5WD6c4Uj456JtTpKrCzs13yazZPEPCW9NanOTj34=
 github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
 github.com/aws/aws-sdk-go v1.33.5/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
-github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
 github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
@@ -127,9 +87,7 @@ github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb
 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
 github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
-github.com/bluekeyes/hatpear v0.0.0-20180714193905-ffb42d5bb417/go.mod h1:D+WOahrNtu6OK0KiVoXY9h5j7IcEs5LYke+zJkMBsKg=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
-github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN3X2KTK8nUTCrTMwAhcug=
 github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
 github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
@@ -138,13 +96,9 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
 github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
 github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/cilium/checkmate v1.0.3 h1:CQC5eOmlAZeEjPrVZY3ZwEBH64lHlx9mXYdUehEwI5w=
 github.com/cilium/checkmate v1.0.3/go.mod h1:KiBTasf39/F2hf2yAmHw21YFl3hcEyP4Yk6filxc12A=
 github.com/cilium/cilium v1.15.0-pre.2 h1:VzGFTNRutaXESrGCFdLs8c5DkjyzTJuAA26bCK3A9cU=
@@ -154,11 +108,8 @@ github.com/cilium/ebpf v0.12.2/go.mod h1:u9H29/Iq+8cy70YqI6p5pfADkFl3vdnV2qXDg5J
 github.com/cilium/proxy v0.0.0-20231018073547-ab187719b71b h1:NYdQn/qPPkqHNSRMKWnSwhQuy2/rJn8pAl656iMdKtw=
 github.com/cilium/proxy v0.0.0-20231018073547-ab187719b71b/go.mod h1:p044XccCmONGIUbx3bJ7qvHXK0RcrdvIvbTGiu/RjUA=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k=
-github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE=
@@ -187,22 +138,19 @@ github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfc
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/crewjam/httperr v0.0.0-20190612203328-a946449404da/go.mod h1:+rmNIXRvYMqLQeR4DHyTvs6y0MEMymTz4vyFpFkKTPs=
-github.com/crewjam/saml v0.3.2-0.20191206212704-861266e3a689/go.mod h1:fxbjgoFRea91JEzfcATb14uB+XPW1H88n0feRzehDeg=
 github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE=
+github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=
-github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
 github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As=
 github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
@@ -228,41 +176,38 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk=
+github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
 github.com/emicklei/proto v1.6.15 h1:XbpwxmuOPrdES97FrSfpyy67SSCV/wBIKXqgJzh6hNw=
 github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
-github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.11.2-0.20231019082134-6e4589f570e1 h1:i/XN+pZrv2iM+Czc4o4tP6UzUJoOxjNI9gQdE1vIjd0=
-github.com/envoyproxy/go-control-plane v0.11.2-0.20231019082134-6e4589f570e1/go.mod h1:3X10o7QcAVxP4y/hnTLgkXLwuZV2DxAEh6uaYD5PoxI=
+github.com/envoyproxy/go-control-plane v0.13.1-0.20241009135036-bec043f2e850 h1:wXrFiquLgpbofJ80z0RUZxsKKIaRU1JZ6j4HSaibx4E=
+github.com/envoyproxy/go-control-plane v0.13.1-0.20241009135036-bec043f2e850/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/envoyproxy/protoc-gen-validate v0.6.1/go.mod h1:txg5va2Qkip90uYoSKH+nkAAmXrb2j3iq4FLwdrCbXQ=
-github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
-github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
+github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM=
+github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4=
 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
 github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro=
-github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
+github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
+github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
 github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
 github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fgrosse/zaptest v1.1.0 h1:sK9hP0/xBoNX5qfFo3KWFluDXfc809APomI1QXuYELA=
 github.com/fgrosse/zaptest v1.1.0/go.mod h1:vMnRSul6kW7kIUXZgnZZcDwyTn8k49ODfAULL8nmL5w=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA=
-github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
+github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/gertd/go-pluralize v0.1.1 h1:fQhql/WRRwr4TVp+TCw12s2esCacvEVBdkTUUwNqF/Q=
 github.com/gertd/go-pluralize v0.1.1/go.mod h1:t5DfHcumb6m0RqyVJDrDLEzL2AGeaiqUXIcDNwLaeAs=
@@ -271,7 +216,6 @@ github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
 github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
 github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
@@ -280,19 +224,15 @@ github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI
 github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
 github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
 github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
@@ -322,9 +262,8 @@ github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
-github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
 github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
@@ -332,8 +271,8 @@ github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwoh
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
 github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
-github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
-github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
 github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
@@ -372,9 +311,8 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
-github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
-github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=
-github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
 github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
@@ -384,8 +322,8 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
 github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
 github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
@@ -425,8 +363,8 @@ github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kE
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
 github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
 github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -442,38 +380,27 @@ github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0L
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
 github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
-github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
 github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8=
@@ -482,72 +409,49 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
 github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ=
-github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
+github.com/google/cel-go v0.21.0 h1:cl6uW/gxN+Hy50tNYvI691+sXxioCnstFzLp2WO4GCI=
+github.com/google/cel-go v0.21.0/go.mod h1:rHUlWCcBKgyEk+eV03RPdZUekPp6YcJwV0FxuUksYxc=
 github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E=
-github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E=
-github.com/google/go-github/v32 v32.0.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ=
-github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
-github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
-github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
 github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
-github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww=
-github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A=
+github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
+github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
@@ -564,31 +468,25 @@ github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 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/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
-github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
+github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
-github.com/hinshun/vt10x v0.0.0-20180809195222-d55458df857c/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
-github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
+github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=
 github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
 github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
-github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
+github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
 github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -599,7 +497,6 @@ github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj
 github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY=
 github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
 github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
@@ -616,7 +513,6 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
@@ -627,14 +523,14 @@ github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t
 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
-github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
@@ -654,14 +550,14 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtB
 github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
 github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A=
 github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y=
-github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80=
-github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
+github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k=
+github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
 github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
 github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
 github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
 github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
-github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB0=
-github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ=
+github.com/lestrrat-go/jwx v1.2.30 h1:VKIFrmjYn0z2J51iLPadqoHIVLzvWNa1kCsTqNDHYPA=
+github.com/lestrrat-go/jwx v1.2.30/go.mod h1:vMxrwFhunGZ3qddmfmEm2+uced8MSI6QFWGTKygjSzQ=
 github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
 github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -707,14 +603,10 @@ github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO
 github.com/mattn/go-zglob v0.0.3 h1:6Ry4EYsScDyt5di4OI6xw1bYhOqfE5S33Z1OPy+d+To=
 github.com/mattn/go-zglob v0.0.3/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
-github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
-github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
 github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
@@ -729,8 +621,8 @@ github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQ
 github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
 github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
-github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
+github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8=
+github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -752,7 +644,6 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J
 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
@@ -762,24 +653,20 @@ github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXW
 github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
-github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
+github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
+github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
-github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
+github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -791,15 +678,12 @@ github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.m
 github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU=
-github.com/palantir/go-baseapp v0.2.0/go.mod h1:7rEjgYzWbHLLuY+mV2iJthxTddEc6aO+kFYsjDKNmEs=
-github.com/palantir/go-githubapp v0.5.0/go.mod h1:/Xm5h66uEBX24An2Ln8H6Rk44z8uwk4E6m4gNrPadjQ=
 github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
-github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
-github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
 github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
 github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
 github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
@@ -814,7 +698,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240409071808-615f978279ca h1:ujRGEVWJEoaxQ+8+HMl8YEpGaDAgohgZxJ5S+d2TTFQ=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240409071808-615f978279ca/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
 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=
@@ -824,43 +709,35 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om
 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U=
-github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
-github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
+github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
+github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
-github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
-github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
+github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
+github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
 github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
-github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
-github.com/prometheus/prometheus v0.48.0-rc.1 h1:/+uPuCIQ2pVOtBrD8QCf0RNpOjcmnxegdOYriN8+GUE=
-github.com/prometheus/prometheus v0.48.0-rc.1/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ=
+github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc h1:gSVONBi2HWMFXCa9jFdYvYk7IwW/mTLxWOF7rXS4LO0=
 github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc/go.mod h1:KbKfKPy2I6ecOIGA9apfheFv14+P3RSmmQvshofQyMY=
-github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -873,16 +750,12 @@ github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU
 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 github.com/rotisserie/eris v0.1.1 h1:C0wEdnJ6+3jYx2r8RS4xBM+ZW+mVrXGocIaFbTdRYCA=
 github.com/rotisserie/eris v0.1.1/go.mod h1:2ik3CyJrzlOjGyDGrKfqZivSfmkhCS3ktE+T1mNzzLk=
-github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
-github.com/rs/zerolog v1.9.1/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
-github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I=
 github.com/rubenv/sql-migrate v0.0.0-20200212082348-64f95ea68aa3/go.mod h1:rtQlpHw+eR6UrqaS3kX1VYeaCxzCVdimDS7g5Ln4pPc=
-github.com/russellhaering/goxmldsig v0.0.0-20180430223755-7acd5e4a6ef7/go.mod h1:Oz4y6ImuOQZxynhbSXk7btjEfNBtGlj2dcaOvXl2FSM=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ=
-github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
 github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
 github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
 github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
@@ -894,11 +767,8 @@ github.com/servicemeshinterface/smi-sdk-go v0.4.1 h1:L8nS7WtVlGoEJF7RdCbwh0Oj/Jh
 github.com/servicemeshinterface/smi-sdk-go v0.4.1/go.mod h1:9rsLPBNcqfDNmEgyYwpopn93aE9yz46d2EHFBNOYj/w=
 github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU=
 github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M=
-github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
-github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
-github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
-github.com/shurcooL/githubv4 v0.0.0-20191127044304-8f68eb5628d0/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=
-github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg=
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -914,14 +784,16 @@ github.com/solo-io/anyvendor v0.0.4 h1:9nI7o7Srml2uaOpT5HJSru06IHUZpzSCU/dEkseiG
 github.com/solo-io/anyvendor v0.0.4/go.mod h1:+TTkDGd11u8ugXccqtukBEWvkZkODaBbeWgdH/F/IWY=
 github.com/solo-io/cue v0.4.7 h1:X65mDmyBrS3ODvDvAgzIt9aTxbwBtdt+ayg4w9XKoaA=
 github.com/solo-io/cue v0.4.7/go.mod h1:P1tN9y6nBPAMoEK5aJxI8kn0VUcjVcRc+8esieRzQ7M=
-github.com/solo-io/go-utils v0.21.4 h1:BUOrGNV+zQGIEKTS02SyPqevmkyG+AMl+0+czBg9avg=
-github.com/solo-io/go-utils v0.21.4/go.mod h1:6e8K1spnMWwlnJRSNp/J84GEyJbrcK4Gm7i+ehzCi8c=
-github.com/solo-io/k8s-utils v0.0.1 h1:e2alFsqTT7GU10d6cFDX2y+86J142DrsRwy5itvvZOI=
-github.com/solo-io/k8s-utils v0.0.1/go.mod h1:53N9+9Gl2MwqIZJ7/ocA9gKvWt+6z7MPD2qKQix7oFE=
-github.com/solo-io/protoc-gen-ext v0.0.18 h1:zSAL8NzWpJUGYoA5IyjHiKASNyHjR0uxBQ7eQS94i3A=
-github.com/solo-io/protoc-gen-ext v0.0.18/go.mod h1:iGyCvmKmhJNXs5MgBcYFBF0om7LDnCVD2WwhOZGnqeA=
-github.com/solo-io/skv2 v0.39.1 h1:dWaZTWgntAsvh4lTlojd3xE+g7NF4oYNonfcdpy0nXE=
-github.com/solo-io/skv2 v0.39.1/go.mod h1:Zsnl+OYmOkj+6KeaMfkzYIxHTVMC0w2gVApzNJRadM8=
+github.com/solo-io/go-utils v0.26.0 h1:IFNqBPzKEMR2XYkKqtBu5RqPz0GrlndIxwrOcWk3cxo=
+github.com/solo-io/go-utils v0.26.0/go.mod h1:fdJxjkQFdZ2FsxU+Sk0QDwgFsvYm4axPRfyPVV4oAQM=
+github.com/solo-io/istio-operator-legacy v1.23.3 h1:Ya7Twf5jqZuMrb79Oao4g4SB1JtTCpUc9fTSOn0gABo=
+github.com/solo-io/istio-operator-legacy v1.23.3/go.mod h1:k+nfJm93mBP7N2dXEs+uxHNd3bipn1VY9KZb7JZtasM=
+github.com/solo-io/k8s-utils v0.8.0 h1:jXd4HFDgbPWxHi04QDFYwA37D1nYr9XJI3MVa75oCD8=
+github.com/solo-io/k8s-utils v0.8.0/go.mod h1:fOIFkh4+F45MmrUZEFx0pW75EvFYOR7v5/BIIQiSIwA=
+github.com/solo-io/protoc-gen-ext v0.0.20 h1:0cE+DvIp7G97/xlETL3didPQ1s5SHav5mkebljXk/Ws=
+github.com/solo-io/protoc-gen-ext v0.0.20/go.mod h1:iGyCvmKmhJNXs5MgBcYFBF0om7LDnCVD2WwhOZGnqeA=
+github.com/solo-io/skv2 v0.41.0 h1:NRZUe83LquB8zR++SY36JKhw1abRd+SBuGUGAHS9rWA=
+github.com/solo-io/skv2 v0.41.0/go.mod h1:GtEN0CCne94tm710YbefQh9YcMFcIu2X490g7Loq/Zs=
 github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
 github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -930,18 +802,18 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
 github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY=
-github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
-github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
+github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
+github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
 github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
-github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
-github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
+github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
+github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -951,9 +823,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
-github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI=
-github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI=
-github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
+github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
 github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
 github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -961,7 +832,7 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -971,10 +842,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -994,12 +865,13 @@ github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
 github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
-github.com/vishvananda/netlink v1.2.1-beta.2.0.20231024175852-77df5d35f725 h1:jXQwcl0Ga5tfyej8AdhADlg1R4OcbpSVRWrpn4ihl8M=
-github.com/vishvananda/netlink v1.2.1-beta.2.0.20231024175852-77df5d35f725/go.mod h1:whJevzBpTrid75eZy99s3DqCmy05NfibNaF2Ol5Ox5A=
+github.com/vishvananda/netlink v1.2.1-beta.2.0.20240411215012-578e95cc3190 h1:G9ovFHG2n9BlIxcwYufO4UVMCS9WnjyvGvjRv0Ckbhk=
+github.com/vishvananda/netlink v1.2.1-beta.2.0.20240411215012-578e95cc3190/go.mod h1:whJevzBpTrid75eZy99s3DqCmy05NfibNaF2Ol5Ox5A=
 github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
 github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
 github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
-github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
+github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
+github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
@@ -1019,20 +891,15 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
 github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
 github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
 github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
-github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
-github.com/zenazn/goji v0.9.1-0.20160507202103-64eb34159fe5/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -1047,24 +914,20 @@ go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW
 go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
-go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
-go.opentelemetry.io/otel/exporters/prometheus v0.39.1-0.20230714155235-03b8c47770f2 h1:Aph2X1/DxO5WvT1uZ+4XijVu/zzv3HsEmgWOskU2gOA=
-go.opentelemetry.io/otel/exporters/prometheus v0.39.1-0.20230714155235-03b8c47770f2/go.mod h1:38vyoWXIF54R5KmBjqAer6ib6+kY6EOhRo10wXRN6ek=
-go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
-go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
-go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
-go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
-go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI=
-go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI=
-go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
-go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
-go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
-go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
+go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts=
+go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc=
+go.opentelemetry.io/otel/exporters/prometheus v0.52.0 h1:kmU3H0b9ufFSi8IQCcxack+sWUblKkFbqWYs6YiACGQ=
+go.opentelemetry.io/otel/exporters/prometheus v0.52.0/go.mod h1:+wsAp2+JhuGXX7YRkjlkx6hyWY3ogFPfNA4x3nyiAh0=
+go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w=
+go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
+go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE=
+go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg=
+go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM=
+go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y=
+go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc=
+go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
@@ -1076,18 +939,14 @@ go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 go4.org/netipx v0.0.0-20230824141953-6213f710f925 h1:eeQDDVKFkx0g4Hyy8pHgmZaK0EqB4SD6rvKbUdN3ziQ=
 go4.org/netipx v0.0.0-20230824141953-6213f710f925/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
-goji.io v2.0.0+incompatible/go.mod h1:sbqFwrtqZACxLBTQcdgVjFh54yGVCvwq8+w49MVMMIk=
-goji.io v2.0.2+incompatible/go.mod h1:sbqFwrtqZACxLBTQcdgVjFh54yGVCvwq8+w49MVMMIk=
 golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -1095,13 +954,10 @@ golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACk
 golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1109,30 +965,17 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
-golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
+golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/exp v0.0.0-20210126221216-84987778548c/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -1140,38 +983,25 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
+golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1179,57 +1009,31 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
+golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY=
-golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1237,19 +1041,13 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1257,7 +1055,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1269,88 +1066,53 @@ golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
+golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
+golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
+golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
-golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1368,63 +1130,25 @@ golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
-golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
+golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1440,113 +1164,42 @@ gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6d
 gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
 google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
-google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
 google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=
-google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=
-google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a h1:myvhA4is3vrit1a6NZCWBIwN0kNEnX21DJOJX/NvIfI=
-google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
+google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
+google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f/go.mod h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f h1:cUMEy+8oS78BWIH9OWazBkzbr090Od9tWBNtZHkOhf0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
 google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
-google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
+google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/AlecAivazis/survey.v1 v1.8.2/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1558,6 +1211,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
+gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
 gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=
@@ -1566,13 +1221,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/src-d/go-billy.v4 v4.2.1/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk=
-gopkg.in/src-d/go-git-fixtures.v3 v3.1.1/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
-gopkg.in/src-d/go-git.v4 v4.10.0/go.mod h1:Vtut8izDyrM8BUVQnzJ+YvmNcem2J89EmfZYCkLokZk=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
@@ -1582,7 +1232,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -1595,81 +1244,76 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 helm.sh/helm/v3 v3.2.0/go.mod h1:ZaXz/vzktgwjyGGFbUWtIQkscfE7WYoRGP2szqAFHR0=
-helm.sh/helm/v3 v3.12.3 h1:5y1+Sbty12t48T/t/CGNYUIME5BJ0WKfmW/sobYqkFg=
-helm.sh/helm/v3 v3.12.3/go.mod h1:KPKQiX9IP5HX7o5YnnhViMnNuKiL/lJBVQ47GHe1R0k=
+helm.sh/helm/v3 v3.16.1 h1:cER6tI/8PgUAsaJaQCVBUg3VI9KN4oVaZJgY60RIc0c=
+helm.sh/helm/v3 v3.16.1/go.mod h1:r+xBHHP20qJeEqtvBXMf7W35QDJnzY/eiEBzt+TfHps=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-istio.io/api v1.20.1-0.20231207143627-8237149662d6 h1:SbThL6mmEhAVI8yb3jeE160vrri6l6whkIKccuj5+YI=
-istio.io/api v1.20.1-0.20231207143627-8237149662d6/go.mod h1:hm1PE/mGdIAsjCDkTIAplP53H7TjO5LUQCiVvF26SVg=
-istio.io/client-go v1.20.1 h1:0kObqt2b6mJ1lM+PEOWQ9/MQbhJFMBZ2K7krAz/Qrto=
-istio.io/client-go v1.20.1/go.mod h1:5Je53KEbCFhBedeu1wIf02ekK2v7bAQEAfR9e0/u1LI=
-istio.io/istio v0.0.0-20231207195727-552626bd81f6 h1:n1TO3aL4moeyOQZGMQZGdFM9ws6D7g062M4sw0MJkB0=
-istio.io/istio v0.0.0-20231207195727-552626bd81f6/go.mod h1:sRiwXH4JywVnmoDDMAmW+NaNV7se8fH1w34wVt8AhSs=
+istio.io/api v1.23.3 h1:+CP0AHz8/+WJ7ZKJLbilHEiqBCi5KLe1Yil9bJI39ow=
+istio.io/api v1.23.3/go.mod h1:QPSTGXuIQdnZFEm3myf9NZ5uBMwCdJWUvfj9ZZ+2oBM=
+istio.io/api v1.24.0 h1:KH1Xxha9HAFekQILzdHpRF9AB4RY13/Sdi3rmHQWoQI=
+istio.io/api v1.24.0/go.mod h1:MQnRok7RZ20/PE56v0LxmoWH0xVxnCQPNuf9O7PAN1I=
+istio.io/client-go v1.24.0 h1:30Qmx12lJCB5xeJuyodPSWh848b2PvgCubdPTazG1eU=
+istio.io/client-go v1.24.0/go.mod h1:sCDBDJWQGJQz/1t3CHwUTDE5V7Nk6pFFkqBwhIg+LrI=
+istio.io/istio v0.0.0-20241105211601-8825a6b7f8c9 h1:TL8KZXIOBxGUFJYvyqVkBK8B9D1tx2uCrxKNz3BfPtk=
+istio.io/istio v0.0.0-20241105211601-8825a6b7f8c9/go.mod h1:WPuuRxVLJBE4gdDc/ZfEn+Rar1azZ2Am6qWBxUfh6r0=
 k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
 k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
-k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A=
-k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0=
+k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
+k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
 k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo=
 k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
-k8s.io/apiextensions-apiserver v0.29.2 h1:UK3xB5lOWSnhaCk0RFZ0LUacPZz9RY4wi/yt2Iu+btg=
-k8s.io/apiextensions-apiserver v0.29.2/go.mod h1:aLfYjpA5p3OwtqNXQFkhJ56TB+spV8Gc4wfMhUA3/b8=
+k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40=
+k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ=
 k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
-k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8=
-k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU=
+k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
+k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
 k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw=
 k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
-k8s.io/apiserver v0.29.2 h1:+Z9S0dSNr+CjnVXQePG8TcBWHr3Q7BmAr7NraHvsMiQ=
-k8s.io/apiserver v0.29.2/go.mod h1:B0LieKVoyU7ykQvPFm7XSdIHaCHSzCzQWPFa5bqbeMQ=
+k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
+k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM=
 k8s.io/cli-runtime v0.18.0/go.mod h1:1eXfmBsIJosjn9LjEBUd2WVPoPAY9XGTqTFcPMIBsUQ=
 k8s.io/cli-runtime v0.18.2/go.mod h1:yfFR2sQQzDsV0VEKGZtrJwEy4hLZ2oj4ZIfodgxAHWQ=
 k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
 k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
-k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg=
-k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA=
+k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
+k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
 k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
 k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
 k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c=
 k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
-k8s.io/component-base v0.29.2 h1:lpiLyuvPA9yV1aQwGLENYyK7n/8t6l3nn3zAtFTJYe8=
-k8s.io/component-base v0.29.2/go.mod h1:BfB3SLrefbZXiBfbM+2H1dlat21Uewg/5qtKOl8degM=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
-k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
+k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
+k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
-k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
-k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
+k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 h1:Q8Z7VlGhcJgBHJHYugJ/K/7iB8a2eSxCyxdVjJp+lLY=
+k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
 k8s.io/kubectl v0.18.0/go.mod h1:LOkWx9Z5DXMEg5KtOjHhRiC1fqJPLyCr3KtQgEolCkU=
 k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 k8s.io/metrics v0.18.0/go.mod h1:8aYTW18koXqjLVKL7Ds05RPMX9ipJZI3mywYvBOxXd4=
 k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI=
+k8s.io/utils v0.0.0-20240921022957-49e7df575cb6/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
 sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
-sigs.k8s.io/controller-runtime v0.17.4 h1:AMf1E0+93/jLQ13fb76S6Atwqp24EQFCmNbG84GJxew=
-sigs.k8s.io/controller-runtime v0.17.4/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
-sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016 h1:ovFzI+PB1mdbfAyR+Olnhc+HSys1z9IXSYqNfSdUUf0=
-sigs.k8s.io/gateway-api v1.0.1-0.20231102234152-004e14bfe016/go.mod h1:4cUgr0Lnp5FZ0Cdq8FdRwCvpiWws7LVhLHGIudLlf4c=
+sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q=
+sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
+sigs.k8s.io/gateway-api v1.2.0 h1:LrToiFwtqKTKZcZtoQPTuo3FxhrrhTgzQG0Te+YGSo8=
+sigs.k8s.io/gateway-api v1.2.0/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
 sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
-sigs.k8s.io/mcs-api v0.1.0 h1:edDbg0oRGfXw8TmZjKYep06LcJLv/qcYLidejnUp0PM=
-sigs.k8s.io/mcs-api v0.1.0/go.mod h1:gGiAryeFNB4GBsq2LBmVqSgKoobLxt+p7ii/WG5QYYw=
+sigs.k8s.io/mcs-api v0.1.1-0.20240624222831-d7001fe1d21c h1:F7hIEutAxtXDOQX9NXFdvhWmWETu2zmUPHuPPcAez7g=
+sigs.k8s.io/mcs-api v0.1.1-0.20240624222831-d7001fe1d21c/go.mod h1:DPFniRsBzCeLB4ANjlPEvQQt9QGIX489d1faK+GPvI4=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/clients.go b/pkg/api/istio/install.istio.io/v1alpha1/clients.go
index 3097f76..5744b8f 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/clients.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/clients.go
@@ -7,9 +7,9 @@ package v1alpha1
 import (
 	"context"
 
+	install_istio_io_v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	"github.com/solo-io/skv2/pkg/controllerutils"
 	"github.com/solo-io/skv2/pkg/multicluster"
-	install_istio_io_v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/kubernetes/scheme"
 	"k8s.io/client-go/rest"
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/event_handlers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/event_handlers.go
index d3d133d..0369620 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/event_handlers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/event_handlers.go
@@ -8,7 +8,7 @@ package controller
 import (
 	"context"
 
-	install_istio_io_v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	install_istio_io_v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 
 	"github.com/pkg/errors"
 	"github.com/solo-io/skv2/pkg/events"
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/event_handlers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/event_handlers.go
index 45e54ab..6bd94c6 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/event_handlers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/event_handlers.go
@@ -10,7 +10,7 @@ import (
 
 	gomock "github.com/golang/mock/gomock"
 	controller "github.com/solo-io/external-apis/pkg/api/istio/install.istio.io/v1alpha1/controller"
-	v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
 )
 
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/multicluster_reconcilers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/multicluster_reconcilers.go
index 8a9f628..71bbe75 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/multicluster_reconcilers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/multicluster_reconcilers.go
@@ -10,8 +10,8 @@ import (
 
 	gomock "github.com/golang/mock/gomock"
 	controller "github.com/solo-io/external-apis/pkg/api/istio/install.istio.io/v1alpha1/controller"
+	v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	reconcile "github.com/solo-io/skv2/pkg/reconcile"
-	v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
 	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
 )
 
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/reconcilers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/reconcilers.go
index 08a91cc..7fd0762 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/reconcilers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/mocks/reconcilers.go
@@ -10,8 +10,8 @@ import (
 
 	gomock "github.com/golang/mock/gomock"
 	controller "github.com/solo-io/external-apis/pkg/api/istio/install.istio.io/v1alpha1/controller"
+	v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	reconcile "github.com/solo-io/skv2/pkg/reconcile"
-	v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
 	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
 )
 
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/multicluster_reconcilers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/multicluster_reconcilers.go
index 0cc635a..91cc150 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/multicluster_reconcilers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/multicluster_reconcilers.go
@@ -8,7 +8,7 @@ package controller
 import (
 	"context"
 
-	install_istio_io_v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	install_istio_io_v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 
 	"github.com/pkg/errors"
 	"github.com/solo-io/skv2/pkg/ezkube"
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/controller/reconcilers.go b/pkg/api/istio/install.istio.io/v1alpha1/controller/reconcilers.go
index 4b7f7cc..d590ec0 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/controller/reconcilers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/controller/reconcilers.go
@@ -8,7 +8,7 @@ package controller
 import (
 	"context"
 
-	install_istio_io_v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	install_istio_io_v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 
 	"github.com/pkg/errors"
 	"github.com/solo-io/skv2/pkg/ezkube"
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/mocks/clients.go b/pkg/api/istio/install.istio.io/v1alpha1/mocks/clients.go
index 9716a36..0e326b3 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/mocks/clients.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/mocks/clients.go
@@ -10,7 +10,7 @@ import (
 
 	gomock "github.com/golang/mock/gomock"
 	v1alpha1 "github.com/solo-io/external-apis/pkg/api/istio/install.istio.io/v1alpha1"
-	v1alpha10 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	v1alpha10 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	client "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/sets/mocks/sets.go b/pkg/api/istio/install.istio.io/v1alpha1/sets/mocks/sets.go
index 06f7aa6..b169e3a 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/sets/mocks/sets.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/sets/mocks/sets.go
@@ -9,9 +9,9 @@ import (
 
 	gomock "github.com/golang/mock/gomock"
 	v1alpha1sets "github.com/solo-io/external-apis/pkg/api/istio/install.istio.io/v1alpha1/sets"
+	v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 	sets "github.com/solo-io/skv2/contrib/pkg/sets"
 	ezkube "github.com/solo-io/skv2/pkg/ezkube"
-	v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
 	sets0 "k8s.io/apimachinery/pkg/util/sets"
 )
 
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/sets/sets.go b/pkg/api/istio/install.istio.io/v1alpha1/sets/sets.go
index 4b00542..fd70d0d 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/sets/sets.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/sets/sets.go
@@ -5,7 +5,7 @@
 package v1alpha1sets
 
 import (
-	install_istio_io_v1alpha1 "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	install_istio_io_v1alpha1 "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 
 	"github.com/rotisserie/eris"
 	sksets "github.com/solo-io/skv2/contrib/pkg/sets"
diff --git a/pkg/api/istio/install.istio.io/v1alpha1/type_helpers.go b/pkg/api/istio/install.istio.io/v1alpha1/type_helpers.go
index d444f31..10bc64c 100644
--- a/pkg/api/istio/install.istio.io/v1alpha1/type_helpers.go
+++ b/pkg/api/istio/install.istio.io/v1alpha1/type_helpers.go
@@ -4,7 +4,7 @@
 package v1alpha1
 
 import (
-	. "istio.io/istio/operator/pkg/apis/istio/v1alpha1"
+	. "github.com/solo-io/istio-operator-legacy/operator/pkg/apis/istio/v1alpha1"
 )
 
 // IstioOperatorSlice represents a slice of *IstioOperator
diff --git a/pkg/api/istio/networking.istio.io/v1/clients.go b/pkg/api/istio/networking.istio.io/v1/clients.go
new file mode 100644
index 0000000..680f156
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/clients.go
@@ -0,0 +1,1108 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./clients.go -destination mocks/clients.go
+
+package v1
+
+import (
+	"context"
+
+	"github.com/solo-io/skv2/pkg/controllerutils"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	networking_istio_io_v1 "istio.io/client-go/pkg/apis/networking/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/kubernetes/scheme"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MulticlusterClientset for the networking.istio.io/v1 APIs
+type MulticlusterClientset interface {
+	// Cluster returns a Clientset for the given cluster
+	Cluster(cluster string) (Clientset, error)
+}
+
+type multiclusterClientset struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterClientset(client multicluster.Client) MulticlusterClientset {
+	return &multiclusterClientset{client: client}
+}
+
+func (m *multiclusterClientset) Cluster(cluster string) (Clientset, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+// clienset for the networking.istio.io/v1 APIs
+type Clientset interface {
+	// clienset for the networking.istio.io/v1/v1 APIs
+	DestinationRules() DestinationRuleClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	Gateways() GatewayClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	ServiceEntries() ServiceEntryClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	WorkloadEntries() WorkloadEntryClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	WorkloadGroups() WorkloadGroupClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	VirtualServices() VirtualServiceClient
+	// clienset for the networking.istio.io/v1/v1 APIs
+	Sidecars() SidecarClient
+}
+
+type clientSet struct {
+	client client.Client
+}
+
+func NewClientsetFromConfig(cfg *rest.Config) (Clientset, error) {
+	scheme := scheme.Scheme
+	if err := networking_istio_io_v1.SchemeBuilder.AddToScheme(scheme); err != nil {
+		return nil, err
+	}
+	client, err := client.New(cfg, client.Options{
+		Scheme: scheme,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+func NewClientset(client client.Client) Clientset {
+	return &clientSet{client: client}
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) DestinationRules() DestinationRuleClient {
+	return NewDestinationRuleClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) Gateways() GatewayClient {
+	return NewGatewayClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) ServiceEntries() ServiceEntryClient {
+	return NewServiceEntryClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) WorkloadEntries() WorkloadEntryClient {
+	return NewWorkloadEntryClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) WorkloadGroups() WorkloadGroupClient {
+	return NewWorkloadGroupClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) VirtualServices() VirtualServiceClient {
+	return NewVirtualServiceClient(c.client)
+}
+
+// clienset for the networking.istio.io/v1/v1 APIs
+func (c *clientSet) Sidecars() SidecarClient {
+	return NewSidecarClient(c.client)
+}
+
+// Reader knows how to read and list DestinationRules.
+type DestinationRuleReader interface {
+	// Get retrieves a DestinationRule for the given object key
+	GetDestinationRule(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.DestinationRule, error)
+
+	// List retrieves list of DestinationRules for a given namespace and list options.
+	ListDestinationRule(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.DestinationRuleList, error)
+}
+
+// DestinationRuleTransitionFunction instructs the DestinationRuleWriter how to transition between an existing
+// DestinationRule object and a desired on an Upsert
+type DestinationRuleTransitionFunction func(existing, desired *networking_istio_io_v1.DestinationRule) error
+
+// Writer knows how to create, delete, and update DestinationRules.
+type DestinationRuleWriter interface {
+	// Create saves the DestinationRule object.
+	CreateDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.CreateOption) error
+
+	// Delete deletes the DestinationRule object.
+	DeleteDestinationRule(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given DestinationRule object.
+	UpdateDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.UpdateOption) error
+
+	// Patch patches the given DestinationRule object.
+	PatchDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all DestinationRule objects matching the given options.
+	DeleteAllOfDestinationRule(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the DestinationRule object.
+	UpsertDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, transitionFuncs ...DestinationRuleTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a DestinationRule object.
+type DestinationRuleStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given DestinationRule object.
+	UpdateDestinationRuleStatus(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given DestinationRule object's subresource.
+	PatchDestinationRuleStatus(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on DestinationRules.
+type DestinationRuleClient interface {
+	DestinationRuleReader
+	DestinationRuleWriter
+	DestinationRuleStatusWriter
+}
+
+type destinationRuleClient struct {
+	client client.Client
+}
+
+func NewDestinationRuleClient(client client.Client) *destinationRuleClient {
+	return &destinationRuleClient{client: client}
+}
+
+func (c *destinationRuleClient) GetDestinationRule(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.DestinationRule, error) {
+	obj := &networking_istio_io_v1.DestinationRule{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *destinationRuleClient) ListDestinationRule(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.DestinationRuleList, error) {
+	list := &networking_istio_io_v1.DestinationRuleList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *destinationRuleClient) CreateDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *destinationRuleClient) DeleteDestinationRule(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.DestinationRule{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *destinationRuleClient) UpdateDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *destinationRuleClient) PatchDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *destinationRuleClient) DeleteAllOfDestinationRule(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.DestinationRule{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *destinationRuleClient) UpsertDestinationRule(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, transitionFuncs ...DestinationRuleTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.DestinationRule), desired.(*networking_istio_io_v1.DestinationRule)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *destinationRuleClient) UpdateDestinationRuleStatus(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *destinationRuleClient) PatchDestinationRuleStatus(ctx context.Context, obj *networking_istio_io_v1.DestinationRule, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides DestinationRuleClients for multiple clusters.
+type MulticlusterDestinationRuleClient interface {
+	// Cluster returns a DestinationRuleClient for the given cluster
+	Cluster(cluster string) (DestinationRuleClient, error)
+}
+
+type multiclusterDestinationRuleClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterDestinationRuleClient(client multicluster.Client) MulticlusterDestinationRuleClient {
+	return &multiclusterDestinationRuleClient{client: client}
+}
+
+func (m *multiclusterDestinationRuleClient) Cluster(cluster string) (DestinationRuleClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewDestinationRuleClient(client), nil
+}
+
+// Reader knows how to read and list Gateways.
+type GatewayReader interface {
+	// Get retrieves a Gateway for the given object key
+	GetGateway(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.Gateway, error)
+
+	// List retrieves list of Gateways for a given namespace and list options.
+	ListGateway(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.GatewayList, error)
+}
+
+// GatewayTransitionFunction instructs the GatewayWriter how to transition between an existing
+// Gateway object and a desired on an Upsert
+type GatewayTransitionFunction func(existing, desired *networking_istio_io_v1.Gateway) error
+
+// Writer knows how to create, delete, and update Gateways.
+type GatewayWriter interface {
+	// Create saves the Gateway object.
+	CreateGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.CreateOption) error
+
+	// Delete deletes the Gateway object.
+	DeleteGateway(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given Gateway object.
+	UpdateGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.UpdateOption) error
+
+	// Patch patches the given Gateway object.
+	PatchGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all Gateway objects matching the given options.
+	DeleteAllOfGateway(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the Gateway object.
+	UpsertGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, transitionFuncs ...GatewayTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a Gateway object.
+type GatewayStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given Gateway object.
+	UpdateGatewayStatus(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given Gateway object's subresource.
+	PatchGatewayStatus(ctx context.Context, obj *networking_istio_io_v1.Gateway, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on Gateways.
+type GatewayClient interface {
+	GatewayReader
+	GatewayWriter
+	GatewayStatusWriter
+}
+
+type gatewayClient struct {
+	client client.Client
+}
+
+func NewGatewayClient(client client.Client) *gatewayClient {
+	return &gatewayClient{client: client}
+}
+
+func (c *gatewayClient) GetGateway(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.Gateway, error) {
+	obj := &networking_istio_io_v1.Gateway{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *gatewayClient) ListGateway(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.GatewayList, error) {
+	list := &networking_istio_io_v1.GatewayList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *gatewayClient) CreateGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *gatewayClient) DeleteGateway(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.Gateway{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *gatewayClient) UpdateGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *gatewayClient) PatchGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *gatewayClient) DeleteAllOfGateway(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.Gateway{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *gatewayClient) UpsertGateway(ctx context.Context, obj *networking_istio_io_v1.Gateway, transitionFuncs ...GatewayTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.Gateway), desired.(*networking_istio_io_v1.Gateway)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *gatewayClient) UpdateGatewayStatus(ctx context.Context, obj *networking_istio_io_v1.Gateway, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *gatewayClient) PatchGatewayStatus(ctx context.Context, obj *networking_istio_io_v1.Gateway, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides GatewayClients for multiple clusters.
+type MulticlusterGatewayClient interface {
+	// Cluster returns a GatewayClient for the given cluster
+	Cluster(cluster string) (GatewayClient, error)
+}
+
+type multiclusterGatewayClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterGatewayClient(client multicluster.Client) MulticlusterGatewayClient {
+	return &multiclusterGatewayClient{client: client}
+}
+
+func (m *multiclusterGatewayClient) Cluster(cluster string) (GatewayClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewGatewayClient(client), nil
+}
+
+// Reader knows how to read and list ServiceEntrys.
+type ServiceEntryReader interface {
+	// Get retrieves a ServiceEntry for the given object key
+	GetServiceEntry(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.ServiceEntry, error)
+
+	// List retrieves list of ServiceEntrys for a given namespace and list options.
+	ListServiceEntry(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.ServiceEntryList, error)
+}
+
+// ServiceEntryTransitionFunction instructs the ServiceEntryWriter how to transition between an existing
+// ServiceEntry object and a desired on an Upsert
+type ServiceEntryTransitionFunction func(existing, desired *networking_istio_io_v1.ServiceEntry) error
+
+// Writer knows how to create, delete, and update ServiceEntrys.
+type ServiceEntryWriter interface {
+	// Create saves the ServiceEntry object.
+	CreateServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.CreateOption) error
+
+	// Delete deletes the ServiceEntry object.
+	DeleteServiceEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given ServiceEntry object.
+	UpdateServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.UpdateOption) error
+
+	// Patch patches the given ServiceEntry object.
+	PatchServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all ServiceEntry objects matching the given options.
+	DeleteAllOfServiceEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the ServiceEntry object.
+	UpsertServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, transitionFuncs ...ServiceEntryTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a ServiceEntry object.
+type ServiceEntryStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given ServiceEntry object.
+	UpdateServiceEntryStatus(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given ServiceEntry object's subresource.
+	PatchServiceEntryStatus(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on ServiceEntrys.
+type ServiceEntryClient interface {
+	ServiceEntryReader
+	ServiceEntryWriter
+	ServiceEntryStatusWriter
+}
+
+type serviceEntryClient struct {
+	client client.Client
+}
+
+func NewServiceEntryClient(client client.Client) *serviceEntryClient {
+	return &serviceEntryClient{client: client}
+}
+
+func (c *serviceEntryClient) GetServiceEntry(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.ServiceEntry, error) {
+	obj := &networking_istio_io_v1.ServiceEntry{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *serviceEntryClient) ListServiceEntry(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.ServiceEntryList, error) {
+	list := &networking_istio_io_v1.ServiceEntryList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *serviceEntryClient) CreateServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *serviceEntryClient) DeleteServiceEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.ServiceEntry{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *serviceEntryClient) UpdateServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *serviceEntryClient) PatchServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *serviceEntryClient) DeleteAllOfServiceEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.ServiceEntry{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *serviceEntryClient) UpsertServiceEntry(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, transitionFuncs ...ServiceEntryTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.ServiceEntry), desired.(*networking_istio_io_v1.ServiceEntry)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *serviceEntryClient) UpdateServiceEntryStatus(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *serviceEntryClient) PatchServiceEntryStatus(ctx context.Context, obj *networking_istio_io_v1.ServiceEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides ServiceEntryClients for multiple clusters.
+type MulticlusterServiceEntryClient interface {
+	// Cluster returns a ServiceEntryClient for the given cluster
+	Cluster(cluster string) (ServiceEntryClient, error)
+}
+
+type multiclusterServiceEntryClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterServiceEntryClient(client multicluster.Client) MulticlusterServiceEntryClient {
+	return &multiclusterServiceEntryClient{client: client}
+}
+
+func (m *multiclusterServiceEntryClient) Cluster(cluster string) (ServiceEntryClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewServiceEntryClient(client), nil
+}
+
+// Reader knows how to read and list WorkloadEntrys.
+type WorkloadEntryReader interface {
+	// Get retrieves a WorkloadEntry for the given object key
+	GetWorkloadEntry(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.WorkloadEntry, error)
+
+	// List retrieves list of WorkloadEntrys for a given namespace and list options.
+	ListWorkloadEntry(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.WorkloadEntryList, error)
+}
+
+// WorkloadEntryTransitionFunction instructs the WorkloadEntryWriter how to transition between an existing
+// WorkloadEntry object and a desired on an Upsert
+type WorkloadEntryTransitionFunction func(existing, desired *networking_istio_io_v1.WorkloadEntry) error
+
+// Writer knows how to create, delete, and update WorkloadEntrys.
+type WorkloadEntryWriter interface {
+	// Create saves the WorkloadEntry object.
+	CreateWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.CreateOption) error
+
+	// Delete deletes the WorkloadEntry object.
+	DeleteWorkloadEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given WorkloadEntry object.
+	UpdateWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.UpdateOption) error
+
+	// Patch patches the given WorkloadEntry object.
+	PatchWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all WorkloadEntry objects matching the given options.
+	DeleteAllOfWorkloadEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the WorkloadEntry object.
+	UpsertWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, transitionFuncs ...WorkloadEntryTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a WorkloadEntry object.
+type WorkloadEntryStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given WorkloadEntry object.
+	UpdateWorkloadEntryStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given WorkloadEntry object's subresource.
+	PatchWorkloadEntryStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on WorkloadEntrys.
+type WorkloadEntryClient interface {
+	WorkloadEntryReader
+	WorkloadEntryWriter
+	WorkloadEntryStatusWriter
+}
+
+type workloadEntryClient struct {
+	client client.Client
+}
+
+func NewWorkloadEntryClient(client client.Client) *workloadEntryClient {
+	return &workloadEntryClient{client: client}
+}
+
+func (c *workloadEntryClient) GetWorkloadEntry(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.WorkloadEntry, error) {
+	obj := &networking_istio_io_v1.WorkloadEntry{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *workloadEntryClient) ListWorkloadEntry(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.WorkloadEntryList, error) {
+	list := &networking_istio_io_v1.WorkloadEntryList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *workloadEntryClient) CreateWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *workloadEntryClient) DeleteWorkloadEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.WorkloadEntry{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *workloadEntryClient) UpdateWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *workloadEntryClient) PatchWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *workloadEntryClient) DeleteAllOfWorkloadEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.WorkloadEntry{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *workloadEntryClient) UpsertWorkloadEntry(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, transitionFuncs ...WorkloadEntryTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.WorkloadEntry), desired.(*networking_istio_io_v1.WorkloadEntry)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *workloadEntryClient) UpdateWorkloadEntryStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *workloadEntryClient) PatchWorkloadEntryStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides WorkloadEntryClients for multiple clusters.
+type MulticlusterWorkloadEntryClient interface {
+	// Cluster returns a WorkloadEntryClient for the given cluster
+	Cluster(cluster string) (WorkloadEntryClient, error)
+}
+
+type multiclusterWorkloadEntryClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterWorkloadEntryClient(client multicluster.Client) MulticlusterWorkloadEntryClient {
+	return &multiclusterWorkloadEntryClient{client: client}
+}
+
+func (m *multiclusterWorkloadEntryClient) Cluster(cluster string) (WorkloadEntryClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewWorkloadEntryClient(client), nil
+}
+
+// Reader knows how to read and list WorkloadGroups.
+type WorkloadGroupReader interface {
+	// Get retrieves a WorkloadGroup for the given object key
+	GetWorkloadGroup(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.WorkloadGroup, error)
+
+	// List retrieves list of WorkloadGroups for a given namespace and list options.
+	ListWorkloadGroup(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.WorkloadGroupList, error)
+}
+
+// WorkloadGroupTransitionFunction instructs the WorkloadGroupWriter how to transition between an existing
+// WorkloadGroup object and a desired on an Upsert
+type WorkloadGroupTransitionFunction func(existing, desired *networking_istio_io_v1.WorkloadGroup) error
+
+// Writer knows how to create, delete, and update WorkloadGroups.
+type WorkloadGroupWriter interface {
+	// Create saves the WorkloadGroup object.
+	CreateWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.CreateOption) error
+
+	// Delete deletes the WorkloadGroup object.
+	DeleteWorkloadGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given WorkloadGroup object.
+	UpdateWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.UpdateOption) error
+
+	// Patch patches the given WorkloadGroup object.
+	PatchWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all WorkloadGroup objects matching the given options.
+	DeleteAllOfWorkloadGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the WorkloadGroup object.
+	UpsertWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, transitionFuncs ...WorkloadGroupTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a WorkloadGroup object.
+type WorkloadGroupStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given WorkloadGroup object.
+	UpdateWorkloadGroupStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given WorkloadGroup object's subresource.
+	PatchWorkloadGroupStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on WorkloadGroups.
+type WorkloadGroupClient interface {
+	WorkloadGroupReader
+	WorkloadGroupWriter
+	WorkloadGroupStatusWriter
+}
+
+type workloadGroupClient struct {
+	client client.Client
+}
+
+func NewWorkloadGroupClient(client client.Client) *workloadGroupClient {
+	return &workloadGroupClient{client: client}
+}
+
+func (c *workloadGroupClient) GetWorkloadGroup(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.WorkloadGroup, error) {
+	obj := &networking_istio_io_v1.WorkloadGroup{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *workloadGroupClient) ListWorkloadGroup(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.WorkloadGroupList, error) {
+	list := &networking_istio_io_v1.WorkloadGroupList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *workloadGroupClient) CreateWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *workloadGroupClient) DeleteWorkloadGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.WorkloadGroup{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *workloadGroupClient) UpdateWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *workloadGroupClient) PatchWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *workloadGroupClient) DeleteAllOfWorkloadGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.WorkloadGroup{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *workloadGroupClient) UpsertWorkloadGroup(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, transitionFuncs ...WorkloadGroupTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.WorkloadGroup), desired.(*networking_istio_io_v1.WorkloadGroup)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *workloadGroupClient) UpdateWorkloadGroupStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *workloadGroupClient) PatchWorkloadGroupStatus(ctx context.Context, obj *networking_istio_io_v1.WorkloadGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides WorkloadGroupClients for multiple clusters.
+type MulticlusterWorkloadGroupClient interface {
+	// Cluster returns a WorkloadGroupClient for the given cluster
+	Cluster(cluster string) (WorkloadGroupClient, error)
+}
+
+type multiclusterWorkloadGroupClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterWorkloadGroupClient(client multicluster.Client) MulticlusterWorkloadGroupClient {
+	return &multiclusterWorkloadGroupClient{client: client}
+}
+
+func (m *multiclusterWorkloadGroupClient) Cluster(cluster string) (WorkloadGroupClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewWorkloadGroupClient(client), nil
+}
+
+// Reader knows how to read and list VirtualServices.
+type VirtualServiceReader interface {
+	// Get retrieves a VirtualService for the given object key
+	GetVirtualService(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.VirtualService, error)
+
+	// List retrieves list of VirtualServices for a given namespace and list options.
+	ListVirtualService(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.VirtualServiceList, error)
+}
+
+// VirtualServiceTransitionFunction instructs the VirtualServiceWriter how to transition between an existing
+// VirtualService object and a desired on an Upsert
+type VirtualServiceTransitionFunction func(existing, desired *networking_istio_io_v1.VirtualService) error
+
+// Writer knows how to create, delete, and update VirtualServices.
+type VirtualServiceWriter interface {
+	// Create saves the VirtualService object.
+	CreateVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.CreateOption) error
+
+	// Delete deletes the VirtualService object.
+	DeleteVirtualService(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given VirtualService object.
+	UpdateVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.UpdateOption) error
+
+	// Patch patches the given VirtualService object.
+	PatchVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all VirtualService objects matching the given options.
+	DeleteAllOfVirtualService(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the VirtualService object.
+	UpsertVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, transitionFuncs ...VirtualServiceTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a VirtualService object.
+type VirtualServiceStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given VirtualService object.
+	UpdateVirtualServiceStatus(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given VirtualService object's subresource.
+	PatchVirtualServiceStatus(ctx context.Context, obj *networking_istio_io_v1.VirtualService, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on VirtualServices.
+type VirtualServiceClient interface {
+	VirtualServiceReader
+	VirtualServiceWriter
+	VirtualServiceStatusWriter
+}
+
+type virtualServiceClient struct {
+	client client.Client
+}
+
+func NewVirtualServiceClient(client client.Client) *virtualServiceClient {
+	return &virtualServiceClient{client: client}
+}
+
+func (c *virtualServiceClient) GetVirtualService(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.VirtualService, error) {
+	obj := &networking_istio_io_v1.VirtualService{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *virtualServiceClient) ListVirtualService(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.VirtualServiceList, error) {
+	list := &networking_istio_io_v1.VirtualServiceList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *virtualServiceClient) CreateVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *virtualServiceClient) DeleteVirtualService(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.VirtualService{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *virtualServiceClient) UpdateVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *virtualServiceClient) PatchVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *virtualServiceClient) DeleteAllOfVirtualService(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.VirtualService{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *virtualServiceClient) UpsertVirtualService(ctx context.Context, obj *networking_istio_io_v1.VirtualService, transitionFuncs ...VirtualServiceTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.VirtualService), desired.(*networking_istio_io_v1.VirtualService)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *virtualServiceClient) UpdateVirtualServiceStatus(ctx context.Context, obj *networking_istio_io_v1.VirtualService, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *virtualServiceClient) PatchVirtualServiceStatus(ctx context.Context, obj *networking_istio_io_v1.VirtualService, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides VirtualServiceClients for multiple clusters.
+type MulticlusterVirtualServiceClient interface {
+	// Cluster returns a VirtualServiceClient for the given cluster
+	Cluster(cluster string) (VirtualServiceClient, error)
+}
+
+type multiclusterVirtualServiceClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterVirtualServiceClient(client multicluster.Client) MulticlusterVirtualServiceClient {
+	return &multiclusterVirtualServiceClient{client: client}
+}
+
+func (m *multiclusterVirtualServiceClient) Cluster(cluster string) (VirtualServiceClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewVirtualServiceClient(client), nil
+}
+
+// Reader knows how to read and list Sidecars.
+type SidecarReader interface {
+	// Get retrieves a Sidecar for the given object key
+	GetSidecar(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.Sidecar, error)
+
+	// List retrieves list of Sidecars for a given namespace and list options.
+	ListSidecar(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.SidecarList, error)
+}
+
+// SidecarTransitionFunction instructs the SidecarWriter how to transition between an existing
+// Sidecar object and a desired on an Upsert
+type SidecarTransitionFunction func(existing, desired *networking_istio_io_v1.Sidecar) error
+
+// Writer knows how to create, delete, and update Sidecars.
+type SidecarWriter interface {
+	// Create saves the Sidecar object.
+	CreateSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.CreateOption) error
+
+	// Delete deletes the Sidecar object.
+	DeleteSidecar(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given Sidecar object.
+	UpdateSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.UpdateOption) error
+
+	// Patch patches the given Sidecar object.
+	PatchSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all Sidecar objects matching the given options.
+	DeleteAllOfSidecar(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the Sidecar object.
+	UpsertSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, transitionFuncs ...SidecarTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a Sidecar object.
+type SidecarStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given Sidecar object.
+	UpdateSidecarStatus(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given Sidecar object's subresource.
+	PatchSidecarStatus(ctx context.Context, obj *networking_istio_io_v1.Sidecar, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on Sidecars.
+type SidecarClient interface {
+	SidecarReader
+	SidecarWriter
+	SidecarStatusWriter
+}
+
+type sidecarClient struct {
+	client client.Client
+}
+
+func NewSidecarClient(client client.Client) *sidecarClient {
+	return &sidecarClient{client: client}
+}
+
+func (c *sidecarClient) GetSidecar(ctx context.Context, key client.ObjectKey) (*networking_istio_io_v1.Sidecar, error) {
+	obj := &networking_istio_io_v1.Sidecar{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *sidecarClient) ListSidecar(ctx context.Context, opts ...client.ListOption) (*networking_istio_io_v1.SidecarList, error) {
+	list := &networking_istio_io_v1.SidecarList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *sidecarClient) CreateSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *sidecarClient) DeleteSidecar(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &networking_istio_io_v1.Sidecar{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *sidecarClient) UpdateSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *sidecarClient) PatchSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *sidecarClient) DeleteAllOfSidecar(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &networking_istio_io_v1.Sidecar{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *sidecarClient) UpsertSidecar(ctx context.Context, obj *networking_istio_io_v1.Sidecar, transitionFuncs ...SidecarTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*networking_istio_io_v1.Sidecar), desired.(*networking_istio_io_v1.Sidecar)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *sidecarClient) UpdateSidecarStatus(ctx context.Context, obj *networking_istio_io_v1.Sidecar, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *sidecarClient) PatchSidecarStatus(ctx context.Context, obj *networking_istio_io_v1.Sidecar, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides SidecarClients for multiple clusters.
+type MulticlusterSidecarClient interface {
+	// Cluster returns a SidecarClient for the given cluster
+	Cluster(cluster string) (SidecarClient, error)
+}
+
+type multiclusterSidecarClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterSidecarClient(client multicluster.Client) MulticlusterSidecarClient {
+	return &multiclusterSidecarClient{client: client}
+}
+
+func (m *multiclusterSidecarClient) Cluster(cluster string) (SidecarClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewSidecarClient(client), nil
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/event_handlers.go b/pkg/api/istio/networking.istio.io/v1/controller/event_handlers.go
new file mode 100644
index 0000000..f9e2ae1
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/event_handlers.go
@@ -0,0 +1,767 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./event_handlers.go -destination mocks/event_handlers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	networking_istio_io_v1 "istio.io/client-go/pkg/apis/networking/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/events"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Handle events for the DestinationRule Resource
+// DEPRECATED: Prefer reconciler pattern.
+type DestinationRuleEventHandler interface {
+	CreateDestinationRule(obj *networking_istio_io_v1.DestinationRule) error
+	UpdateDestinationRule(old, new *networking_istio_io_v1.DestinationRule) error
+	DeleteDestinationRule(obj *networking_istio_io_v1.DestinationRule) error
+	GenericDestinationRule(obj *networking_istio_io_v1.DestinationRule) error
+}
+
+type DestinationRuleEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.DestinationRule) error
+	OnUpdate  func(old, new *networking_istio_io_v1.DestinationRule) error
+	OnDelete  func(obj *networking_istio_io_v1.DestinationRule) error
+	OnGeneric func(obj *networking_istio_io_v1.DestinationRule) error
+}
+
+func (f *DestinationRuleEventHandlerFuncs) CreateDestinationRule(obj *networking_istio_io_v1.DestinationRule) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *DestinationRuleEventHandlerFuncs) DeleteDestinationRule(obj *networking_istio_io_v1.DestinationRule) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *DestinationRuleEventHandlerFuncs) UpdateDestinationRule(objOld, objNew *networking_istio_io_v1.DestinationRule) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *DestinationRuleEventHandlerFuncs) GenericDestinationRule(obj *networking_istio_io_v1.DestinationRule) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type DestinationRuleEventWatcher interface {
+	AddEventHandler(ctx context.Context, h DestinationRuleEventHandler, predicates ...predicate.Predicate) error
+}
+
+type destinationRuleEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewDestinationRuleEventWatcher(name string, mgr manager.Manager) DestinationRuleEventWatcher {
+	return &destinationRuleEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.DestinationRule{}),
+	}
+}
+
+func (c *destinationRuleEventWatcher) AddEventHandler(ctx context.Context, h DestinationRuleEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericDestinationRuleHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericDestinationRuleHandler implements a generic events.EventHandler
+type genericDestinationRuleHandler struct {
+	handler DestinationRuleEventHandler
+}
+
+func (h genericDestinationRuleHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return h.handler.CreateDestinationRule(obj)
+}
+
+func (h genericDestinationRuleHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return h.handler.DeleteDestinationRule(obj)
+}
+
+func (h genericDestinationRuleHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", new)
+	}
+	return h.handler.UpdateDestinationRule(objOld, objNew)
+}
+
+func (h genericDestinationRuleHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return h.handler.GenericDestinationRule(obj)
+}
+
+// Handle events for the Gateway Resource
+// DEPRECATED: Prefer reconciler pattern.
+type GatewayEventHandler interface {
+	CreateGateway(obj *networking_istio_io_v1.Gateway) error
+	UpdateGateway(old, new *networking_istio_io_v1.Gateway) error
+	DeleteGateway(obj *networking_istio_io_v1.Gateway) error
+	GenericGateway(obj *networking_istio_io_v1.Gateway) error
+}
+
+type GatewayEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.Gateway) error
+	OnUpdate  func(old, new *networking_istio_io_v1.Gateway) error
+	OnDelete  func(obj *networking_istio_io_v1.Gateway) error
+	OnGeneric func(obj *networking_istio_io_v1.Gateway) error
+}
+
+func (f *GatewayEventHandlerFuncs) CreateGateway(obj *networking_istio_io_v1.Gateway) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *GatewayEventHandlerFuncs) DeleteGateway(obj *networking_istio_io_v1.Gateway) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *GatewayEventHandlerFuncs) UpdateGateway(objOld, objNew *networking_istio_io_v1.Gateway) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *GatewayEventHandlerFuncs) GenericGateway(obj *networking_istio_io_v1.Gateway) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type GatewayEventWatcher interface {
+	AddEventHandler(ctx context.Context, h GatewayEventHandler, predicates ...predicate.Predicate) error
+}
+
+type gatewayEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewGatewayEventWatcher(name string, mgr manager.Manager) GatewayEventWatcher {
+	return &gatewayEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.Gateway{}),
+	}
+}
+
+func (c *gatewayEventWatcher) AddEventHandler(ctx context.Context, h GatewayEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericGatewayHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericGatewayHandler implements a generic events.EventHandler
+type genericGatewayHandler struct {
+	handler GatewayEventHandler
+}
+
+func (h genericGatewayHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return h.handler.CreateGateway(obj)
+}
+
+func (h genericGatewayHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return h.handler.DeleteGateway(obj)
+}
+
+func (h genericGatewayHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", new)
+	}
+	return h.handler.UpdateGateway(objOld, objNew)
+}
+
+func (h genericGatewayHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return h.handler.GenericGateway(obj)
+}
+
+// Handle events for the ServiceEntry Resource
+// DEPRECATED: Prefer reconciler pattern.
+type ServiceEntryEventHandler interface {
+	CreateServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error
+	UpdateServiceEntry(old, new *networking_istio_io_v1.ServiceEntry) error
+	DeleteServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error
+	GenericServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error
+}
+
+type ServiceEntryEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.ServiceEntry) error
+	OnUpdate  func(old, new *networking_istio_io_v1.ServiceEntry) error
+	OnDelete  func(obj *networking_istio_io_v1.ServiceEntry) error
+	OnGeneric func(obj *networking_istio_io_v1.ServiceEntry) error
+}
+
+func (f *ServiceEntryEventHandlerFuncs) CreateServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *ServiceEntryEventHandlerFuncs) DeleteServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *ServiceEntryEventHandlerFuncs) UpdateServiceEntry(objOld, objNew *networking_istio_io_v1.ServiceEntry) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *ServiceEntryEventHandlerFuncs) GenericServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type ServiceEntryEventWatcher interface {
+	AddEventHandler(ctx context.Context, h ServiceEntryEventHandler, predicates ...predicate.Predicate) error
+}
+
+type serviceEntryEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewServiceEntryEventWatcher(name string, mgr manager.Manager) ServiceEntryEventWatcher {
+	return &serviceEntryEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.ServiceEntry{}),
+	}
+}
+
+func (c *serviceEntryEventWatcher) AddEventHandler(ctx context.Context, h ServiceEntryEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericServiceEntryHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericServiceEntryHandler implements a generic events.EventHandler
+type genericServiceEntryHandler struct {
+	handler ServiceEntryEventHandler
+}
+
+func (h genericServiceEntryHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return h.handler.CreateServiceEntry(obj)
+}
+
+func (h genericServiceEntryHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return h.handler.DeleteServiceEntry(obj)
+}
+
+func (h genericServiceEntryHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", new)
+	}
+	return h.handler.UpdateServiceEntry(objOld, objNew)
+}
+
+func (h genericServiceEntryHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return h.handler.GenericServiceEntry(obj)
+}
+
+// Handle events for the WorkloadEntry Resource
+// DEPRECATED: Prefer reconciler pattern.
+type WorkloadEntryEventHandler interface {
+	CreateWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error
+	UpdateWorkloadEntry(old, new *networking_istio_io_v1.WorkloadEntry) error
+	DeleteWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error
+	GenericWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error
+}
+
+type WorkloadEntryEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.WorkloadEntry) error
+	OnUpdate  func(old, new *networking_istio_io_v1.WorkloadEntry) error
+	OnDelete  func(obj *networking_istio_io_v1.WorkloadEntry) error
+	OnGeneric func(obj *networking_istio_io_v1.WorkloadEntry) error
+}
+
+func (f *WorkloadEntryEventHandlerFuncs) CreateWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *WorkloadEntryEventHandlerFuncs) DeleteWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *WorkloadEntryEventHandlerFuncs) UpdateWorkloadEntry(objOld, objNew *networking_istio_io_v1.WorkloadEntry) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *WorkloadEntryEventHandlerFuncs) GenericWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type WorkloadEntryEventWatcher interface {
+	AddEventHandler(ctx context.Context, h WorkloadEntryEventHandler, predicates ...predicate.Predicate) error
+}
+
+type workloadEntryEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewWorkloadEntryEventWatcher(name string, mgr manager.Manager) WorkloadEntryEventWatcher {
+	return &workloadEntryEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.WorkloadEntry{}),
+	}
+}
+
+func (c *workloadEntryEventWatcher) AddEventHandler(ctx context.Context, h WorkloadEntryEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericWorkloadEntryHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericWorkloadEntryHandler implements a generic events.EventHandler
+type genericWorkloadEntryHandler struct {
+	handler WorkloadEntryEventHandler
+}
+
+func (h genericWorkloadEntryHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return h.handler.CreateWorkloadEntry(obj)
+}
+
+func (h genericWorkloadEntryHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return h.handler.DeleteWorkloadEntry(obj)
+}
+
+func (h genericWorkloadEntryHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", new)
+	}
+	return h.handler.UpdateWorkloadEntry(objOld, objNew)
+}
+
+func (h genericWorkloadEntryHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return h.handler.GenericWorkloadEntry(obj)
+}
+
+// Handle events for the WorkloadGroup Resource
+// DEPRECATED: Prefer reconciler pattern.
+type WorkloadGroupEventHandler interface {
+	CreateWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error
+	UpdateWorkloadGroup(old, new *networking_istio_io_v1.WorkloadGroup) error
+	DeleteWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error
+	GenericWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error
+}
+
+type WorkloadGroupEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.WorkloadGroup) error
+	OnUpdate  func(old, new *networking_istio_io_v1.WorkloadGroup) error
+	OnDelete  func(obj *networking_istio_io_v1.WorkloadGroup) error
+	OnGeneric func(obj *networking_istio_io_v1.WorkloadGroup) error
+}
+
+func (f *WorkloadGroupEventHandlerFuncs) CreateWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *WorkloadGroupEventHandlerFuncs) DeleteWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *WorkloadGroupEventHandlerFuncs) UpdateWorkloadGroup(objOld, objNew *networking_istio_io_v1.WorkloadGroup) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *WorkloadGroupEventHandlerFuncs) GenericWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type WorkloadGroupEventWatcher interface {
+	AddEventHandler(ctx context.Context, h WorkloadGroupEventHandler, predicates ...predicate.Predicate) error
+}
+
+type workloadGroupEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewWorkloadGroupEventWatcher(name string, mgr manager.Manager) WorkloadGroupEventWatcher {
+	return &workloadGroupEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.WorkloadGroup{}),
+	}
+}
+
+func (c *workloadGroupEventWatcher) AddEventHandler(ctx context.Context, h WorkloadGroupEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericWorkloadGroupHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericWorkloadGroupHandler implements a generic events.EventHandler
+type genericWorkloadGroupHandler struct {
+	handler WorkloadGroupEventHandler
+}
+
+func (h genericWorkloadGroupHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return h.handler.CreateWorkloadGroup(obj)
+}
+
+func (h genericWorkloadGroupHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return h.handler.DeleteWorkloadGroup(obj)
+}
+
+func (h genericWorkloadGroupHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", new)
+	}
+	return h.handler.UpdateWorkloadGroup(objOld, objNew)
+}
+
+func (h genericWorkloadGroupHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return h.handler.GenericWorkloadGroup(obj)
+}
+
+// Handle events for the VirtualService Resource
+// DEPRECATED: Prefer reconciler pattern.
+type VirtualServiceEventHandler interface {
+	CreateVirtualService(obj *networking_istio_io_v1.VirtualService) error
+	UpdateVirtualService(old, new *networking_istio_io_v1.VirtualService) error
+	DeleteVirtualService(obj *networking_istio_io_v1.VirtualService) error
+	GenericVirtualService(obj *networking_istio_io_v1.VirtualService) error
+}
+
+type VirtualServiceEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.VirtualService) error
+	OnUpdate  func(old, new *networking_istio_io_v1.VirtualService) error
+	OnDelete  func(obj *networking_istio_io_v1.VirtualService) error
+	OnGeneric func(obj *networking_istio_io_v1.VirtualService) error
+}
+
+func (f *VirtualServiceEventHandlerFuncs) CreateVirtualService(obj *networking_istio_io_v1.VirtualService) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *VirtualServiceEventHandlerFuncs) DeleteVirtualService(obj *networking_istio_io_v1.VirtualService) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *VirtualServiceEventHandlerFuncs) UpdateVirtualService(objOld, objNew *networking_istio_io_v1.VirtualService) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *VirtualServiceEventHandlerFuncs) GenericVirtualService(obj *networking_istio_io_v1.VirtualService) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type VirtualServiceEventWatcher interface {
+	AddEventHandler(ctx context.Context, h VirtualServiceEventHandler, predicates ...predicate.Predicate) error
+}
+
+type virtualServiceEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewVirtualServiceEventWatcher(name string, mgr manager.Manager) VirtualServiceEventWatcher {
+	return &virtualServiceEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.VirtualService{}),
+	}
+}
+
+func (c *virtualServiceEventWatcher) AddEventHandler(ctx context.Context, h VirtualServiceEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericVirtualServiceHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericVirtualServiceHandler implements a generic events.EventHandler
+type genericVirtualServiceHandler struct {
+	handler VirtualServiceEventHandler
+}
+
+func (h genericVirtualServiceHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return h.handler.CreateVirtualService(obj)
+}
+
+func (h genericVirtualServiceHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return h.handler.DeleteVirtualService(obj)
+}
+
+func (h genericVirtualServiceHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", new)
+	}
+	return h.handler.UpdateVirtualService(objOld, objNew)
+}
+
+func (h genericVirtualServiceHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return h.handler.GenericVirtualService(obj)
+}
+
+// Handle events for the Sidecar Resource
+// DEPRECATED: Prefer reconciler pattern.
+type SidecarEventHandler interface {
+	CreateSidecar(obj *networking_istio_io_v1.Sidecar) error
+	UpdateSidecar(old, new *networking_istio_io_v1.Sidecar) error
+	DeleteSidecar(obj *networking_istio_io_v1.Sidecar) error
+	GenericSidecar(obj *networking_istio_io_v1.Sidecar) error
+}
+
+type SidecarEventHandlerFuncs struct {
+	OnCreate  func(obj *networking_istio_io_v1.Sidecar) error
+	OnUpdate  func(old, new *networking_istio_io_v1.Sidecar) error
+	OnDelete  func(obj *networking_istio_io_v1.Sidecar) error
+	OnGeneric func(obj *networking_istio_io_v1.Sidecar) error
+}
+
+func (f *SidecarEventHandlerFuncs) CreateSidecar(obj *networking_istio_io_v1.Sidecar) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *SidecarEventHandlerFuncs) DeleteSidecar(obj *networking_istio_io_v1.Sidecar) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *SidecarEventHandlerFuncs) UpdateSidecar(objOld, objNew *networking_istio_io_v1.Sidecar) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *SidecarEventHandlerFuncs) GenericSidecar(obj *networking_istio_io_v1.Sidecar) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type SidecarEventWatcher interface {
+	AddEventHandler(ctx context.Context, h SidecarEventHandler, predicates ...predicate.Predicate) error
+}
+
+type sidecarEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewSidecarEventWatcher(name string, mgr manager.Manager) SidecarEventWatcher {
+	return &sidecarEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &networking_istio_io_v1.Sidecar{}),
+	}
+}
+
+func (c *sidecarEventWatcher) AddEventHandler(ctx context.Context, h SidecarEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericSidecarHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericSidecarHandler implements a generic events.EventHandler
+type genericSidecarHandler struct {
+	handler SidecarEventHandler
+}
+
+func (h genericSidecarHandler) Create(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return h.handler.CreateSidecar(obj)
+}
+
+func (h genericSidecarHandler) Delete(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return h.handler.DeleteSidecar(obj)
+}
+
+func (h genericSidecarHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", old)
+	}
+	objNew, ok := new.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", new)
+	}
+	return h.handler.UpdateSidecar(objOld, objNew)
+}
+
+func (h genericSidecarHandler) Generic(object client.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return h.handler.GenericSidecar(obj)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/mocks/event_handlers.go b/pkg/api/istio/networking.istio.io/v1/controller/mocks/event_handlers.go
new file mode 100644
index 0000000..7030f89
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/mocks/event_handlers.go
@@ -0,0 +1,862 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./event_handlers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1/controller"
+	v1 "istio.io/client-go/pkg/apis/networking/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockDestinationRuleEventHandler is a mock of DestinationRuleEventHandler interface.
+type MockDestinationRuleEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleEventHandlerMockRecorder
+}
+
+// MockDestinationRuleEventHandlerMockRecorder is the mock recorder for MockDestinationRuleEventHandler.
+type MockDestinationRuleEventHandlerMockRecorder struct {
+	mock *MockDestinationRuleEventHandler
+}
+
+// NewMockDestinationRuleEventHandler creates a new mock instance.
+func NewMockDestinationRuleEventHandler(ctrl *gomock.Controller) *MockDestinationRuleEventHandler {
+	mock := &MockDestinationRuleEventHandler{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleEventHandler) EXPECT() *MockDestinationRuleEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateDestinationRule mocks base method.
+func (m *MockDestinationRuleEventHandler) CreateDestinationRule(obj *v1.DestinationRule) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateDestinationRule", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateDestinationRule indicates an expected call of CreateDestinationRule.
+func (mr *MockDestinationRuleEventHandlerMockRecorder) CreateDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDestinationRule", reflect.TypeOf((*MockDestinationRuleEventHandler)(nil).CreateDestinationRule), obj)
+}
+
+// DeleteDestinationRule mocks base method.
+func (m *MockDestinationRuleEventHandler) DeleteDestinationRule(obj *v1.DestinationRule) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteDestinationRule", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteDestinationRule indicates an expected call of DeleteDestinationRule.
+func (mr *MockDestinationRuleEventHandlerMockRecorder) DeleteDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDestinationRule", reflect.TypeOf((*MockDestinationRuleEventHandler)(nil).DeleteDestinationRule), obj)
+}
+
+// GenericDestinationRule mocks base method.
+func (m *MockDestinationRuleEventHandler) GenericDestinationRule(obj *v1.DestinationRule) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericDestinationRule", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericDestinationRule indicates an expected call of GenericDestinationRule.
+func (mr *MockDestinationRuleEventHandlerMockRecorder) GenericDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericDestinationRule", reflect.TypeOf((*MockDestinationRuleEventHandler)(nil).GenericDestinationRule), obj)
+}
+
+// UpdateDestinationRule mocks base method.
+func (m *MockDestinationRuleEventHandler) UpdateDestinationRule(old, new *v1.DestinationRule) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateDestinationRule", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateDestinationRule indicates an expected call of UpdateDestinationRule.
+func (mr *MockDestinationRuleEventHandlerMockRecorder) UpdateDestinationRule(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDestinationRule", reflect.TypeOf((*MockDestinationRuleEventHandler)(nil).UpdateDestinationRule), old, new)
+}
+
+// MockDestinationRuleEventWatcher is a mock of DestinationRuleEventWatcher interface.
+type MockDestinationRuleEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleEventWatcherMockRecorder
+}
+
+// MockDestinationRuleEventWatcherMockRecorder is the mock recorder for MockDestinationRuleEventWatcher.
+type MockDestinationRuleEventWatcherMockRecorder struct {
+	mock *MockDestinationRuleEventWatcher
+}
+
+// NewMockDestinationRuleEventWatcher creates a new mock instance.
+func NewMockDestinationRuleEventWatcher(ctrl *gomock.Controller) *MockDestinationRuleEventWatcher {
+	mock := &MockDestinationRuleEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleEventWatcher) EXPECT() *MockDestinationRuleEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockDestinationRuleEventWatcher) AddEventHandler(ctx context.Context, h controller.DestinationRuleEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockDestinationRuleEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockDestinationRuleEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockGatewayEventHandler is a mock of GatewayEventHandler interface.
+type MockGatewayEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayEventHandlerMockRecorder
+}
+
+// MockGatewayEventHandlerMockRecorder is the mock recorder for MockGatewayEventHandler.
+type MockGatewayEventHandlerMockRecorder struct {
+	mock *MockGatewayEventHandler
+}
+
+// NewMockGatewayEventHandler creates a new mock instance.
+func NewMockGatewayEventHandler(ctrl *gomock.Controller) *MockGatewayEventHandler {
+	mock := &MockGatewayEventHandler{ctrl: ctrl}
+	mock.recorder = &MockGatewayEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayEventHandler) EXPECT() *MockGatewayEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateGateway mocks base method.
+func (m *MockGatewayEventHandler) CreateGateway(obj *v1.Gateway) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateGateway", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateGateway indicates an expected call of CreateGateway.
+func (mr *MockGatewayEventHandlerMockRecorder) CreateGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGateway", reflect.TypeOf((*MockGatewayEventHandler)(nil).CreateGateway), obj)
+}
+
+// DeleteGateway mocks base method.
+func (m *MockGatewayEventHandler) DeleteGateway(obj *v1.Gateway) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteGateway", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteGateway indicates an expected call of DeleteGateway.
+func (mr *MockGatewayEventHandlerMockRecorder) DeleteGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGateway", reflect.TypeOf((*MockGatewayEventHandler)(nil).DeleteGateway), obj)
+}
+
+// GenericGateway mocks base method.
+func (m *MockGatewayEventHandler) GenericGateway(obj *v1.Gateway) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericGateway", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericGateway indicates an expected call of GenericGateway.
+func (mr *MockGatewayEventHandlerMockRecorder) GenericGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericGateway", reflect.TypeOf((*MockGatewayEventHandler)(nil).GenericGateway), obj)
+}
+
+// UpdateGateway mocks base method.
+func (m *MockGatewayEventHandler) UpdateGateway(old, new *v1.Gateway) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateGateway", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateGateway indicates an expected call of UpdateGateway.
+func (mr *MockGatewayEventHandlerMockRecorder) UpdateGateway(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGateway", reflect.TypeOf((*MockGatewayEventHandler)(nil).UpdateGateway), old, new)
+}
+
+// MockGatewayEventWatcher is a mock of GatewayEventWatcher interface.
+type MockGatewayEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayEventWatcherMockRecorder
+}
+
+// MockGatewayEventWatcherMockRecorder is the mock recorder for MockGatewayEventWatcher.
+type MockGatewayEventWatcherMockRecorder struct {
+	mock *MockGatewayEventWatcher
+}
+
+// NewMockGatewayEventWatcher creates a new mock instance.
+func NewMockGatewayEventWatcher(ctrl *gomock.Controller) *MockGatewayEventWatcher {
+	mock := &MockGatewayEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockGatewayEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayEventWatcher) EXPECT() *MockGatewayEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockGatewayEventWatcher) AddEventHandler(ctx context.Context, h controller.GatewayEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockGatewayEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockGatewayEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockServiceEntryEventHandler is a mock of ServiceEntryEventHandler interface.
+type MockServiceEntryEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryEventHandlerMockRecorder
+}
+
+// MockServiceEntryEventHandlerMockRecorder is the mock recorder for MockServiceEntryEventHandler.
+type MockServiceEntryEventHandlerMockRecorder struct {
+	mock *MockServiceEntryEventHandler
+}
+
+// NewMockServiceEntryEventHandler creates a new mock instance.
+func NewMockServiceEntryEventHandler(ctrl *gomock.Controller) *MockServiceEntryEventHandler {
+	mock := &MockServiceEntryEventHandler{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryEventHandler) EXPECT() *MockServiceEntryEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateServiceEntry mocks base method.
+func (m *MockServiceEntryEventHandler) CreateServiceEntry(obj *v1.ServiceEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateServiceEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateServiceEntry indicates an expected call of CreateServiceEntry.
+func (mr *MockServiceEntryEventHandlerMockRecorder) CreateServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateServiceEntry", reflect.TypeOf((*MockServiceEntryEventHandler)(nil).CreateServiceEntry), obj)
+}
+
+// DeleteServiceEntry mocks base method.
+func (m *MockServiceEntryEventHandler) DeleteServiceEntry(obj *v1.ServiceEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteServiceEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteServiceEntry indicates an expected call of DeleteServiceEntry.
+func (mr *MockServiceEntryEventHandlerMockRecorder) DeleteServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteServiceEntry", reflect.TypeOf((*MockServiceEntryEventHandler)(nil).DeleteServiceEntry), obj)
+}
+
+// GenericServiceEntry mocks base method.
+func (m *MockServiceEntryEventHandler) GenericServiceEntry(obj *v1.ServiceEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericServiceEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericServiceEntry indicates an expected call of GenericServiceEntry.
+func (mr *MockServiceEntryEventHandlerMockRecorder) GenericServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericServiceEntry", reflect.TypeOf((*MockServiceEntryEventHandler)(nil).GenericServiceEntry), obj)
+}
+
+// UpdateServiceEntry mocks base method.
+func (m *MockServiceEntryEventHandler) UpdateServiceEntry(old, new *v1.ServiceEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateServiceEntry", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateServiceEntry indicates an expected call of UpdateServiceEntry.
+func (mr *MockServiceEntryEventHandlerMockRecorder) UpdateServiceEntry(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateServiceEntry", reflect.TypeOf((*MockServiceEntryEventHandler)(nil).UpdateServiceEntry), old, new)
+}
+
+// MockServiceEntryEventWatcher is a mock of ServiceEntryEventWatcher interface.
+type MockServiceEntryEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryEventWatcherMockRecorder
+}
+
+// MockServiceEntryEventWatcherMockRecorder is the mock recorder for MockServiceEntryEventWatcher.
+type MockServiceEntryEventWatcherMockRecorder struct {
+	mock *MockServiceEntryEventWatcher
+}
+
+// NewMockServiceEntryEventWatcher creates a new mock instance.
+func NewMockServiceEntryEventWatcher(ctrl *gomock.Controller) *MockServiceEntryEventWatcher {
+	mock := &MockServiceEntryEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryEventWatcher) EXPECT() *MockServiceEntryEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockServiceEntryEventWatcher) AddEventHandler(ctx context.Context, h controller.ServiceEntryEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockServiceEntryEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockServiceEntryEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockWorkloadEntryEventHandler is a mock of WorkloadEntryEventHandler interface.
+type MockWorkloadEntryEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryEventHandlerMockRecorder
+}
+
+// MockWorkloadEntryEventHandlerMockRecorder is the mock recorder for MockWorkloadEntryEventHandler.
+type MockWorkloadEntryEventHandlerMockRecorder struct {
+	mock *MockWorkloadEntryEventHandler
+}
+
+// NewMockWorkloadEntryEventHandler creates a new mock instance.
+func NewMockWorkloadEntryEventHandler(ctrl *gomock.Controller) *MockWorkloadEntryEventHandler {
+	mock := &MockWorkloadEntryEventHandler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryEventHandler) EXPECT() *MockWorkloadEntryEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryEventHandler) CreateWorkloadEntry(obj *v1.WorkloadEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateWorkloadEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadEntry indicates an expected call of CreateWorkloadEntry.
+func (mr *MockWorkloadEntryEventHandlerMockRecorder) CreateWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryEventHandler)(nil).CreateWorkloadEntry), obj)
+}
+
+// DeleteWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryEventHandler) DeleteWorkloadEntry(obj *v1.WorkloadEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteWorkloadEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadEntry indicates an expected call of DeleteWorkloadEntry.
+func (mr *MockWorkloadEntryEventHandlerMockRecorder) DeleteWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryEventHandler)(nil).DeleteWorkloadEntry), obj)
+}
+
+// GenericWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryEventHandler) GenericWorkloadEntry(obj *v1.WorkloadEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericWorkloadEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericWorkloadEntry indicates an expected call of GenericWorkloadEntry.
+func (mr *MockWorkloadEntryEventHandlerMockRecorder) GenericWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryEventHandler)(nil).GenericWorkloadEntry), obj)
+}
+
+// UpdateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryEventHandler) UpdateWorkloadEntry(old, new *v1.WorkloadEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateWorkloadEntry", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadEntry indicates an expected call of UpdateWorkloadEntry.
+func (mr *MockWorkloadEntryEventHandlerMockRecorder) UpdateWorkloadEntry(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryEventHandler)(nil).UpdateWorkloadEntry), old, new)
+}
+
+// MockWorkloadEntryEventWatcher is a mock of WorkloadEntryEventWatcher interface.
+type MockWorkloadEntryEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryEventWatcherMockRecorder
+}
+
+// MockWorkloadEntryEventWatcherMockRecorder is the mock recorder for MockWorkloadEntryEventWatcher.
+type MockWorkloadEntryEventWatcherMockRecorder struct {
+	mock *MockWorkloadEntryEventWatcher
+}
+
+// NewMockWorkloadEntryEventWatcher creates a new mock instance.
+func NewMockWorkloadEntryEventWatcher(ctrl *gomock.Controller) *MockWorkloadEntryEventWatcher {
+	mock := &MockWorkloadEntryEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryEventWatcher) EXPECT() *MockWorkloadEntryEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockWorkloadEntryEventWatcher) AddEventHandler(ctx context.Context, h controller.WorkloadEntryEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockWorkloadEntryEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockWorkloadEntryEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockWorkloadGroupEventHandler is a mock of WorkloadGroupEventHandler interface.
+type MockWorkloadGroupEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupEventHandlerMockRecorder
+}
+
+// MockWorkloadGroupEventHandlerMockRecorder is the mock recorder for MockWorkloadGroupEventHandler.
+type MockWorkloadGroupEventHandlerMockRecorder struct {
+	mock *MockWorkloadGroupEventHandler
+}
+
+// NewMockWorkloadGroupEventHandler creates a new mock instance.
+func NewMockWorkloadGroupEventHandler(ctrl *gomock.Controller) *MockWorkloadGroupEventHandler {
+	mock := &MockWorkloadGroupEventHandler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupEventHandler) EXPECT() *MockWorkloadGroupEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupEventHandler) CreateWorkloadGroup(obj *v1.WorkloadGroup) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateWorkloadGroup", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadGroup indicates an expected call of CreateWorkloadGroup.
+func (mr *MockWorkloadGroupEventHandlerMockRecorder) CreateWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupEventHandler)(nil).CreateWorkloadGroup), obj)
+}
+
+// DeleteWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupEventHandler) DeleteWorkloadGroup(obj *v1.WorkloadGroup) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteWorkloadGroup", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadGroup indicates an expected call of DeleteWorkloadGroup.
+func (mr *MockWorkloadGroupEventHandlerMockRecorder) DeleteWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupEventHandler)(nil).DeleteWorkloadGroup), obj)
+}
+
+// GenericWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupEventHandler) GenericWorkloadGroup(obj *v1.WorkloadGroup) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericWorkloadGroup", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericWorkloadGroup indicates an expected call of GenericWorkloadGroup.
+func (mr *MockWorkloadGroupEventHandlerMockRecorder) GenericWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupEventHandler)(nil).GenericWorkloadGroup), obj)
+}
+
+// UpdateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupEventHandler) UpdateWorkloadGroup(old, new *v1.WorkloadGroup) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateWorkloadGroup", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadGroup indicates an expected call of UpdateWorkloadGroup.
+func (mr *MockWorkloadGroupEventHandlerMockRecorder) UpdateWorkloadGroup(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupEventHandler)(nil).UpdateWorkloadGroup), old, new)
+}
+
+// MockWorkloadGroupEventWatcher is a mock of WorkloadGroupEventWatcher interface.
+type MockWorkloadGroupEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupEventWatcherMockRecorder
+}
+
+// MockWorkloadGroupEventWatcherMockRecorder is the mock recorder for MockWorkloadGroupEventWatcher.
+type MockWorkloadGroupEventWatcherMockRecorder struct {
+	mock *MockWorkloadGroupEventWatcher
+}
+
+// NewMockWorkloadGroupEventWatcher creates a new mock instance.
+func NewMockWorkloadGroupEventWatcher(ctrl *gomock.Controller) *MockWorkloadGroupEventWatcher {
+	mock := &MockWorkloadGroupEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupEventWatcher) EXPECT() *MockWorkloadGroupEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockWorkloadGroupEventWatcher) AddEventHandler(ctx context.Context, h controller.WorkloadGroupEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockWorkloadGroupEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockWorkloadGroupEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockVirtualServiceEventHandler is a mock of VirtualServiceEventHandler interface.
+type MockVirtualServiceEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceEventHandlerMockRecorder
+}
+
+// MockVirtualServiceEventHandlerMockRecorder is the mock recorder for MockVirtualServiceEventHandler.
+type MockVirtualServiceEventHandlerMockRecorder struct {
+	mock *MockVirtualServiceEventHandler
+}
+
+// NewMockVirtualServiceEventHandler creates a new mock instance.
+func NewMockVirtualServiceEventHandler(ctrl *gomock.Controller) *MockVirtualServiceEventHandler {
+	mock := &MockVirtualServiceEventHandler{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceEventHandler) EXPECT() *MockVirtualServiceEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateVirtualService mocks base method.
+func (m *MockVirtualServiceEventHandler) CreateVirtualService(obj *v1.VirtualService) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateVirtualService", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateVirtualService indicates an expected call of CreateVirtualService.
+func (mr *MockVirtualServiceEventHandlerMockRecorder) CreateVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateVirtualService", reflect.TypeOf((*MockVirtualServiceEventHandler)(nil).CreateVirtualService), obj)
+}
+
+// DeleteVirtualService mocks base method.
+func (m *MockVirtualServiceEventHandler) DeleteVirtualService(obj *v1.VirtualService) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteVirtualService", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteVirtualService indicates an expected call of DeleteVirtualService.
+func (mr *MockVirtualServiceEventHandlerMockRecorder) DeleteVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteVirtualService", reflect.TypeOf((*MockVirtualServiceEventHandler)(nil).DeleteVirtualService), obj)
+}
+
+// GenericVirtualService mocks base method.
+func (m *MockVirtualServiceEventHandler) GenericVirtualService(obj *v1.VirtualService) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericVirtualService", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericVirtualService indicates an expected call of GenericVirtualService.
+func (mr *MockVirtualServiceEventHandlerMockRecorder) GenericVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericVirtualService", reflect.TypeOf((*MockVirtualServiceEventHandler)(nil).GenericVirtualService), obj)
+}
+
+// UpdateVirtualService mocks base method.
+func (m *MockVirtualServiceEventHandler) UpdateVirtualService(old, new *v1.VirtualService) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateVirtualService", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateVirtualService indicates an expected call of UpdateVirtualService.
+func (mr *MockVirtualServiceEventHandlerMockRecorder) UpdateVirtualService(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualService", reflect.TypeOf((*MockVirtualServiceEventHandler)(nil).UpdateVirtualService), old, new)
+}
+
+// MockVirtualServiceEventWatcher is a mock of VirtualServiceEventWatcher interface.
+type MockVirtualServiceEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceEventWatcherMockRecorder
+}
+
+// MockVirtualServiceEventWatcherMockRecorder is the mock recorder for MockVirtualServiceEventWatcher.
+type MockVirtualServiceEventWatcherMockRecorder struct {
+	mock *MockVirtualServiceEventWatcher
+}
+
+// NewMockVirtualServiceEventWatcher creates a new mock instance.
+func NewMockVirtualServiceEventWatcher(ctrl *gomock.Controller) *MockVirtualServiceEventWatcher {
+	mock := &MockVirtualServiceEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceEventWatcher) EXPECT() *MockVirtualServiceEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockVirtualServiceEventWatcher) AddEventHandler(ctx context.Context, h controller.VirtualServiceEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockVirtualServiceEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockVirtualServiceEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockSidecarEventHandler is a mock of SidecarEventHandler interface.
+type MockSidecarEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarEventHandlerMockRecorder
+}
+
+// MockSidecarEventHandlerMockRecorder is the mock recorder for MockSidecarEventHandler.
+type MockSidecarEventHandlerMockRecorder struct {
+	mock *MockSidecarEventHandler
+}
+
+// NewMockSidecarEventHandler creates a new mock instance.
+func NewMockSidecarEventHandler(ctrl *gomock.Controller) *MockSidecarEventHandler {
+	mock := &MockSidecarEventHandler{ctrl: ctrl}
+	mock.recorder = &MockSidecarEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarEventHandler) EXPECT() *MockSidecarEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateSidecar mocks base method.
+func (m *MockSidecarEventHandler) CreateSidecar(obj *v1.Sidecar) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateSidecar", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateSidecar indicates an expected call of CreateSidecar.
+func (mr *MockSidecarEventHandlerMockRecorder) CreateSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSidecar", reflect.TypeOf((*MockSidecarEventHandler)(nil).CreateSidecar), obj)
+}
+
+// DeleteSidecar mocks base method.
+func (m *MockSidecarEventHandler) DeleteSidecar(obj *v1.Sidecar) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteSidecar", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteSidecar indicates an expected call of DeleteSidecar.
+func (mr *MockSidecarEventHandlerMockRecorder) DeleteSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSidecar", reflect.TypeOf((*MockSidecarEventHandler)(nil).DeleteSidecar), obj)
+}
+
+// GenericSidecar mocks base method.
+func (m *MockSidecarEventHandler) GenericSidecar(obj *v1.Sidecar) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericSidecar", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericSidecar indicates an expected call of GenericSidecar.
+func (mr *MockSidecarEventHandlerMockRecorder) GenericSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericSidecar", reflect.TypeOf((*MockSidecarEventHandler)(nil).GenericSidecar), obj)
+}
+
+// UpdateSidecar mocks base method.
+func (m *MockSidecarEventHandler) UpdateSidecar(old, new *v1.Sidecar) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateSidecar", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateSidecar indicates an expected call of UpdateSidecar.
+func (mr *MockSidecarEventHandlerMockRecorder) UpdateSidecar(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSidecar", reflect.TypeOf((*MockSidecarEventHandler)(nil).UpdateSidecar), old, new)
+}
+
+// MockSidecarEventWatcher is a mock of SidecarEventWatcher interface.
+type MockSidecarEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarEventWatcherMockRecorder
+}
+
+// MockSidecarEventWatcherMockRecorder is the mock recorder for MockSidecarEventWatcher.
+type MockSidecarEventWatcherMockRecorder struct {
+	mock *MockSidecarEventWatcher
+}
+
+// NewMockSidecarEventWatcher creates a new mock instance.
+func NewMockSidecarEventWatcher(ctrl *gomock.Controller) *MockSidecarEventWatcher {
+	mock := &MockSidecarEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockSidecarEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarEventWatcher) EXPECT() *MockSidecarEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockSidecarEventWatcher) AddEventHandler(ctx context.Context, h controller.SidecarEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockSidecarEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockSidecarEventWatcher)(nil).AddEventHandler), varargs...)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/mocks/multicluster_reconcilers.go b/pkg/api/istio/networking.istio.io/v1/controller/mocks/multicluster_reconcilers.go
new file mode 100644
index 0000000..bd56ad8
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/mocks/multicluster_reconcilers.go
@@ -0,0 +1,821 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./multicluster_reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/networking/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockMulticlusterDestinationRuleReconciler is a mock of MulticlusterDestinationRuleReconciler interface.
+type MockMulticlusterDestinationRuleReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterDestinationRuleReconcilerMockRecorder
+}
+
+// MockMulticlusterDestinationRuleReconcilerMockRecorder is the mock recorder for MockMulticlusterDestinationRuleReconciler.
+type MockMulticlusterDestinationRuleReconcilerMockRecorder struct {
+	mock *MockMulticlusterDestinationRuleReconciler
+}
+
+// NewMockMulticlusterDestinationRuleReconciler creates a new mock instance.
+func NewMockMulticlusterDestinationRuleReconciler(ctrl *gomock.Controller) *MockMulticlusterDestinationRuleReconciler {
+	mock := &MockMulticlusterDestinationRuleReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterDestinationRuleReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterDestinationRuleReconciler) EXPECT() *MockMulticlusterDestinationRuleReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileDestinationRule mocks base method.
+func (m *MockMulticlusterDestinationRuleReconciler) ReconcileDestinationRule(clusterName string, obj *v1.DestinationRule) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileDestinationRule", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileDestinationRule indicates an expected call of ReconcileDestinationRule.
+func (mr *MockMulticlusterDestinationRuleReconcilerMockRecorder) ReconcileDestinationRule(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileDestinationRule", reflect.TypeOf((*MockMulticlusterDestinationRuleReconciler)(nil).ReconcileDestinationRule), clusterName, obj)
+}
+
+// MockMulticlusterDestinationRuleDeletionReconciler is a mock of MulticlusterDestinationRuleDeletionReconciler interface.
+type MockMulticlusterDestinationRuleDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterDestinationRuleDeletionReconciler.
+type MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterDestinationRuleDeletionReconciler
+}
+
+// NewMockMulticlusterDestinationRuleDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterDestinationRuleDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterDestinationRuleDeletionReconciler {
+	mock := &MockMulticlusterDestinationRuleDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterDestinationRuleDeletionReconciler) EXPECT() *MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileDestinationRuleDeletion mocks base method.
+func (m *MockMulticlusterDestinationRuleDeletionReconciler) ReconcileDestinationRuleDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileDestinationRuleDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileDestinationRuleDeletion indicates an expected call of ReconcileDestinationRuleDeletion.
+func (mr *MockMulticlusterDestinationRuleDeletionReconcilerMockRecorder) ReconcileDestinationRuleDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileDestinationRuleDeletion", reflect.TypeOf((*MockMulticlusterDestinationRuleDeletionReconciler)(nil).ReconcileDestinationRuleDeletion), clusterName, req)
+}
+
+// MockMulticlusterDestinationRuleReconcileLoop is a mock of MulticlusterDestinationRuleReconcileLoop interface.
+type MockMulticlusterDestinationRuleReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterDestinationRuleReconcileLoopMockRecorder
+}
+
+// MockMulticlusterDestinationRuleReconcileLoopMockRecorder is the mock recorder for MockMulticlusterDestinationRuleReconcileLoop.
+type MockMulticlusterDestinationRuleReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterDestinationRuleReconcileLoop
+}
+
+// NewMockMulticlusterDestinationRuleReconcileLoop creates a new mock instance.
+func NewMockMulticlusterDestinationRuleReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterDestinationRuleReconcileLoop {
+	mock := &MockMulticlusterDestinationRuleReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterDestinationRuleReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterDestinationRuleReconcileLoop) EXPECT() *MockMulticlusterDestinationRuleReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterDestinationRuleReconciler mocks base method.
+func (m *MockMulticlusterDestinationRuleReconcileLoop) AddMulticlusterDestinationRuleReconciler(ctx context.Context, rec controller.MulticlusterDestinationRuleReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterDestinationRuleReconciler", varargs...)
+}
+
+// AddMulticlusterDestinationRuleReconciler indicates an expected call of AddMulticlusterDestinationRuleReconciler.
+func (mr *MockMulticlusterDestinationRuleReconcileLoopMockRecorder) AddMulticlusterDestinationRuleReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterDestinationRuleReconciler", reflect.TypeOf((*MockMulticlusterDestinationRuleReconcileLoop)(nil).AddMulticlusterDestinationRuleReconciler), varargs...)
+}
+
+// MockMulticlusterGatewayReconciler is a mock of MulticlusterGatewayReconciler interface.
+type MockMulticlusterGatewayReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterGatewayReconcilerMockRecorder
+}
+
+// MockMulticlusterGatewayReconcilerMockRecorder is the mock recorder for MockMulticlusterGatewayReconciler.
+type MockMulticlusterGatewayReconcilerMockRecorder struct {
+	mock *MockMulticlusterGatewayReconciler
+}
+
+// NewMockMulticlusterGatewayReconciler creates a new mock instance.
+func NewMockMulticlusterGatewayReconciler(ctrl *gomock.Controller) *MockMulticlusterGatewayReconciler {
+	mock := &MockMulticlusterGatewayReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterGatewayReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterGatewayReconciler) EXPECT() *MockMulticlusterGatewayReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileGateway mocks base method.
+func (m *MockMulticlusterGatewayReconciler) ReconcileGateway(clusterName string, obj *v1.Gateway) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileGateway", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileGateway indicates an expected call of ReconcileGateway.
+func (mr *MockMulticlusterGatewayReconcilerMockRecorder) ReconcileGateway(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileGateway", reflect.TypeOf((*MockMulticlusterGatewayReconciler)(nil).ReconcileGateway), clusterName, obj)
+}
+
+// MockMulticlusterGatewayDeletionReconciler is a mock of MulticlusterGatewayDeletionReconciler interface.
+type MockMulticlusterGatewayDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterGatewayDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterGatewayDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterGatewayDeletionReconciler.
+type MockMulticlusterGatewayDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterGatewayDeletionReconciler
+}
+
+// NewMockMulticlusterGatewayDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterGatewayDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterGatewayDeletionReconciler {
+	mock := &MockMulticlusterGatewayDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterGatewayDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterGatewayDeletionReconciler) EXPECT() *MockMulticlusterGatewayDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileGatewayDeletion mocks base method.
+func (m *MockMulticlusterGatewayDeletionReconciler) ReconcileGatewayDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileGatewayDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileGatewayDeletion indicates an expected call of ReconcileGatewayDeletion.
+func (mr *MockMulticlusterGatewayDeletionReconcilerMockRecorder) ReconcileGatewayDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileGatewayDeletion", reflect.TypeOf((*MockMulticlusterGatewayDeletionReconciler)(nil).ReconcileGatewayDeletion), clusterName, req)
+}
+
+// MockMulticlusterGatewayReconcileLoop is a mock of MulticlusterGatewayReconcileLoop interface.
+type MockMulticlusterGatewayReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterGatewayReconcileLoopMockRecorder
+}
+
+// MockMulticlusterGatewayReconcileLoopMockRecorder is the mock recorder for MockMulticlusterGatewayReconcileLoop.
+type MockMulticlusterGatewayReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterGatewayReconcileLoop
+}
+
+// NewMockMulticlusterGatewayReconcileLoop creates a new mock instance.
+func NewMockMulticlusterGatewayReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterGatewayReconcileLoop {
+	mock := &MockMulticlusterGatewayReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterGatewayReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterGatewayReconcileLoop) EXPECT() *MockMulticlusterGatewayReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterGatewayReconciler mocks base method.
+func (m *MockMulticlusterGatewayReconcileLoop) AddMulticlusterGatewayReconciler(ctx context.Context, rec controller.MulticlusterGatewayReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterGatewayReconciler", varargs...)
+}
+
+// AddMulticlusterGatewayReconciler indicates an expected call of AddMulticlusterGatewayReconciler.
+func (mr *MockMulticlusterGatewayReconcileLoopMockRecorder) AddMulticlusterGatewayReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterGatewayReconciler", reflect.TypeOf((*MockMulticlusterGatewayReconcileLoop)(nil).AddMulticlusterGatewayReconciler), varargs...)
+}
+
+// MockMulticlusterServiceEntryReconciler is a mock of MulticlusterServiceEntryReconciler interface.
+type MockMulticlusterServiceEntryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterServiceEntryReconcilerMockRecorder
+}
+
+// MockMulticlusterServiceEntryReconcilerMockRecorder is the mock recorder for MockMulticlusterServiceEntryReconciler.
+type MockMulticlusterServiceEntryReconcilerMockRecorder struct {
+	mock *MockMulticlusterServiceEntryReconciler
+}
+
+// NewMockMulticlusterServiceEntryReconciler creates a new mock instance.
+func NewMockMulticlusterServiceEntryReconciler(ctrl *gomock.Controller) *MockMulticlusterServiceEntryReconciler {
+	mock := &MockMulticlusterServiceEntryReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterServiceEntryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterServiceEntryReconciler) EXPECT() *MockMulticlusterServiceEntryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileServiceEntry mocks base method.
+func (m *MockMulticlusterServiceEntryReconciler) ReconcileServiceEntry(clusterName string, obj *v1.ServiceEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileServiceEntry", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileServiceEntry indicates an expected call of ReconcileServiceEntry.
+func (mr *MockMulticlusterServiceEntryReconcilerMockRecorder) ReconcileServiceEntry(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileServiceEntry", reflect.TypeOf((*MockMulticlusterServiceEntryReconciler)(nil).ReconcileServiceEntry), clusterName, obj)
+}
+
+// MockMulticlusterServiceEntryDeletionReconciler is a mock of MulticlusterServiceEntryDeletionReconciler interface.
+type MockMulticlusterServiceEntryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterServiceEntryDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterServiceEntryDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterServiceEntryDeletionReconciler.
+type MockMulticlusterServiceEntryDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterServiceEntryDeletionReconciler
+}
+
+// NewMockMulticlusterServiceEntryDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterServiceEntryDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterServiceEntryDeletionReconciler {
+	mock := &MockMulticlusterServiceEntryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterServiceEntryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterServiceEntryDeletionReconciler) EXPECT() *MockMulticlusterServiceEntryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileServiceEntryDeletion mocks base method.
+func (m *MockMulticlusterServiceEntryDeletionReconciler) ReconcileServiceEntryDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileServiceEntryDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileServiceEntryDeletion indicates an expected call of ReconcileServiceEntryDeletion.
+func (mr *MockMulticlusterServiceEntryDeletionReconcilerMockRecorder) ReconcileServiceEntryDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileServiceEntryDeletion", reflect.TypeOf((*MockMulticlusterServiceEntryDeletionReconciler)(nil).ReconcileServiceEntryDeletion), clusterName, req)
+}
+
+// MockMulticlusterServiceEntryReconcileLoop is a mock of MulticlusterServiceEntryReconcileLoop interface.
+type MockMulticlusterServiceEntryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterServiceEntryReconcileLoopMockRecorder
+}
+
+// MockMulticlusterServiceEntryReconcileLoopMockRecorder is the mock recorder for MockMulticlusterServiceEntryReconcileLoop.
+type MockMulticlusterServiceEntryReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterServiceEntryReconcileLoop
+}
+
+// NewMockMulticlusterServiceEntryReconcileLoop creates a new mock instance.
+func NewMockMulticlusterServiceEntryReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterServiceEntryReconcileLoop {
+	mock := &MockMulticlusterServiceEntryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterServiceEntryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterServiceEntryReconcileLoop) EXPECT() *MockMulticlusterServiceEntryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterServiceEntryReconciler mocks base method.
+func (m *MockMulticlusterServiceEntryReconcileLoop) AddMulticlusterServiceEntryReconciler(ctx context.Context, rec controller.MulticlusterServiceEntryReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterServiceEntryReconciler", varargs...)
+}
+
+// AddMulticlusterServiceEntryReconciler indicates an expected call of AddMulticlusterServiceEntryReconciler.
+func (mr *MockMulticlusterServiceEntryReconcileLoopMockRecorder) AddMulticlusterServiceEntryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterServiceEntryReconciler", reflect.TypeOf((*MockMulticlusterServiceEntryReconcileLoop)(nil).AddMulticlusterServiceEntryReconciler), varargs...)
+}
+
+// MockMulticlusterWorkloadEntryReconciler is a mock of MulticlusterWorkloadEntryReconciler interface.
+type MockMulticlusterWorkloadEntryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadEntryReconcilerMockRecorder
+}
+
+// MockMulticlusterWorkloadEntryReconcilerMockRecorder is the mock recorder for MockMulticlusterWorkloadEntryReconciler.
+type MockMulticlusterWorkloadEntryReconcilerMockRecorder struct {
+	mock *MockMulticlusterWorkloadEntryReconciler
+}
+
+// NewMockMulticlusterWorkloadEntryReconciler creates a new mock instance.
+func NewMockMulticlusterWorkloadEntryReconciler(ctrl *gomock.Controller) *MockMulticlusterWorkloadEntryReconciler {
+	mock := &MockMulticlusterWorkloadEntryReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadEntryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadEntryReconciler) EXPECT() *MockMulticlusterWorkloadEntryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadEntry mocks base method.
+func (m *MockMulticlusterWorkloadEntryReconciler) ReconcileWorkloadEntry(clusterName string, obj *v1.WorkloadEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadEntry", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadEntry indicates an expected call of ReconcileWorkloadEntry.
+func (mr *MockMulticlusterWorkloadEntryReconcilerMockRecorder) ReconcileWorkloadEntry(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadEntry", reflect.TypeOf((*MockMulticlusterWorkloadEntryReconciler)(nil).ReconcileWorkloadEntry), clusterName, obj)
+}
+
+// MockMulticlusterWorkloadEntryDeletionReconciler is a mock of MulticlusterWorkloadEntryDeletionReconciler interface.
+type MockMulticlusterWorkloadEntryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterWorkloadEntryDeletionReconciler.
+type MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterWorkloadEntryDeletionReconciler
+}
+
+// NewMockMulticlusterWorkloadEntryDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterWorkloadEntryDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterWorkloadEntryDeletionReconciler {
+	mock := &MockMulticlusterWorkloadEntryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadEntryDeletionReconciler) EXPECT() *MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadEntryDeletion mocks base method.
+func (m *MockMulticlusterWorkloadEntryDeletionReconciler) ReconcileWorkloadEntryDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadEntryDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileWorkloadEntryDeletion indicates an expected call of ReconcileWorkloadEntryDeletion.
+func (mr *MockMulticlusterWorkloadEntryDeletionReconcilerMockRecorder) ReconcileWorkloadEntryDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadEntryDeletion", reflect.TypeOf((*MockMulticlusterWorkloadEntryDeletionReconciler)(nil).ReconcileWorkloadEntryDeletion), clusterName, req)
+}
+
+// MockMulticlusterWorkloadEntryReconcileLoop is a mock of MulticlusterWorkloadEntryReconcileLoop interface.
+type MockMulticlusterWorkloadEntryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadEntryReconcileLoopMockRecorder
+}
+
+// MockMulticlusterWorkloadEntryReconcileLoopMockRecorder is the mock recorder for MockMulticlusterWorkloadEntryReconcileLoop.
+type MockMulticlusterWorkloadEntryReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterWorkloadEntryReconcileLoop
+}
+
+// NewMockMulticlusterWorkloadEntryReconcileLoop creates a new mock instance.
+func NewMockMulticlusterWorkloadEntryReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterWorkloadEntryReconcileLoop {
+	mock := &MockMulticlusterWorkloadEntryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadEntryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadEntryReconcileLoop) EXPECT() *MockMulticlusterWorkloadEntryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterWorkloadEntryReconciler mocks base method.
+func (m *MockMulticlusterWorkloadEntryReconcileLoop) AddMulticlusterWorkloadEntryReconciler(ctx context.Context, rec controller.MulticlusterWorkloadEntryReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterWorkloadEntryReconciler", varargs...)
+}
+
+// AddMulticlusterWorkloadEntryReconciler indicates an expected call of AddMulticlusterWorkloadEntryReconciler.
+func (mr *MockMulticlusterWorkloadEntryReconcileLoopMockRecorder) AddMulticlusterWorkloadEntryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterWorkloadEntryReconciler", reflect.TypeOf((*MockMulticlusterWorkloadEntryReconcileLoop)(nil).AddMulticlusterWorkloadEntryReconciler), varargs...)
+}
+
+// MockMulticlusterWorkloadGroupReconciler is a mock of MulticlusterWorkloadGroupReconciler interface.
+type MockMulticlusterWorkloadGroupReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadGroupReconcilerMockRecorder
+}
+
+// MockMulticlusterWorkloadGroupReconcilerMockRecorder is the mock recorder for MockMulticlusterWorkloadGroupReconciler.
+type MockMulticlusterWorkloadGroupReconcilerMockRecorder struct {
+	mock *MockMulticlusterWorkloadGroupReconciler
+}
+
+// NewMockMulticlusterWorkloadGroupReconciler creates a new mock instance.
+func NewMockMulticlusterWorkloadGroupReconciler(ctrl *gomock.Controller) *MockMulticlusterWorkloadGroupReconciler {
+	mock := &MockMulticlusterWorkloadGroupReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadGroupReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadGroupReconciler) EXPECT() *MockMulticlusterWorkloadGroupReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadGroup mocks base method.
+func (m *MockMulticlusterWorkloadGroupReconciler) ReconcileWorkloadGroup(clusterName string, obj *v1.WorkloadGroup) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadGroup", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadGroup indicates an expected call of ReconcileWorkloadGroup.
+func (mr *MockMulticlusterWorkloadGroupReconcilerMockRecorder) ReconcileWorkloadGroup(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadGroup", reflect.TypeOf((*MockMulticlusterWorkloadGroupReconciler)(nil).ReconcileWorkloadGroup), clusterName, obj)
+}
+
+// MockMulticlusterWorkloadGroupDeletionReconciler is a mock of MulticlusterWorkloadGroupDeletionReconciler interface.
+type MockMulticlusterWorkloadGroupDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterWorkloadGroupDeletionReconciler.
+type MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterWorkloadGroupDeletionReconciler
+}
+
+// NewMockMulticlusterWorkloadGroupDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterWorkloadGroupDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterWorkloadGroupDeletionReconciler {
+	mock := &MockMulticlusterWorkloadGroupDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadGroupDeletionReconciler) EXPECT() *MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadGroupDeletion mocks base method.
+func (m *MockMulticlusterWorkloadGroupDeletionReconciler) ReconcileWorkloadGroupDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadGroupDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileWorkloadGroupDeletion indicates an expected call of ReconcileWorkloadGroupDeletion.
+func (mr *MockMulticlusterWorkloadGroupDeletionReconcilerMockRecorder) ReconcileWorkloadGroupDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadGroupDeletion", reflect.TypeOf((*MockMulticlusterWorkloadGroupDeletionReconciler)(nil).ReconcileWorkloadGroupDeletion), clusterName, req)
+}
+
+// MockMulticlusterWorkloadGroupReconcileLoop is a mock of MulticlusterWorkloadGroupReconcileLoop interface.
+type MockMulticlusterWorkloadGroupReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadGroupReconcileLoopMockRecorder
+}
+
+// MockMulticlusterWorkloadGroupReconcileLoopMockRecorder is the mock recorder for MockMulticlusterWorkloadGroupReconcileLoop.
+type MockMulticlusterWorkloadGroupReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterWorkloadGroupReconcileLoop
+}
+
+// NewMockMulticlusterWorkloadGroupReconcileLoop creates a new mock instance.
+func NewMockMulticlusterWorkloadGroupReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterWorkloadGroupReconcileLoop {
+	mock := &MockMulticlusterWorkloadGroupReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadGroupReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadGroupReconcileLoop) EXPECT() *MockMulticlusterWorkloadGroupReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterWorkloadGroupReconciler mocks base method.
+func (m *MockMulticlusterWorkloadGroupReconcileLoop) AddMulticlusterWorkloadGroupReconciler(ctx context.Context, rec controller.MulticlusterWorkloadGroupReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterWorkloadGroupReconciler", varargs...)
+}
+
+// AddMulticlusterWorkloadGroupReconciler indicates an expected call of AddMulticlusterWorkloadGroupReconciler.
+func (mr *MockMulticlusterWorkloadGroupReconcileLoopMockRecorder) AddMulticlusterWorkloadGroupReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterWorkloadGroupReconciler", reflect.TypeOf((*MockMulticlusterWorkloadGroupReconcileLoop)(nil).AddMulticlusterWorkloadGroupReconciler), varargs...)
+}
+
+// MockMulticlusterVirtualServiceReconciler is a mock of MulticlusterVirtualServiceReconciler interface.
+type MockMulticlusterVirtualServiceReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterVirtualServiceReconcilerMockRecorder
+}
+
+// MockMulticlusterVirtualServiceReconcilerMockRecorder is the mock recorder for MockMulticlusterVirtualServiceReconciler.
+type MockMulticlusterVirtualServiceReconcilerMockRecorder struct {
+	mock *MockMulticlusterVirtualServiceReconciler
+}
+
+// NewMockMulticlusterVirtualServiceReconciler creates a new mock instance.
+func NewMockMulticlusterVirtualServiceReconciler(ctrl *gomock.Controller) *MockMulticlusterVirtualServiceReconciler {
+	mock := &MockMulticlusterVirtualServiceReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterVirtualServiceReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterVirtualServiceReconciler) EXPECT() *MockMulticlusterVirtualServiceReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileVirtualService mocks base method.
+func (m *MockMulticlusterVirtualServiceReconciler) ReconcileVirtualService(clusterName string, obj *v1.VirtualService) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileVirtualService", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileVirtualService indicates an expected call of ReconcileVirtualService.
+func (mr *MockMulticlusterVirtualServiceReconcilerMockRecorder) ReconcileVirtualService(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileVirtualService", reflect.TypeOf((*MockMulticlusterVirtualServiceReconciler)(nil).ReconcileVirtualService), clusterName, obj)
+}
+
+// MockMulticlusterVirtualServiceDeletionReconciler is a mock of MulticlusterVirtualServiceDeletionReconciler interface.
+type MockMulticlusterVirtualServiceDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterVirtualServiceDeletionReconciler.
+type MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterVirtualServiceDeletionReconciler
+}
+
+// NewMockMulticlusterVirtualServiceDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterVirtualServiceDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterVirtualServiceDeletionReconciler {
+	mock := &MockMulticlusterVirtualServiceDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterVirtualServiceDeletionReconciler) EXPECT() *MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileVirtualServiceDeletion mocks base method.
+func (m *MockMulticlusterVirtualServiceDeletionReconciler) ReconcileVirtualServiceDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileVirtualServiceDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileVirtualServiceDeletion indicates an expected call of ReconcileVirtualServiceDeletion.
+func (mr *MockMulticlusterVirtualServiceDeletionReconcilerMockRecorder) ReconcileVirtualServiceDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileVirtualServiceDeletion", reflect.TypeOf((*MockMulticlusterVirtualServiceDeletionReconciler)(nil).ReconcileVirtualServiceDeletion), clusterName, req)
+}
+
+// MockMulticlusterVirtualServiceReconcileLoop is a mock of MulticlusterVirtualServiceReconcileLoop interface.
+type MockMulticlusterVirtualServiceReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterVirtualServiceReconcileLoopMockRecorder
+}
+
+// MockMulticlusterVirtualServiceReconcileLoopMockRecorder is the mock recorder for MockMulticlusterVirtualServiceReconcileLoop.
+type MockMulticlusterVirtualServiceReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterVirtualServiceReconcileLoop
+}
+
+// NewMockMulticlusterVirtualServiceReconcileLoop creates a new mock instance.
+func NewMockMulticlusterVirtualServiceReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterVirtualServiceReconcileLoop {
+	mock := &MockMulticlusterVirtualServiceReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterVirtualServiceReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterVirtualServiceReconcileLoop) EXPECT() *MockMulticlusterVirtualServiceReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterVirtualServiceReconciler mocks base method.
+func (m *MockMulticlusterVirtualServiceReconcileLoop) AddMulticlusterVirtualServiceReconciler(ctx context.Context, rec controller.MulticlusterVirtualServiceReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterVirtualServiceReconciler", varargs...)
+}
+
+// AddMulticlusterVirtualServiceReconciler indicates an expected call of AddMulticlusterVirtualServiceReconciler.
+func (mr *MockMulticlusterVirtualServiceReconcileLoopMockRecorder) AddMulticlusterVirtualServiceReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterVirtualServiceReconciler", reflect.TypeOf((*MockMulticlusterVirtualServiceReconcileLoop)(nil).AddMulticlusterVirtualServiceReconciler), varargs...)
+}
+
+// MockMulticlusterSidecarReconciler is a mock of MulticlusterSidecarReconciler interface.
+type MockMulticlusterSidecarReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterSidecarReconcilerMockRecorder
+}
+
+// MockMulticlusterSidecarReconcilerMockRecorder is the mock recorder for MockMulticlusterSidecarReconciler.
+type MockMulticlusterSidecarReconcilerMockRecorder struct {
+	mock *MockMulticlusterSidecarReconciler
+}
+
+// NewMockMulticlusterSidecarReconciler creates a new mock instance.
+func NewMockMulticlusterSidecarReconciler(ctrl *gomock.Controller) *MockMulticlusterSidecarReconciler {
+	mock := &MockMulticlusterSidecarReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterSidecarReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterSidecarReconciler) EXPECT() *MockMulticlusterSidecarReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileSidecar mocks base method.
+func (m *MockMulticlusterSidecarReconciler) ReconcileSidecar(clusterName string, obj *v1.Sidecar) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileSidecar", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileSidecar indicates an expected call of ReconcileSidecar.
+func (mr *MockMulticlusterSidecarReconcilerMockRecorder) ReconcileSidecar(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileSidecar", reflect.TypeOf((*MockMulticlusterSidecarReconciler)(nil).ReconcileSidecar), clusterName, obj)
+}
+
+// MockMulticlusterSidecarDeletionReconciler is a mock of MulticlusterSidecarDeletionReconciler interface.
+type MockMulticlusterSidecarDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterSidecarDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterSidecarDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterSidecarDeletionReconciler.
+type MockMulticlusterSidecarDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterSidecarDeletionReconciler
+}
+
+// NewMockMulticlusterSidecarDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterSidecarDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterSidecarDeletionReconciler {
+	mock := &MockMulticlusterSidecarDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterSidecarDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterSidecarDeletionReconciler) EXPECT() *MockMulticlusterSidecarDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileSidecarDeletion mocks base method.
+func (m *MockMulticlusterSidecarDeletionReconciler) ReconcileSidecarDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileSidecarDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileSidecarDeletion indicates an expected call of ReconcileSidecarDeletion.
+func (mr *MockMulticlusterSidecarDeletionReconcilerMockRecorder) ReconcileSidecarDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileSidecarDeletion", reflect.TypeOf((*MockMulticlusterSidecarDeletionReconciler)(nil).ReconcileSidecarDeletion), clusterName, req)
+}
+
+// MockMulticlusterSidecarReconcileLoop is a mock of MulticlusterSidecarReconcileLoop interface.
+type MockMulticlusterSidecarReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterSidecarReconcileLoopMockRecorder
+}
+
+// MockMulticlusterSidecarReconcileLoopMockRecorder is the mock recorder for MockMulticlusterSidecarReconcileLoop.
+type MockMulticlusterSidecarReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterSidecarReconcileLoop
+}
+
+// NewMockMulticlusterSidecarReconcileLoop creates a new mock instance.
+func NewMockMulticlusterSidecarReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterSidecarReconcileLoop {
+	mock := &MockMulticlusterSidecarReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterSidecarReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterSidecarReconcileLoop) EXPECT() *MockMulticlusterSidecarReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterSidecarReconciler mocks base method.
+func (m *MockMulticlusterSidecarReconcileLoop) AddMulticlusterSidecarReconciler(ctx context.Context, rec controller.MulticlusterSidecarReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterSidecarReconciler", varargs...)
+}
+
+// AddMulticlusterSidecarReconciler indicates an expected call of AddMulticlusterSidecarReconciler.
+func (mr *MockMulticlusterSidecarReconcileLoopMockRecorder) AddMulticlusterSidecarReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterSidecarReconciler", reflect.TypeOf((*MockMulticlusterSidecarReconcileLoop)(nil).AddMulticlusterSidecarReconciler), varargs...)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/mocks/reconcilers.go b/pkg/api/istio/networking.istio.io/v1/controller/mocks/reconcilers.go
new file mode 100644
index 0000000..1929f77
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/mocks/reconcilers.go
@@ -0,0 +1,1297 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/networking/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockDestinationRuleReconciler is a mock of DestinationRuleReconciler interface.
+type MockDestinationRuleReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleReconcilerMockRecorder
+}
+
+// MockDestinationRuleReconcilerMockRecorder is the mock recorder for MockDestinationRuleReconciler.
+type MockDestinationRuleReconcilerMockRecorder struct {
+	mock *MockDestinationRuleReconciler
+}
+
+// NewMockDestinationRuleReconciler creates a new mock instance.
+func NewMockDestinationRuleReconciler(ctrl *gomock.Controller) *MockDestinationRuleReconciler {
+	mock := &MockDestinationRuleReconciler{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleReconciler) EXPECT() *MockDestinationRuleReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileDestinationRule mocks base method.
+func (m *MockDestinationRuleReconciler) ReconcileDestinationRule(obj *v1.DestinationRule) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileDestinationRule", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileDestinationRule indicates an expected call of ReconcileDestinationRule.
+func (mr *MockDestinationRuleReconcilerMockRecorder) ReconcileDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileDestinationRule", reflect.TypeOf((*MockDestinationRuleReconciler)(nil).ReconcileDestinationRule), obj)
+}
+
+// MockDestinationRuleDeletionReconciler is a mock of DestinationRuleDeletionReconciler interface.
+type MockDestinationRuleDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleDeletionReconcilerMockRecorder
+}
+
+// MockDestinationRuleDeletionReconcilerMockRecorder is the mock recorder for MockDestinationRuleDeletionReconciler.
+type MockDestinationRuleDeletionReconcilerMockRecorder struct {
+	mock *MockDestinationRuleDeletionReconciler
+}
+
+// NewMockDestinationRuleDeletionReconciler creates a new mock instance.
+func NewMockDestinationRuleDeletionReconciler(ctrl *gomock.Controller) *MockDestinationRuleDeletionReconciler {
+	mock := &MockDestinationRuleDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleDeletionReconciler) EXPECT() *MockDestinationRuleDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileDestinationRuleDeletion mocks base method.
+func (m *MockDestinationRuleDeletionReconciler) ReconcileDestinationRuleDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileDestinationRuleDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileDestinationRuleDeletion indicates an expected call of ReconcileDestinationRuleDeletion.
+func (mr *MockDestinationRuleDeletionReconcilerMockRecorder) ReconcileDestinationRuleDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileDestinationRuleDeletion", reflect.TypeOf((*MockDestinationRuleDeletionReconciler)(nil).ReconcileDestinationRuleDeletion), req)
+}
+
+// MockDestinationRuleFinalizer is a mock of DestinationRuleFinalizer interface.
+type MockDestinationRuleFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleFinalizerMockRecorder
+}
+
+// MockDestinationRuleFinalizerMockRecorder is the mock recorder for MockDestinationRuleFinalizer.
+type MockDestinationRuleFinalizerMockRecorder struct {
+	mock *MockDestinationRuleFinalizer
+}
+
+// NewMockDestinationRuleFinalizer creates a new mock instance.
+func NewMockDestinationRuleFinalizer(ctrl *gomock.Controller) *MockDestinationRuleFinalizer {
+	mock := &MockDestinationRuleFinalizer{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleFinalizer) EXPECT() *MockDestinationRuleFinalizerMockRecorder {
+	return m.recorder
+}
+
+// DestinationRuleFinalizerName mocks base method.
+func (m *MockDestinationRuleFinalizer) DestinationRuleFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DestinationRuleFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// DestinationRuleFinalizerName indicates an expected call of DestinationRuleFinalizerName.
+func (mr *MockDestinationRuleFinalizerMockRecorder) DestinationRuleFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DestinationRuleFinalizerName", reflect.TypeOf((*MockDestinationRuleFinalizer)(nil).DestinationRuleFinalizerName))
+}
+
+// FinalizeDestinationRule mocks base method.
+func (m *MockDestinationRuleFinalizer) FinalizeDestinationRule(obj *v1.DestinationRule) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeDestinationRule", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeDestinationRule indicates an expected call of FinalizeDestinationRule.
+func (mr *MockDestinationRuleFinalizerMockRecorder) FinalizeDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeDestinationRule", reflect.TypeOf((*MockDestinationRuleFinalizer)(nil).FinalizeDestinationRule), obj)
+}
+
+// ReconcileDestinationRule mocks base method.
+func (m *MockDestinationRuleFinalizer) ReconcileDestinationRule(obj *v1.DestinationRule) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileDestinationRule", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileDestinationRule indicates an expected call of ReconcileDestinationRule.
+func (mr *MockDestinationRuleFinalizerMockRecorder) ReconcileDestinationRule(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileDestinationRule", reflect.TypeOf((*MockDestinationRuleFinalizer)(nil).ReconcileDestinationRule), obj)
+}
+
+// MockDestinationRuleReconcileLoop is a mock of DestinationRuleReconcileLoop interface.
+type MockDestinationRuleReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleReconcileLoopMockRecorder
+}
+
+// MockDestinationRuleReconcileLoopMockRecorder is the mock recorder for MockDestinationRuleReconcileLoop.
+type MockDestinationRuleReconcileLoopMockRecorder struct {
+	mock *MockDestinationRuleReconcileLoop
+}
+
+// NewMockDestinationRuleReconcileLoop creates a new mock instance.
+func NewMockDestinationRuleReconcileLoop(ctrl *gomock.Controller) *MockDestinationRuleReconcileLoop {
+	mock := &MockDestinationRuleReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleReconcileLoop) EXPECT() *MockDestinationRuleReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunDestinationRuleReconciler mocks base method.
+func (m *MockDestinationRuleReconcileLoop) RunDestinationRuleReconciler(ctx context.Context, rec controller.DestinationRuleReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunDestinationRuleReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunDestinationRuleReconciler indicates an expected call of RunDestinationRuleReconciler.
+func (mr *MockDestinationRuleReconcileLoopMockRecorder) RunDestinationRuleReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunDestinationRuleReconciler", reflect.TypeOf((*MockDestinationRuleReconcileLoop)(nil).RunDestinationRuleReconciler), varargs...)
+}
+
+// MockGatewayReconciler is a mock of GatewayReconciler interface.
+type MockGatewayReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayReconcilerMockRecorder
+}
+
+// MockGatewayReconcilerMockRecorder is the mock recorder for MockGatewayReconciler.
+type MockGatewayReconcilerMockRecorder struct {
+	mock *MockGatewayReconciler
+}
+
+// NewMockGatewayReconciler creates a new mock instance.
+func NewMockGatewayReconciler(ctrl *gomock.Controller) *MockGatewayReconciler {
+	mock := &MockGatewayReconciler{ctrl: ctrl}
+	mock.recorder = &MockGatewayReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayReconciler) EXPECT() *MockGatewayReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileGateway mocks base method.
+func (m *MockGatewayReconciler) ReconcileGateway(obj *v1.Gateway) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileGateway", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileGateway indicates an expected call of ReconcileGateway.
+func (mr *MockGatewayReconcilerMockRecorder) ReconcileGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileGateway", reflect.TypeOf((*MockGatewayReconciler)(nil).ReconcileGateway), obj)
+}
+
+// MockGatewayDeletionReconciler is a mock of GatewayDeletionReconciler interface.
+type MockGatewayDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayDeletionReconcilerMockRecorder
+}
+
+// MockGatewayDeletionReconcilerMockRecorder is the mock recorder for MockGatewayDeletionReconciler.
+type MockGatewayDeletionReconcilerMockRecorder struct {
+	mock *MockGatewayDeletionReconciler
+}
+
+// NewMockGatewayDeletionReconciler creates a new mock instance.
+func NewMockGatewayDeletionReconciler(ctrl *gomock.Controller) *MockGatewayDeletionReconciler {
+	mock := &MockGatewayDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockGatewayDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayDeletionReconciler) EXPECT() *MockGatewayDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileGatewayDeletion mocks base method.
+func (m *MockGatewayDeletionReconciler) ReconcileGatewayDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileGatewayDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileGatewayDeletion indicates an expected call of ReconcileGatewayDeletion.
+func (mr *MockGatewayDeletionReconcilerMockRecorder) ReconcileGatewayDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileGatewayDeletion", reflect.TypeOf((*MockGatewayDeletionReconciler)(nil).ReconcileGatewayDeletion), req)
+}
+
+// MockGatewayFinalizer is a mock of GatewayFinalizer interface.
+type MockGatewayFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayFinalizerMockRecorder
+}
+
+// MockGatewayFinalizerMockRecorder is the mock recorder for MockGatewayFinalizer.
+type MockGatewayFinalizerMockRecorder struct {
+	mock *MockGatewayFinalizer
+}
+
+// NewMockGatewayFinalizer creates a new mock instance.
+func NewMockGatewayFinalizer(ctrl *gomock.Controller) *MockGatewayFinalizer {
+	mock := &MockGatewayFinalizer{ctrl: ctrl}
+	mock.recorder = &MockGatewayFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayFinalizer) EXPECT() *MockGatewayFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeGateway mocks base method.
+func (m *MockGatewayFinalizer) FinalizeGateway(obj *v1.Gateway) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeGateway", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeGateway indicates an expected call of FinalizeGateway.
+func (mr *MockGatewayFinalizerMockRecorder) FinalizeGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeGateway", reflect.TypeOf((*MockGatewayFinalizer)(nil).FinalizeGateway), obj)
+}
+
+// GatewayFinalizerName mocks base method.
+func (m *MockGatewayFinalizer) GatewayFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GatewayFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// GatewayFinalizerName indicates an expected call of GatewayFinalizerName.
+func (mr *MockGatewayFinalizerMockRecorder) GatewayFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GatewayFinalizerName", reflect.TypeOf((*MockGatewayFinalizer)(nil).GatewayFinalizerName))
+}
+
+// ReconcileGateway mocks base method.
+func (m *MockGatewayFinalizer) ReconcileGateway(obj *v1.Gateway) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileGateway", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileGateway indicates an expected call of ReconcileGateway.
+func (mr *MockGatewayFinalizerMockRecorder) ReconcileGateway(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileGateway", reflect.TypeOf((*MockGatewayFinalizer)(nil).ReconcileGateway), obj)
+}
+
+// MockGatewayReconcileLoop is a mock of GatewayReconcileLoop interface.
+type MockGatewayReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayReconcileLoopMockRecorder
+}
+
+// MockGatewayReconcileLoopMockRecorder is the mock recorder for MockGatewayReconcileLoop.
+type MockGatewayReconcileLoopMockRecorder struct {
+	mock *MockGatewayReconcileLoop
+}
+
+// NewMockGatewayReconcileLoop creates a new mock instance.
+func NewMockGatewayReconcileLoop(ctrl *gomock.Controller) *MockGatewayReconcileLoop {
+	mock := &MockGatewayReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockGatewayReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayReconcileLoop) EXPECT() *MockGatewayReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunGatewayReconciler mocks base method.
+func (m *MockGatewayReconcileLoop) RunGatewayReconciler(ctx context.Context, rec controller.GatewayReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunGatewayReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunGatewayReconciler indicates an expected call of RunGatewayReconciler.
+func (mr *MockGatewayReconcileLoopMockRecorder) RunGatewayReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunGatewayReconciler", reflect.TypeOf((*MockGatewayReconcileLoop)(nil).RunGatewayReconciler), varargs...)
+}
+
+// MockServiceEntryReconciler is a mock of ServiceEntryReconciler interface.
+type MockServiceEntryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryReconcilerMockRecorder
+}
+
+// MockServiceEntryReconcilerMockRecorder is the mock recorder for MockServiceEntryReconciler.
+type MockServiceEntryReconcilerMockRecorder struct {
+	mock *MockServiceEntryReconciler
+}
+
+// NewMockServiceEntryReconciler creates a new mock instance.
+func NewMockServiceEntryReconciler(ctrl *gomock.Controller) *MockServiceEntryReconciler {
+	mock := &MockServiceEntryReconciler{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryReconciler) EXPECT() *MockServiceEntryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileServiceEntry mocks base method.
+func (m *MockServiceEntryReconciler) ReconcileServiceEntry(obj *v1.ServiceEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileServiceEntry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileServiceEntry indicates an expected call of ReconcileServiceEntry.
+func (mr *MockServiceEntryReconcilerMockRecorder) ReconcileServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileServiceEntry", reflect.TypeOf((*MockServiceEntryReconciler)(nil).ReconcileServiceEntry), obj)
+}
+
+// MockServiceEntryDeletionReconciler is a mock of ServiceEntryDeletionReconciler interface.
+type MockServiceEntryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryDeletionReconcilerMockRecorder
+}
+
+// MockServiceEntryDeletionReconcilerMockRecorder is the mock recorder for MockServiceEntryDeletionReconciler.
+type MockServiceEntryDeletionReconcilerMockRecorder struct {
+	mock *MockServiceEntryDeletionReconciler
+}
+
+// NewMockServiceEntryDeletionReconciler creates a new mock instance.
+func NewMockServiceEntryDeletionReconciler(ctrl *gomock.Controller) *MockServiceEntryDeletionReconciler {
+	mock := &MockServiceEntryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryDeletionReconciler) EXPECT() *MockServiceEntryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileServiceEntryDeletion mocks base method.
+func (m *MockServiceEntryDeletionReconciler) ReconcileServiceEntryDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileServiceEntryDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileServiceEntryDeletion indicates an expected call of ReconcileServiceEntryDeletion.
+func (mr *MockServiceEntryDeletionReconcilerMockRecorder) ReconcileServiceEntryDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileServiceEntryDeletion", reflect.TypeOf((*MockServiceEntryDeletionReconciler)(nil).ReconcileServiceEntryDeletion), req)
+}
+
+// MockServiceEntryFinalizer is a mock of ServiceEntryFinalizer interface.
+type MockServiceEntryFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryFinalizerMockRecorder
+}
+
+// MockServiceEntryFinalizerMockRecorder is the mock recorder for MockServiceEntryFinalizer.
+type MockServiceEntryFinalizerMockRecorder struct {
+	mock *MockServiceEntryFinalizer
+}
+
+// NewMockServiceEntryFinalizer creates a new mock instance.
+func NewMockServiceEntryFinalizer(ctrl *gomock.Controller) *MockServiceEntryFinalizer {
+	mock := &MockServiceEntryFinalizer{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryFinalizer) EXPECT() *MockServiceEntryFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeServiceEntry mocks base method.
+func (m *MockServiceEntryFinalizer) FinalizeServiceEntry(obj *v1.ServiceEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeServiceEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeServiceEntry indicates an expected call of FinalizeServiceEntry.
+func (mr *MockServiceEntryFinalizerMockRecorder) FinalizeServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeServiceEntry", reflect.TypeOf((*MockServiceEntryFinalizer)(nil).FinalizeServiceEntry), obj)
+}
+
+// ReconcileServiceEntry mocks base method.
+func (m *MockServiceEntryFinalizer) ReconcileServiceEntry(obj *v1.ServiceEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileServiceEntry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileServiceEntry indicates an expected call of ReconcileServiceEntry.
+func (mr *MockServiceEntryFinalizerMockRecorder) ReconcileServiceEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileServiceEntry", reflect.TypeOf((*MockServiceEntryFinalizer)(nil).ReconcileServiceEntry), obj)
+}
+
+// ServiceEntryFinalizerName mocks base method.
+func (m *MockServiceEntryFinalizer) ServiceEntryFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ServiceEntryFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// ServiceEntryFinalizerName indicates an expected call of ServiceEntryFinalizerName.
+func (mr *MockServiceEntryFinalizerMockRecorder) ServiceEntryFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceEntryFinalizerName", reflect.TypeOf((*MockServiceEntryFinalizer)(nil).ServiceEntryFinalizerName))
+}
+
+// MockServiceEntryReconcileLoop is a mock of ServiceEntryReconcileLoop interface.
+type MockServiceEntryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryReconcileLoopMockRecorder
+}
+
+// MockServiceEntryReconcileLoopMockRecorder is the mock recorder for MockServiceEntryReconcileLoop.
+type MockServiceEntryReconcileLoopMockRecorder struct {
+	mock *MockServiceEntryReconcileLoop
+}
+
+// NewMockServiceEntryReconcileLoop creates a new mock instance.
+func NewMockServiceEntryReconcileLoop(ctrl *gomock.Controller) *MockServiceEntryReconcileLoop {
+	mock := &MockServiceEntryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryReconcileLoop) EXPECT() *MockServiceEntryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunServiceEntryReconciler mocks base method.
+func (m *MockServiceEntryReconcileLoop) RunServiceEntryReconciler(ctx context.Context, rec controller.ServiceEntryReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunServiceEntryReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunServiceEntryReconciler indicates an expected call of RunServiceEntryReconciler.
+func (mr *MockServiceEntryReconcileLoopMockRecorder) RunServiceEntryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunServiceEntryReconciler", reflect.TypeOf((*MockServiceEntryReconcileLoop)(nil).RunServiceEntryReconciler), varargs...)
+}
+
+// MockWorkloadEntryReconciler is a mock of WorkloadEntryReconciler interface.
+type MockWorkloadEntryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryReconcilerMockRecorder
+}
+
+// MockWorkloadEntryReconcilerMockRecorder is the mock recorder for MockWorkloadEntryReconciler.
+type MockWorkloadEntryReconcilerMockRecorder struct {
+	mock *MockWorkloadEntryReconciler
+}
+
+// NewMockWorkloadEntryReconciler creates a new mock instance.
+func NewMockWorkloadEntryReconciler(ctrl *gomock.Controller) *MockWorkloadEntryReconciler {
+	mock := &MockWorkloadEntryReconciler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryReconciler) EXPECT() *MockWorkloadEntryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryReconciler) ReconcileWorkloadEntry(obj *v1.WorkloadEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadEntry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadEntry indicates an expected call of ReconcileWorkloadEntry.
+func (mr *MockWorkloadEntryReconcilerMockRecorder) ReconcileWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryReconciler)(nil).ReconcileWorkloadEntry), obj)
+}
+
+// MockWorkloadEntryDeletionReconciler is a mock of WorkloadEntryDeletionReconciler interface.
+type MockWorkloadEntryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryDeletionReconcilerMockRecorder
+}
+
+// MockWorkloadEntryDeletionReconcilerMockRecorder is the mock recorder for MockWorkloadEntryDeletionReconciler.
+type MockWorkloadEntryDeletionReconcilerMockRecorder struct {
+	mock *MockWorkloadEntryDeletionReconciler
+}
+
+// NewMockWorkloadEntryDeletionReconciler creates a new mock instance.
+func NewMockWorkloadEntryDeletionReconciler(ctrl *gomock.Controller) *MockWorkloadEntryDeletionReconciler {
+	mock := &MockWorkloadEntryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryDeletionReconciler) EXPECT() *MockWorkloadEntryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadEntryDeletion mocks base method.
+func (m *MockWorkloadEntryDeletionReconciler) ReconcileWorkloadEntryDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadEntryDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileWorkloadEntryDeletion indicates an expected call of ReconcileWorkloadEntryDeletion.
+func (mr *MockWorkloadEntryDeletionReconcilerMockRecorder) ReconcileWorkloadEntryDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadEntryDeletion", reflect.TypeOf((*MockWorkloadEntryDeletionReconciler)(nil).ReconcileWorkloadEntryDeletion), req)
+}
+
+// MockWorkloadEntryFinalizer is a mock of WorkloadEntryFinalizer interface.
+type MockWorkloadEntryFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryFinalizerMockRecorder
+}
+
+// MockWorkloadEntryFinalizerMockRecorder is the mock recorder for MockWorkloadEntryFinalizer.
+type MockWorkloadEntryFinalizerMockRecorder struct {
+	mock *MockWorkloadEntryFinalizer
+}
+
+// NewMockWorkloadEntryFinalizer creates a new mock instance.
+func NewMockWorkloadEntryFinalizer(ctrl *gomock.Controller) *MockWorkloadEntryFinalizer {
+	mock := &MockWorkloadEntryFinalizer{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryFinalizer) EXPECT() *MockWorkloadEntryFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryFinalizer) FinalizeWorkloadEntry(obj *v1.WorkloadEntry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeWorkloadEntry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeWorkloadEntry indicates an expected call of FinalizeWorkloadEntry.
+func (mr *MockWorkloadEntryFinalizerMockRecorder) FinalizeWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryFinalizer)(nil).FinalizeWorkloadEntry), obj)
+}
+
+// ReconcileWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryFinalizer) ReconcileWorkloadEntry(obj *v1.WorkloadEntry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadEntry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadEntry indicates an expected call of ReconcileWorkloadEntry.
+func (mr *MockWorkloadEntryFinalizerMockRecorder) ReconcileWorkloadEntry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryFinalizer)(nil).ReconcileWorkloadEntry), obj)
+}
+
+// WorkloadEntryFinalizerName mocks base method.
+func (m *MockWorkloadEntryFinalizer) WorkloadEntryFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "WorkloadEntryFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// WorkloadEntryFinalizerName indicates an expected call of WorkloadEntryFinalizerName.
+func (mr *MockWorkloadEntryFinalizerMockRecorder) WorkloadEntryFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkloadEntryFinalizerName", reflect.TypeOf((*MockWorkloadEntryFinalizer)(nil).WorkloadEntryFinalizerName))
+}
+
+// MockWorkloadEntryReconcileLoop is a mock of WorkloadEntryReconcileLoop interface.
+type MockWorkloadEntryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryReconcileLoopMockRecorder
+}
+
+// MockWorkloadEntryReconcileLoopMockRecorder is the mock recorder for MockWorkloadEntryReconcileLoop.
+type MockWorkloadEntryReconcileLoopMockRecorder struct {
+	mock *MockWorkloadEntryReconcileLoop
+}
+
+// NewMockWorkloadEntryReconcileLoop creates a new mock instance.
+func NewMockWorkloadEntryReconcileLoop(ctrl *gomock.Controller) *MockWorkloadEntryReconcileLoop {
+	mock := &MockWorkloadEntryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryReconcileLoop) EXPECT() *MockWorkloadEntryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunWorkloadEntryReconciler mocks base method.
+func (m *MockWorkloadEntryReconcileLoop) RunWorkloadEntryReconciler(ctx context.Context, rec controller.WorkloadEntryReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunWorkloadEntryReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunWorkloadEntryReconciler indicates an expected call of RunWorkloadEntryReconciler.
+func (mr *MockWorkloadEntryReconcileLoopMockRecorder) RunWorkloadEntryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunWorkloadEntryReconciler", reflect.TypeOf((*MockWorkloadEntryReconcileLoop)(nil).RunWorkloadEntryReconciler), varargs...)
+}
+
+// MockWorkloadGroupReconciler is a mock of WorkloadGroupReconciler interface.
+type MockWorkloadGroupReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupReconcilerMockRecorder
+}
+
+// MockWorkloadGroupReconcilerMockRecorder is the mock recorder for MockWorkloadGroupReconciler.
+type MockWorkloadGroupReconcilerMockRecorder struct {
+	mock *MockWorkloadGroupReconciler
+}
+
+// NewMockWorkloadGroupReconciler creates a new mock instance.
+func NewMockWorkloadGroupReconciler(ctrl *gomock.Controller) *MockWorkloadGroupReconciler {
+	mock := &MockWorkloadGroupReconciler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupReconciler) EXPECT() *MockWorkloadGroupReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupReconciler) ReconcileWorkloadGroup(obj *v1.WorkloadGroup) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadGroup", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadGroup indicates an expected call of ReconcileWorkloadGroup.
+func (mr *MockWorkloadGroupReconcilerMockRecorder) ReconcileWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupReconciler)(nil).ReconcileWorkloadGroup), obj)
+}
+
+// MockWorkloadGroupDeletionReconciler is a mock of WorkloadGroupDeletionReconciler interface.
+type MockWorkloadGroupDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupDeletionReconcilerMockRecorder
+}
+
+// MockWorkloadGroupDeletionReconcilerMockRecorder is the mock recorder for MockWorkloadGroupDeletionReconciler.
+type MockWorkloadGroupDeletionReconcilerMockRecorder struct {
+	mock *MockWorkloadGroupDeletionReconciler
+}
+
+// NewMockWorkloadGroupDeletionReconciler creates a new mock instance.
+func NewMockWorkloadGroupDeletionReconciler(ctrl *gomock.Controller) *MockWorkloadGroupDeletionReconciler {
+	mock := &MockWorkloadGroupDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupDeletionReconciler) EXPECT() *MockWorkloadGroupDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileWorkloadGroupDeletion mocks base method.
+func (m *MockWorkloadGroupDeletionReconciler) ReconcileWorkloadGroupDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadGroupDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileWorkloadGroupDeletion indicates an expected call of ReconcileWorkloadGroupDeletion.
+func (mr *MockWorkloadGroupDeletionReconcilerMockRecorder) ReconcileWorkloadGroupDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadGroupDeletion", reflect.TypeOf((*MockWorkloadGroupDeletionReconciler)(nil).ReconcileWorkloadGroupDeletion), req)
+}
+
+// MockWorkloadGroupFinalizer is a mock of WorkloadGroupFinalizer interface.
+type MockWorkloadGroupFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupFinalizerMockRecorder
+}
+
+// MockWorkloadGroupFinalizerMockRecorder is the mock recorder for MockWorkloadGroupFinalizer.
+type MockWorkloadGroupFinalizerMockRecorder struct {
+	mock *MockWorkloadGroupFinalizer
+}
+
+// NewMockWorkloadGroupFinalizer creates a new mock instance.
+func NewMockWorkloadGroupFinalizer(ctrl *gomock.Controller) *MockWorkloadGroupFinalizer {
+	mock := &MockWorkloadGroupFinalizer{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupFinalizer) EXPECT() *MockWorkloadGroupFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupFinalizer) FinalizeWorkloadGroup(obj *v1.WorkloadGroup) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeWorkloadGroup", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeWorkloadGroup indicates an expected call of FinalizeWorkloadGroup.
+func (mr *MockWorkloadGroupFinalizerMockRecorder) FinalizeWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupFinalizer)(nil).FinalizeWorkloadGroup), obj)
+}
+
+// ReconcileWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupFinalizer) ReconcileWorkloadGroup(obj *v1.WorkloadGroup) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileWorkloadGroup", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileWorkloadGroup indicates an expected call of ReconcileWorkloadGroup.
+func (mr *MockWorkloadGroupFinalizerMockRecorder) ReconcileWorkloadGroup(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupFinalizer)(nil).ReconcileWorkloadGroup), obj)
+}
+
+// WorkloadGroupFinalizerName mocks base method.
+func (m *MockWorkloadGroupFinalizer) WorkloadGroupFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "WorkloadGroupFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// WorkloadGroupFinalizerName indicates an expected call of WorkloadGroupFinalizerName.
+func (mr *MockWorkloadGroupFinalizerMockRecorder) WorkloadGroupFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkloadGroupFinalizerName", reflect.TypeOf((*MockWorkloadGroupFinalizer)(nil).WorkloadGroupFinalizerName))
+}
+
+// MockWorkloadGroupReconcileLoop is a mock of WorkloadGroupReconcileLoop interface.
+type MockWorkloadGroupReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupReconcileLoopMockRecorder
+}
+
+// MockWorkloadGroupReconcileLoopMockRecorder is the mock recorder for MockWorkloadGroupReconcileLoop.
+type MockWorkloadGroupReconcileLoopMockRecorder struct {
+	mock *MockWorkloadGroupReconcileLoop
+}
+
+// NewMockWorkloadGroupReconcileLoop creates a new mock instance.
+func NewMockWorkloadGroupReconcileLoop(ctrl *gomock.Controller) *MockWorkloadGroupReconcileLoop {
+	mock := &MockWorkloadGroupReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupReconcileLoop) EXPECT() *MockWorkloadGroupReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunWorkloadGroupReconciler mocks base method.
+func (m *MockWorkloadGroupReconcileLoop) RunWorkloadGroupReconciler(ctx context.Context, rec controller.WorkloadGroupReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunWorkloadGroupReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunWorkloadGroupReconciler indicates an expected call of RunWorkloadGroupReconciler.
+func (mr *MockWorkloadGroupReconcileLoopMockRecorder) RunWorkloadGroupReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunWorkloadGroupReconciler", reflect.TypeOf((*MockWorkloadGroupReconcileLoop)(nil).RunWorkloadGroupReconciler), varargs...)
+}
+
+// MockVirtualServiceReconciler is a mock of VirtualServiceReconciler interface.
+type MockVirtualServiceReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceReconcilerMockRecorder
+}
+
+// MockVirtualServiceReconcilerMockRecorder is the mock recorder for MockVirtualServiceReconciler.
+type MockVirtualServiceReconcilerMockRecorder struct {
+	mock *MockVirtualServiceReconciler
+}
+
+// NewMockVirtualServiceReconciler creates a new mock instance.
+func NewMockVirtualServiceReconciler(ctrl *gomock.Controller) *MockVirtualServiceReconciler {
+	mock := &MockVirtualServiceReconciler{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceReconciler) EXPECT() *MockVirtualServiceReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileVirtualService mocks base method.
+func (m *MockVirtualServiceReconciler) ReconcileVirtualService(obj *v1.VirtualService) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileVirtualService", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileVirtualService indicates an expected call of ReconcileVirtualService.
+func (mr *MockVirtualServiceReconcilerMockRecorder) ReconcileVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileVirtualService", reflect.TypeOf((*MockVirtualServiceReconciler)(nil).ReconcileVirtualService), obj)
+}
+
+// MockVirtualServiceDeletionReconciler is a mock of VirtualServiceDeletionReconciler interface.
+type MockVirtualServiceDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceDeletionReconcilerMockRecorder
+}
+
+// MockVirtualServiceDeletionReconcilerMockRecorder is the mock recorder for MockVirtualServiceDeletionReconciler.
+type MockVirtualServiceDeletionReconcilerMockRecorder struct {
+	mock *MockVirtualServiceDeletionReconciler
+}
+
+// NewMockVirtualServiceDeletionReconciler creates a new mock instance.
+func NewMockVirtualServiceDeletionReconciler(ctrl *gomock.Controller) *MockVirtualServiceDeletionReconciler {
+	mock := &MockVirtualServiceDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceDeletionReconciler) EXPECT() *MockVirtualServiceDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileVirtualServiceDeletion mocks base method.
+func (m *MockVirtualServiceDeletionReconciler) ReconcileVirtualServiceDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileVirtualServiceDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileVirtualServiceDeletion indicates an expected call of ReconcileVirtualServiceDeletion.
+func (mr *MockVirtualServiceDeletionReconcilerMockRecorder) ReconcileVirtualServiceDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileVirtualServiceDeletion", reflect.TypeOf((*MockVirtualServiceDeletionReconciler)(nil).ReconcileVirtualServiceDeletion), req)
+}
+
+// MockVirtualServiceFinalizer is a mock of VirtualServiceFinalizer interface.
+type MockVirtualServiceFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceFinalizerMockRecorder
+}
+
+// MockVirtualServiceFinalizerMockRecorder is the mock recorder for MockVirtualServiceFinalizer.
+type MockVirtualServiceFinalizerMockRecorder struct {
+	mock *MockVirtualServiceFinalizer
+}
+
+// NewMockVirtualServiceFinalizer creates a new mock instance.
+func NewMockVirtualServiceFinalizer(ctrl *gomock.Controller) *MockVirtualServiceFinalizer {
+	mock := &MockVirtualServiceFinalizer{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceFinalizer) EXPECT() *MockVirtualServiceFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeVirtualService mocks base method.
+func (m *MockVirtualServiceFinalizer) FinalizeVirtualService(obj *v1.VirtualService) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeVirtualService", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeVirtualService indicates an expected call of FinalizeVirtualService.
+func (mr *MockVirtualServiceFinalizerMockRecorder) FinalizeVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeVirtualService", reflect.TypeOf((*MockVirtualServiceFinalizer)(nil).FinalizeVirtualService), obj)
+}
+
+// ReconcileVirtualService mocks base method.
+func (m *MockVirtualServiceFinalizer) ReconcileVirtualService(obj *v1.VirtualService) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileVirtualService", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileVirtualService indicates an expected call of ReconcileVirtualService.
+func (mr *MockVirtualServiceFinalizerMockRecorder) ReconcileVirtualService(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileVirtualService", reflect.TypeOf((*MockVirtualServiceFinalizer)(nil).ReconcileVirtualService), obj)
+}
+
+// VirtualServiceFinalizerName mocks base method.
+func (m *MockVirtualServiceFinalizer) VirtualServiceFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "VirtualServiceFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// VirtualServiceFinalizerName indicates an expected call of VirtualServiceFinalizerName.
+func (mr *MockVirtualServiceFinalizerMockRecorder) VirtualServiceFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VirtualServiceFinalizerName", reflect.TypeOf((*MockVirtualServiceFinalizer)(nil).VirtualServiceFinalizerName))
+}
+
+// MockVirtualServiceReconcileLoop is a mock of VirtualServiceReconcileLoop interface.
+type MockVirtualServiceReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceReconcileLoopMockRecorder
+}
+
+// MockVirtualServiceReconcileLoopMockRecorder is the mock recorder for MockVirtualServiceReconcileLoop.
+type MockVirtualServiceReconcileLoopMockRecorder struct {
+	mock *MockVirtualServiceReconcileLoop
+}
+
+// NewMockVirtualServiceReconcileLoop creates a new mock instance.
+func NewMockVirtualServiceReconcileLoop(ctrl *gomock.Controller) *MockVirtualServiceReconcileLoop {
+	mock := &MockVirtualServiceReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceReconcileLoop) EXPECT() *MockVirtualServiceReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunVirtualServiceReconciler mocks base method.
+func (m *MockVirtualServiceReconcileLoop) RunVirtualServiceReconciler(ctx context.Context, rec controller.VirtualServiceReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunVirtualServiceReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunVirtualServiceReconciler indicates an expected call of RunVirtualServiceReconciler.
+func (mr *MockVirtualServiceReconcileLoopMockRecorder) RunVirtualServiceReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunVirtualServiceReconciler", reflect.TypeOf((*MockVirtualServiceReconcileLoop)(nil).RunVirtualServiceReconciler), varargs...)
+}
+
+// MockSidecarReconciler is a mock of SidecarReconciler interface.
+type MockSidecarReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarReconcilerMockRecorder
+}
+
+// MockSidecarReconcilerMockRecorder is the mock recorder for MockSidecarReconciler.
+type MockSidecarReconcilerMockRecorder struct {
+	mock *MockSidecarReconciler
+}
+
+// NewMockSidecarReconciler creates a new mock instance.
+func NewMockSidecarReconciler(ctrl *gomock.Controller) *MockSidecarReconciler {
+	mock := &MockSidecarReconciler{ctrl: ctrl}
+	mock.recorder = &MockSidecarReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarReconciler) EXPECT() *MockSidecarReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileSidecar mocks base method.
+func (m *MockSidecarReconciler) ReconcileSidecar(obj *v1.Sidecar) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileSidecar", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileSidecar indicates an expected call of ReconcileSidecar.
+func (mr *MockSidecarReconcilerMockRecorder) ReconcileSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileSidecar", reflect.TypeOf((*MockSidecarReconciler)(nil).ReconcileSidecar), obj)
+}
+
+// MockSidecarDeletionReconciler is a mock of SidecarDeletionReconciler interface.
+type MockSidecarDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarDeletionReconcilerMockRecorder
+}
+
+// MockSidecarDeletionReconcilerMockRecorder is the mock recorder for MockSidecarDeletionReconciler.
+type MockSidecarDeletionReconcilerMockRecorder struct {
+	mock *MockSidecarDeletionReconciler
+}
+
+// NewMockSidecarDeletionReconciler creates a new mock instance.
+func NewMockSidecarDeletionReconciler(ctrl *gomock.Controller) *MockSidecarDeletionReconciler {
+	mock := &MockSidecarDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockSidecarDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarDeletionReconciler) EXPECT() *MockSidecarDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileSidecarDeletion mocks base method.
+func (m *MockSidecarDeletionReconciler) ReconcileSidecarDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileSidecarDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileSidecarDeletion indicates an expected call of ReconcileSidecarDeletion.
+func (mr *MockSidecarDeletionReconcilerMockRecorder) ReconcileSidecarDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileSidecarDeletion", reflect.TypeOf((*MockSidecarDeletionReconciler)(nil).ReconcileSidecarDeletion), req)
+}
+
+// MockSidecarFinalizer is a mock of SidecarFinalizer interface.
+type MockSidecarFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarFinalizerMockRecorder
+}
+
+// MockSidecarFinalizerMockRecorder is the mock recorder for MockSidecarFinalizer.
+type MockSidecarFinalizerMockRecorder struct {
+	mock *MockSidecarFinalizer
+}
+
+// NewMockSidecarFinalizer creates a new mock instance.
+func NewMockSidecarFinalizer(ctrl *gomock.Controller) *MockSidecarFinalizer {
+	mock := &MockSidecarFinalizer{ctrl: ctrl}
+	mock.recorder = &MockSidecarFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarFinalizer) EXPECT() *MockSidecarFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeSidecar mocks base method.
+func (m *MockSidecarFinalizer) FinalizeSidecar(obj *v1.Sidecar) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeSidecar", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeSidecar indicates an expected call of FinalizeSidecar.
+func (mr *MockSidecarFinalizerMockRecorder) FinalizeSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeSidecar", reflect.TypeOf((*MockSidecarFinalizer)(nil).FinalizeSidecar), obj)
+}
+
+// ReconcileSidecar mocks base method.
+func (m *MockSidecarFinalizer) ReconcileSidecar(obj *v1.Sidecar) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileSidecar", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileSidecar indicates an expected call of ReconcileSidecar.
+func (mr *MockSidecarFinalizerMockRecorder) ReconcileSidecar(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileSidecar", reflect.TypeOf((*MockSidecarFinalizer)(nil).ReconcileSidecar), obj)
+}
+
+// SidecarFinalizerName mocks base method.
+func (m *MockSidecarFinalizer) SidecarFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "SidecarFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// SidecarFinalizerName indicates an expected call of SidecarFinalizerName.
+func (mr *MockSidecarFinalizerMockRecorder) SidecarFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SidecarFinalizerName", reflect.TypeOf((*MockSidecarFinalizer)(nil).SidecarFinalizerName))
+}
+
+// MockSidecarReconcileLoop is a mock of SidecarReconcileLoop interface.
+type MockSidecarReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarReconcileLoopMockRecorder
+}
+
+// MockSidecarReconcileLoopMockRecorder is the mock recorder for MockSidecarReconcileLoop.
+type MockSidecarReconcileLoopMockRecorder struct {
+	mock *MockSidecarReconcileLoop
+}
+
+// NewMockSidecarReconcileLoop creates a new mock instance.
+func NewMockSidecarReconcileLoop(ctrl *gomock.Controller) *MockSidecarReconcileLoop {
+	mock := &MockSidecarReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockSidecarReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarReconcileLoop) EXPECT() *MockSidecarReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunSidecarReconciler mocks base method.
+func (m *MockSidecarReconcileLoop) RunSidecarReconciler(ctx context.Context, rec controller.SidecarReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunSidecarReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunSidecarReconciler indicates an expected call of RunSidecarReconciler.
+func (mr *MockSidecarReconcileLoopMockRecorder) RunSidecarReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSidecarReconciler", reflect.TypeOf((*MockSidecarReconcileLoop)(nil).RunSidecarReconciler), varargs...)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/multicluster_reconcilers.go b/pkg/api/istio/networking.istio.io/v1/controller/multicluster_reconcilers.go
new file mode 100644
index 0000000..67c3fb5
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/multicluster_reconcilers.go
@@ -0,0 +1,516 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./multicluster_reconcilers.go -destination mocks/multicluster_reconcilers.go
+
+// Definitions for the multicluster Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	networking_istio_io_v1 "istio.io/client-go/pkg/apis/networking/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	mc_reconcile "github.com/solo-io/skv2/pkg/multicluster/reconcile"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the DestinationRule Resource across clusters.
+// implemented by the user
+type MulticlusterDestinationRuleReconciler interface {
+	ReconcileDestinationRule(clusterName string, obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the DestinationRule Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterDestinationRuleDeletionReconciler interface {
+	ReconcileDestinationRuleDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterDestinationRuleReconcilerFuncs struct {
+	OnReconcileDestinationRule         func(clusterName string, obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error)
+	OnReconcileDestinationRuleDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterDestinationRuleReconcilerFuncs) ReconcileDestinationRule(clusterName string, obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error) {
+	if f.OnReconcileDestinationRule == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileDestinationRule(clusterName, obj)
+}
+
+func (f *MulticlusterDestinationRuleReconcilerFuncs) ReconcileDestinationRuleDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileDestinationRuleDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileDestinationRuleDeletion(clusterName, req)
+}
+
+type MulticlusterDestinationRuleReconcileLoop interface {
+	// AddMulticlusterDestinationRuleReconciler adds a MulticlusterDestinationRuleReconciler to the MulticlusterDestinationRuleReconcileLoop.
+	AddMulticlusterDestinationRuleReconciler(ctx context.Context, rec MulticlusterDestinationRuleReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterDestinationRuleReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterDestinationRuleReconcileLoop) AddMulticlusterDestinationRuleReconciler(ctx context.Context, rec MulticlusterDestinationRuleReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericDestinationRuleMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterDestinationRuleReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterDestinationRuleReconcileLoop {
+	return &multiclusterDestinationRuleReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.DestinationRule{}, options)}
+}
+
+type genericDestinationRuleMulticlusterReconciler struct {
+	reconciler MulticlusterDestinationRuleReconciler
+}
+
+func (g genericDestinationRuleMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterDestinationRuleDeletionReconciler); ok {
+		return deletionReconciler.ReconcileDestinationRuleDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericDestinationRuleMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileDestinationRule(cluster, obj)
+}
+
+// Reconcile Upsert events for the Gateway Resource across clusters.
+// implemented by the user
+type MulticlusterGatewayReconciler interface {
+	ReconcileGateway(clusterName string, obj *networking_istio_io_v1.Gateway) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Gateway Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterGatewayDeletionReconciler interface {
+	ReconcileGatewayDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterGatewayReconcilerFuncs struct {
+	OnReconcileGateway         func(clusterName string, obj *networking_istio_io_v1.Gateway) (reconcile.Result, error)
+	OnReconcileGatewayDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterGatewayReconcilerFuncs) ReconcileGateway(clusterName string, obj *networking_istio_io_v1.Gateway) (reconcile.Result, error) {
+	if f.OnReconcileGateway == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileGateway(clusterName, obj)
+}
+
+func (f *MulticlusterGatewayReconcilerFuncs) ReconcileGatewayDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileGatewayDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileGatewayDeletion(clusterName, req)
+}
+
+type MulticlusterGatewayReconcileLoop interface {
+	// AddMulticlusterGatewayReconciler adds a MulticlusterGatewayReconciler to the MulticlusterGatewayReconcileLoop.
+	AddMulticlusterGatewayReconciler(ctx context.Context, rec MulticlusterGatewayReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterGatewayReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterGatewayReconcileLoop) AddMulticlusterGatewayReconciler(ctx context.Context, rec MulticlusterGatewayReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericGatewayMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterGatewayReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterGatewayReconcileLoop {
+	return &multiclusterGatewayReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.Gateway{}, options)}
+}
+
+type genericGatewayMulticlusterReconciler struct {
+	reconciler MulticlusterGatewayReconciler
+}
+
+func (g genericGatewayMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterGatewayDeletionReconciler); ok {
+		return deletionReconciler.ReconcileGatewayDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericGatewayMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileGateway(cluster, obj)
+}
+
+// Reconcile Upsert events for the ServiceEntry Resource across clusters.
+// implemented by the user
+type MulticlusterServiceEntryReconciler interface {
+	ReconcileServiceEntry(clusterName string, obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the ServiceEntry Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterServiceEntryDeletionReconciler interface {
+	ReconcileServiceEntryDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterServiceEntryReconcilerFuncs struct {
+	OnReconcileServiceEntry         func(clusterName string, obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error)
+	OnReconcileServiceEntryDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterServiceEntryReconcilerFuncs) ReconcileServiceEntry(clusterName string, obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error) {
+	if f.OnReconcileServiceEntry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileServiceEntry(clusterName, obj)
+}
+
+func (f *MulticlusterServiceEntryReconcilerFuncs) ReconcileServiceEntryDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileServiceEntryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileServiceEntryDeletion(clusterName, req)
+}
+
+type MulticlusterServiceEntryReconcileLoop interface {
+	// AddMulticlusterServiceEntryReconciler adds a MulticlusterServiceEntryReconciler to the MulticlusterServiceEntryReconcileLoop.
+	AddMulticlusterServiceEntryReconciler(ctx context.Context, rec MulticlusterServiceEntryReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterServiceEntryReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterServiceEntryReconcileLoop) AddMulticlusterServiceEntryReconciler(ctx context.Context, rec MulticlusterServiceEntryReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericServiceEntryMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterServiceEntryReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterServiceEntryReconcileLoop {
+	return &multiclusterServiceEntryReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.ServiceEntry{}, options)}
+}
+
+type genericServiceEntryMulticlusterReconciler struct {
+	reconciler MulticlusterServiceEntryReconciler
+}
+
+func (g genericServiceEntryMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterServiceEntryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileServiceEntryDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericServiceEntryMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileServiceEntry(cluster, obj)
+}
+
+// Reconcile Upsert events for the WorkloadEntry Resource across clusters.
+// implemented by the user
+type MulticlusterWorkloadEntryReconciler interface {
+	ReconcileWorkloadEntry(clusterName string, obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the WorkloadEntry Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterWorkloadEntryDeletionReconciler interface {
+	ReconcileWorkloadEntryDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterWorkloadEntryReconcilerFuncs struct {
+	OnReconcileWorkloadEntry         func(clusterName string, obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error)
+	OnReconcileWorkloadEntryDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterWorkloadEntryReconcilerFuncs) ReconcileWorkloadEntry(clusterName string, obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error) {
+	if f.OnReconcileWorkloadEntry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileWorkloadEntry(clusterName, obj)
+}
+
+func (f *MulticlusterWorkloadEntryReconcilerFuncs) ReconcileWorkloadEntryDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileWorkloadEntryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileWorkloadEntryDeletion(clusterName, req)
+}
+
+type MulticlusterWorkloadEntryReconcileLoop interface {
+	// AddMulticlusterWorkloadEntryReconciler adds a MulticlusterWorkloadEntryReconciler to the MulticlusterWorkloadEntryReconcileLoop.
+	AddMulticlusterWorkloadEntryReconciler(ctx context.Context, rec MulticlusterWorkloadEntryReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterWorkloadEntryReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterWorkloadEntryReconcileLoop) AddMulticlusterWorkloadEntryReconciler(ctx context.Context, rec MulticlusterWorkloadEntryReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericWorkloadEntryMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterWorkloadEntryReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterWorkloadEntryReconcileLoop {
+	return &multiclusterWorkloadEntryReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.WorkloadEntry{}, options)}
+}
+
+type genericWorkloadEntryMulticlusterReconciler struct {
+	reconciler MulticlusterWorkloadEntryReconciler
+}
+
+func (g genericWorkloadEntryMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterWorkloadEntryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileWorkloadEntryDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericWorkloadEntryMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileWorkloadEntry(cluster, obj)
+}
+
+// Reconcile Upsert events for the WorkloadGroup Resource across clusters.
+// implemented by the user
+type MulticlusterWorkloadGroupReconciler interface {
+	ReconcileWorkloadGroup(clusterName string, obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the WorkloadGroup Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterWorkloadGroupDeletionReconciler interface {
+	ReconcileWorkloadGroupDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterWorkloadGroupReconcilerFuncs struct {
+	OnReconcileWorkloadGroup         func(clusterName string, obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error)
+	OnReconcileWorkloadGroupDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterWorkloadGroupReconcilerFuncs) ReconcileWorkloadGroup(clusterName string, obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error) {
+	if f.OnReconcileWorkloadGroup == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileWorkloadGroup(clusterName, obj)
+}
+
+func (f *MulticlusterWorkloadGroupReconcilerFuncs) ReconcileWorkloadGroupDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileWorkloadGroupDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileWorkloadGroupDeletion(clusterName, req)
+}
+
+type MulticlusterWorkloadGroupReconcileLoop interface {
+	// AddMulticlusterWorkloadGroupReconciler adds a MulticlusterWorkloadGroupReconciler to the MulticlusterWorkloadGroupReconcileLoop.
+	AddMulticlusterWorkloadGroupReconciler(ctx context.Context, rec MulticlusterWorkloadGroupReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterWorkloadGroupReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterWorkloadGroupReconcileLoop) AddMulticlusterWorkloadGroupReconciler(ctx context.Context, rec MulticlusterWorkloadGroupReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericWorkloadGroupMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterWorkloadGroupReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterWorkloadGroupReconcileLoop {
+	return &multiclusterWorkloadGroupReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.WorkloadGroup{}, options)}
+}
+
+type genericWorkloadGroupMulticlusterReconciler struct {
+	reconciler MulticlusterWorkloadGroupReconciler
+}
+
+func (g genericWorkloadGroupMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterWorkloadGroupDeletionReconciler); ok {
+		return deletionReconciler.ReconcileWorkloadGroupDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericWorkloadGroupMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileWorkloadGroup(cluster, obj)
+}
+
+// Reconcile Upsert events for the VirtualService Resource across clusters.
+// implemented by the user
+type MulticlusterVirtualServiceReconciler interface {
+	ReconcileVirtualService(clusterName string, obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the VirtualService Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterVirtualServiceDeletionReconciler interface {
+	ReconcileVirtualServiceDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterVirtualServiceReconcilerFuncs struct {
+	OnReconcileVirtualService         func(clusterName string, obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error)
+	OnReconcileVirtualServiceDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterVirtualServiceReconcilerFuncs) ReconcileVirtualService(clusterName string, obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error) {
+	if f.OnReconcileVirtualService == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileVirtualService(clusterName, obj)
+}
+
+func (f *MulticlusterVirtualServiceReconcilerFuncs) ReconcileVirtualServiceDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileVirtualServiceDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileVirtualServiceDeletion(clusterName, req)
+}
+
+type MulticlusterVirtualServiceReconcileLoop interface {
+	// AddMulticlusterVirtualServiceReconciler adds a MulticlusterVirtualServiceReconciler to the MulticlusterVirtualServiceReconcileLoop.
+	AddMulticlusterVirtualServiceReconciler(ctx context.Context, rec MulticlusterVirtualServiceReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterVirtualServiceReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterVirtualServiceReconcileLoop) AddMulticlusterVirtualServiceReconciler(ctx context.Context, rec MulticlusterVirtualServiceReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericVirtualServiceMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterVirtualServiceReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterVirtualServiceReconcileLoop {
+	return &multiclusterVirtualServiceReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.VirtualService{}, options)}
+}
+
+type genericVirtualServiceMulticlusterReconciler struct {
+	reconciler MulticlusterVirtualServiceReconciler
+}
+
+func (g genericVirtualServiceMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterVirtualServiceDeletionReconciler); ok {
+		return deletionReconciler.ReconcileVirtualServiceDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericVirtualServiceMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileVirtualService(cluster, obj)
+}
+
+// Reconcile Upsert events for the Sidecar Resource across clusters.
+// implemented by the user
+type MulticlusterSidecarReconciler interface {
+	ReconcileSidecar(clusterName string, obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Sidecar Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterSidecarDeletionReconciler interface {
+	ReconcileSidecarDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterSidecarReconcilerFuncs struct {
+	OnReconcileSidecar         func(clusterName string, obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error)
+	OnReconcileSidecarDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterSidecarReconcilerFuncs) ReconcileSidecar(clusterName string, obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error) {
+	if f.OnReconcileSidecar == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileSidecar(clusterName, obj)
+}
+
+func (f *MulticlusterSidecarReconcilerFuncs) ReconcileSidecarDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileSidecarDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileSidecarDeletion(clusterName, req)
+}
+
+type MulticlusterSidecarReconcileLoop interface {
+	// AddMulticlusterSidecarReconciler adds a MulticlusterSidecarReconciler to the MulticlusterSidecarReconcileLoop.
+	AddMulticlusterSidecarReconciler(ctx context.Context, rec MulticlusterSidecarReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterSidecarReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterSidecarReconcileLoop) AddMulticlusterSidecarReconciler(ctx context.Context, rec MulticlusterSidecarReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericSidecarMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterSidecarReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterSidecarReconcileLoop {
+	return &multiclusterSidecarReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &networking_istio_io_v1.Sidecar{}, options)}
+}
+
+type genericSidecarMulticlusterReconciler struct {
+	reconciler MulticlusterSidecarReconciler
+}
+
+func (g genericSidecarMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterSidecarDeletionReconciler); ok {
+		return deletionReconciler.ReconcileSidecarDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericSidecarMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileSidecar(cluster, obj)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/controller/reconcilers.go b/pkg/api/istio/networking.istio.io/v1/controller/reconcilers.go
new file mode 100644
index 0000000..46e9d58
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/controller/reconcilers.go
@@ -0,0 +1,837 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./reconcilers.go -destination mocks/reconcilers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	networking_istio_io_v1 "istio.io/client-go/pkg/apis/networking/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the DestinationRule Resource.
+// implemented by the user
+type DestinationRuleReconciler interface {
+	ReconcileDestinationRule(obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the DestinationRule Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type DestinationRuleDeletionReconciler interface {
+	ReconcileDestinationRuleDeletion(req reconcile.Request) error
+}
+
+type DestinationRuleReconcilerFuncs struct {
+	OnReconcileDestinationRule         func(obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error)
+	OnReconcileDestinationRuleDeletion func(req reconcile.Request) error
+}
+
+func (f *DestinationRuleReconcilerFuncs) ReconcileDestinationRule(obj *networking_istio_io_v1.DestinationRule) (reconcile.Result, error) {
+	if f.OnReconcileDestinationRule == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileDestinationRule(obj)
+}
+
+func (f *DestinationRuleReconcilerFuncs) ReconcileDestinationRuleDeletion(req reconcile.Request) error {
+	if f.OnReconcileDestinationRuleDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileDestinationRuleDeletion(req)
+}
+
+// Reconcile and finalize the DestinationRule Resource
+// implemented by the user
+type DestinationRuleFinalizer interface {
+	DestinationRuleReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	DestinationRuleFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeDestinationRule(obj *networking_istio_io_v1.DestinationRule) error
+}
+
+type DestinationRuleReconcileLoop interface {
+	RunDestinationRuleReconciler(ctx context.Context, rec DestinationRuleReconciler, predicates ...predicate.Predicate) error
+}
+
+type destinationRuleReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewDestinationRuleReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) DestinationRuleReconcileLoop {
+	return &destinationRuleReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.DestinationRule{}, options),
+	}
+}
+
+func (c *destinationRuleReconcileLoop) RunDestinationRuleReconciler(ctx context.Context, reconciler DestinationRuleReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericDestinationRuleReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(DestinationRuleFinalizer); ok {
+		reconcilerWrapper = genericDestinationRuleFinalizer{
+			genericDestinationRuleReconciler: genericReconciler,
+			finalizingReconciler:             finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericDestinationRuleHandler implements a generic reconcile.Reconciler
+type genericDestinationRuleReconciler struct {
+	reconciler DestinationRuleReconciler
+}
+
+func (r genericDestinationRuleReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileDestinationRule(obj)
+}
+
+func (r genericDestinationRuleReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(DestinationRuleDeletionReconciler); ok {
+		return deletionReconciler.ReconcileDestinationRuleDeletion(request)
+	}
+	return nil
+}
+
+// genericDestinationRuleFinalizer implements a generic reconcile.FinalizingReconciler
+type genericDestinationRuleFinalizer struct {
+	genericDestinationRuleReconciler
+	finalizingReconciler DestinationRuleFinalizer
+}
+
+func (r genericDestinationRuleFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.DestinationRuleFinalizerName()
+}
+
+func (r genericDestinationRuleFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.DestinationRule)
+	if !ok {
+		return errors.Errorf("internal error: DestinationRule handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeDestinationRule(obj)
+}
+
+// Reconcile Upsert events for the Gateway Resource.
+// implemented by the user
+type GatewayReconciler interface {
+	ReconcileGateway(obj *networking_istio_io_v1.Gateway) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Gateway Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type GatewayDeletionReconciler interface {
+	ReconcileGatewayDeletion(req reconcile.Request) error
+}
+
+type GatewayReconcilerFuncs struct {
+	OnReconcileGateway         func(obj *networking_istio_io_v1.Gateway) (reconcile.Result, error)
+	OnReconcileGatewayDeletion func(req reconcile.Request) error
+}
+
+func (f *GatewayReconcilerFuncs) ReconcileGateway(obj *networking_istio_io_v1.Gateway) (reconcile.Result, error) {
+	if f.OnReconcileGateway == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileGateway(obj)
+}
+
+func (f *GatewayReconcilerFuncs) ReconcileGatewayDeletion(req reconcile.Request) error {
+	if f.OnReconcileGatewayDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileGatewayDeletion(req)
+}
+
+// Reconcile and finalize the Gateway Resource
+// implemented by the user
+type GatewayFinalizer interface {
+	GatewayReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	GatewayFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeGateway(obj *networking_istio_io_v1.Gateway) error
+}
+
+type GatewayReconcileLoop interface {
+	RunGatewayReconciler(ctx context.Context, rec GatewayReconciler, predicates ...predicate.Predicate) error
+}
+
+type gatewayReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewGatewayReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) GatewayReconcileLoop {
+	return &gatewayReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.Gateway{}, options),
+	}
+}
+
+func (c *gatewayReconcileLoop) RunGatewayReconciler(ctx context.Context, reconciler GatewayReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericGatewayReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(GatewayFinalizer); ok {
+		reconcilerWrapper = genericGatewayFinalizer{
+			genericGatewayReconciler: genericReconciler,
+			finalizingReconciler:     finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericGatewayHandler implements a generic reconcile.Reconciler
+type genericGatewayReconciler struct {
+	reconciler GatewayReconciler
+}
+
+func (r genericGatewayReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileGateway(obj)
+}
+
+func (r genericGatewayReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(GatewayDeletionReconciler); ok {
+		return deletionReconciler.ReconcileGatewayDeletion(request)
+	}
+	return nil
+}
+
+// genericGatewayFinalizer implements a generic reconcile.FinalizingReconciler
+type genericGatewayFinalizer struct {
+	genericGatewayReconciler
+	finalizingReconciler GatewayFinalizer
+}
+
+func (r genericGatewayFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.GatewayFinalizerName()
+}
+
+func (r genericGatewayFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Gateway)
+	if !ok {
+		return errors.Errorf("internal error: Gateway handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeGateway(obj)
+}
+
+// Reconcile Upsert events for the ServiceEntry Resource.
+// implemented by the user
+type ServiceEntryReconciler interface {
+	ReconcileServiceEntry(obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the ServiceEntry Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type ServiceEntryDeletionReconciler interface {
+	ReconcileServiceEntryDeletion(req reconcile.Request) error
+}
+
+type ServiceEntryReconcilerFuncs struct {
+	OnReconcileServiceEntry         func(obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error)
+	OnReconcileServiceEntryDeletion func(req reconcile.Request) error
+}
+
+func (f *ServiceEntryReconcilerFuncs) ReconcileServiceEntry(obj *networking_istio_io_v1.ServiceEntry) (reconcile.Result, error) {
+	if f.OnReconcileServiceEntry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileServiceEntry(obj)
+}
+
+func (f *ServiceEntryReconcilerFuncs) ReconcileServiceEntryDeletion(req reconcile.Request) error {
+	if f.OnReconcileServiceEntryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileServiceEntryDeletion(req)
+}
+
+// Reconcile and finalize the ServiceEntry Resource
+// implemented by the user
+type ServiceEntryFinalizer interface {
+	ServiceEntryReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	ServiceEntryFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeServiceEntry(obj *networking_istio_io_v1.ServiceEntry) error
+}
+
+type ServiceEntryReconcileLoop interface {
+	RunServiceEntryReconciler(ctx context.Context, rec ServiceEntryReconciler, predicates ...predicate.Predicate) error
+}
+
+type serviceEntryReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewServiceEntryReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) ServiceEntryReconcileLoop {
+	return &serviceEntryReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.ServiceEntry{}, options),
+	}
+}
+
+func (c *serviceEntryReconcileLoop) RunServiceEntryReconciler(ctx context.Context, reconciler ServiceEntryReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericServiceEntryReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(ServiceEntryFinalizer); ok {
+		reconcilerWrapper = genericServiceEntryFinalizer{
+			genericServiceEntryReconciler: genericReconciler,
+			finalizingReconciler:          finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericServiceEntryHandler implements a generic reconcile.Reconciler
+type genericServiceEntryReconciler struct {
+	reconciler ServiceEntryReconciler
+}
+
+func (r genericServiceEntryReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileServiceEntry(obj)
+}
+
+func (r genericServiceEntryReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(ServiceEntryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileServiceEntryDeletion(request)
+	}
+	return nil
+}
+
+// genericServiceEntryFinalizer implements a generic reconcile.FinalizingReconciler
+type genericServiceEntryFinalizer struct {
+	genericServiceEntryReconciler
+	finalizingReconciler ServiceEntryFinalizer
+}
+
+func (r genericServiceEntryFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.ServiceEntryFinalizerName()
+}
+
+func (r genericServiceEntryFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.ServiceEntry)
+	if !ok {
+		return errors.Errorf("internal error: ServiceEntry handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeServiceEntry(obj)
+}
+
+// Reconcile Upsert events for the WorkloadEntry Resource.
+// implemented by the user
+type WorkloadEntryReconciler interface {
+	ReconcileWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the WorkloadEntry Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type WorkloadEntryDeletionReconciler interface {
+	ReconcileWorkloadEntryDeletion(req reconcile.Request) error
+}
+
+type WorkloadEntryReconcilerFuncs struct {
+	OnReconcileWorkloadEntry         func(obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error)
+	OnReconcileWorkloadEntryDeletion func(req reconcile.Request) error
+}
+
+func (f *WorkloadEntryReconcilerFuncs) ReconcileWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) (reconcile.Result, error) {
+	if f.OnReconcileWorkloadEntry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileWorkloadEntry(obj)
+}
+
+func (f *WorkloadEntryReconcilerFuncs) ReconcileWorkloadEntryDeletion(req reconcile.Request) error {
+	if f.OnReconcileWorkloadEntryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileWorkloadEntryDeletion(req)
+}
+
+// Reconcile and finalize the WorkloadEntry Resource
+// implemented by the user
+type WorkloadEntryFinalizer interface {
+	WorkloadEntryReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	WorkloadEntryFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeWorkloadEntry(obj *networking_istio_io_v1.WorkloadEntry) error
+}
+
+type WorkloadEntryReconcileLoop interface {
+	RunWorkloadEntryReconciler(ctx context.Context, rec WorkloadEntryReconciler, predicates ...predicate.Predicate) error
+}
+
+type workloadEntryReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewWorkloadEntryReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) WorkloadEntryReconcileLoop {
+	return &workloadEntryReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.WorkloadEntry{}, options),
+	}
+}
+
+func (c *workloadEntryReconcileLoop) RunWorkloadEntryReconciler(ctx context.Context, reconciler WorkloadEntryReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericWorkloadEntryReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(WorkloadEntryFinalizer); ok {
+		reconcilerWrapper = genericWorkloadEntryFinalizer{
+			genericWorkloadEntryReconciler: genericReconciler,
+			finalizingReconciler:           finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericWorkloadEntryHandler implements a generic reconcile.Reconciler
+type genericWorkloadEntryReconciler struct {
+	reconciler WorkloadEntryReconciler
+}
+
+func (r genericWorkloadEntryReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileWorkloadEntry(obj)
+}
+
+func (r genericWorkloadEntryReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(WorkloadEntryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileWorkloadEntryDeletion(request)
+	}
+	return nil
+}
+
+// genericWorkloadEntryFinalizer implements a generic reconcile.FinalizingReconciler
+type genericWorkloadEntryFinalizer struct {
+	genericWorkloadEntryReconciler
+	finalizingReconciler WorkloadEntryFinalizer
+}
+
+func (r genericWorkloadEntryFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.WorkloadEntryFinalizerName()
+}
+
+func (r genericWorkloadEntryFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadEntry)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadEntry handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeWorkloadEntry(obj)
+}
+
+// Reconcile Upsert events for the WorkloadGroup Resource.
+// implemented by the user
+type WorkloadGroupReconciler interface {
+	ReconcileWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the WorkloadGroup Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type WorkloadGroupDeletionReconciler interface {
+	ReconcileWorkloadGroupDeletion(req reconcile.Request) error
+}
+
+type WorkloadGroupReconcilerFuncs struct {
+	OnReconcileWorkloadGroup         func(obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error)
+	OnReconcileWorkloadGroupDeletion func(req reconcile.Request) error
+}
+
+func (f *WorkloadGroupReconcilerFuncs) ReconcileWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) (reconcile.Result, error) {
+	if f.OnReconcileWorkloadGroup == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileWorkloadGroup(obj)
+}
+
+func (f *WorkloadGroupReconcilerFuncs) ReconcileWorkloadGroupDeletion(req reconcile.Request) error {
+	if f.OnReconcileWorkloadGroupDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileWorkloadGroupDeletion(req)
+}
+
+// Reconcile and finalize the WorkloadGroup Resource
+// implemented by the user
+type WorkloadGroupFinalizer interface {
+	WorkloadGroupReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	WorkloadGroupFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeWorkloadGroup(obj *networking_istio_io_v1.WorkloadGroup) error
+}
+
+type WorkloadGroupReconcileLoop interface {
+	RunWorkloadGroupReconciler(ctx context.Context, rec WorkloadGroupReconciler, predicates ...predicate.Predicate) error
+}
+
+type workloadGroupReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewWorkloadGroupReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) WorkloadGroupReconcileLoop {
+	return &workloadGroupReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.WorkloadGroup{}, options),
+	}
+}
+
+func (c *workloadGroupReconcileLoop) RunWorkloadGroupReconciler(ctx context.Context, reconciler WorkloadGroupReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericWorkloadGroupReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(WorkloadGroupFinalizer); ok {
+		reconcilerWrapper = genericWorkloadGroupFinalizer{
+			genericWorkloadGroupReconciler: genericReconciler,
+			finalizingReconciler:           finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericWorkloadGroupHandler implements a generic reconcile.Reconciler
+type genericWorkloadGroupReconciler struct {
+	reconciler WorkloadGroupReconciler
+}
+
+func (r genericWorkloadGroupReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileWorkloadGroup(obj)
+}
+
+func (r genericWorkloadGroupReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(WorkloadGroupDeletionReconciler); ok {
+		return deletionReconciler.ReconcileWorkloadGroupDeletion(request)
+	}
+	return nil
+}
+
+// genericWorkloadGroupFinalizer implements a generic reconcile.FinalizingReconciler
+type genericWorkloadGroupFinalizer struct {
+	genericWorkloadGroupReconciler
+	finalizingReconciler WorkloadGroupFinalizer
+}
+
+func (r genericWorkloadGroupFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.WorkloadGroupFinalizerName()
+}
+
+func (r genericWorkloadGroupFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.WorkloadGroup)
+	if !ok {
+		return errors.Errorf("internal error: WorkloadGroup handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeWorkloadGroup(obj)
+}
+
+// Reconcile Upsert events for the VirtualService Resource.
+// implemented by the user
+type VirtualServiceReconciler interface {
+	ReconcileVirtualService(obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the VirtualService Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type VirtualServiceDeletionReconciler interface {
+	ReconcileVirtualServiceDeletion(req reconcile.Request) error
+}
+
+type VirtualServiceReconcilerFuncs struct {
+	OnReconcileVirtualService         func(obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error)
+	OnReconcileVirtualServiceDeletion func(req reconcile.Request) error
+}
+
+func (f *VirtualServiceReconcilerFuncs) ReconcileVirtualService(obj *networking_istio_io_v1.VirtualService) (reconcile.Result, error) {
+	if f.OnReconcileVirtualService == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileVirtualService(obj)
+}
+
+func (f *VirtualServiceReconcilerFuncs) ReconcileVirtualServiceDeletion(req reconcile.Request) error {
+	if f.OnReconcileVirtualServiceDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileVirtualServiceDeletion(req)
+}
+
+// Reconcile and finalize the VirtualService Resource
+// implemented by the user
+type VirtualServiceFinalizer interface {
+	VirtualServiceReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	VirtualServiceFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeVirtualService(obj *networking_istio_io_v1.VirtualService) error
+}
+
+type VirtualServiceReconcileLoop interface {
+	RunVirtualServiceReconciler(ctx context.Context, rec VirtualServiceReconciler, predicates ...predicate.Predicate) error
+}
+
+type virtualServiceReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewVirtualServiceReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) VirtualServiceReconcileLoop {
+	return &virtualServiceReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.VirtualService{}, options),
+	}
+}
+
+func (c *virtualServiceReconcileLoop) RunVirtualServiceReconciler(ctx context.Context, reconciler VirtualServiceReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericVirtualServiceReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(VirtualServiceFinalizer); ok {
+		reconcilerWrapper = genericVirtualServiceFinalizer{
+			genericVirtualServiceReconciler: genericReconciler,
+			finalizingReconciler:            finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericVirtualServiceHandler implements a generic reconcile.Reconciler
+type genericVirtualServiceReconciler struct {
+	reconciler VirtualServiceReconciler
+}
+
+func (r genericVirtualServiceReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileVirtualService(obj)
+}
+
+func (r genericVirtualServiceReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(VirtualServiceDeletionReconciler); ok {
+		return deletionReconciler.ReconcileVirtualServiceDeletion(request)
+	}
+	return nil
+}
+
+// genericVirtualServiceFinalizer implements a generic reconcile.FinalizingReconciler
+type genericVirtualServiceFinalizer struct {
+	genericVirtualServiceReconciler
+	finalizingReconciler VirtualServiceFinalizer
+}
+
+func (r genericVirtualServiceFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.VirtualServiceFinalizerName()
+}
+
+func (r genericVirtualServiceFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.VirtualService)
+	if !ok {
+		return errors.Errorf("internal error: VirtualService handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeVirtualService(obj)
+}
+
+// Reconcile Upsert events for the Sidecar Resource.
+// implemented by the user
+type SidecarReconciler interface {
+	ReconcileSidecar(obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Sidecar Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type SidecarDeletionReconciler interface {
+	ReconcileSidecarDeletion(req reconcile.Request) error
+}
+
+type SidecarReconcilerFuncs struct {
+	OnReconcileSidecar         func(obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error)
+	OnReconcileSidecarDeletion func(req reconcile.Request) error
+}
+
+func (f *SidecarReconcilerFuncs) ReconcileSidecar(obj *networking_istio_io_v1.Sidecar) (reconcile.Result, error) {
+	if f.OnReconcileSidecar == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileSidecar(obj)
+}
+
+func (f *SidecarReconcilerFuncs) ReconcileSidecarDeletion(req reconcile.Request) error {
+	if f.OnReconcileSidecarDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileSidecarDeletion(req)
+}
+
+// Reconcile and finalize the Sidecar Resource
+// implemented by the user
+type SidecarFinalizer interface {
+	SidecarReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	SidecarFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeSidecar(obj *networking_istio_io_v1.Sidecar) error
+}
+
+type SidecarReconcileLoop interface {
+	RunSidecarReconciler(ctx context.Context, rec SidecarReconciler, predicates ...predicate.Predicate) error
+}
+
+type sidecarReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewSidecarReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) SidecarReconcileLoop {
+	return &sidecarReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &networking_istio_io_v1.Sidecar{}, options),
+	}
+}
+
+func (c *sidecarReconcileLoop) RunSidecarReconciler(ctx context.Context, reconciler SidecarReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericSidecarReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(SidecarFinalizer); ok {
+		reconcilerWrapper = genericSidecarFinalizer{
+			genericSidecarReconciler: genericReconciler,
+			finalizingReconciler:     finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericSidecarHandler implements a generic reconcile.Reconciler
+type genericSidecarReconciler struct {
+	reconciler SidecarReconciler
+}
+
+func (r genericSidecarReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileSidecar(obj)
+}
+
+func (r genericSidecarReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(SidecarDeletionReconciler); ok {
+		return deletionReconciler.ReconcileSidecarDeletion(request)
+	}
+	return nil
+}
+
+// genericSidecarFinalizer implements a generic reconcile.FinalizingReconciler
+type genericSidecarFinalizer struct {
+	genericSidecarReconciler
+	finalizingReconciler SidecarFinalizer
+}
+
+func (r genericSidecarFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.SidecarFinalizerName()
+}
+
+func (r genericSidecarFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*networking_istio_io_v1.Sidecar)
+	if !ok {
+		return errors.Errorf("internal error: Sidecar handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeSidecar(obj)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/mocks/clients.go b/pkg/api/istio/networking.istio.io/v1/mocks/clients.go
new file mode 100644
index 0000000..3371f1d
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/mocks/clients.go
@@ -0,0 +1,3702 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./clients.go
+
+// Package mock_v1 is a generated GoMock package.
+package mock_v1
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1 "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1"
+	v10 "istio.io/client-go/pkg/apis/networking/v1"
+	client "sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MockMulticlusterClientset is a mock of MulticlusterClientset interface.
+type MockMulticlusterClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterClientsetMockRecorder
+}
+
+// MockMulticlusterClientsetMockRecorder is the mock recorder for MockMulticlusterClientset.
+type MockMulticlusterClientsetMockRecorder struct {
+	mock *MockMulticlusterClientset
+}
+
+// NewMockMulticlusterClientset creates a new mock instance.
+func NewMockMulticlusterClientset(ctrl *gomock.Controller) *MockMulticlusterClientset {
+	mock := &MockMulticlusterClientset{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterClientset) EXPECT() *MockMulticlusterClientsetMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterClientset) Cluster(cluster string) (v1.Clientset, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.Clientset)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterClientsetMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterClientset)(nil).Cluster), cluster)
+}
+
+// MockClientset is a mock of Clientset interface.
+type MockClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockClientsetMockRecorder
+}
+
+// MockClientsetMockRecorder is the mock recorder for MockClientset.
+type MockClientsetMockRecorder struct {
+	mock *MockClientset
+}
+
+// NewMockClientset creates a new mock instance.
+func NewMockClientset(ctrl *gomock.Controller) *MockClientset {
+	mock := &MockClientset{ctrl: ctrl}
+	mock.recorder = &MockClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockClientset) EXPECT() *MockClientsetMockRecorder {
+	return m.recorder
+}
+
+// DestinationRules mocks base method.
+func (m *MockClientset) DestinationRules() v1.DestinationRuleClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DestinationRules")
+	ret0, _ := ret[0].(v1.DestinationRuleClient)
+	return ret0
+}
+
+// DestinationRules indicates an expected call of DestinationRules.
+func (mr *MockClientsetMockRecorder) DestinationRules() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DestinationRules", reflect.TypeOf((*MockClientset)(nil).DestinationRules))
+}
+
+// Gateways mocks base method.
+func (m *MockClientset) Gateways() v1.GatewayClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Gateways")
+	ret0, _ := ret[0].(v1.GatewayClient)
+	return ret0
+}
+
+// Gateways indicates an expected call of Gateways.
+func (mr *MockClientsetMockRecorder) Gateways() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Gateways", reflect.TypeOf((*MockClientset)(nil).Gateways))
+}
+
+// ServiceEntries mocks base method.
+func (m *MockClientset) ServiceEntries() v1.ServiceEntryClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ServiceEntries")
+	ret0, _ := ret[0].(v1.ServiceEntryClient)
+	return ret0
+}
+
+// ServiceEntries indicates an expected call of ServiceEntries.
+func (mr *MockClientsetMockRecorder) ServiceEntries() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceEntries", reflect.TypeOf((*MockClientset)(nil).ServiceEntries))
+}
+
+// Sidecars mocks base method.
+func (m *MockClientset) Sidecars() v1.SidecarClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Sidecars")
+	ret0, _ := ret[0].(v1.SidecarClient)
+	return ret0
+}
+
+// Sidecars indicates an expected call of Sidecars.
+func (mr *MockClientsetMockRecorder) Sidecars() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sidecars", reflect.TypeOf((*MockClientset)(nil).Sidecars))
+}
+
+// VirtualServices mocks base method.
+func (m *MockClientset) VirtualServices() v1.VirtualServiceClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "VirtualServices")
+	ret0, _ := ret[0].(v1.VirtualServiceClient)
+	return ret0
+}
+
+// VirtualServices indicates an expected call of VirtualServices.
+func (mr *MockClientsetMockRecorder) VirtualServices() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VirtualServices", reflect.TypeOf((*MockClientset)(nil).VirtualServices))
+}
+
+// WorkloadEntries mocks base method.
+func (m *MockClientset) WorkloadEntries() v1.WorkloadEntryClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "WorkloadEntries")
+	ret0, _ := ret[0].(v1.WorkloadEntryClient)
+	return ret0
+}
+
+// WorkloadEntries indicates an expected call of WorkloadEntries.
+func (mr *MockClientsetMockRecorder) WorkloadEntries() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkloadEntries", reflect.TypeOf((*MockClientset)(nil).WorkloadEntries))
+}
+
+// WorkloadGroups mocks base method.
+func (m *MockClientset) WorkloadGroups() v1.WorkloadGroupClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "WorkloadGroups")
+	ret0, _ := ret[0].(v1.WorkloadGroupClient)
+	return ret0
+}
+
+// WorkloadGroups indicates an expected call of WorkloadGroups.
+func (mr *MockClientsetMockRecorder) WorkloadGroups() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkloadGroups", reflect.TypeOf((*MockClientset)(nil).WorkloadGroups))
+}
+
+// MockDestinationRuleReader is a mock of DestinationRuleReader interface.
+type MockDestinationRuleReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleReaderMockRecorder
+}
+
+// MockDestinationRuleReaderMockRecorder is the mock recorder for MockDestinationRuleReader.
+type MockDestinationRuleReaderMockRecorder struct {
+	mock *MockDestinationRuleReader
+}
+
+// NewMockDestinationRuleReader creates a new mock instance.
+func NewMockDestinationRuleReader(ctrl *gomock.Controller) *MockDestinationRuleReader {
+	mock := &MockDestinationRuleReader{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleReader) EXPECT() *MockDestinationRuleReaderMockRecorder {
+	return m.recorder
+}
+
+// GetDestinationRule mocks base method.
+func (m *MockDestinationRuleReader) GetDestinationRule(ctx context.Context, key client.ObjectKey) (*v10.DestinationRule, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetDestinationRule", ctx, key)
+	ret0, _ := ret[0].(*v10.DestinationRule)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetDestinationRule indicates an expected call of GetDestinationRule.
+func (mr *MockDestinationRuleReaderMockRecorder) GetDestinationRule(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDestinationRule", reflect.TypeOf((*MockDestinationRuleReader)(nil).GetDestinationRule), ctx, key)
+}
+
+// ListDestinationRule mocks base method.
+func (m *MockDestinationRuleReader) ListDestinationRule(ctx context.Context, opts ...client.ListOption) (*v10.DestinationRuleList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListDestinationRule", varargs...)
+	ret0, _ := ret[0].(*v10.DestinationRuleList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListDestinationRule indicates an expected call of ListDestinationRule.
+func (mr *MockDestinationRuleReaderMockRecorder) ListDestinationRule(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDestinationRule", reflect.TypeOf((*MockDestinationRuleReader)(nil).ListDestinationRule), varargs...)
+}
+
+// MockDestinationRuleWriter is a mock of DestinationRuleWriter interface.
+type MockDestinationRuleWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleWriterMockRecorder
+}
+
+// MockDestinationRuleWriterMockRecorder is the mock recorder for MockDestinationRuleWriter.
+type MockDestinationRuleWriterMockRecorder struct {
+	mock *MockDestinationRuleWriter
+}
+
+// NewMockDestinationRuleWriter creates a new mock instance.
+func NewMockDestinationRuleWriter(ctrl *gomock.Controller) *MockDestinationRuleWriter {
+	mock := &MockDestinationRuleWriter{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleWriter) EXPECT() *MockDestinationRuleWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) CreateDestinationRule(ctx context.Context, obj *v10.DestinationRule, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateDestinationRule indicates an expected call of CreateDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) CreateDestinationRule(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).CreateDestinationRule), varargs...)
+}
+
+// DeleteAllOfDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) DeleteAllOfDestinationRule(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfDestinationRule indicates an expected call of DeleteAllOfDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) DeleteAllOfDestinationRule(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).DeleteAllOfDestinationRule), varargs...)
+}
+
+// DeleteDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) DeleteDestinationRule(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteDestinationRule indicates an expected call of DeleteDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) DeleteDestinationRule(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).DeleteDestinationRule), varargs...)
+}
+
+// PatchDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) PatchDestinationRule(ctx context.Context, obj *v10.DestinationRule, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchDestinationRule indicates an expected call of PatchDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) PatchDestinationRule(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).PatchDestinationRule), varargs...)
+}
+
+// UpdateDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) UpdateDestinationRule(ctx context.Context, obj *v10.DestinationRule, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateDestinationRule indicates an expected call of UpdateDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) UpdateDestinationRule(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).UpdateDestinationRule), varargs...)
+}
+
+// UpsertDestinationRule mocks base method.
+func (m *MockDestinationRuleWriter) UpsertDestinationRule(ctx context.Context, obj *v10.DestinationRule, transitionFuncs ...v1.DestinationRuleTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertDestinationRule indicates an expected call of UpsertDestinationRule.
+func (mr *MockDestinationRuleWriterMockRecorder) UpsertDestinationRule(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDestinationRule", reflect.TypeOf((*MockDestinationRuleWriter)(nil).UpsertDestinationRule), varargs...)
+}
+
+// MockDestinationRuleStatusWriter is a mock of DestinationRuleStatusWriter interface.
+type MockDestinationRuleStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleStatusWriterMockRecorder
+}
+
+// MockDestinationRuleStatusWriterMockRecorder is the mock recorder for MockDestinationRuleStatusWriter.
+type MockDestinationRuleStatusWriterMockRecorder struct {
+	mock *MockDestinationRuleStatusWriter
+}
+
+// NewMockDestinationRuleStatusWriter creates a new mock instance.
+func NewMockDestinationRuleStatusWriter(ctrl *gomock.Controller) *MockDestinationRuleStatusWriter {
+	mock := &MockDestinationRuleStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleStatusWriter) EXPECT() *MockDestinationRuleStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchDestinationRuleStatus mocks base method.
+func (m *MockDestinationRuleStatusWriter) PatchDestinationRuleStatus(ctx context.Context, obj *v10.DestinationRule, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchDestinationRuleStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchDestinationRuleStatus indicates an expected call of PatchDestinationRuleStatus.
+func (mr *MockDestinationRuleStatusWriterMockRecorder) PatchDestinationRuleStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchDestinationRuleStatus", reflect.TypeOf((*MockDestinationRuleStatusWriter)(nil).PatchDestinationRuleStatus), varargs...)
+}
+
+// UpdateDestinationRuleStatus mocks base method.
+func (m *MockDestinationRuleStatusWriter) UpdateDestinationRuleStatus(ctx context.Context, obj *v10.DestinationRule, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateDestinationRuleStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateDestinationRuleStatus indicates an expected call of UpdateDestinationRuleStatus.
+func (mr *MockDestinationRuleStatusWriterMockRecorder) UpdateDestinationRuleStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDestinationRuleStatus", reflect.TypeOf((*MockDestinationRuleStatusWriter)(nil).UpdateDestinationRuleStatus), varargs...)
+}
+
+// MockDestinationRuleClient is a mock of DestinationRuleClient interface.
+type MockDestinationRuleClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleClientMockRecorder
+}
+
+// MockDestinationRuleClientMockRecorder is the mock recorder for MockDestinationRuleClient.
+type MockDestinationRuleClientMockRecorder struct {
+	mock *MockDestinationRuleClient
+}
+
+// NewMockDestinationRuleClient creates a new mock instance.
+func NewMockDestinationRuleClient(ctrl *gomock.Controller) *MockDestinationRuleClient {
+	mock := &MockDestinationRuleClient{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleClient) EXPECT() *MockDestinationRuleClientMockRecorder {
+	return m.recorder
+}
+
+// CreateDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) CreateDestinationRule(ctx context.Context, obj *v10.DestinationRule, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateDestinationRule indicates an expected call of CreateDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) CreateDestinationRule(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).CreateDestinationRule), varargs...)
+}
+
+// DeleteAllOfDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) DeleteAllOfDestinationRule(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfDestinationRule indicates an expected call of DeleteAllOfDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) DeleteAllOfDestinationRule(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).DeleteAllOfDestinationRule), varargs...)
+}
+
+// DeleteDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) DeleteDestinationRule(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteDestinationRule indicates an expected call of DeleteDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) DeleteDestinationRule(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).DeleteDestinationRule), varargs...)
+}
+
+// GetDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) GetDestinationRule(ctx context.Context, key client.ObjectKey) (*v10.DestinationRule, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetDestinationRule", ctx, key)
+	ret0, _ := ret[0].(*v10.DestinationRule)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetDestinationRule indicates an expected call of GetDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) GetDestinationRule(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).GetDestinationRule), ctx, key)
+}
+
+// ListDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) ListDestinationRule(ctx context.Context, opts ...client.ListOption) (*v10.DestinationRuleList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListDestinationRule", varargs...)
+	ret0, _ := ret[0].(*v10.DestinationRuleList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListDestinationRule indicates an expected call of ListDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) ListDestinationRule(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).ListDestinationRule), varargs...)
+}
+
+// PatchDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) PatchDestinationRule(ctx context.Context, obj *v10.DestinationRule, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchDestinationRule indicates an expected call of PatchDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) PatchDestinationRule(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).PatchDestinationRule), varargs...)
+}
+
+// PatchDestinationRuleStatus mocks base method.
+func (m *MockDestinationRuleClient) PatchDestinationRuleStatus(ctx context.Context, obj *v10.DestinationRule, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchDestinationRuleStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchDestinationRuleStatus indicates an expected call of PatchDestinationRuleStatus.
+func (mr *MockDestinationRuleClientMockRecorder) PatchDestinationRuleStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchDestinationRuleStatus", reflect.TypeOf((*MockDestinationRuleClient)(nil).PatchDestinationRuleStatus), varargs...)
+}
+
+// UpdateDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) UpdateDestinationRule(ctx context.Context, obj *v10.DestinationRule, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateDestinationRule indicates an expected call of UpdateDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) UpdateDestinationRule(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).UpdateDestinationRule), varargs...)
+}
+
+// UpdateDestinationRuleStatus mocks base method.
+func (m *MockDestinationRuleClient) UpdateDestinationRuleStatus(ctx context.Context, obj *v10.DestinationRule, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateDestinationRuleStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateDestinationRuleStatus indicates an expected call of UpdateDestinationRuleStatus.
+func (mr *MockDestinationRuleClientMockRecorder) UpdateDestinationRuleStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDestinationRuleStatus", reflect.TypeOf((*MockDestinationRuleClient)(nil).UpdateDestinationRuleStatus), varargs...)
+}
+
+// UpsertDestinationRule mocks base method.
+func (m *MockDestinationRuleClient) UpsertDestinationRule(ctx context.Context, obj *v10.DestinationRule, transitionFuncs ...v1.DestinationRuleTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertDestinationRule", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertDestinationRule indicates an expected call of UpsertDestinationRule.
+func (mr *MockDestinationRuleClientMockRecorder) UpsertDestinationRule(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertDestinationRule", reflect.TypeOf((*MockDestinationRuleClient)(nil).UpsertDestinationRule), varargs...)
+}
+
+// MockMulticlusterDestinationRuleClient is a mock of MulticlusterDestinationRuleClient interface.
+type MockMulticlusterDestinationRuleClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterDestinationRuleClientMockRecorder
+}
+
+// MockMulticlusterDestinationRuleClientMockRecorder is the mock recorder for MockMulticlusterDestinationRuleClient.
+type MockMulticlusterDestinationRuleClientMockRecorder struct {
+	mock *MockMulticlusterDestinationRuleClient
+}
+
+// NewMockMulticlusterDestinationRuleClient creates a new mock instance.
+func NewMockMulticlusterDestinationRuleClient(ctrl *gomock.Controller) *MockMulticlusterDestinationRuleClient {
+	mock := &MockMulticlusterDestinationRuleClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterDestinationRuleClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterDestinationRuleClient) EXPECT() *MockMulticlusterDestinationRuleClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterDestinationRuleClient) Cluster(cluster string) (v1.DestinationRuleClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.DestinationRuleClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterDestinationRuleClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterDestinationRuleClient)(nil).Cluster), cluster)
+}
+
+// MockGatewayReader is a mock of GatewayReader interface.
+type MockGatewayReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayReaderMockRecorder
+}
+
+// MockGatewayReaderMockRecorder is the mock recorder for MockGatewayReader.
+type MockGatewayReaderMockRecorder struct {
+	mock *MockGatewayReader
+}
+
+// NewMockGatewayReader creates a new mock instance.
+func NewMockGatewayReader(ctrl *gomock.Controller) *MockGatewayReader {
+	mock := &MockGatewayReader{ctrl: ctrl}
+	mock.recorder = &MockGatewayReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayReader) EXPECT() *MockGatewayReaderMockRecorder {
+	return m.recorder
+}
+
+// GetGateway mocks base method.
+func (m *MockGatewayReader) GetGateway(ctx context.Context, key client.ObjectKey) (*v10.Gateway, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetGateway", ctx, key)
+	ret0, _ := ret[0].(*v10.Gateway)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetGateway indicates an expected call of GetGateway.
+func (mr *MockGatewayReaderMockRecorder) GetGateway(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGateway", reflect.TypeOf((*MockGatewayReader)(nil).GetGateway), ctx, key)
+}
+
+// ListGateway mocks base method.
+func (m *MockGatewayReader) ListGateway(ctx context.Context, opts ...client.ListOption) (*v10.GatewayList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListGateway", varargs...)
+	ret0, _ := ret[0].(*v10.GatewayList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListGateway indicates an expected call of ListGateway.
+func (mr *MockGatewayReaderMockRecorder) ListGateway(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListGateway", reflect.TypeOf((*MockGatewayReader)(nil).ListGateway), varargs...)
+}
+
+// MockGatewayWriter is a mock of GatewayWriter interface.
+type MockGatewayWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayWriterMockRecorder
+}
+
+// MockGatewayWriterMockRecorder is the mock recorder for MockGatewayWriter.
+type MockGatewayWriterMockRecorder struct {
+	mock *MockGatewayWriter
+}
+
+// NewMockGatewayWriter creates a new mock instance.
+func NewMockGatewayWriter(ctrl *gomock.Controller) *MockGatewayWriter {
+	mock := &MockGatewayWriter{ctrl: ctrl}
+	mock.recorder = &MockGatewayWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayWriter) EXPECT() *MockGatewayWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateGateway mocks base method.
+func (m *MockGatewayWriter) CreateGateway(ctx context.Context, obj *v10.Gateway, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateGateway indicates an expected call of CreateGateway.
+func (mr *MockGatewayWriterMockRecorder) CreateGateway(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGateway", reflect.TypeOf((*MockGatewayWriter)(nil).CreateGateway), varargs...)
+}
+
+// DeleteAllOfGateway mocks base method.
+func (m *MockGatewayWriter) DeleteAllOfGateway(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfGateway indicates an expected call of DeleteAllOfGateway.
+func (mr *MockGatewayWriterMockRecorder) DeleteAllOfGateway(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfGateway", reflect.TypeOf((*MockGatewayWriter)(nil).DeleteAllOfGateway), varargs...)
+}
+
+// DeleteGateway mocks base method.
+func (m *MockGatewayWriter) DeleteGateway(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteGateway indicates an expected call of DeleteGateway.
+func (mr *MockGatewayWriterMockRecorder) DeleteGateway(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGateway", reflect.TypeOf((*MockGatewayWriter)(nil).DeleteGateway), varargs...)
+}
+
+// PatchGateway mocks base method.
+func (m *MockGatewayWriter) PatchGateway(ctx context.Context, obj *v10.Gateway, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchGateway indicates an expected call of PatchGateway.
+func (mr *MockGatewayWriterMockRecorder) PatchGateway(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchGateway", reflect.TypeOf((*MockGatewayWriter)(nil).PatchGateway), varargs...)
+}
+
+// UpdateGateway mocks base method.
+func (m *MockGatewayWriter) UpdateGateway(ctx context.Context, obj *v10.Gateway, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateGateway indicates an expected call of UpdateGateway.
+func (mr *MockGatewayWriterMockRecorder) UpdateGateway(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGateway", reflect.TypeOf((*MockGatewayWriter)(nil).UpdateGateway), varargs...)
+}
+
+// UpsertGateway mocks base method.
+func (m *MockGatewayWriter) UpsertGateway(ctx context.Context, obj *v10.Gateway, transitionFuncs ...v1.GatewayTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertGateway indicates an expected call of UpsertGateway.
+func (mr *MockGatewayWriterMockRecorder) UpsertGateway(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertGateway", reflect.TypeOf((*MockGatewayWriter)(nil).UpsertGateway), varargs...)
+}
+
+// MockGatewayStatusWriter is a mock of GatewayStatusWriter interface.
+type MockGatewayStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayStatusWriterMockRecorder
+}
+
+// MockGatewayStatusWriterMockRecorder is the mock recorder for MockGatewayStatusWriter.
+type MockGatewayStatusWriterMockRecorder struct {
+	mock *MockGatewayStatusWriter
+}
+
+// NewMockGatewayStatusWriter creates a new mock instance.
+func NewMockGatewayStatusWriter(ctrl *gomock.Controller) *MockGatewayStatusWriter {
+	mock := &MockGatewayStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockGatewayStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayStatusWriter) EXPECT() *MockGatewayStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchGatewayStatus mocks base method.
+func (m *MockGatewayStatusWriter) PatchGatewayStatus(ctx context.Context, obj *v10.Gateway, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchGatewayStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchGatewayStatus indicates an expected call of PatchGatewayStatus.
+func (mr *MockGatewayStatusWriterMockRecorder) PatchGatewayStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchGatewayStatus", reflect.TypeOf((*MockGatewayStatusWriter)(nil).PatchGatewayStatus), varargs...)
+}
+
+// UpdateGatewayStatus mocks base method.
+func (m *MockGatewayStatusWriter) UpdateGatewayStatus(ctx context.Context, obj *v10.Gateway, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateGatewayStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateGatewayStatus indicates an expected call of UpdateGatewayStatus.
+func (mr *MockGatewayStatusWriterMockRecorder) UpdateGatewayStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGatewayStatus", reflect.TypeOf((*MockGatewayStatusWriter)(nil).UpdateGatewayStatus), varargs...)
+}
+
+// MockGatewayClient is a mock of GatewayClient interface.
+type MockGatewayClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewayClientMockRecorder
+}
+
+// MockGatewayClientMockRecorder is the mock recorder for MockGatewayClient.
+type MockGatewayClientMockRecorder struct {
+	mock *MockGatewayClient
+}
+
+// NewMockGatewayClient creates a new mock instance.
+func NewMockGatewayClient(ctrl *gomock.Controller) *MockGatewayClient {
+	mock := &MockGatewayClient{ctrl: ctrl}
+	mock.recorder = &MockGatewayClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewayClient) EXPECT() *MockGatewayClientMockRecorder {
+	return m.recorder
+}
+
+// CreateGateway mocks base method.
+func (m *MockGatewayClient) CreateGateway(ctx context.Context, obj *v10.Gateway, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateGateway indicates an expected call of CreateGateway.
+func (mr *MockGatewayClientMockRecorder) CreateGateway(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGateway", reflect.TypeOf((*MockGatewayClient)(nil).CreateGateway), varargs...)
+}
+
+// DeleteAllOfGateway mocks base method.
+func (m *MockGatewayClient) DeleteAllOfGateway(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfGateway indicates an expected call of DeleteAllOfGateway.
+func (mr *MockGatewayClientMockRecorder) DeleteAllOfGateway(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfGateway", reflect.TypeOf((*MockGatewayClient)(nil).DeleteAllOfGateway), varargs...)
+}
+
+// DeleteGateway mocks base method.
+func (m *MockGatewayClient) DeleteGateway(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteGateway indicates an expected call of DeleteGateway.
+func (mr *MockGatewayClientMockRecorder) DeleteGateway(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGateway", reflect.TypeOf((*MockGatewayClient)(nil).DeleteGateway), varargs...)
+}
+
+// GetGateway mocks base method.
+func (m *MockGatewayClient) GetGateway(ctx context.Context, key client.ObjectKey) (*v10.Gateway, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetGateway", ctx, key)
+	ret0, _ := ret[0].(*v10.Gateway)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetGateway indicates an expected call of GetGateway.
+func (mr *MockGatewayClientMockRecorder) GetGateway(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGateway", reflect.TypeOf((*MockGatewayClient)(nil).GetGateway), ctx, key)
+}
+
+// ListGateway mocks base method.
+func (m *MockGatewayClient) ListGateway(ctx context.Context, opts ...client.ListOption) (*v10.GatewayList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListGateway", varargs...)
+	ret0, _ := ret[0].(*v10.GatewayList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListGateway indicates an expected call of ListGateway.
+func (mr *MockGatewayClientMockRecorder) ListGateway(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListGateway", reflect.TypeOf((*MockGatewayClient)(nil).ListGateway), varargs...)
+}
+
+// PatchGateway mocks base method.
+func (m *MockGatewayClient) PatchGateway(ctx context.Context, obj *v10.Gateway, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchGateway indicates an expected call of PatchGateway.
+func (mr *MockGatewayClientMockRecorder) PatchGateway(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchGateway", reflect.TypeOf((*MockGatewayClient)(nil).PatchGateway), varargs...)
+}
+
+// PatchGatewayStatus mocks base method.
+func (m *MockGatewayClient) PatchGatewayStatus(ctx context.Context, obj *v10.Gateway, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchGatewayStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchGatewayStatus indicates an expected call of PatchGatewayStatus.
+func (mr *MockGatewayClientMockRecorder) PatchGatewayStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchGatewayStatus", reflect.TypeOf((*MockGatewayClient)(nil).PatchGatewayStatus), varargs...)
+}
+
+// UpdateGateway mocks base method.
+func (m *MockGatewayClient) UpdateGateway(ctx context.Context, obj *v10.Gateway, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateGateway indicates an expected call of UpdateGateway.
+func (mr *MockGatewayClientMockRecorder) UpdateGateway(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGateway", reflect.TypeOf((*MockGatewayClient)(nil).UpdateGateway), varargs...)
+}
+
+// UpdateGatewayStatus mocks base method.
+func (m *MockGatewayClient) UpdateGatewayStatus(ctx context.Context, obj *v10.Gateway, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateGatewayStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateGatewayStatus indicates an expected call of UpdateGatewayStatus.
+func (mr *MockGatewayClientMockRecorder) UpdateGatewayStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGatewayStatus", reflect.TypeOf((*MockGatewayClient)(nil).UpdateGatewayStatus), varargs...)
+}
+
+// UpsertGateway mocks base method.
+func (m *MockGatewayClient) UpsertGateway(ctx context.Context, obj *v10.Gateway, transitionFuncs ...v1.GatewayTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertGateway", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertGateway indicates an expected call of UpsertGateway.
+func (mr *MockGatewayClientMockRecorder) UpsertGateway(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertGateway", reflect.TypeOf((*MockGatewayClient)(nil).UpsertGateway), varargs...)
+}
+
+// MockMulticlusterGatewayClient is a mock of MulticlusterGatewayClient interface.
+type MockMulticlusterGatewayClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterGatewayClientMockRecorder
+}
+
+// MockMulticlusterGatewayClientMockRecorder is the mock recorder for MockMulticlusterGatewayClient.
+type MockMulticlusterGatewayClientMockRecorder struct {
+	mock *MockMulticlusterGatewayClient
+}
+
+// NewMockMulticlusterGatewayClient creates a new mock instance.
+func NewMockMulticlusterGatewayClient(ctrl *gomock.Controller) *MockMulticlusterGatewayClient {
+	mock := &MockMulticlusterGatewayClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterGatewayClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterGatewayClient) EXPECT() *MockMulticlusterGatewayClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterGatewayClient) Cluster(cluster string) (v1.GatewayClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.GatewayClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterGatewayClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterGatewayClient)(nil).Cluster), cluster)
+}
+
+// MockServiceEntryReader is a mock of ServiceEntryReader interface.
+type MockServiceEntryReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryReaderMockRecorder
+}
+
+// MockServiceEntryReaderMockRecorder is the mock recorder for MockServiceEntryReader.
+type MockServiceEntryReaderMockRecorder struct {
+	mock *MockServiceEntryReader
+}
+
+// NewMockServiceEntryReader creates a new mock instance.
+func NewMockServiceEntryReader(ctrl *gomock.Controller) *MockServiceEntryReader {
+	mock := &MockServiceEntryReader{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryReader) EXPECT() *MockServiceEntryReaderMockRecorder {
+	return m.recorder
+}
+
+// GetServiceEntry mocks base method.
+func (m *MockServiceEntryReader) GetServiceEntry(ctx context.Context, key client.ObjectKey) (*v10.ServiceEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetServiceEntry", ctx, key)
+	ret0, _ := ret[0].(*v10.ServiceEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetServiceEntry indicates an expected call of GetServiceEntry.
+func (mr *MockServiceEntryReaderMockRecorder) GetServiceEntry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetServiceEntry", reflect.TypeOf((*MockServiceEntryReader)(nil).GetServiceEntry), ctx, key)
+}
+
+// ListServiceEntry mocks base method.
+func (m *MockServiceEntryReader) ListServiceEntry(ctx context.Context, opts ...client.ListOption) (*v10.ServiceEntryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListServiceEntry", varargs...)
+	ret0, _ := ret[0].(*v10.ServiceEntryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListServiceEntry indicates an expected call of ListServiceEntry.
+func (mr *MockServiceEntryReaderMockRecorder) ListServiceEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListServiceEntry", reflect.TypeOf((*MockServiceEntryReader)(nil).ListServiceEntry), varargs...)
+}
+
+// MockServiceEntryWriter is a mock of ServiceEntryWriter interface.
+type MockServiceEntryWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryWriterMockRecorder
+}
+
+// MockServiceEntryWriterMockRecorder is the mock recorder for MockServiceEntryWriter.
+type MockServiceEntryWriterMockRecorder struct {
+	mock *MockServiceEntryWriter
+}
+
+// NewMockServiceEntryWriter creates a new mock instance.
+func NewMockServiceEntryWriter(ctrl *gomock.Controller) *MockServiceEntryWriter {
+	mock := &MockServiceEntryWriter{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryWriter) EXPECT() *MockServiceEntryWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) CreateServiceEntry(ctx context.Context, obj *v10.ServiceEntry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateServiceEntry indicates an expected call of CreateServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) CreateServiceEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).CreateServiceEntry), varargs...)
+}
+
+// DeleteAllOfServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) DeleteAllOfServiceEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfServiceEntry indicates an expected call of DeleteAllOfServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) DeleteAllOfServiceEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).DeleteAllOfServiceEntry), varargs...)
+}
+
+// DeleteServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) DeleteServiceEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteServiceEntry indicates an expected call of DeleteServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) DeleteServiceEntry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).DeleteServiceEntry), varargs...)
+}
+
+// PatchServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) PatchServiceEntry(ctx context.Context, obj *v10.ServiceEntry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchServiceEntry indicates an expected call of PatchServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) PatchServiceEntry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).PatchServiceEntry), varargs...)
+}
+
+// UpdateServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) UpdateServiceEntry(ctx context.Context, obj *v10.ServiceEntry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateServiceEntry indicates an expected call of UpdateServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) UpdateServiceEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).UpdateServiceEntry), varargs...)
+}
+
+// UpsertServiceEntry mocks base method.
+func (m *MockServiceEntryWriter) UpsertServiceEntry(ctx context.Context, obj *v10.ServiceEntry, transitionFuncs ...v1.ServiceEntryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertServiceEntry indicates an expected call of UpsertServiceEntry.
+func (mr *MockServiceEntryWriterMockRecorder) UpsertServiceEntry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertServiceEntry", reflect.TypeOf((*MockServiceEntryWriter)(nil).UpsertServiceEntry), varargs...)
+}
+
+// MockServiceEntryStatusWriter is a mock of ServiceEntryStatusWriter interface.
+type MockServiceEntryStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryStatusWriterMockRecorder
+}
+
+// MockServiceEntryStatusWriterMockRecorder is the mock recorder for MockServiceEntryStatusWriter.
+type MockServiceEntryStatusWriterMockRecorder struct {
+	mock *MockServiceEntryStatusWriter
+}
+
+// NewMockServiceEntryStatusWriter creates a new mock instance.
+func NewMockServiceEntryStatusWriter(ctrl *gomock.Controller) *MockServiceEntryStatusWriter {
+	mock := &MockServiceEntryStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryStatusWriter) EXPECT() *MockServiceEntryStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchServiceEntryStatus mocks base method.
+func (m *MockServiceEntryStatusWriter) PatchServiceEntryStatus(ctx context.Context, obj *v10.ServiceEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchServiceEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchServiceEntryStatus indicates an expected call of PatchServiceEntryStatus.
+func (mr *MockServiceEntryStatusWriterMockRecorder) PatchServiceEntryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchServiceEntryStatus", reflect.TypeOf((*MockServiceEntryStatusWriter)(nil).PatchServiceEntryStatus), varargs...)
+}
+
+// UpdateServiceEntryStatus mocks base method.
+func (m *MockServiceEntryStatusWriter) UpdateServiceEntryStatus(ctx context.Context, obj *v10.ServiceEntry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateServiceEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateServiceEntryStatus indicates an expected call of UpdateServiceEntryStatus.
+func (mr *MockServiceEntryStatusWriterMockRecorder) UpdateServiceEntryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateServiceEntryStatus", reflect.TypeOf((*MockServiceEntryStatusWriter)(nil).UpdateServiceEntryStatus), varargs...)
+}
+
+// MockServiceEntryClient is a mock of ServiceEntryClient interface.
+type MockServiceEntryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntryClientMockRecorder
+}
+
+// MockServiceEntryClientMockRecorder is the mock recorder for MockServiceEntryClient.
+type MockServiceEntryClientMockRecorder struct {
+	mock *MockServiceEntryClient
+}
+
+// NewMockServiceEntryClient creates a new mock instance.
+func NewMockServiceEntryClient(ctrl *gomock.Controller) *MockServiceEntryClient {
+	mock := &MockServiceEntryClient{ctrl: ctrl}
+	mock.recorder = &MockServiceEntryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntryClient) EXPECT() *MockServiceEntryClientMockRecorder {
+	return m.recorder
+}
+
+// CreateServiceEntry mocks base method.
+func (m *MockServiceEntryClient) CreateServiceEntry(ctx context.Context, obj *v10.ServiceEntry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateServiceEntry indicates an expected call of CreateServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) CreateServiceEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).CreateServiceEntry), varargs...)
+}
+
+// DeleteAllOfServiceEntry mocks base method.
+func (m *MockServiceEntryClient) DeleteAllOfServiceEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfServiceEntry indicates an expected call of DeleteAllOfServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) DeleteAllOfServiceEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).DeleteAllOfServiceEntry), varargs...)
+}
+
+// DeleteServiceEntry mocks base method.
+func (m *MockServiceEntryClient) DeleteServiceEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteServiceEntry indicates an expected call of DeleteServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) DeleteServiceEntry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).DeleteServiceEntry), varargs...)
+}
+
+// GetServiceEntry mocks base method.
+func (m *MockServiceEntryClient) GetServiceEntry(ctx context.Context, key client.ObjectKey) (*v10.ServiceEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetServiceEntry", ctx, key)
+	ret0, _ := ret[0].(*v10.ServiceEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetServiceEntry indicates an expected call of GetServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) GetServiceEntry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).GetServiceEntry), ctx, key)
+}
+
+// ListServiceEntry mocks base method.
+func (m *MockServiceEntryClient) ListServiceEntry(ctx context.Context, opts ...client.ListOption) (*v10.ServiceEntryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListServiceEntry", varargs...)
+	ret0, _ := ret[0].(*v10.ServiceEntryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListServiceEntry indicates an expected call of ListServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) ListServiceEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).ListServiceEntry), varargs...)
+}
+
+// PatchServiceEntry mocks base method.
+func (m *MockServiceEntryClient) PatchServiceEntry(ctx context.Context, obj *v10.ServiceEntry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchServiceEntry indicates an expected call of PatchServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) PatchServiceEntry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).PatchServiceEntry), varargs...)
+}
+
+// PatchServiceEntryStatus mocks base method.
+func (m *MockServiceEntryClient) PatchServiceEntryStatus(ctx context.Context, obj *v10.ServiceEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchServiceEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchServiceEntryStatus indicates an expected call of PatchServiceEntryStatus.
+func (mr *MockServiceEntryClientMockRecorder) PatchServiceEntryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchServiceEntryStatus", reflect.TypeOf((*MockServiceEntryClient)(nil).PatchServiceEntryStatus), varargs...)
+}
+
+// UpdateServiceEntry mocks base method.
+func (m *MockServiceEntryClient) UpdateServiceEntry(ctx context.Context, obj *v10.ServiceEntry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateServiceEntry indicates an expected call of UpdateServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) UpdateServiceEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).UpdateServiceEntry), varargs...)
+}
+
+// UpdateServiceEntryStatus mocks base method.
+func (m *MockServiceEntryClient) UpdateServiceEntryStatus(ctx context.Context, obj *v10.ServiceEntry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateServiceEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateServiceEntryStatus indicates an expected call of UpdateServiceEntryStatus.
+func (mr *MockServiceEntryClientMockRecorder) UpdateServiceEntryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateServiceEntryStatus", reflect.TypeOf((*MockServiceEntryClient)(nil).UpdateServiceEntryStatus), varargs...)
+}
+
+// UpsertServiceEntry mocks base method.
+func (m *MockServiceEntryClient) UpsertServiceEntry(ctx context.Context, obj *v10.ServiceEntry, transitionFuncs ...v1.ServiceEntryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertServiceEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertServiceEntry indicates an expected call of UpsertServiceEntry.
+func (mr *MockServiceEntryClientMockRecorder) UpsertServiceEntry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertServiceEntry", reflect.TypeOf((*MockServiceEntryClient)(nil).UpsertServiceEntry), varargs...)
+}
+
+// MockMulticlusterServiceEntryClient is a mock of MulticlusterServiceEntryClient interface.
+type MockMulticlusterServiceEntryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterServiceEntryClientMockRecorder
+}
+
+// MockMulticlusterServiceEntryClientMockRecorder is the mock recorder for MockMulticlusterServiceEntryClient.
+type MockMulticlusterServiceEntryClientMockRecorder struct {
+	mock *MockMulticlusterServiceEntryClient
+}
+
+// NewMockMulticlusterServiceEntryClient creates a new mock instance.
+func NewMockMulticlusterServiceEntryClient(ctrl *gomock.Controller) *MockMulticlusterServiceEntryClient {
+	mock := &MockMulticlusterServiceEntryClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterServiceEntryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterServiceEntryClient) EXPECT() *MockMulticlusterServiceEntryClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterServiceEntryClient) Cluster(cluster string) (v1.ServiceEntryClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.ServiceEntryClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterServiceEntryClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterServiceEntryClient)(nil).Cluster), cluster)
+}
+
+// MockWorkloadEntryReader is a mock of WorkloadEntryReader interface.
+type MockWorkloadEntryReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryReaderMockRecorder
+}
+
+// MockWorkloadEntryReaderMockRecorder is the mock recorder for MockWorkloadEntryReader.
+type MockWorkloadEntryReaderMockRecorder struct {
+	mock *MockWorkloadEntryReader
+}
+
+// NewMockWorkloadEntryReader creates a new mock instance.
+func NewMockWorkloadEntryReader(ctrl *gomock.Controller) *MockWorkloadEntryReader {
+	mock := &MockWorkloadEntryReader{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryReader) EXPECT() *MockWorkloadEntryReaderMockRecorder {
+	return m.recorder
+}
+
+// GetWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryReader) GetWorkloadEntry(ctx context.Context, key client.ObjectKey) (*v10.WorkloadEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetWorkloadEntry", ctx, key)
+	ret0, _ := ret[0].(*v10.WorkloadEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetWorkloadEntry indicates an expected call of GetWorkloadEntry.
+func (mr *MockWorkloadEntryReaderMockRecorder) GetWorkloadEntry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryReader)(nil).GetWorkloadEntry), ctx, key)
+}
+
+// ListWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryReader) ListWorkloadEntry(ctx context.Context, opts ...client.ListOption) (*v10.WorkloadEntryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(*v10.WorkloadEntryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListWorkloadEntry indicates an expected call of ListWorkloadEntry.
+func (mr *MockWorkloadEntryReaderMockRecorder) ListWorkloadEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryReader)(nil).ListWorkloadEntry), varargs...)
+}
+
+// MockWorkloadEntryWriter is a mock of WorkloadEntryWriter interface.
+type MockWorkloadEntryWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryWriterMockRecorder
+}
+
+// MockWorkloadEntryWriterMockRecorder is the mock recorder for MockWorkloadEntryWriter.
+type MockWorkloadEntryWriterMockRecorder struct {
+	mock *MockWorkloadEntryWriter
+}
+
+// NewMockWorkloadEntryWriter creates a new mock instance.
+func NewMockWorkloadEntryWriter(ctrl *gomock.Controller) *MockWorkloadEntryWriter {
+	mock := &MockWorkloadEntryWriter{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryWriter) EXPECT() *MockWorkloadEntryWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) CreateWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadEntry indicates an expected call of CreateWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) CreateWorkloadEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).CreateWorkloadEntry), varargs...)
+}
+
+// DeleteAllOfWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) DeleteAllOfWorkloadEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfWorkloadEntry indicates an expected call of DeleteAllOfWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) DeleteAllOfWorkloadEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).DeleteAllOfWorkloadEntry), varargs...)
+}
+
+// DeleteWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) DeleteWorkloadEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadEntry indicates an expected call of DeleteWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) DeleteWorkloadEntry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).DeleteWorkloadEntry), varargs...)
+}
+
+// PatchWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) PatchWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadEntry indicates an expected call of PatchWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) PatchWorkloadEntry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).PatchWorkloadEntry), varargs...)
+}
+
+// UpdateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) UpdateWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadEntry indicates an expected call of UpdateWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) UpdateWorkloadEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).UpdateWorkloadEntry), varargs...)
+}
+
+// UpsertWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryWriter) UpsertWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, transitionFuncs ...v1.WorkloadEntryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertWorkloadEntry indicates an expected call of UpsertWorkloadEntry.
+func (mr *MockWorkloadEntryWriterMockRecorder) UpsertWorkloadEntry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryWriter)(nil).UpsertWorkloadEntry), varargs...)
+}
+
+// MockWorkloadEntryStatusWriter is a mock of WorkloadEntryStatusWriter interface.
+type MockWorkloadEntryStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryStatusWriterMockRecorder
+}
+
+// MockWorkloadEntryStatusWriterMockRecorder is the mock recorder for MockWorkloadEntryStatusWriter.
+type MockWorkloadEntryStatusWriterMockRecorder struct {
+	mock *MockWorkloadEntryStatusWriter
+}
+
+// NewMockWorkloadEntryStatusWriter creates a new mock instance.
+func NewMockWorkloadEntryStatusWriter(ctrl *gomock.Controller) *MockWorkloadEntryStatusWriter {
+	mock := &MockWorkloadEntryStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryStatusWriter) EXPECT() *MockWorkloadEntryStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchWorkloadEntryStatus mocks base method.
+func (m *MockWorkloadEntryStatusWriter) PatchWorkloadEntryStatus(ctx context.Context, obj *v10.WorkloadEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadEntryStatus indicates an expected call of PatchWorkloadEntryStatus.
+func (mr *MockWorkloadEntryStatusWriterMockRecorder) PatchWorkloadEntryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadEntryStatus", reflect.TypeOf((*MockWorkloadEntryStatusWriter)(nil).PatchWorkloadEntryStatus), varargs...)
+}
+
+// UpdateWorkloadEntryStatus mocks base method.
+func (m *MockWorkloadEntryStatusWriter) UpdateWorkloadEntryStatus(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadEntryStatus indicates an expected call of UpdateWorkloadEntryStatus.
+func (mr *MockWorkloadEntryStatusWriterMockRecorder) UpdateWorkloadEntryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadEntryStatus", reflect.TypeOf((*MockWorkloadEntryStatusWriter)(nil).UpdateWorkloadEntryStatus), varargs...)
+}
+
+// MockWorkloadEntryClient is a mock of WorkloadEntryClient interface.
+type MockWorkloadEntryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntryClientMockRecorder
+}
+
+// MockWorkloadEntryClientMockRecorder is the mock recorder for MockWorkloadEntryClient.
+type MockWorkloadEntryClientMockRecorder struct {
+	mock *MockWorkloadEntryClient
+}
+
+// NewMockWorkloadEntryClient creates a new mock instance.
+func NewMockWorkloadEntryClient(ctrl *gomock.Controller) *MockWorkloadEntryClient {
+	mock := &MockWorkloadEntryClient{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntryClient) EXPECT() *MockWorkloadEntryClientMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) CreateWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadEntry indicates an expected call of CreateWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) CreateWorkloadEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).CreateWorkloadEntry), varargs...)
+}
+
+// DeleteAllOfWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) DeleteAllOfWorkloadEntry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfWorkloadEntry indicates an expected call of DeleteAllOfWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) DeleteAllOfWorkloadEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).DeleteAllOfWorkloadEntry), varargs...)
+}
+
+// DeleteWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) DeleteWorkloadEntry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadEntry indicates an expected call of DeleteWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) DeleteWorkloadEntry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).DeleteWorkloadEntry), varargs...)
+}
+
+// GetWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) GetWorkloadEntry(ctx context.Context, key client.ObjectKey) (*v10.WorkloadEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetWorkloadEntry", ctx, key)
+	ret0, _ := ret[0].(*v10.WorkloadEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetWorkloadEntry indicates an expected call of GetWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) GetWorkloadEntry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).GetWorkloadEntry), ctx, key)
+}
+
+// ListWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) ListWorkloadEntry(ctx context.Context, opts ...client.ListOption) (*v10.WorkloadEntryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(*v10.WorkloadEntryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListWorkloadEntry indicates an expected call of ListWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) ListWorkloadEntry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).ListWorkloadEntry), varargs...)
+}
+
+// PatchWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) PatchWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadEntry indicates an expected call of PatchWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) PatchWorkloadEntry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).PatchWorkloadEntry), varargs...)
+}
+
+// PatchWorkloadEntryStatus mocks base method.
+func (m *MockWorkloadEntryClient) PatchWorkloadEntryStatus(ctx context.Context, obj *v10.WorkloadEntry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadEntryStatus indicates an expected call of PatchWorkloadEntryStatus.
+func (mr *MockWorkloadEntryClientMockRecorder) PatchWorkloadEntryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadEntryStatus", reflect.TypeOf((*MockWorkloadEntryClient)(nil).PatchWorkloadEntryStatus), varargs...)
+}
+
+// UpdateWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) UpdateWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadEntry indicates an expected call of UpdateWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) UpdateWorkloadEntry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).UpdateWorkloadEntry), varargs...)
+}
+
+// UpdateWorkloadEntryStatus mocks base method.
+func (m *MockWorkloadEntryClient) UpdateWorkloadEntryStatus(ctx context.Context, obj *v10.WorkloadEntry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadEntryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadEntryStatus indicates an expected call of UpdateWorkloadEntryStatus.
+func (mr *MockWorkloadEntryClientMockRecorder) UpdateWorkloadEntryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadEntryStatus", reflect.TypeOf((*MockWorkloadEntryClient)(nil).UpdateWorkloadEntryStatus), varargs...)
+}
+
+// UpsertWorkloadEntry mocks base method.
+func (m *MockWorkloadEntryClient) UpsertWorkloadEntry(ctx context.Context, obj *v10.WorkloadEntry, transitionFuncs ...v1.WorkloadEntryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertWorkloadEntry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertWorkloadEntry indicates an expected call of UpsertWorkloadEntry.
+func (mr *MockWorkloadEntryClientMockRecorder) UpsertWorkloadEntry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertWorkloadEntry", reflect.TypeOf((*MockWorkloadEntryClient)(nil).UpsertWorkloadEntry), varargs...)
+}
+
+// MockMulticlusterWorkloadEntryClient is a mock of MulticlusterWorkloadEntryClient interface.
+type MockMulticlusterWorkloadEntryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadEntryClientMockRecorder
+}
+
+// MockMulticlusterWorkloadEntryClientMockRecorder is the mock recorder for MockMulticlusterWorkloadEntryClient.
+type MockMulticlusterWorkloadEntryClientMockRecorder struct {
+	mock *MockMulticlusterWorkloadEntryClient
+}
+
+// NewMockMulticlusterWorkloadEntryClient creates a new mock instance.
+func NewMockMulticlusterWorkloadEntryClient(ctrl *gomock.Controller) *MockMulticlusterWorkloadEntryClient {
+	mock := &MockMulticlusterWorkloadEntryClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadEntryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadEntryClient) EXPECT() *MockMulticlusterWorkloadEntryClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterWorkloadEntryClient) Cluster(cluster string) (v1.WorkloadEntryClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.WorkloadEntryClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterWorkloadEntryClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterWorkloadEntryClient)(nil).Cluster), cluster)
+}
+
+// MockWorkloadGroupReader is a mock of WorkloadGroupReader interface.
+type MockWorkloadGroupReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupReaderMockRecorder
+}
+
+// MockWorkloadGroupReaderMockRecorder is the mock recorder for MockWorkloadGroupReader.
+type MockWorkloadGroupReaderMockRecorder struct {
+	mock *MockWorkloadGroupReader
+}
+
+// NewMockWorkloadGroupReader creates a new mock instance.
+func NewMockWorkloadGroupReader(ctrl *gomock.Controller) *MockWorkloadGroupReader {
+	mock := &MockWorkloadGroupReader{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupReader) EXPECT() *MockWorkloadGroupReaderMockRecorder {
+	return m.recorder
+}
+
+// GetWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupReader) GetWorkloadGroup(ctx context.Context, key client.ObjectKey) (*v10.WorkloadGroup, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetWorkloadGroup", ctx, key)
+	ret0, _ := ret[0].(*v10.WorkloadGroup)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetWorkloadGroup indicates an expected call of GetWorkloadGroup.
+func (mr *MockWorkloadGroupReaderMockRecorder) GetWorkloadGroup(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupReader)(nil).GetWorkloadGroup), ctx, key)
+}
+
+// ListWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupReader) ListWorkloadGroup(ctx context.Context, opts ...client.ListOption) (*v10.WorkloadGroupList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(*v10.WorkloadGroupList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListWorkloadGroup indicates an expected call of ListWorkloadGroup.
+func (mr *MockWorkloadGroupReaderMockRecorder) ListWorkloadGroup(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupReader)(nil).ListWorkloadGroup), varargs...)
+}
+
+// MockWorkloadGroupWriter is a mock of WorkloadGroupWriter interface.
+type MockWorkloadGroupWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupWriterMockRecorder
+}
+
+// MockWorkloadGroupWriterMockRecorder is the mock recorder for MockWorkloadGroupWriter.
+type MockWorkloadGroupWriterMockRecorder struct {
+	mock *MockWorkloadGroupWriter
+}
+
+// NewMockWorkloadGroupWriter creates a new mock instance.
+func NewMockWorkloadGroupWriter(ctrl *gomock.Controller) *MockWorkloadGroupWriter {
+	mock := &MockWorkloadGroupWriter{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupWriter) EXPECT() *MockWorkloadGroupWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) CreateWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadGroup indicates an expected call of CreateWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) CreateWorkloadGroup(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).CreateWorkloadGroup), varargs...)
+}
+
+// DeleteAllOfWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) DeleteAllOfWorkloadGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfWorkloadGroup indicates an expected call of DeleteAllOfWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) DeleteAllOfWorkloadGroup(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).DeleteAllOfWorkloadGroup), varargs...)
+}
+
+// DeleteWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) DeleteWorkloadGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadGroup indicates an expected call of DeleteWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) DeleteWorkloadGroup(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).DeleteWorkloadGroup), varargs...)
+}
+
+// PatchWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) PatchWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadGroup indicates an expected call of PatchWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) PatchWorkloadGroup(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).PatchWorkloadGroup), varargs...)
+}
+
+// UpdateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) UpdateWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadGroup indicates an expected call of UpdateWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) UpdateWorkloadGroup(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).UpdateWorkloadGroup), varargs...)
+}
+
+// UpsertWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupWriter) UpsertWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, transitionFuncs ...v1.WorkloadGroupTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertWorkloadGroup indicates an expected call of UpsertWorkloadGroup.
+func (mr *MockWorkloadGroupWriterMockRecorder) UpsertWorkloadGroup(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupWriter)(nil).UpsertWorkloadGroup), varargs...)
+}
+
+// MockWorkloadGroupStatusWriter is a mock of WorkloadGroupStatusWriter interface.
+type MockWorkloadGroupStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupStatusWriterMockRecorder
+}
+
+// MockWorkloadGroupStatusWriterMockRecorder is the mock recorder for MockWorkloadGroupStatusWriter.
+type MockWorkloadGroupStatusWriterMockRecorder struct {
+	mock *MockWorkloadGroupStatusWriter
+}
+
+// NewMockWorkloadGroupStatusWriter creates a new mock instance.
+func NewMockWorkloadGroupStatusWriter(ctrl *gomock.Controller) *MockWorkloadGroupStatusWriter {
+	mock := &MockWorkloadGroupStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupStatusWriter) EXPECT() *MockWorkloadGroupStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchWorkloadGroupStatus mocks base method.
+func (m *MockWorkloadGroupStatusWriter) PatchWorkloadGroupStatus(ctx context.Context, obj *v10.WorkloadGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadGroupStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadGroupStatus indicates an expected call of PatchWorkloadGroupStatus.
+func (mr *MockWorkloadGroupStatusWriterMockRecorder) PatchWorkloadGroupStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadGroupStatus", reflect.TypeOf((*MockWorkloadGroupStatusWriter)(nil).PatchWorkloadGroupStatus), varargs...)
+}
+
+// UpdateWorkloadGroupStatus mocks base method.
+func (m *MockWorkloadGroupStatusWriter) UpdateWorkloadGroupStatus(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadGroupStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadGroupStatus indicates an expected call of UpdateWorkloadGroupStatus.
+func (mr *MockWorkloadGroupStatusWriterMockRecorder) UpdateWorkloadGroupStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadGroupStatus", reflect.TypeOf((*MockWorkloadGroupStatusWriter)(nil).UpdateWorkloadGroupStatus), varargs...)
+}
+
+// MockWorkloadGroupClient is a mock of WorkloadGroupClient interface.
+type MockWorkloadGroupClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupClientMockRecorder
+}
+
+// MockWorkloadGroupClientMockRecorder is the mock recorder for MockWorkloadGroupClient.
+type MockWorkloadGroupClientMockRecorder struct {
+	mock *MockWorkloadGroupClient
+}
+
+// NewMockWorkloadGroupClient creates a new mock instance.
+func NewMockWorkloadGroupClient(ctrl *gomock.Controller) *MockWorkloadGroupClient {
+	mock := &MockWorkloadGroupClient{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupClient) EXPECT() *MockWorkloadGroupClientMockRecorder {
+	return m.recorder
+}
+
+// CreateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) CreateWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateWorkloadGroup indicates an expected call of CreateWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) CreateWorkloadGroup(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).CreateWorkloadGroup), varargs...)
+}
+
+// DeleteAllOfWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) DeleteAllOfWorkloadGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfWorkloadGroup indicates an expected call of DeleteAllOfWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) DeleteAllOfWorkloadGroup(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).DeleteAllOfWorkloadGroup), varargs...)
+}
+
+// DeleteWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) DeleteWorkloadGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteWorkloadGroup indicates an expected call of DeleteWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) DeleteWorkloadGroup(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).DeleteWorkloadGroup), varargs...)
+}
+
+// GetWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) GetWorkloadGroup(ctx context.Context, key client.ObjectKey) (*v10.WorkloadGroup, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetWorkloadGroup", ctx, key)
+	ret0, _ := ret[0].(*v10.WorkloadGroup)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetWorkloadGroup indicates an expected call of GetWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) GetWorkloadGroup(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).GetWorkloadGroup), ctx, key)
+}
+
+// ListWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) ListWorkloadGroup(ctx context.Context, opts ...client.ListOption) (*v10.WorkloadGroupList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(*v10.WorkloadGroupList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListWorkloadGroup indicates an expected call of ListWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) ListWorkloadGroup(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).ListWorkloadGroup), varargs...)
+}
+
+// PatchWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) PatchWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadGroup indicates an expected call of PatchWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) PatchWorkloadGroup(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).PatchWorkloadGroup), varargs...)
+}
+
+// PatchWorkloadGroupStatus mocks base method.
+func (m *MockWorkloadGroupClient) PatchWorkloadGroupStatus(ctx context.Context, obj *v10.WorkloadGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchWorkloadGroupStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchWorkloadGroupStatus indicates an expected call of PatchWorkloadGroupStatus.
+func (mr *MockWorkloadGroupClientMockRecorder) PatchWorkloadGroupStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchWorkloadGroupStatus", reflect.TypeOf((*MockWorkloadGroupClient)(nil).PatchWorkloadGroupStatus), varargs...)
+}
+
+// UpdateWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) UpdateWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadGroup indicates an expected call of UpdateWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) UpdateWorkloadGroup(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).UpdateWorkloadGroup), varargs...)
+}
+
+// UpdateWorkloadGroupStatus mocks base method.
+func (m *MockWorkloadGroupClient) UpdateWorkloadGroupStatus(ctx context.Context, obj *v10.WorkloadGroup, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateWorkloadGroupStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateWorkloadGroupStatus indicates an expected call of UpdateWorkloadGroupStatus.
+func (mr *MockWorkloadGroupClientMockRecorder) UpdateWorkloadGroupStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkloadGroupStatus", reflect.TypeOf((*MockWorkloadGroupClient)(nil).UpdateWorkloadGroupStatus), varargs...)
+}
+
+// UpsertWorkloadGroup mocks base method.
+func (m *MockWorkloadGroupClient) UpsertWorkloadGroup(ctx context.Context, obj *v10.WorkloadGroup, transitionFuncs ...v1.WorkloadGroupTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertWorkloadGroup", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertWorkloadGroup indicates an expected call of UpsertWorkloadGroup.
+func (mr *MockWorkloadGroupClientMockRecorder) UpsertWorkloadGroup(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertWorkloadGroup", reflect.TypeOf((*MockWorkloadGroupClient)(nil).UpsertWorkloadGroup), varargs...)
+}
+
+// MockMulticlusterWorkloadGroupClient is a mock of MulticlusterWorkloadGroupClient interface.
+type MockMulticlusterWorkloadGroupClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterWorkloadGroupClientMockRecorder
+}
+
+// MockMulticlusterWorkloadGroupClientMockRecorder is the mock recorder for MockMulticlusterWorkloadGroupClient.
+type MockMulticlusterWorkloadGroupClientMockRecorder struct {
+	mock *MockMulticlusterWorkloadGroupClient
+}
+
+// NewMockMulticlusterWorkloadGroupClient creates a new mock instance.
+func NewMockMulticlusterWorkloadGroupClient(ctrl *gomock.Controller) *MockMulticlusterWorkloadGroupClient {
+	mock := &MockMulticlusterWorkloadGroupClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterWorkloadGroupClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterWorkloadGroupClient) EXPECT() *MockMulticlusterWorkloadGroupClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterWorkloadGroupClient) Cluster(cluster string) (v1.WorkloadGroupClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.WorkloadGroupClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterWorkloadGroupClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterWorkloadGroupClient)(nil).Cluster), cluster)
+}
+
+// MockVirtualServiceReader is a mock of VirtualServiceReader interface.
+type MockVirtualServiceReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceReaderMockRecorder
+}
+
+// MockVirtualServiceReaderMockRecorder is the mock recorder for MockVirtualServiceReader.
+type MockVirtualServiceReaderMockRecorder struct {
+	mock *MockVirtualServiceReader
+}
+
+// NewMockVirtualServiceReader creates a new mock instance.
+func NewMockVirtualServiceReader(ctrl *gomock.Controller) *MockVirtualServiceReader {
+	mock := &MockVirtualServiceReader{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceReader) EXPECT() *MockVirtualServiceReaderMockRecorder {
+	return m.recorder
+}
+
+// GetVirtualService mocks base method.
+func (m *MockVirtualServiceReader) GetVirtualService(ctx context.Context, key client.ObjectKey) (*v10.VirtualService, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetVirtualService", ctx, key)
+	ret0, _ := ret[0].(*v10.VirtualService)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetVirtualService indicates an expected call of GetVirtualService.
+func (mr *MockVirtualServiceReaderMockRecorder) GetVirtualService(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVirtualService", reflect.TypeOf((*MockVirtualServiceReader)(nil).GetVirtualService), ctx, key)
+}
+
+// ListVirtualService mocks base method.
+func (m *MockVirtualServiceReader) ListVirtualService(ctx context.Context, opts ...client.ListOption) (*v10.VirtualServiceList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListVirtualService", varargs...)
+	ret0, _ := ret[0].(*v10.VirtualServiceList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListVirtualService indicates an expected call of ListVirtualService.
+func (mr *MockVirtualServiceReaderMockRecorder) ListVirtualService(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListVirtualService", reflect.TypeOf((*MockVirtualServiceReader)(nil).ListVirtualService), varargs...)
+}
+
+// MockVirtualServiceWriter is a mock of VirtualServiceWriter interface.
+type MockVirtualServiceWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceWriterMockRecorder
+}
+
+// MockVirtualServiceWriterMockRecorder is the mock recorder for MockVirtualServiceWriter.
+type MockVirtualServiceWriterMockRecorder struct {
+	mock *MockVirtualServiceWriter
+}
+
+// NewMockVirtualServiceWriter creates a new mock instance.
+func NewMockVirtualServiceWriter(ctrl *gomock.Controller) *MockVirtualServiceWriter {
+	mock := &MockVirtualServiceWriter{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceWriter) EXPECT() *MockVirtualServiceWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) CreateVirtualService(ctx context.Context, obj *v10.VirtualService, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateVirtualService indicates an expected call of CreateVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) CreateVirtualService(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).CreateVirtualService), varargs...)
+}
+
+// DeleteAllOfVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) DeleteAllOfVirtualService(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfVirtualService indicates an expected call of DeleteAllOfVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) DeleteAllOfVirtualService(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).DeleteAllOfVirtualService), varargs...)
+}
+
+// DeleteVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) DeleteVirtualService(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteVirtualService indicates an expected call of DeleteVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) DeleteVirtualService(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).DeleteVirtualService), varargs...)
+}
+
+// PatchVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) PatchVirtualService(ctx context.Context, obj *v10.VirtualService, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchVirtualService indicates an expected call of PatchVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) PatchVirtualService(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).PatchVirtualService), varargs...)
+}
+
+// UpdateVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) UpdateVirtualService(ctx context.Context, obj *v10.VirtualService, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateVirtualService indicates an expected call of UpdateVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) UpdateVirtualService(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).UpdateVirtualService), varargs...)
+}
+
+// UpsertVirtualService mocks base method.
+func (m *MockVirtualServiceWriter) UpsertVirtualService(ctx context.Context, obj *v10.VirtualService, transitionFuncs ...v1.VirtualServiceTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertVirtualService indicates an expected call of UpsertVirtualService.
+func (mr *MockVirtualServiceWriterMockRecorder) UpsertVirtualService(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertVirtualService", reflect.TypeOf((*MockVirtualServiceWriter)(nil).UpsertVirtualService), varargs...)
+}
+
+// MockVirtualServiceStatusWriter is a mock of VirtualServiceStatusWriter interface.
+type MockVirtualServiceStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceStatusWriterMockRecorder
+}
+
+// MockVirtualServiceStatusWriterMockRecorder is the mock recorder for MockVirtualServiceStatusWriter.
+type MockVirtualServiceStatusWriterMockRecorder struct {
+	mock *MockVirtualServiceStatusWriter
+}
+
+// NewMockVirtualServiceStatusWriter creates a new mock instance.
+func NewMockVirtualServiceStatusWriter(ctrl *gomock.Controller) *MockVirtualServiceStatusWriter {
+	mock := &MockVirtualServiceStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceStatusWriter) EXPECT() *MockVirtualServiceStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchVirtualServiceStatus mocks base method.
+func (m *MockVirtualServiceStatusWriter) PatchVirtualServiceStatus(ctx context.Context, obj *v10.VirtualService, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchVirtualServiceStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchVirtualServiceStatus indicates an expected call of PatchVirtualServiceStatus.
+func (mr *MockVirtualServiceStatusWriterMockRecorder) PatchVirtualServiceStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchVirtualServiceStatus", reflect.TypeOf((*MockVirtualServiceStatusWriter)(nil).PatchVirtualServiceStatus), varargs...)
+}
+
+// UpdateVirtualServiceStatus mocks base method.
+func (m *MockVirtualServiceStatusWriter) UpdateVirtualServiceStatus(ctx context.Context, obj *v10.VirtualService, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateVirtualServiceStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateVirtualServiceStatus indicates an expected call of UpdateVirtualServiceStatus.
+func (mr *MockVirtualServiceStatusWriterMockRecorder) UpdateVirtualServiceStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualServiceStatus", reflect.TypeOf((*MockVirtualServiceStatusWriter)(nil).UpdateVirtualServiceStatus), varargs...)
+}
+
+// MockVirtualServiceClient is a mock of VirtualServiceClient interface.
+type MockVirtualServiceClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceClientMockRecorder
+}
+
+// MockVirtualServiceClientMockRecorder is the mock recorder for MockVirtualServiceClient.
+type MockVirtualServiceClientMockRecorder struct {
+	mock *MockVirtualServiceClient
+}
+
+// NewMockVirtualServiceClient creates a new mock instance.
+func NewMockVirtualServiceClient(ctrl *gomock.Controller) *MockVirtualServiceClient {
+	mock := &MockVirtualServiceClient{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceClient) EXPECT() *MockVirtualServiceClientMockRecorder {
+	return m.recorder
+}
+
+// CreateVirtualService mocks base method.
+func (m *MockVirtualServiceClient) CreateVirtualService(ctx context.Context, obj *v10.VirtualService, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateVirtualService indicates an expected call of CreateVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) CreateVirtualService(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).CreateVirtualService), varargs...)
+}
+
+// DeleteAllOfVirtualService mocks base method.
+func (m *MockVirtualServiceClient) DeleteAllOfVirtualService(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfVirtualService indicates an expected call of DeleteAllOfVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) DeleteAllOfVirtualService(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).DeleteAllOfVirtualService), varargs...)
+}
+
+// DeleteVirtualService mocks base method.
+func (m *MockVirtualServiceClient) DeleteVirtualService(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteVirtualService indicates an expected call of DeleteVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) DeleteVirtualService(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).DeleteVirtualService), varargs...)
+}
+
+// GetVirtualService mocks base method.
+func (m *MockVirtualServiceClient) GetVirtualService(ctx context.Context, key client.ObjectKey) (*v10.VirtualService, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetVirtualService", ctx, key)
+	ret0, _ := ret[0].(*v10.VirtualService)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetVirtualService indicates an expected call of GetVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) GetVirtualService(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).GetVirtualService), ctx, key)
+}
+
+// ListVirtualService mocks base method.
+func (m *MockVirtualServiceClient) ListVirtualService(ctx context.Context, opts ...client.ListOption) (*v10.VirtualServiceList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListVirtualService", varargs...)
+	ret0, _ := ret[0].(*v10.VirtualServiceList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListVirtualService indicates an expected call of ListVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) ListVirtualService(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).ListVirtualService), varargs...)
+}
+
+// PatchVirtualService mocks base method.
+func (m *MockVirtualServiceClient) PatchVirtualService(ctx context.Context, obj *v10.VirtualService, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchVirtualService indicates an expected call of PatchVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) PatchVirtualService(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).PatchVirtualService), varargs...)
+}
+
+// PatchVirtualServiceStatus mocks base method.
+func (m *MockVirtualServiceClient) PatchVirtualServiceStatus(ctx context.Context, obj *v10.VirtualService, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchVirtualServiceStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchVirtualServiceStatus indicates an expected call of PatchVirtualServiceStatus.
+func (mr *MockVirtualServiceClientMockRecorder) PatchVirtualServiceStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchVirtualServiceStatus", reflect.TypeOf((*MockVirtualServiceClient)(nil).PatchVirtualServiceStatus), varargs...)
+}
+
+// UpdateVirtualService mocks base method.
+func (m *MockVirtualServiceClient) UpdateVirtualService(ctx context.Context, obj *v10.VirtualService, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateVirtualService indicates an expected call of UpdateVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) UpdateVirtualService(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).UpdateVirtualService), varargs...)
+}
+
+// UpdateVirtualServiceStatus mocks base method.
+func (m *MockVirtualServiceClient) UpdateVirtualServiceStatus(ctx context.Context, obj *v10.VirtualService, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateVirtualServiceStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateVirtualServiceStatus indicates an expected call of UpdateVirtualServiceStatus.
+func (mr *MockVirtualServiceClientMockRecorder) UpdateVirtualServiceStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualServiceStatus", reflect.TypeOf((*MockVirtualServiceClient)(nil).UpdateVirtualServiceStatus), varargs...)
+}
+
+// UpsertVirtualService mocks base method.
+func (m *MockVirtualServiceClient) UpsertVirtualService(ctx context.Context, obj *v10.VirtualService, transitionFuncs ...v1.VirtualServiceTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertVirtualService", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertVirtualService indicates an expected call of UpsertVirtualService.
+func (mr *MockVirtualServiceClientMockRecorder) UpsertVirtualService(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertVirtualService", reflect.TypeOf((*MockVirtualServiceClient)(nil).UpsertVirtualService), varargs...)
+}
+
+// MockMulticlusterVirtualServiceClient is a mock of MulticlusterVirtualServiceClient interface.
+type MockMulticlusterVirtualServiceClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterVirtualServiceClientMockRecorder
+}
+
+// MockMulticlusterVirtualServiceClientMockRecorder is the mock recorder for MockMulticlusterVirtualServiceClient.
+type MockMulticlusterVirtualServiceClientMockRecorder struct {
+	mock *MockMulticlusterVirtualServiceClient
+}
+
+// NewMockMulticlusterVirtualServiceClient creates a new mock instance.
+func NewMockMulticlusterVirtualServiceClient(ctrl *gomock.Controller) *MockMulticlusterVirtualServiceClient {
+	mock := &MockMulticlusterVirtualServiceClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterVirtualServiceClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterVirtualServiceClient) EXPECT() *MockMulticlusterVirtualServiceClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterVirtualServiceClient) Cluster(cluster string) (v1.VirtualServiceClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.VirtualServiceClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterVirtualServiceClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterVirtualServiceClient)(nil).Cluster), cluster)
+}
+
+// MockSidecarReader is a mock of SidecarReader interface.
+type MockSidecarReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarReaderMockRecorder
+}
+
+// MockSidecarReaderMockRecorder is the mock recorder for MockSidecarReader.
+type MockSidecarReaderMockRecorder struct {
+	mock *MockSidecarReader
+}
+
+// NewMockSidecarReader creates a new mock instance.
+func NewMockSidecarReader(ctrl *gomock.Controller) *MockSidecarReader {
+	mock := &MockSidecarReader{ctrl: ctrl}
+	mock.recorder = &MockSidecarReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarReader) EXPECT() *MockSidecarReaderMockRecorder {
+	return m.recorder
+}
+
+// GetSidecar mocks base method.
+func (m *MockSidecarReader) GetSidecar(ctx context.Context, key client.ObjectKey) (*v10.Sidecar, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetSidecar", ctx, key)
+	ret0, _ := ret[0].(*v10.Sidecar)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetSidecar indicates an expected call of GetSidecar.
+func (mr *MockSidecarReaderMockRecorder) GetSidecar(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSidecar", reflect.TypeOf((*MockSidecarReader)(nil).GetSidecar), ctx, key)
+}
+
+// ListSidecar mocks base method.
+func (m *MockSidecarReader) ListSidecar(ctx context.Context, opts ...client.ListOption) (*v10.SidecarList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListSidecar", varargs...)
+	ret0, _ := ret[0].(*v10.SidecarList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListSidecar indicates an expected call of ListSidecar.
+func (mr *MockSidecarReaderMockRecorder) ListSidecar(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListSidecar", reflect.TypeOf((*MockSidecarReader)(nil).ListSidecar), varargs...)
+}
+
+// MockSidecarWriter is a mock of SidecarWriter interface.
+type MockSidecarWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarWriterMockRecorder
+}
+
+// MockSidecarWriterMockRecorder is the mock recorder for MockSidecarWriter.
+type MockSidecarWriterMockRecorder struct {
+	mock *MockSidecarWriter
+}
+
+// NewMockSidecarWriter creates a new mock instance.
+func NewMockSidecarWriter(ctrl *gomock.Controller) *MockSidecarWriter {
+	mock := &MockSidecarWriter{ctrl: ctrl}
+	mock.recorder = &MockSidecarWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarWriter) EXPECT() *MockSidecarWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateSidecar mocks base method.
+func (m *MockSidecarWriter) CreateSidecar(ctx context.Context, obj *v10.Sidecar, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateSidecar indicates an expected call of CreateSidecar.
+func (mr *MockSidecarWriterMockRecorder) CreateSidecar(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).CreateSidecar), varargs...)
+}
+
+// DeleteAllOfSidecar mocks base method.
+func (m *MockSidecarWriter) DeleteAllOfSidecar(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfSidecar indicates an expected call of DeleteAllOfSidecar.
+func (mr *MockSidecarWriterMockRecorder) DeleteAllOfSidecar(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).DeleteAllOfSidecar), varargs...)
+}
+
+// DeleteSidecar mocks base method.
+func (m *MockSidecarWriter) DeleteSidecar(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteSidecar indicates an expected call of DeleteSidecar.
+func (mr *MockSidecarWriterMockRecorder) DeleteSidecar(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).DeleteSidecar), varargs...)
+}
+
+// PatchSidecar mocks base method.
+func (m *MockSidecarWriter) PatchSidecar(ctx context.Context, obj *v10.Sidecar, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchSidecar indicates an expected call of PatchSidecar.
+func (mr *MockSidecarWriterMockRecorder) PatchSidecar(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).PatchSidecar), varargs...)
+}
+
+// UpdateSidecar mocks base method.
+func (m *MockSidecarWriter) UpdateSidecar(ctx context.Context, obj *v10.Sidecar, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateSidecar indicates an expected call of UpdateSidecar.
+func (mr *MockSidecarWriterMockRecorder) UpdateSidecar(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).UpdateSidecar), varargs...)
+}
+
+// UpsertSidecar mocks base method.
+func (m *MockSidecarWriter) UpsertSidecar(ctx context.Context, obj *v10.Sidecar, transitionFuncs ...v1.SidecarTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertSidecar indicates an expected call of UpsertSidecar.
+func (mr *MockSidecarWriterMockRecorder) UpsertSidecar(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertSidecar", reflect.TypeOf((*MockSidecarWriter)(nil).UpsertSidecar), varargs...)
+}
+
+// MockSidecarStatusWriter is a mock of SidecarStatusWriter interface.
+type MockSidecarStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarStatusWriterMockRecorder
+}
+
+// MockSidecarStatusWriterMockRecorder is the mock recorder for MockSidecarStatusWriter.
+type MockSidecarStatusWriterMockRecorder struct {
+	mock *MockSidecarStatusWriter
+}
+
+// NewMockSidecarStatusWriter creates a new mock instance.
+func NewMockSidecarStatusWriter(ctrl *gomock.Controller) *MockSidecarStatusWriter {
+	mock := &MockSidecarStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockSidecarStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarStatusWriter) EXPECT() *MockSidecarStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchSidecarStatus mocks base method.
+func (m *MockSidecarStatusWriter) PatchSidecarStatus(ctx context.Context, obj *v10.Sidecar, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchSidecarStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchSidecarStatus indicates an expected call of PatchSidecarStatus.
+func (mr *MockSidecarStatusWriterMockRecorder) PatchSidecarStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchSidecarStatus", reflect.TypeOf((*MockSidecarStatusWriter)(nil).PatchSidecarStatus), varargs...)
+}
+
+// UpdateSidecarStatus mocks base method.
+func (m *MockSidecarStatusWriter) UpdateSidecarStatus(ctx context.Context, obj *v10.Sidecar, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateSidecarStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateSidecarStatus indicates an expected call of UpdateSidecarStatus.
+func (mr *MockSidecarStatusWriterMockRecorder) UpdateSidecarStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSidecarStatus", reflect.TypeOf((*MockSidecarStatusWriter)(nil).UpdateSidecarStatus), varargs...)
+}
+
+// MockSidecarClient is a mock of SidecarClient interface.
+type MockSidecarClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarClientMockRecorder
+}
+
+// MockSidecarClientMockRecorder is the mock recorder for MockSidecarClient.
+type MockSidecarClientMockRecorder struct {
+	mock *MockSidecarClient
+}
+
+// NewMockSidecarClient creates a new mock instance.
+func NewMockSidecarClient(ctrl *gomock.Controller) *MockSidecarClient {
+	mock := &MockSidecarClient{ctrl: ctrl}
+	mock.recorder = &MockSidecarClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarClient) EXPECT() *MockSidecarClientMockRecorder {
+	return m.recorder
+}
+
+// CreateSidecar mocks base method.
+func (m *MockSidecarClient) CreateSidecar(ctx context.Context, obj *v10.Sidecar, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateSidecar indicates an expected call of CreateSidecar.
+func (mr *MockSidecarClientMockRecorder) CreateSidecar(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSidecar", reflect.TypeOf((*MockSidecarClient)(nil).CreateSidecar), varargs...)
+}
+
+// DeleteAllOfSidecar mocks base method.
+func (m *MockSidecarClient) DeleteAllOfSidecar(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfSidecar indicates an expected call of DeleteAllOfSidecar.
+func (mr *MockSidecarClientMockRecorder) DeleteAllOfSidecar(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfSidecar", reflect.TypeOf((*MockSidecarClient)(nil).DeleteAllOfSidecar), varargs...)
+}
+
+// DeleteSidecar mocks base method.
+func (m *MockSidecarClient) DeleteSidecar(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteSidecar indicates an expected call of DeleteSidecar.
+func (mr *MockSidecarClientMockRecorder) DeleteSidecar(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSidecar", reflect.TypeOf((*MockSidecarClient)(nil).DeleteSidecar), varargs...)
+}
+
+// GetSidecar mocks base method.
+func (m *MockSidecarClient) GetSidecar(ctx context.Context, key client.ObjectKey) (*v10.Sidecar, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetSidecar", ctx, key)
+	ret0, _ := ret[0].(*v10.Sidecar)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetSidecar indicates an expected call of GetSidecar.
+func (mr *MockSidecarClientMockRecorder) GetSidecar(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSidecar", reflect.TypeOf((*MockSidecarClient)(nil).GetSidecar), ctx, key)
+}
+
+// ListSidecar mocks base method.
+func (m *MockSidecarClient) ListSidecar(ctx context.Context, opts ...client.ListOption) (*v10.SidecarList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListSidecar", varargs...)
+	ret0, _ := ret[0].(*v10.SidecarList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListSidecar indicates an expected call of ListSidecar.
+func (mr *MockSidecarClientMockRecorder) ListSidecar(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListSidecar", reflect.TypeOf((*MockSidecarClient)(nil).ListSidecar), varargs...)
+}
+
+// PatchSidecar mocks base method.
+func (m *MockSidecarClient) PatchSidecar(ctx context.Context, obj *v10.Sidecar, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchSidecar indicates an expected call of PatchSidecar.
+func (mr *MockSidecarClientMockRecorder) PatchSidecar(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchSidecar", reflect.TypeOf((*MockSidecarClient)(nil).PatchSidecar), varargs...)
+}
+
+// PatchSidecarStatus mocks base method.
+func (m *MockSidecarClient) PatchSidecarStatus(ctx context.Context, obj *v10.Sidecar, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchSidecarStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchSidecarStatus indicates an expected call of PatchSidecarStatus.
+func (mr *MockSidecarClientMockRecorder) PatchSidecarStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchSidecarStatus", reflect.TypeOf((*MockSidecarClient)(nil).PatchSidecarStatus), varargs...)
+}
+
+// UpdateSidecar mocks base method.
+func (m *MockSidecarClient) UpdateSidecar(ctx context.Context, obj *v10.Sidecar, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateSidecar indicates an expected call of UpdateSidecar.
+func (mr *MockSidecarClientMockRecorder) UpdateSidecar(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSidecar", reflect.TypeOf((*MockSidecarClient)(nil).UpdateSidecar), varargs...)
+}
+
+// UpdateSidecarStatus mocks base method.
+func (m *MockSidecarClient) UpdateSidecarStatus(ctx context.Context, obj *v10.Sidecar, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateSidecarStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateSidecarStatus indicates an expected call of UpdateSidecarStatus.
+func (mr *MockSidecarClientMockRecorder) UpdateSidecarStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSidecarStatus", reflect.TypeOf((*MockSidecarClient)(nil).UpdateSidecarStatus), varargs...)
+}
+
+// UpsertSidecar mocks base method.
+func (m *MockSidecarClient) UpsertSidecar(ctx context.Context, obj *v10.Sidecar, transitionFuncs ...v1.SidecarTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertSidecar", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertSidecar indicates an expected call of UpsertSidecar.
+func (mr *MockSidecarClientMockRecorder) UpsertSidecar(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertSidecar", reflect.TypeOf((*MockSidecarClient)(nil).UpsertSidecar), varargs...)
+}
+
+// MockMulticlusterSidecarClient is a mock of MulticlusterSidecarClient interface.
+type MockMulticlusterSidecarClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterSidecarClientMockRecorder
+}
+
+// MockMulticlusterSidecarClientMockRecorder is the mock recorder for MockMulticlusterSidecarClient.
+type MockMulticlusterSidecarClientMockRecorder struct {
+	mock *MockMulticlusterSidecarClient
+}
+
+// NewMockMulticlusterSidecarClient creates a new mock instance.
+func NewMockMulticlusterSidecarClient(ctrl *gomock.Controller) *MockMulticlusterSidecarClient {
+	mock := &MockMulticlusterSidecarClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterSidecarClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterSidecarClient) EXPECT() *MockMulticlusterSidecarClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterSidecarClient) Cluster(cluster string) (v1.SidecarClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.SidecarClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterSidecarClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterSidecarClient)(nil).Cluster), cluster)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/providers/client_providers.go b/pkg/api/istio/networking.istio.io/v1/providers/client_providers.go
new file mode 100644
index 0000000..a8e10ca
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/providers/client_providers.go
@@ -0,0 +1,214 @@
+// Code generated by skv2. DO NOT EDIT.
+
+package v1
+
+import (
+	networking_istio_io_v1 "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1"
+
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+/*
+  The intention of these providers are to be used for Mocking.
+  They expose the Clients as interfaces, as well as factories to provide mocked versions
+  of the clients when they require building within a component.
+
+  See package `github.com/solo-io/skv2/pkg/multicluster/register` for example
+*/
+
+// Provider for DestinationRuleClient from Clientset
+func DestinationRuleClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.DestinationRuleClient {
+	return clients.DestinationRules()
+}
+
+// Provider for DestinationRule Client from Client
+func DestinationRuleClientProvider(client client.Client) networking_istio_io_v1.DestinationRuleClient {
+	return networking_istio_io_v1.NewDestinationRuleClient(client)
+}
+
+type DestinationRuleClientFactory func(client client.Client) networking_istio_io_v1.DestinationRuleClient
+
+func DestinationRuleClientFactoryProvider() DestinationRuleClientFactory {
+	return DestinationRuleClientProvider
+}
+
+type DestinationRuleClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.DestinationRuleClient, error)
+
+func DestinationRuleClientFromConfigFactoryProvider() DestinationRuleClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.DestinationRuleClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.DestinationRules(), nil
+	}
+}
+
+// Provider for GatewayClient from Clientset
+func GatewayClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.GatewayClient {
+	return clients.Gateways()
+}
+
+// Provider for Gateway Client from Client
+func GatewayClientProvider(client client.Client) networking_istio_io_v1.GatewayClient {
+	return networking_istio_io_v1.NewGatewayClient(client)
+}
+
+type GatewayClientFactory func(client client.Client) networking_istio_io_v1.GatewayClient
+
+func GatewayClientFactoryProvider() GatewayClientFactory {
+	return GatewayClientProvider
+}
+
+type GatewayClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.GatewayClient, error)
+
+func GatewayClientFromConfigFactoryProvider() GatewayClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.GatewayClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.Gateways(), nil
+	}
+}
+
+// Provider for ServiceEntryClient from Clientset
+func ServiceEntryClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.ServiceEntryClient {
+	return clients.ServiceEntries()
+}
+
+// Provider for ServiceEntry Client from Client
+func ServiceEntryClientProvider(client client.Client) networking_istio_io_v1.ServiceEntryClient {
+	return networking_istio_io_v1.NewServiceEntryClient(client)
+}
+
+type ServiceEntryClientFactory func(client client.Client) networking_istio_io_v1.ServiceEntryClient
+
+func ServiceEntryClientFactoryProvider() ServiceEntryClientFactory {
+	return ServiceEntryClientProvider
+}
+
+type ServiceEntryClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.ServiceEntryClient, error)
+
+func ServiceEntryClientFromConfigFactoryProvider() ServiceEntryClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.ServiceEntryClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.ServiceEntries(), nil
+	}
+}
+
+// Provider for WorkloadEntryClient from Clientset
+func WorkloadEntryClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.WorkloadEntryClient {
+	return clients.WorkloadEntries()
+}
+
+// Provider for WorkloadEntry Client from Client
+func WorkloadEntryClientProvider(client client.Client) networking_istio_io_v1.WorkloadEntryClient {
+	return networking_istio_io_v1.NewWorkloadEntryClient(client)
+}
+
+type WorkloadEntryClientFactory func(client client.Client) networking_istio_io_v1.WorkloadEntryClient
+
+func WorkloadEntryClientFactoryProvider() WorkloadEntryClientFactory {
+	return WorkloadEntryClientProvider
+}
+
+type WorkloadEntryClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.WorkloadEntryClient, error)
+
+func WorkloadEntryClientFromConfigFactoryProvider() WorkloadEntryClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.WorkloadEntryClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.WorkloadEntries(), nil
+	}
+}
+
+// Provider for WorkloadGroupClient from Clientset
+func WorkloadGroupClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.WorkloadGroupClient {
+	return clients.WorkloadGroups()
+}
+
+// Provider for WorkloadGroup Client from Client
+func WorkloadGroupClientProvider(client client.Client) networking_istio_io_v1.WorkloadGroupClient {
+	return networking_istio_io_v1.NewWorkloadGroupClient(client)
+}
+
+type WorkloadGroupClientFactory func(client client.Client) networking_istio_io_v1.WorkloadGroupClient
+
+func WorkloadGroupClientFactoryProvider() WorkloadGroupClientFactory {
+	return WorkloadGroupClientProvider
+}
+
+type WorkloadGroupClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.WorkloadGroupClient, error)
+
+func WorkloadGroupClientFromConfigFactoryProvider() WorkloadGroupClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.WorkloadGroupClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.WorkloadGroups(), nil
+	}
+}
+
+// Provider for VirtualServiceClient from Clientset
+func VirtualServiceClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.VirtualServiceClient {
+	return clients.VirtualServices()
+}
+
+// Provider for VirtualService Client from Client
+func VirtualServiceClientProvider(client client.Client) networking_istio_io_v1.VirtualServiceClient {
+	return networking_istio_io_v1.NewVirtualServiceClient(client)
+}
+
+type VirtualServiceClientFactory func(client client.Client) networking_istio_io_v1.VirtualServiceClient
+
+func VirtualServiceClientFactoryProvider() VirtualServiceClientFactory {
+	return VirtualServiceClientProvider
+}
+
+type VirtualServiceClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.VirtualServiceClient, error)
+
+func VirtualServiceClientFromConfigFactoryProvider() VirtualServiceClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.VirtualServiceClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.VirtualServices(), nil
+	}
+}
+
+// Provider for SidecarClient from Clientset
+func SidecarClientFromClientsetProvider(clients networking_istio_io_v1.Clientset) networking_istio_io_v1.SidecarClient {
+	return clients.Sidecars()
+}
+
+// Provider for Sidecar Client from Client
+func SidecarClientProvider(client client.Client) networking_istio_io_v1.SidecarClient {
+	return networking_istio_io_v1.NewSidecarClient(client)
+}
+
+type SidecarClientFactory func(client client.Client) networking_istio_io_v1.SidecarClient
+
+func SidecarClientFactoryProvider() SidecarClientFactory {
+	return SidecarClientProvider
+}
+
+type SidecarClientFromConfigFactory func(cfg *rest.Config) (networking_istio_io_v1.SidecarClient, error)
+
+func SidecarClientFromConfigFactoryProvider() SidecarClientFromConfigFactory {
+	return func(cfg *rest.Config) (networking_istio_io_v1.SidecarClient, error) {
+		clients, err := networking_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.Sidecars(), nil
+	}
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/sets/mocks/sets.go b/pkg/api/istio/networking.istio.io/v1/sets/mocks/sets.go
new file mode 100644
index 0000000..1fbcb6c
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/sets/mocks/sets.go
@@ -0,0 +1,1808 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./sets.go
+
+// Package mock_v1sets is a generated GoMock package.
+package mock_v1sets
+
+import (
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1sets "github.com/solo-io/external-apis/pkg/api/istio/networking.istio.io/v1/sets"
+	sets "github.com/solo-io/skv2/contrib/pkg/sets"
+	ezkube "github.com/solo-io/skv2/pkg/ezkube"
+	v1 "istio.io/client-go/pkg/apis/networking/v1"
+	sets0 "k8s.io/apimachinery/pkg/util/sets"
+)
+
+// MockDestinationRuleSet is a mock of DestinationRuleSet interface.
+type MockDestinationRuleSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockDestinationRuleSetMockRecorder
+}
+
+// MockDestinationRuleSetMockRecorder is the mock recorder for MockDestinationRuleSet.
+type MockDestinationRuleSetMockRecorder struct {
+	mock *MockDestinationRuleSet
+}
+
+// NewMockDestinationRuleSet creates a new mock instance.
+func NewMockDestinationRuleSet(ctrl *gomock.Controller) *MockDestinationRuleSet {
+	mock := &MockDestinationRuleSet{ctrl: ctrl}
+	mock.recorder = &MockDestinationRuleSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockDestinationRuleSet) EXPECT() *MockDestinationRuleSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockDestinationRuleSet) Clone() v1sets.DestinationRuleSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.DestinationRuleSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockDestinationRuleSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockDestinationRuleSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockDestinationRuleSet) Delete(destinationRule ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", destinationRule)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockDestinationRuleSetMockRecorder) Delete(destinationRule interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockDestinationRuleSet)(nil).Delete), destinationRule)
+}
+
+// Delta mocks base method.
+func (m *MockDestinationRuleSet) Delta(newSet v1sets.DestinationRuleSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockDestinationRuleSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockDestinationRuleSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockDestinationRuleSet) Difference(set v1sets.DestinationRuleSet) v1sets.DestinationRuleSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.DestinationRuleSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockDestinationRuleSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockDestinationRuleSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockDestinationRuleSet) Equal(destinationRuleSet v1sets.DestinationRuleSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", destinationRuleSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockDestinationRuleSetMockRecorder) Equal(destinationRuleSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockDestinationRuleSet)(nil).Equal), destinationRuleSet)
+}
+
+// Find mocks base method.
+func (m *MockDestinationRuleSet) Find(id ezkube.ResourceId) (*v1.DestinationRule, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.DestinationRule)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockDestinationRuleSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockDestinationRuleSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockDestinationRuleSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockDestinationRuleSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockDestinationRuleSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockDestinationRuleSet) Has(destinationRule ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", destinationRule)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockDestinationRuleSetMockRecorder) Has(destinationRule interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockDestinationRuleSet)(nil).Has), destinationRule)
+}
+
+// Insert mocks base method.
+func (m *MockDestinationRuleSet) Insert(destinationRule ...*v1.DestinationRule) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range destinationRule {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockDestinationRuleSetMockRecorder) Insert(destinationRule ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockDestinationRuleSet)(nil).Insert), destinationRule...)
+}
+
+// Intersection mocks base method.
+func (m *MockDestinationRuleSet) Intersection(set v1sets.DestinationRuleSet) v1sets.DestinationRuleSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.DestinationRuleSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockDestinationRuleSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockDestinationRuleSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockDestinationRuleSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockDestinationRuleSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockDestinationRuleSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockDestinationRuleSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockDestinationRuleSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockDestinationRuleSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockDestinationRuleSet) List(filterResource ...func(*v1.DestinationRule) bool) []*v1.DestinationRule {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.DestinationRule)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockDestinationRuleSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockDestinationRuleSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockDestinationRuleSet) Map() map[string]*v1.DestinationRule {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.DestinationRule)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockDestinationRuleSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockDestinationRuleSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockDestinationRuleSet) Union(set v1sets.DestinationRuleSet) v1sets.DestinationRuleSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.DestinationRuleSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockDestinationRuleSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockDestinationRuleSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockDestinationRuleSet) UnsortedList(filterResource ...func(*v1.DestinationRule) bool) []*v1.DestinationRule {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.DestinationRule)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockDestinationRuleSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockDestinationRuleSet)(nil).UnsortedList), filterResource...)
+}
+
+// MockGatewaySet is a mock of GatewaySet interface.
+type MockGatewaySet struct {
+	ctrl     *gomock.Controller
+	recorder *MockGatewaySetMockRecorder
+}
+
+// MockGatewaySetMockRecorder is the mock recorder for MockGatewaySet.
+type MockGatewaySetMockRecorder struct {
+	mock *MockGatewaySet
+}
+
+// NewMockGatewaySet creates a new mock instance.
+func NewMockGatewaySet(ctrl *gomock.Controller) *MockGatewaySet {
+	mock := &MockGatewaySet{ctrl: ctrl}
+	mock.recorder = &MockGatewaySetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockGatewaySet) EXPECT() *MockGatewaySetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockGatewaySet) Clone() v1sets.GatewaySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.GatewaySet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockGatewaySetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockGatewaySet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockGatewaySet) Delete(gateway ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", gateway)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockGatewaySetMockRecorder) Delete(gateway interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockGatewaySet)(nil).Delete), gateway)
+}
+
+// Delta mocks base method.
+func (m *MockGatewaySet) Delta(newSet v1sets.GatewaySet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockGatewaySetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockGatewaySet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockGatewaySet) Difference(set v1sets.GatewaySet) v1sets.GatewaySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.GatewaySet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockGatewaySetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockGatewaySet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockGatewaySet) Equal(gatewaySet v1sets.GatewaySet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", gatewaySet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockGatewaySetMockRecorder) Equal(gatewaySet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockGatewaySet)(nil).Equal), gatewaySet)
+}
+
+// Find mocks base method.
+func (m *MockGatewaySet) Find(id ezkube.ResourceId) (*v1.Gateway, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.Gateway)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockGatewaySetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockGatewaySet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockGatewaySet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockGatewaySetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockGatewaySet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockGatewaySet) Has(gateway ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", gateway)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockGatewaySetMockRecorder) Has(gateway interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockGatewaySet)(nil).Has), gateway)
+}
+
+// Insert mocks base method.
+func (m *MockGatewaySet) Insert(gateway ...*v1.Gateway) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range gateway {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockGatewaySetMockRecorder) Insert(gateway ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockGatewaySet)(nil).Insert), gateway...)
+}
+
+// Intersection mocks base method.
+func (m *MockGatewaySet) Intersection(set v1sets.GatewaySet) v1sets.GatewaySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.GatewaySet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockGatewaySetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockGatewaySet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockGatewaySet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockGatewaySetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockGatewaySet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockGatewaySet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockGatewaySetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockGatewaySet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockGatewaySet) List(filterResource ...func(*v1.Gateway) bool) []*v1.Gateway {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.Gateway)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockGatewaySetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockGatewaySet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockGatewaySet) Map() map[string]*v1.Gateway {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.Gateway)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockGatewaySetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockGatewaySet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockGatewaySet) Union(set v1sets.GatewaySet) v1sets.GatewaySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.GatewaySet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockGatewaySetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockGatewaySet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockGatewaySet) UnsortedList(filterResource ...func(*v1.Gateway) bool) []*v1.Gateway {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.Gateway)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockGatewaySetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockGatewaySet)(nil).UnsortedList), filterResource...)
+}
+
+// MockServiceEntrySet is a mock of ServiceEntrySet interface.
+type MockServiceEntrySet struct {
+	ctrl     *gomock.Controller
+	recorder *MockServiceEntrySetMockRecorder
+}
+
+// MockServiceEntrySetMockRecorder is the mock recorder for MockServiceEntrySet.
+type MockServiceEntrySetMockRecorder struct {
+	mock *MockServiceEntrySet
+}
+
+// NewMockServiceEntrySet creates a new mock instance.
+func NewMockServiceEntrySet(ctrl *gomock.Controller) *MockServiceEntrySet {
+	mock := &MockServiceEntrySet{ctrl: ctrl}
+	mock.recorder = &MockServiceEntrySetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockServiceEntrySet) EXPECT() *MockServiceEntrySetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockServiceEntrySet) Clone() v1sets.ServiceEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.ServiceEntrySet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockServiceEntrySetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockServiceEntrySet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockServiceEntrySet) Delete(serviceEntry ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", serviceEntry)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockServiceEntrySetMockRecorder) Delete(serviceEntry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockServiceEntrySet)(nil).Delete), serviceEntry)
+}
+
+// Delta mocks base method.
+func (m *MockServiceEntrySet) Delta(newSet v1sets.ServiceEntrySet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockServiceEntrySetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockServiceEntrySet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockServiceEntrySet) Difference(set v1sets.ServiceEntrySet) v1sets.ServiceEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.ServiceEntrySet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockServiceEntrySetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockServiceEntrySet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockServiceEntrySet) Equal(serviceEntrySet v1sets.ServiceEntrySet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", serviceEntrySet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockServiceEntrySetMockRecorder) Equal(serviceEntrySet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockServiceEntrySet)(nil).Equal), serviceEntrySet)
+}
+
+// Find mocks base method.
+func (m *MockServiceEntrySet) Find(id ezkube.ResourceId) (*v1.ServiceEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.ServiceEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockServiceEntrySetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockServiceEntrySet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockServiceEntrySet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockServiceEntrySetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockServiceEntrySet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockServiceEntrySet) Has(serviceEntry ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", serviceEntry)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockServiceEntrySetMockRecorder) Has(serviceEntry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockServiceEntrySet)(nil).Has), serviceEntry)
+}
+
+// Insert mocks base method.
+func (m *MockServiceEntrySet) Insert(serviceEntry ...*v1.ServiceEntry) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range serviceEntry {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockServiceEntrySetMockRecorder) Insert(serviceEntry ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockServiceEntrySet)(nil).Insert), serviceEntry...)
+}
+
+// Intersection mocks base method.
+func (m *MockServiceEntrySet) Intersection(set v1sets.ServiceEntrySet) v1sets.ServiceEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.ServiceEntrySet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockServiceEntrySetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockServiceEntrySet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockServiceEntrySet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockServiceEntrySetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockServiceEntrySet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockServiceEntrySet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockServiceEntrySetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockServiceEntrySet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockServiceEntrySet) List(filterResource ...func(*v1.ServiceEntry) bool) []*v1.ServiceEntry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.ServiceEntry)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockServiceEntrySetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockServiceEntrySet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockServiceEntrySet) Map() map[string]*v1.ServiceEntry {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.ServiceEntry)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockServiceEntrySetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockServiceEntrySet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockServiceEntrySet) Union(set v1sets.ServiceEntrySet) v1sets.ServiceEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.ServiceEntrySet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockServiceEntrySetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockServiceEntrySet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockServiceEntrySet) UnsortedList(filterResource ...func(*v1.ServiceEntry) bool) []*v1.ServiceEntry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.ServiceEntry)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockServiceEntrySetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockServiceEntrySet)(nil).UnsortedList), filterResource...)
+}
+
+// MockWorkloadEntrySet is a mock of WorkloadEntrySet interface.
+type MockWorkloadEntrySet struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadEntrySetMockRecorder
+}
+
+// MockWorkloadEntrySetMockRecorder is the mock recorder for MockWorkloadEntrySet.
+type MockWorkloadEntrySetMockRecorder struct {
+	mock *MockWorkloadEntrySet
+}
+
+// NewMockWorkloadEntrySet creates a new mock instance.
+func NewMockWorkloadEntrySet(ctrl *gomock.Controller) *MockWorkloadEntrySet {
+	mock := &MockWorkloadEntrySet{ctrl: ctrl}
+	mock.recorder = &MockWorkloadEntrySetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadEntrySet) EXPECT() *MockWorkloadEntrySetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockWorkloadEntrySet) Clone() v1sets.WorkloadEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.WorkloadEntrySet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockWorkloadEntrySetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockWorkloadEntrySet) Delete(workloadEntry ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", workloadEntry)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockWorkloadEntrySetMockRecorder) Delete(workloadEntry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Delete), workloadEntry)
+}
+
+// Delta mocks base method.
+func (m *MockWorkloadEntrySet) Delta(newSet v1sets.WorkloadEntrySet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockWorkloadEntrySetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockWorkloadEntrySet) Difference(set v1sets.WorkloadEntrySet) v1sets.WorkloadEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.WorkloadEntrySet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockWorkloadEntrySetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockWorkloadEntrySet) Equal(workloadEntrySet v1sets.WorkloadEntrySet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", workloadEntrySet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockWorkloadEntrySetMockRecorder) Equal(workloadEntrySet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Equal), workloadEntrySet)
+}
+
+// Find mocks base method.
+func (m *MockWorkloadEntrySet) Find(id ezkube.ResourceId) (*v1.WorkloadEntry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.WorkloadEntry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockWorkloadEntrySetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockWorkloadEntrySet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockWorkloadEntrySetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockWorkloadEntrySet) Has(workloadEntry ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", workloadEntry)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockWorkloadEntrySetMockRecorder) Has(workloadEntry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Has), workloadEntry)
+}
+
+// Insert mocks base method.
+func (m *MockWorkloadEntrySet) Insert(workloadEntry ...*v1.WorkloadEntry) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range workloadEntry {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockWorkloadEntrySetMockRecorder) Insert(workloadEntry ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Insert), workloadEntry...)
+}
+
+// Intersection mocks base method.
+func (m *MockWorkloadEntrySet) Intersection(set v1sets.WorkloadEntrySet) v1sets.WorkloadEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.WorkloadEntrySet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockWorkloadEntrySetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockWorkloadEntrySet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockWorkloadEntrySetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockWorkloadEntrySet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockWorkloadEntrySetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockWorkloadEntrySet) List(filterResource ...func(*v1.WorkloadEntry) bool) []*v1.WorkloadEntry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.WorkloadEntry)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockWorkloadEntrySetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockWorkloadEntrySet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockWorkloadEntrySet) Map() map[string]*v1.WorkloadEntry {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.WorkloadEntry)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockWorkloadEntrySetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockWorkloadEntrySet) Union(set v1sets.WorkloadEntrySet) v1sets.WorkloadEntrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.WorkloadEntrySet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockWorkloadEntrySetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockWorkloadEntrySet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockWorkloadEntrySet) UnsortedList(filterResource ...func(*v1.WorkloadEntry) bool) []*v1.WorkloadEntry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.WorkloadEntry)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockWorkloadEntrySetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockWorkloadEntrySet)(nil).UnsortedList), filterResource...)
+}
+
+// MockWorkloadGroupSet is a mock of WorkloadGroupSet interface.
+type MockWorkloadGroupSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockWorkloadGroupSetMockRecorder
+}
+
+// MockWorkloadGroupSetMockRecorder is the mock recorder for MockWorkloadGroupSet.
+type MockWorkloadGroupSetMockRecorder struct {
+	mock *MockWorkloadGroupSet
+}
+
+// NewMockWorkloadGroupSet creates a new mock instance.
+func NewMockWorkloadGroupSet(ctrl *gomock.Controller) *MockWorkloadGroupSet {
+	mock := &MockWorkloadGroupSet{ctrl: ctrl}
+	mock.recorder = &MockWorkloadGroupSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockWorkloadGroupSet) EXPECT() *MockWorkloadGroupSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockWorkloadGroupSet) Clone() v1sets.WorkloadGroupSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.WorkloadGroupSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockWorkloadGroupSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockWorkloadGroupSet) Delete(workloadGroup ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", workloadGroup)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockWorkloadGroupSetMockRecorder) Delete(workloadGroup interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Delete), workloadGroup)
+}
+
+// Delta mocks base method.
+func (m *MockWorkloadGroupSet) Delta(newSet v1sets.WorkloadGroupSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockWorkloadGroupSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockWorkloadGroupSet) Difference(set v1sets.WorkloadGroupSet) v1sets.WorkloadGroupSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.WorkloadGroupSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockWorkloadGroupSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockWorkloadGroupSet) Equal(workloadGroupSet v1sets.WorkloadGroupSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", workloadGroupSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockWorkloadGroupSetMockRecorder) Equal(workloadGroupSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Equal), workloadGroupSet)
+}
+
+// Find mocks base method.
+func (m *MockWorkloadGroupSet) Find(id ezkube.ResourceId) (*v1.WorkloadGroup, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.WorkloadGroup)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockWorkloadGroupSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockWorkloadGroupSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockWorkloadGroupSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockWorkloadGroupSet) Has(workloadGroup ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", workloadGroup)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockWorkloadGroupSetMockRecorder) Has(workloadGroup interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Has), workloadGroup)
+}
+
+// Insert mocks base method.
+func (m *MockWorkloadGroupSet) Insert(workloadGroup ...*v1.WorkloadGroup) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range workloadGroup {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockWorkloadGroupSetMockRecorder) Insert(workloadGroup ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Insert), workloadGroup...)
+}
+
+// Intersection mocks base method.
+func (m *MockWorkloadGroupSet) Intersection(set v1sets.WorkloadGroupSet) v1sets.WorkloadGroupSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.WorkloadGroupSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockWorkloadGroupSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockWorkloadGroupSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockWorkloadGroupSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockWorkloadGroupSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockWorkloadGroupSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockWorkloadGroupSet) List(filterResource ...func(*v1.WorkloadGroup) bool) []*v1.WorkloadGroup {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.WorkloadGroup)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockWorkloadGroupSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockWorkloadGroupSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockWorkloadGroupSet) Map() map[string]*v1.WorkloadGroup {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.WorkloadGroup)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockWorkloadGroupSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockWorkloadGroupSet) Union(set v1sets.WorkloadGroupSet) v1sets.WorkloadGroupSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.WorkloadGroupSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockWorkloadGroupSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockWorkloadGroupSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockWorkloadGroupSet) UnsortedList(filterResource ...func(*v1.WorkloadGroup) bool) []*v1.WorkloadGroup {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.WorkloadGroup)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockWorkloadGroupSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockWorkloadGroupSet)(nil).UnsortedList), filterResource...)
+}
+
+// MockVirtualServiceSet is a mock of VirtualServiceSet interface.
+type MockVirtualServiceSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockVirtualServiceSetMockRecorder
+}
+
+// MockVirtualServiceSetMockRecorder is the mock recorder for MockVirtualServiceSet.
+type MockVirtualServiceSetMockRecorder struct {
+	mock *MockVirtualServiceSet
+}
+
+// NewMockVirtualServiceSet creates a new mock instance.
+func NewMockVirtualServiceSet(ctrl *gomock.Controller) *MockVirtualServiceSet {
+	mock := &MockVirtualServiceSet{ctrl: ctrl}
+	mock.recorder = &MockVirtualServiceSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockVirtualServiceSet) EXPECT() *MockVirtualServiceSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockVirtualServiceSet) Clone() v1sets.VirtualServiceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.VirtualServiceSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockVirtualServiceSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockVirtualServiceSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockVirtualServiceSet) Delete(virtualService ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", virtualService)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockVirtualServiceSetMockRecorder) Delete(virtualService interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockVirtualServiceSet)(nil).Delete), virtualService)
+}
+
+// Delta mocks base method.
+func (m *MockVirtualServiceSet) Delta(newSet v1sets.VirtualServiceSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockVirtualServiceSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockVirtualServiceSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockVirtualServiceSet) Difference(set v1sets.VirtualServiceSet) v1sets.VirtualServiceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.VirtualServiceSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockVirtualServiceSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockVirtualServiceSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockVirtualServiceSet) Equal(virtualServiceSet v1sets.VirtualServiceSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", virtualServiceSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockVirtualServiceSetMockRecorder) Equal(virtualServiceSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockVirtualServiceSet)(nil).Equal), virtualServiceSet)
+}
+
+// Find mocks base method.
+func (m *MockVirtualServiceSet) Find(id ezkube.ResourceId) (*v1.VirtualService, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.VirtualService)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockVirtualServiceSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockVirtualServiceSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockVirtualServiceSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockVirtualServiceSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockVirtualServiceSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockVirtualServiceSet) Has(virtualService ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", virtualService)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockVirtualServiceSetMockRecorder) Has(virtualService interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockVirtualServiceSet)(nil).Has), virtualService)
+}
+
+// Insert mocks base method.
+func (m *MockVirtualServiceSet) Insert(virtualService ...*v1.VirtualService) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range virtualService {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockVirtualServiceSetMockRecorder) Insert(virtualService ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockVirtualServiceSet)(nil).Insert), virtualService...)
+}
+
+// Intersection mocks base method.
+func (m *MockVirtualServiceSet) Intersection(set v1sets.VirtualServiceSet) v1sets.VirtualServiceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.VirtualServiceSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockVirtualServiceSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockVirtualServiceSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockVirtualServiceSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockVirtualServiceSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockVirtualServiceSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockVirtualServiceSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockVirtualServiceSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockVirtualServiceSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockVirtualServiceSet) List(filterResource ...func(*v1.VirtualService) bool) []*v1.VirtualService {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.VirtualService)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockVirtualServiceSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockVirtualServiceSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockVirtualServiceSet) Map() map[string]*v1.VirtualService {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.VirtualService)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockVirtualServiceSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockVirtualServiceSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockVirtualServiceSet) Union(set v1sets.VirtualServiceSet) v1sets.VirtualServiceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.VirtualServiceSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockVirtualServiceSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockVirtualServiceSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockVirtualServiceSet) UnsortedList(filterResource ...func(*v1.VirtualService) bool) []*v1.VirtualService {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.VirtualService)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockVirtualServiceSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockVirtualServiceSet)(nil).UnsortedList), filterResource...)
+}
+
+// MockSidecarSet is a mock of SidecarSet interface.
+type MockSidecarSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockSidecarSetMockRecorder
+}
+
+// MockSidecarSetMockRecorder is the mock recorder for MockSidecarSet.
+type MockSidecarSetMockRecorder struct {
+	mock *MockSidecarSet
+}
+
+// NewMockSidecarSet creates a new mock instance.
+func NewMockSidecarSet(ctrl *gomock.Controller) *MockSidecarSet {
+	mock := &MockSidecarSet{ctrl: ctrl}
+	mock.recorder = &MockSidecarSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockSidecarSet) EXPECT() *MockSidecarSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockSidecarSet) Clone() v1sets.SidecarSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.SidecarSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockSidecarSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockSidecarSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockSidecarSet) Delete(sidecar ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", sidecar)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockSidecarSetMockRecorder) Delete(sidecar interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockSidecarSet)(nil).Delete), sidecar)
+}
+
+// Delta mocks base method.
+func (m *MockSidecarSet) Delta(newSet v1sets.SidecarSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockSidecarSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockSidecarSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockSidecarSet) Difference(set v1sets.SidecarSet) v1sets.SidecarSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.SidecarSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockSidecarSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockSidecarSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockSidecarSet) Equal(sidecarSet v1sets.SidecarSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", sidecarSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockSidecarSetMockRecorder) Equal(sidecarSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockSidecarSet)(nil).Equal), sidecarSet)
+}
+
+// Find mocks base method.
+func (m *MockSidecarSet) Find(id ezkube.ResourceId) (*v1.Sidecar, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.Sidecar)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockSidecarSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockSidecarSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockSidecarSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockSidecarSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockSidecarSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockSidecarSet) Has(sidecar ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", sidecar)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockSidecarSetMockRecorder) Has(sidecar interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockSidecarSet)(nil).Has), sidecar)
+}
+
+// Insert mocks base method.
+func (m *MockSidecarSet) Insert(sidecar ...*v1.Sidecar) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range sidecar {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockSidecarSetMockRecorder) Insert(sidecar ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockSidecarSet)(nil).Insert), sidecar...)
+}
+
+// Intersection mocks base method.
+func (m *MockSidecarSet) Intersection(set v1sets.SidecarSet) v1sets.SidecarSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.SidecarSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockSidecarSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockSidecarSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockSidecarSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockSidecarSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockSidecarSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockSidecarSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockSidecarSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockSidecarSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockSidecarSet) List(filterResource ...func(*v1.Sidecar) bool) []*v1.Sidecar {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.Sidecar)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockSidecarSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockSidecarSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockSidecarSet) Map() map[string]*v1.Sidecar {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.Sidecar)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockSidecarSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockSidecarSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockSidecarSet) Union(set v1sets.SidecarSet) v1sets.SidecarSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.SidecarSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockSidecarSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockSidecarSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockSidecarSet) UnsortedList(filterResource ...func(*v1.Sidecar) bool) []*v1.Sidecar {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.Sidecar)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockSidecarSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockSidecarSet)(nil).UnsortedList), filterResource...)
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/sets/sets.go b/pkg/api/istio/networking.istio.io/v1/sets/sets.go
new file mode 100644
index 0000000..7f68497
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/sets/sets.go
@@ -0,0 +1,1575 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./sets.go -destination mocks/sets.go
+
+package v1sets
+
+import (
+	networking_istio_io_v1 "istio.io/client-go/pkg/apis/networking/v1"
+
+	"github.com/rotisserie/eris"
+	sksets "github.com/solo-io/skv2/contrib/pkg/sets"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+type DestinationRuleSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.DestinationRule) bool) []*networking_istio_io_v1.DestinationRule
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.DestinationRule) bool) []*networking_istio_io_v1.DestinationRule
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.DestinationRule
+	// Insert a resource into the set.
+	Insert(destinationRule ...*networking_istio_io_v1.DestinationRule)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(destinationRuleSet DestinationRuleSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(destinationRule ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(destinationRule ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set DestinationRuleSet) DestinationRuleSet
+	// Return the difference with the provided set
+	Difference(set DestinationRuleSet) DestinationRuleSet
+	// Return the intersection with the provided set
+	Intersection(set DestinationRuleSet) DestinationRuleSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.DestinationRule, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another DestinationRuleSet
+	Delta(newSet DestinationRuleSet) sksets.ResourceDelta
+	// Create a deep copy of the current DestinationRuleSet
+	Clone() DestinationRuleSet
+}
+
+func makeGenericDestinationRuleSet(destinationRuleList []*networking_istio_io_v1.DestinationRule) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range destinationRuleList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type destinationRuleSet struct {
+	set sksets.ResourceSet
+}
+
+func NewDestinationRuleSet(destinationRuleList ...*networking_istio_io_v1.DestinationRule) DestinationRuleSet {
+	return &destinationRuleSet{set: makeGenericDestinationRuleSet(destinationRuleList)}
+}
+
+func NewDestinationRuleSetFromList(destinationRuleList *networking_istio_io_v1.DestinationRuleList) DestinationRuleSet {
+	list := make([]*networking_istio_io_v1.DestinationRule, 0, len(destinationRuleList.Items))
+	for idx := range destinationRuleList.Items {
+		list = append(list, destinationRuleList.Items[idx])
+	}
+	return &destinationRuleSet{set: makeGenericDestinationRuleSet(list)}
+}
+
+func (s *destinationRuleSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *destinationRuleSet) List(filterResource ...func(*networking_istio_io_v1.DestinationRule) bool) []*networking_istio_io_v1.DestinationRule {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.DestinationRule))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	destinationRuleList := make([]*networking_istio_io_v1.DestinationRule, 0, len(objs))
+	for _, obj := range objs {
+		destinationRuleList = append(destinationRuleList, obj.(*networking_istio_io_v1.DestinationRule))
+	}
+	return destinationRuleList
+}
+
+func (s *destinationRuleSet) UnsortedList(filterResource ...func(*networking_istio_io_v1.DestinationRule) bool) []*networking_istio_io_v1.DestinationRule {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.DestinationRule))
+		})
+	}
+
+	var destinationRuleList []*networking_istio_io_v1.DestinationRule
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		destinationRuleList = append(destinationRuleList, obj.(*networking_istio_io_v1.DestinationRule))
+	}
+	return destinationRuleList
+}
+
+func (s *destinationRuleSet) Map() map[string]*networking_istio_io_v1.DestinationRule {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.DestinationRule{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.DestinationRule)
+	}
+	return newMap
+}
+
+func (s *destinationRuleSet) Insert(
+	destinationRuleList ...*networking_istio_io_v1.DestinationRule,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range destinationRuleList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *destinationRuleSet) Has(destinationRule ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(destinationRule)
+}
+
+func (s *destinationRuleSet) Equal(
+	destinationRuleSet DestinationRuleSet,
+) bool {
+	if s == nil {
+		return destinationRuleSet == nil
+	}
+	return s.Generic().Equal(destinationRuleSet.Generic())
+}
+
+func (s *destinationRuleSet) Delete(DestinationRule ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(DestinationRule)
+}
+
+func (s *destinationRuleSet) Union(set DestinationRuleSet) DestinationRuleSet {
+	if s == nil {
+		return set
+	}
+	return NewDestinationRuleSet(append(s.List(), set.List()...)...)
+}
+
+func (s *destinationRuleSet) Difference(set DestinationRuleSet) DestinationRuleSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &destinationRuleSet{set: newSet}
+}
+
+func (s *destinationRuleSet) Intersection(set DestinationRuleSet) DestinationRuleSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var destinationRuleList []*networking_istio_io_v1.DestinationRule
+	for _, obj := range newSet.List() {
+		destinationRuleList = append(destinationRuleList, obj.(*networking_istio_io_v1.DestinationRule))
+	}
+	return NewDestinationRuleSet(destinationRuleList...)
+}
+
+func (s *destinationRuleSet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.DestinationRule, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find DestinationRule %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.DestinationRule{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.DestinationRule), nil
+}
+
+func (s *destinationRuleSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *destinationRuleSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *destinationRuleSet) Delta(newSet DestinationRuleSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *destinationRuleSet) Clone() DestinationRuleSet {
+	if s == nil {
+		return nil
+	}
+	return &destinationRuleSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type GatewaySet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.Gateway) bool) []*networking_istio_io_v1.Gateway
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.Gateway) bool) []*networking_istio_io_v1.Gateway
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.Gateway
+	// Insert a resource into the set.
+	Insert(gateway ...*networking_istio_io_v1.Gateway)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(gatewaySet GatewaySet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(gateway ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(gateway ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set GatewaySet) GatewaySet
+	// Return the difference with the provided set
+	Difference(set GatewaySet) GatewaySet
+	// Return the intersection with the provided set
+	Intersection(set GatewaySet) GatewaySet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.Gateway, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another GatewaySet
+	Delta(newSet GatewaySet) sksets.ResourceDelta
+	// Create a deep copy of the current GatewaySet
+	Clone() GatewaySet
+}
+
+func makeGenericGatewaySet(gatewayList []*networking_istio_io_v1.Gateway) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range gatewayList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type gatewaySet struct {
+	set sksets.ResourceSet
+}
+
+func NewGatewaySet(gatewayList ...*networking_istio_io_v1.Gateway) GatewaySet {
+	return &gatewaySet{set: makeGenericGatewaySet(gatewayList)}
+}
+
+func NewGatewaySetFromList(gatewayList *networking_istio_io_v1.GatewayList) GatewaySet {
+	list := make([]*networking_istio_io_v1.Gateway, 0, len(gatewayList.Items))
+	for idx := range gatewayList.Items {
+		list = append(list, gatewayList.Items[idx])
+	}
+	return &gatewaySet{set: makeGenericGatewaySet(list)}
+}
+
+func (s *gatewaySet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *gatewaySet) List(filterResource ...func(*networking_istio_io_v1.Gateway) bool) []*networking_istio_io_v1.Gateway {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.Gateway))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	gatewayList := make([]*networking_istio_io_v1.Gateway, 0, len(objs))
+	for _, obj := range objs {
+		gatewayList = append(gatewayList, obj.(*networking_istio_io_v1.Gateway))
+	}
+	return gatewayList
+}
+
+func (s *gatewaySet) UnsortedList(filterResource ...func(*networking_istio_io_v1.Gateway) bool) []*networking_istio_io_v1.Gateway {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.Gateway))
+		})
+	}
+
+	var gatewayList []*networking_istio_io_v1.Gateway
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		gatewayList = append(gatewayList, obj.(*networking_istio_io_v1.Gateway))
+	}
+	return gatewayList
+}
+
+func (s *gatewaySet) Map() map[string]*networking_istio_io_v1.Gateway {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.Gateway{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.Gateway)
+	}
+	return newMap
+}
+
+func (s *gatewaySet) Insert(
+	gatewayList ...*networking_istio_io_v1.Gateway,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range gatewayList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *gatewaySet) Has(gateway ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(gateway)
+}
+
+func (s *gatewaySet) Equal(
+	gatewaySet GatewaySet,
+) bool {
+	if s == nil {
+		return gatewaySet == nil
+	}
+	return s.Generic().Equal(gatewaySet.Generic())
+}
+
+func (s *gatewaySet) Delete(Gateway ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(Gateway)
+}
+
+func (s *gatewaySet) Union(set GatewaySet) GatewaySet {
+	if s == nil {
+		return set
+	}
+	return NewGatewaySet(append(s.List(), set.List()...)...)
+}
+
+func (s *gatewaySet) Difference(set GatewaySet) GatewaySet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &gatewaySet{set: newSet}
+}
+
+func (s *gatewaySet) Intersection(set GatewaySet) GatewaySet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var gatewayList []*networking_istio_io_v1.Gateway
+	for _, obj := range newSet.List() {
+		gatewayList = append(gatewayList, obj.(*networking_istio_io_v1.Gateway))
+	}
+	return NewGatewaySet(gatewayList...)
+}
+
+func (s *gatewaySet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.Gateway, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find Gateway %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.Gateway{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.Gateway), nil
+}
+
+func (s *gatewaySet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *gatewaySet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *gatewaySet) Delta(newSet GatewaySet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *gatewaySet) Clone() GatewaySet {
+	if s == nil {
+		return nil
+	}
+	return &gatewaySet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type ServiceEntrySet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.ServiceEntry) bool) []*networking_istio_io_v1.ServiceEntry
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.ServiceEntry) bool) []*networking_istio_io_v1.ServiceEntry
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.ServiceEntry
+	// Insert a resource into the set.
+	Insert(serviceEntry ...*networking_istio_io_v1.ServiceEntry)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(serviceEntrySet ServiceEntrySet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(serviceEntry ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(serviceEntry ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set ServiceEntrySet) ServiceEntrySet
+	// Return the difference with the provided set
+	Difference(set ServiceEntrySet) ServiceEntrySet
+	// Return the intersection with the provided set
+	Intersection(set ServiceEntrySet) ServiceEntrySet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.ServiceEntry, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another ServiceEntrySet
+	Delta(newSet ServiceEntrySet) sksets.ResourceDelta
+	// Create a deep copy of the current ServiceEntrySet
+	Clone() ServiceEntrySet
+}
+
+func makeGenericServiceEntrySet(serviceEntryList []*networking_istio_io_v1.ServiceEntry) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range serviceEntryList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type serviceEntrySet struct {
+	set sksets.ResourceSet
+}
+
+func NewServiceEntrySet(serviceEntryList ...*networking_istio_io_v1.ServiceEntry) ServiceEntrySet {
+	return &serviceEntrySet{set: makeGenericServiceEntrySet(serviceEntryList)}
+}
+
+func NewServiceEntrySetFromList(serviceEntryList *networking_istio_io_v1.ServiceEntryList) ServiceEntrySet {
+	list := make([]*networking_istio_io_v1.ServiceEntry, 0, len(serviceEntryList.Items))
+	for idx := range serviceEntryList.Items {
+		list = append(list, serviceEntryList.Items[idx])
+	}
+	return &serviceEntrySet{set: makeGenericServiceEntrySet(list)}
+}
+
+func (s *serviceEntrySet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *serviceEntrySet) List(filterResource ...func(*networking_istio_io_v1.ServiceEntry) bool) []*networking_istio_io_v1.ServiceEntry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.ServiceEntry))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	serviceEntryList := make([]*networking_istio_io_v1.ServiceEntry, 0, len(objs))
+	for _, obj := range objs {
+		serviceEntryList = append(serviceEntryList, obj.(*networking_istio_io_v1.ServiceEntry))
+	}
+	return serviceEntryList
+}
+
+func (s *serviceEntrySet) UnsortedList(filterResource ...func(*networking_istio_io_v1.ServiceEntry) bool) []*networking_istio_io_v1.ServiceEntry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.ServiceEntry))
+		})
+	}
+
+	var serviceEntryList []*networking_istio_io_v1.ServiceEntry
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		serviceEntryList = append(serviceEntryList, obj.(*networking_istio_io_v1.ServiceEntry))
+	}
+	return serviceEntryList
+}
+
+func (s *serviceEntrySet) Map() map[string]*networking_istio_io_v1.ServiceEntry {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.ServiceEntry{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.ServiceEntry)
+	}
+	return newMap
+}
+
+func (s *serviceEntrySet) Insert(
+	serviceEntryList ...*networking_istio_io_v1.ServiceEntry,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range serviceEntryList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *serviceEntrySet) Has(serviceEntry ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(serviceEntry)
+}
+
+func (s *serviceEntrySet) Equal(
+	serviceEntrySet ServiceEntrySet,
+) bool {
+	if s == nil {
+		return serviceEntrySet == nil
+	}
+	return s.Generic().Equal(serviceEntrySet.Generic())
+}
+
+func (s *serviceEntrySet) Delete(ServiceEntry ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(ServiceEntry)
+}
+
+func (s *serviceEntrySet) Union(set ServiceEntrySet) ServiceEntrySet {
+	if s == nil {
+		return set
+	}
+	return NewServiceEntrySet(append(s.List(), set.List()...)...)
+}
+
+func (s *serviceEntrySet) Difference(set ServiceEntrySet) ServiceEntrySet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &serviceEntrySet{set: newSet}
+}
+
+func (s *serviceEntrySet) Intersection(set ServiceEntrySet) ServiceEntrySet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var serviceEntryList []*networking_istio_io_v1.ServiceEntry
+	for _, obj := range newSet.List() {
+		serviceEntryList = append(serviceEntryList, obj.(*networking_istio_io_v1.ServiceEntry))
+	}
+	return NewServiceEntrySet(serviceEntryList...)
+}
+
+func (s *serviceEntrySet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.ServiceEntry, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find ServiceEntry %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.ServiceEntry{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.ServiceEntry), nil
+}
+
+func (s *serviceEntrySet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *serviceEntrySet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *serviceEntrySet) Delta(newSet ServiceEntrySet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *serviceEntrySet) Clone() ServiceEntrySet {
+	if s == nil {
+		return nil
+	}
+	return &serviceEntrySet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type WorkloadEntrySet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.WorkloadEntry) bool) []*networking_istio_io_v1.WorkloadEntry
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.WorkloadEntry) bool) []*networking_istio_io_v1.WorkloadEntry
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.WorkloadEntry
+	// Insert a resource into the set.
+	Insert(workloadEntry ...*networking_istio_io_v1.WorkloadEntry)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(workloadEntrySet WorkloadEntrySet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(workloadEntry ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(workloadEntry ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set WorkloadEntrySet) WorkloadEntrySet
+	// Return the difference with the provided set
+	Difference(set WorkloadEntrySet) WorkloadEntrySet
+	// Return the intersection with the provided set
+	Intersection(set WorkloadEntrySet) WorkloadEntrySet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.WorkloadEntry, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another WorkloadEntrySet
+	Delta(newSet WorkloadEntrySet) sksets.ResourceDelta
+	// Create a deep copy of the current WorkloadEntrySet
+	Clone() WorkloadEntrySet
+}
+
+func makeGenericWorkloadEntrySet(workloadEntryList []*networking_istio_io_v1.WorkloadEntry) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range workloadEntryList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type workloadEntrySet struct {
+	set sksets.ResourceSet
+}
+
+func NewWorkloadEntrySet(workloadEntryList ...*networking_istio_io_v1.WorkloadEntry) WorkloadEntrySet {
+	return &workloadEntrySet{set: makeGenericWorkloadEntrySet(workloadEntryList)}
+}
+
+func NewWorkloadEntrySetFromList(workloadEntryList *networking_istio_io_v1.WorkloadEntryList) WorkloadEntrySet {
+	list := make([]*networking_istio_io_v1.WorkloadEntry, 0, len(workloadEntryList.Items))
+	for idx := range workloadEntryList.Items {
+		list = append(list, workloadEntryList.Items[idx])
+	}
+	return &workloadEntrySet{set: makeGenericWorkloadEntrySet(list)}
+}
+
+func (s *workloadEntrySet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *workloadEntrySet) List(filterResource ...func(*networking_istio_io_v1.WorkloadEntry) bool) []*networking_istio_io_v1.WorkloadEntry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.WorkloadEntry))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	workloadEntryList := make([]*networking_istio_io_v1.WorkloadEntry, 0, len(objs))
+	for _, obj := range objs {
+		workloadEntryList = append(workloadEntryList, obj.(*networking_istio_io_v1.WorkloadEntry))
+	}
+	return workloadEntryList
+}
+
+func (s *workloadEntrySet) UnsortedList(filterResource ...func(*networking_istio_io_v1.WorkloadEntry) bool) []*networking_istio_io_v1.WorkloadEntry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.WorkloadEntry))
+		})
+	}
+
+	var workloadEntryList []*networking_istio_io_v1.WorkloadEntry
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		workloadEntryList = append(workloadEntryList, obj.(*networking_istio_io_v1.WorkloadEntry))
+	}
+	return workloadEntryList
+}
+
+func (s *workloadEntrySet) Map() map[string]*networking_istio_io_v1.WorkloadEntry {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.WorkloadEntry{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.WorkloadEntry)
+	}
+	return newMap
+}
+
+func (s *workloadEntrySet) Insert(
+	workloadEntryList ...*networking_istio_io_v1.WorkloadEntry,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range workloadEntryList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *workloadEntrySet) Has(workloadEntry ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(workloadEntry)
+}
+
+func (s *workloadEntrySet) Equal(
+	workloadEntrySet WorkloadEntrySet,
+) bool {
+	if s == nil {
+		return workloadEntrySet == nil
+	}
+	return s.Generic().Equal(workloadEntrySet.Generic())
+}
+
+func (s *workloadEntrySet) Delete(WorkloadEntry ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(WorkloadEntry)
+}
+
+func (s *workloadEntrySet) Union(set WorkloadEntrySet) WorkloadEntrySet {
+	if s == nil {
+		return set
+	}
+	return NewWorkloadEntrySet(append(s.List(), set.List()...)...)
+}
+
+func (s *workloadEntrySet) Difference(set WorkloadEntrySet) WorkloadEntrySet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &workloadEntrySet{set: newSet}
+}
+
+func (s *workloadEntrySet) Intersection(set WorkloadEntrySet) WorkloadEntrySet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var workloadEntryList []*networking_istio_io_v1.WorkloadEntry
+	for _, obj := range newSet.List() {
+		workloadEntryList = append(workloadEntryList, obj.(*networking_istio_io_v1.WorkloadEntry))
+	}
+	return NewWorkloadEntrySet(workloadEntryList...)
+}
+
+func (s *workloadEntrySet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.WorkloadEntry, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find WorkloadEntry %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.WorkloadEntry{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.WorkloadEntry), nil
+}
+
+func (s *workloadEntrySet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *workloadEntrySet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *workloadEntrySet) Delta(newSet WorkloadEntrySet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *workloadEntrySet) Clone() WorkloadEntrySet {
+	if s == nil {
+		return nil
+	}
+	return &workloadEntrySet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type WorkloadGroupSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.WorkloadGroup) bool) []*networking_istio_io_v1.WorkloadGroup
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.WorkloadGroup) bool) []*networking_istio_io_v1.WorkloadGroup
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.WorkloadGroup
+	// Insert a resource into the set.
+	Insert(workloadGroup ...*networking_istio_io_v1.WorkloadGroup)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(workloadGroupSet WorkloadGroupSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(workloadGroup ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(workloadGroup ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set WorkloadGroupSet) WorkloadGroupSet
+	// Return the difference with the provided set
+	Difference(set WorkloadGroupSet) WorkloadGroupSet
+	// Return the intersection with the provided set
+	Intersection(set WorkloadGroupSet) WorkloadGroupSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.WorkloadGroup, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another WorkloadGroupSet
+	Delta(newSet WorkloadGroupSet) sksets.ResourceDelta
+	// Create a deep copy of the current WorkloadGroupSet
+	Clone() WorkloadGroupSet
+}
+
+func makeGenericWorkloadGroupSet(workloadGroupList []*networking_istio_io_v1.WorkloadGroup) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range workloadGroupList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type workloadGroupSet struct {
+	set sksets.ResourceSet
+}
+
+func NewWorkloadGroupSet(workloadGroupList ...*networking_istio_io_v1.WorkloadGroup) WorkloadGroupSet {
+	return &workloadGroupSet{set: makeGenericWorkloadGroupSet(workloadGroupList)}
+}
+
+func NewWorkloadGroupSetFromList(workloadGroupList *networking_istio_io_v1.WorkloadGroupList) WorkloadGroupSet {
+	list := make([]*networking_istio_io_v1.WorkloadGroup, 0, len(workloadGroupList.Items))
+	for idx := range workloadGroupList.Items {
+		list = append(list, workloadGroupList.Items[idx])
+	}
+	return &workloadGroupSet{set: makeGenericWorkloadGroupSet(list)}
+}
+
+func (s *workloadGroupSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *workloadGroupSet) List(filterResource ...func(*networking_istio_io_v1.WorkloadGroup) bool) []*networking_istio_io_v1.WorkloadGroup {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.WorkloadGroup))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	workloadGroupList := make([]*networking_istio_io_v1.WorkloadGroup, 0, len(objs))
+	for _, obj := range objs {
+		workloadGroupList = append(workloadGroupList, obj.(*networking_istio_io_v1.WorkloadGroup))
+	}
+	return workloadGroupList
+}
+
+func (s *workloadGroupSet) UnsortedList(filterResource ...func(*networking_istio_io_v1.WorkloadGroup) bool) []*networking_istio_io_v1.WorkloadGroup {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.WorkloadGroup))
+		})
+	}
+
+	var workloadGroupList []*networking_istio_io_v1.WorkloadGroup
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		workloadGroupList = append(workloadGroupList, obj.(*networking_istio_io_v1.WorkloadGroup))
+	}
+	return workloadGroupList
+}
+
+func (s *workloadGroupSet) Map() map[string]*networking_istio_io_v1.WorkloadGroup {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.WorkloadGroup{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.WorkloadGroup)
+	}
+	return newMap
+}
+
+func (s *workloadGroupSet) Insert(
+	workloadGroupList ...*networking_istio_io_v1.WorkloadGroup,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range workloadGroupList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *workloadGroupSet) Has(workloadGroup ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(workloadGroup)
+}
+
+func (s *workloadGroupSet) Equal(
+	workloadGroupSet WorkloadGroupSet,
+) bool {
+	if s == nil {
+		return workloadGroupSet == nil
+	}
+	return s.Generic().Equal(workloadGroupSet.Generic())
+}
+
+func (s *workloadGroupSet) Delete(WorkloadGroup ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(WorkloadGroup)
+}
+
+func (s *workloadGroupSet) Union(set WorkloadGroupSet) WorkloadGroupSet {
+	if s == nil {
+		return set
+	}
+	return NewWorkloadGroupSet(append(s.List(), set.List()...)...)
+}
+
+func (s *workloadGroupSet) Difference(set WorkloadGroupSet) WorkloadGroupSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &workloadGroupSet{set: newSet}
+}
+
+func (s *workloadGroupSet) Intersection(set WorkloadGroupSet) WorkloadGroupSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var workloadGroupList []*networking_istio_io_v1.WorkloadGroup
+	for _, obj := range newSet.List() {
+		workloadGroupList = append(workloadGroupList, obj.(*networking_istio_io_v1.WorkloadGroup))
+	}
+	return NewWorkloadGroupSet(workloadGroupList...)
+}
+
+func (s *workloadGroupSet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.WorkloadGroup, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find WorkloadGroup %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.WorkloadGroup{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.WorkloadGroup), nil
+}
+
+func (s *workloadGroupSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *workloadGroupSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *workloadGroupSet) Delta(newSet WorkloadGroupSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *workloadGroupSet) Clone() WorkloadGroupSet {
+	if s == nil {
+		return nil
+	}
+	return &workloadGroupSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type VirtualServiceSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.VirtualService) bool) []*networking_istio_io_v1.VirtualService
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.VirtualService) bool) []*networking_istio_io_v1.VirtualService
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.VirtualService
+	// Insert a resource into the set.
+	Insert(virtualService ...*networking_istio_io_v1.VirtualService)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(virtualServiceSet VirtualServiceSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(virtualService ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(virtualService ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set VirtualServiceSet) VirtualServiceSet
+	// Return the difference with the provided set
+	Difference(set VirtualServiceSet) VirtualServiceSet
+	// Return the intersection with the provided set
+	Intersection(set VirtualServiceSet) VirtualServiceSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.VirtualService, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another VirtualServiceSet
+	Delta(newSet VirtualServiceSet) sksets.ResourceDelta
+	// Create a deep copy of the current VirtualServiceSet
+	Clone() VirtualServiceSet
+}
+
+func makeGenericVirtualServiceSet(virtualServiceList []*networking_istio_io_v1.VirtualService) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range virtualServiceList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type virtualServiceSet struct {
+	set sksets.ResourceSet
+}
+
+func NewVirtualServiceSet(virtualServiceList ...*networking_istio_io_v1.VirtualService) VirtualServiceSet {
+	return &virtualServiceSet{set: makeGenericVirtualServiceSet(virtualServiceList)}
+}
+
+func NewVirtualServiceSetFromList(virtualServiceList *networking_istio_io_v1.VirtualServiceList) VirtualServiceSet {
+	list := make([]*networking_istio_io_v1.VirtualService, 0, len(virtualServiceList.Items))
+	for idx := range virtualServiceList.Items {
+		list = append(list, virtualServiceList.Items[idx])
+	}
+	return &virtualServiceSet{set: makeGenericVirtualServiceSet(list)}
+}
+
+func (s *virtualServiceSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *virtualServiceSet) List(filterResource ...func(*networking_istio_io_v1.VirtualService) bool) []*networking_istio_io_v1.VirtualService {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.VirtualService))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	virtualServiceList := make([]*networking_istio_io_v1.VirtualService, 0, len(objs))
+	for _, obj := range objs {
+		virtualServiceList = append(virtualServiceList, obj.(*networking_istio_io_v1.VirtualService))
+	}
+	return virtualServiceList
+}
+
+func (s *virtualServiceSet) UnsortedList(filterResource ...func(*networking_istio_io_v1.VirtualService) bool) []*networking_istio_io_v1.VirtualService {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.VirtualService))
+		})
+	}
+
+	var virtualServiceList []*networking_istio_io_v1.VirtualService
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		virtualServiceList = append(virtualServiceList, obj.(*networking_istio_io_v1.VirtualService))
+	}
+	return virtualServiceList
+}
+
+func (s *virtualServiceSet) Map() map[string]*networking_istio_io_v1.VirtualService {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.VirtualService{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.VirtualService)
+	}
+	return newMap
+}
+
+func (s *virtualServiceSet) Insert(
+	virtualServiceList ...*networking_istio_io_v1.VirtualService,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range virtualServiceList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *virtualServiceSet) Has(virtualService ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(virtualService)
+}
+
+func (s *virtualServiceSet) Equal(
+	virtualServiceSet VirtualServiceSet,
+) bool {
+	if s == nil {
+		return virtualServiceSet == nil
+	}
+	return s.Generic().Equal(virtualServiceSet.Generic())
+}
+
+func (s *virtualServiceSet) Delete(VirtualService ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(VirtualService)
+}
+
+func (s *virtualServiceSet) Union(set VirtualServiceSet) VirtualServiceSet {
+	if s == nil {
+		return set
+	}
+	return NewVirtualServiceSet(append(s.List(), set.List()...)...)
+}
+
+func (s *virtualServiceSet) Difference(set VirtualServiceSet) VirtualServiceSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &virtualServiceSet{set: newSet}
+}
+
+func (s *virtualServiceSet) Intersection(set VirtualServiceSet) VirtualServiceSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var virtualServiceList []*networking_istio_io_v1.VirtualService
+	for _, obj := range newSet.List() {
+		virtualServiceList = append(virtualServiceList, obj.(*networking_istio_io_v1.VirtualService))
+	}
+	return NewVirtualServiceSet(virtualServiceList...)
+}
+
+func (s *virtualServiceSet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.VirtualService, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find VirtualService %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.VirtualService{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.VirtualService), nil
+}
+
+func (s *virtualServiceSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *virtualServiceSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *virtualServiceSet) Delta(newSet VirtualServiceSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *virtualServiceSet) Clone() VirtualServiceSet {
+	if s == nil {
+		return nil
+	}
+	return &virtualServiceSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type SidecarSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*networking_istio_io_v1.Sidecar) bool) []*networking_istio_io_v1.Sidecar
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*networking_istio_io_v1.Sidecar) bool) []*networking_istio_io_v1.Sidecar
+	// Return the Set as a map of key to resource.
+	Map() map[string]*networking_istio_io_v1.Sidecar
+	// Insert a resource into the set.
+	Insert(sidecar ...*networking_istio_io_v1.Sidecar)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(sidecarSet SidecarSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(sidecar ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(sidecar ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set SidecarSet) SidecarSet
+	// Return the difference with the provided set
+	Difference(set SidecarSet) SidecarSet
+	// Return the intersection with the provided set
+	Intersection(set SidecarSet) SidecarSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*networking_istio_io_v1.Sidecar, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another SidecarSet
+	Delta(newSet SidecarSet) sksets.ResourceDelta
+	// Create a deep copy of the current SidecarSet
+	Clone() SidecarSet
+}
+
+func makeGenericSidecarSet(sidecarList []*networking_istio_io_v1.Sidecar) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range sidecarList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type sidecarSet struct {
+	set sksets.ResourceSet
+}
+
+func NewSidecarSet(sidecarList ...*networking_istio_io_v1.Sidecar) SidecarSet {
+	return &sidecarSet{set: makeGenericSidecarSet(sidecarList)}
+}
+
+func NewSidecarSetFromList(sidecarList *networking_istio_io_v1.SidecarList) SidecarSet {
+	list := make([]*networking_istio_io_v1.Sidecar, 0, len(sidecarList.Items))
+	for idx := range sidecarList.Items {
+		list = append(list, sidecarList.Items[idx])
+	}
+	return &sidecarSet{set: makeGenericSidecarSet(list)}
+}
+
+func (s *sidecarSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *sidecarSet) List(filterResource ...func(*networking_istio_io_v1.Sidecar) bool) []*networking_istio_io_v1.Sidecar {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.Sidecar))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	sidecarList := make([]*networking_istio_io_v1.Sidecar, 0, len(objs))
+	for _, obj := range objs {
+		sidecarList = append(sidecarList, obj.(*networking_istio_io_v1.Sidecar))
+	}
+	return sidecarList
+}
+
+func (s *sidecarSet) UnsortedList(filterResource ...func(*networking_istio_io_v1.Sidecar) bool) []*networking_istio_io_v1.Sidecar {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*networking_istio_io_v1.Sidecar))
+		})
+	}
+
+	var sidecarList []*networking_istio_io_v1.Sidecar
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		sidecarList = append(sidecarList, obj.(*networking_istio_io_v1.Sidecar))
+	}
+	return sidecarList
+}
+
+func (s *sidecarSet) Map() map[string]*networking_istio_io_v1.Sidecar {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*networking_istio_io_v1.Sidecar{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*networking_istio_io_v1.Sidecar)
+	}
+	return newMap
+}
+
+func (s *sidecarSet) Insert(
+	sidecarList ...*networking_istio_io_v1.Sidecar,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range sidecarList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *sidecarSet) Has(sidecar ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(sidecar)
+}
+
+func (s *sidecarSet) Equal(
+	sidecarSet SidecarSet,
+) bool {
+	if s == nil {
+		return sidecarSet == nil
+	}
+	return s.Generic().Equal(sidecarSet.Generic())
+}
+
+func (s *sidecarSet) Delete(Sidecar ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(Sidecar)
+}
+
+func (s *sidecarSet) Union(set SidecarSet) SidecarSet {
+	if s == nil {
+		return set
+	}
+	return NewSidecarSet(append(s.List(), set.List()...)...)
+}
+
+func (s *sidecarSet) Difference(set SidecarSet) SidecarSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &sidecarSet{set: newSet}
+}
+
+func (s *sidecarSet) Intersection(set SidecarSet) SidecarSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var sidecarList []*networking_istio_io_v1.Sidecar
+	for _, obj := range newSet.List() {
+		sidecarList = append(sidecarList, obj.(*networking_istio_io_v1.Sidecar))
+	}
+	return NewSidecarSet(sidecarList...)
+}
+
+func (s *sidecarSet) Find(id ezkube.ResourceId) (*networking_istio_io_v1.Sidecar, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find Sidecar %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&networking_istio_io_v1.Sidecar{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*networking_istio_io_v1.Sidecar), nil
+}
+
+func (s *sidecarSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *sidecarSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *sidecarSet) Delta(newSet SidecarSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *sidecarSet) Clone() SidecarSet {
+	if s == nil {
+		return nil
+	}
+	return &sidecarSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
diff --git a/pkg/api/istio/networking.istio.io/v1/type_helpers.go b/pkg/api/istio/networking.istio.io/v1/type_helpers.go
new file mode 100644
index 0000000..175b318
--- /dev/null
+++ b/pkg/api/istio/networking.istio.io/v1/type_helpers.go
@@ -0,0 +1,29 @@
+// Code generated by skv2. DO NOT EDIT.
+
+// Definitions for the Kubernetes types
+package v1
+
+import (
+	. "istio.io/client-go/pkg/apis/networking/v1"
+)
+
+// DestinationRuleSlice represents a slice of *DestinationRule
+type DestinationRuleSlice []*DestinationRule
+
+// GatewaySlice represents a slice of *Gateway
+type GatewaySlice []*Gateway
+
+// ServiceEntrySlice represents a slice of *ServiceEntry
+type ServiceEntrySlice []*ServiceEntry
+
+// WorkloadEntrySlice represents a slice of *WorkloadEntry
+type WorkloadEntrySlice []*WorkloadEntry
+
+// WorkloadGroupSlice represents a slice of *WorkloadGroup
+type WorkloadGroupSlice []*WorkloadGroup
+
+// VirtualServiceSlice represents a slice of *VirtualService
+type VirtualServiceSlice []*VirtualService
+
+// SidecarSlice represents a slice of *Sidecar
+type SidecarSlice []*Sidecar
diff --git a/pkg/api/istio/security.istio.io/v1/clients.go b/pkg/api/istio/security.istio.io/v1/clients.go
new file mode 100644
index 0000000..b12df7f
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/clients.go
@@ -0,0 +1,512 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./clients.go -destination mocks/clients.go
+
+package v1
+
+import (
+	"context"
+
+	"github.com/solo-io/skv2/pkg/controllerutils"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	security_istio_io_v1 "istio.io/client-go/pkg/apis/security/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/kubernetes/scheme"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MulticlusterClientset for the security.istio.io/v1 APIs
+type MulticlusterClientset interface {
+	// Cluster returns a Clientset for the given cluster
+	Cluster(cluster string) (Clientset, error)
+}
+
+type multiclusterClientset struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterClientset(client multicluster.Client) MulticlusterClientset {
+	return &multiclusterClientset{client: client}
+}
+
+func (m *multiclusterClientset) Cluster(cluster string) (Clientset, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+// clienset for the security.istio.io/v1 APIs
+type Clientset interface {
+	// clienset for the security.istio.io/v1/v1 APIs
+	AuthorizationPolicies() AuthorizationPolicyClient
+	// clienset for the security.istio.io/v1/v1 APIs
+	PeerAuthentications() PeerAuthenticationClient
+	// clienset for the security.istio.io/v1/v1 APIs
+	RequestAuthentications() RequestAuthenticationClient
+}
+
+type clientSet struct {
+	client client.Client
+}
+
+func NewClientsetFromConfig(cfg *rest.Config) (Clientset, error) {
+	scheme := scheme.Scheme
+	if err := security_istio_io_v1.SchemeBuilder.AddToScheme(scheme); err != nil {
+		return nil, err
+	}
+	client, err := client.New(cfg, client.Options{
+		Scheme: scheme,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+func NewClientset(client client.Client) Clientset {
+	return &clientSet{client: client}
+}
+
+// clienset for the security.istio.io/v1/v1 APIs
+func (c *clientSet) AuthorizationPolicies() AuthorizationPolicyClient {
+	return NewAuthorizationPolicyClient(c.client)
+}
+
+// clienset for the security.istio.io/v1/v1 APIs
+func (c *clientSet) PeerAuthentications() PeerAuthenticationClient {
+	return NewPeerAuthenticationClient(c.client)
+}
+
+// clienset for the security.istio.io/v1/v1 APIs
+func (c *clientSet) RequestAuthentications() RequestAuthenticationClient {
+	return NewRequestAuthenticationClient(c.client)
+}
+
+// Reader knows how to read and list AuthorizationPolicys.
+type AuthorizationPolicyReader interface {
+	// Get retrieves a AuthorizationPolicy for the given object key
+	GetAuthorizationPolicy(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.AuthorizationPolicy, error)
+
+	// List retrieves list of AuthorizationPolicys for a given namespace and list options.
+	ListAuthorizationPolicy(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.AuthorizationPolicyList, error)
+}
+
+// AuthorizationPolicyTransitionFunction instructs the AuthorizationPolicyWriter how to transition between an existing
+// AuthorizationPolicy object and a desired on an Upsert
+type AuthorizationPolicyTransitionFunction func(existing, desired *security_istio_io_v1.AuthorizationPolicy) error
+
+// Writer knows how to create, delete, and update AuthorizationPolicys.
+type AuthorizationPolicyWriter interface {
+	// Create saves the AuthorizationPolicy object.
+	CreateAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.CreateOption) error
+
+	// Delete deletes the AuthorizationPolicy object.
+	DeleteAuthorizationPolicy(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given AuthorizationPolicy object.
+	UpdateAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.UpdateOption) error
+
+	// Patch patches the given AuthorizationPolicy object.
+	PatchAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all AuthorizationPolicy objects matching the given options.
+	DeleteAllOfAuthorizationPolicy(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the AuthorizationPolicy object.
+	UpsertAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, transitionFuncs ...AuthorizationPolicyTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a AuthorizationPolicy object.
+type AuthorizationPolicyStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given AuthorizationPolicy object.
+	UpdateAuthorizationPolicyStatus(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given AuthorizationPolicy object's subresource.
+	PatchAuthorizationPolicyStatus(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on AuthorizationPolicys.
+type AuthorizationPolicyClient interface {
+	AuthorizationPolicyReader
+	AuthorizationPolicyWriter
+	AuthorizationPolicyStatusWriter
+}
+
+type authorizationPolicyClient struct {
+	client client.Client
+}
+
+func NewAuthorizationPolicyClient(client client.Client) *authorizationPolicyClient {
+	return &authorizationPolicyClient{client: client}
+}
+
+func (c *authorizationPolicyClient) GetAuthorizationPolicy(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.AuthorizationPolicy, error) {
+	obj := &security_istio_io_v1.AuthorizationPolicy{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *authorizationPolicyClient) ListAuthorizationPolicy(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.AuthorizationPolicyList, error) {
+	list := &security_istio_io_v1.AuthorizationPolicyList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *authorizationPolicyClient) CreateAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *authorizationPolicyClient) DeleteAuthorizationPolicy(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &security_istio_io_v1.AuthorizationPolicy{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *authorizationPolicyClient) UpdateAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *authorizationPolicyClient) PatchAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *authorizationPolicyClient) DeleteAllOfAuthorizationPolicy(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &security_istio_io_v1.AuthorizationPolicy{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *authorizationPolicyClient) UpsertAuthorizationPolicy(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, transitionFuncs ...AuthorizationPolicyTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*security_istio_io_v1.AuthorizationPolicy), desired.(*security_istio_io_v1.AuthorizationPolicy)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *authorizationPolicyClient) UpdateAuthorizationPolicyStatus(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *authorizationPolicyClient) PatchAuthorizationPolicyStatus(ctx context.Context, obj *security_istio_io_v1.AuthorizationPolicy, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides AuthorizationPolicyClients for multiple clusters.
+type MulticlusterAuthorizationPolicyClient interface {
+	// Cluster returns a AuthorizationPolicyClient for the given cluster
+	Cluster(cluster string) (AuthorizationPolicyClient, error)
+}
+
+type multiclusterAuthorizationPolicyClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterAuthorizationPolicyClient(client multicluster.Client) MulticlusterAuthorizationPolicyClient {
+	return &multiclusterAuthorizationPolicyClient{client: client}
+}
+
+func (m *multiclusterAuthorizationPolicyClient) Cluster(cluster string) (AuthorizationPolicyClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewAuthorizationPolicyClient(client), nil
+}
+
+// Reader knows how to read and list PeerAuthentications.
+type PeerAuthenticationReader interface {
+	// Get retrieves a PeerAuthentication for the given object key
+	GetPeerAuthentication(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.PeerAuthentication, error)
+
+	// List retrieves list of PeerAuthentications for a given namespace and list options.
+	ListPeerAuthentication(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.PeerAuthenticationList, error)
+}
+
+// PeerAuthenticationTransitionFunction instructs the PeerAuthenticationWriter how to transition between an existing
+// PeerAuthentication object and a desired on an Upsert
+type PeerAuthenticationTransitionFunction func(existing, desired *security_istio_io_v1.PeerAuthentication) error
+
+// Writer knows how to create, delete, and update PeerAuthentications.
+type PeerAuthenticationWriter interface {
+	// Create saves the PeerAuthentication object.
+	CreatePeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.CreateOption) error
+
+	// Delete deletes the PeerAuthentication object.
+	DeletePeerAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given PeerAuthentication object.
+	UpdatePeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.UpdateOption) error
+
+	// Patch patches the given PeerAuthentication object.
+	PatchPeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all PeerAuthentication objects matching the given options.
+	DeleteAllOfPeerAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the PeerAuthentication object.
+	UpsertPeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, transitionFuncs ...PeerAuthenticationTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a PeerAuthentication object.
+type PeerAuthenticationStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given PeerAuthentication object.
+	UpdatePeerAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given PeerAuthentication object's subresource.
+	PatchPeerAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on PeerAuthentications.
+type PeerAuthenticationClient interface {
+	PeerAuthenticationReader
+	PeerAuthenticationWriter
+	PeerAuthenticationStatusWriter
+}
+
+type peerAuthenticationClient struct {
+	client client.Client
+}
+
+func NewPeerAuthenticationClient(client client.Client) *peerAuthenticationClient {
+	return &peerAuthenticationClient{client: client}
+}
+
+func (c *peerAuthenticationClient) GetPeerAuthentication(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.PeerAuthentication, error) {
+	obj := &security_istio_io_v1.PeerAuthentication{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *peerAuthenticationClient) ListPeerAuthentication(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.PeerAuthenticationList, error) {
+	list := &security_istio_io_v1.PeerAuthenticationList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *peerAuthenticationClient) CreatePeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *peerAuthenticationClient) DeletePeerAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &security_istio_io_v1.PeerAuthentication{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *peerAuthenticationClient) UpdatePeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *peerAuthenticationClient) PatchPeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *peerAuthenticationClient) DeleteAllOfPeerAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &security_istio_io_v1.PeerAuthentication{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *peerAuthenticationClient) UpsertPeerAuthentication(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, transitionFuncs ...PeerAuthenticationTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*security_istio_io_v1.PeerAuthentication), desired.(*security_istio_io_v1.PeerAuthentication)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *peerAuthenticationClient) UpdatePeerAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *peerAuthenticationClient) PatchPeerAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.PeerAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides PeerAuthenticationClients for multiple clusters.
+type MulticlusterPeerAuthenticationClient interface {
+	// Cluster returns a PeerAuthenticationClient for the given cluster
+	Cluster(cluster string) (PeerAuthenticationClient, error)
+}
+
+type multiclusterPeerAuthenticationClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterPeerAuthenticationClient(client multicluster.Client) MulticlusterPeerAuthenticationClient {
+	return &multiclusterPeerAuthenticationClient{client: client}
+}
+
+func (m *multiclusterPeerAuthenticationClient) Cluster(cluster string) (PeerAuthenticationClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewPeerAuthenticationClient(client), nil
+}
+
+// Reader knows how to read and list RequestAuthentications.
+type RequestAuthenticationReader interface {
+	// Get retrieves a RequestAuthentication for the given object key
+	GetRequestAuthentication(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.RequestAuthentication, error)
+
+	// List retrieves list of RequestAuthentications for a given namespace and list options.
+	ListRequestAuthentication(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.RequestAuthenticationList, error)
+}
+
+// RequestAuthenticationTransitionFunction instructs the RequestAuthenticationWriter how to transition between an existing
+// RequestAuthentication object and a desired on an Upsert
+type RequestAuthenticationTransitionFunction func(existing, desired *security_istio_io_v1.RequestAuthentication) error
+
+// Writer knows how to create, delete, and update RequestAuthentications.
+type RequestAuthenticationWriter interface {
+	// Create saves the RequestAuthentication object.
+	CreateRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.CreateOption) error
+
+	// Delete deletes the RequestAuthentication object.
+	DeleteRequestAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given RequestAuthentication object.
+	UpdateRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.UpdateOption) error
+
+	// Patch patches the given RequestAuthentication object.
+	PatchRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all RequestAuthentication objects matching the given options.
+	DeleteAllOfRequestAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the RequestAuthentication object.
+	UpsertRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, transitionFuncs ...RequestAuthenticationTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a RequestAuthentication object.
+type RequestAuthenticationStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given RequestAuthentication object.
+	UpdateRequestAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given RequestAuthentication object's subresource.
+	PatchRequestAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on RequestAuthentications.
+type RequestAuthenticationClient interface {
+	RequestAuthenticationReader
+	RequestAuthenticationWriter
+	RequestAuthenticationStatusWriter
+}
+
+type requestAuthenticationClient struct {
+	client client.Client
+}
+
+func NewRequestAuthenticationClient(client client.Client) *requestAuthenticationClient {
+	return &requestAuthenticationClient{client: client}
+}
+
+func (c *requestAuthenticationClient) GetRequestAuthentication(ctx context.Context, key client.ObjectKey) (*security_istio_io_v1.RequestAuthentication, error) {
+	obj := &security_istio_io_v1.RequestAuthentication{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *requestAuthenticationClient) ListRequestAuthentication(ctx context.Context, opts ...client.ListOption) (*security_istio_io_v1.RequestAuthenticationList, error) {
+	list := &security_istio_io_v1.RequestAuthenticationList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *requestAuthenticationClient) CreateRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *requestAuthenticationClient) DeleteRequestAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &security_istio_io_v1.RequestAuthentication{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *requestAuthenticationClient) UpdateRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *requestAuthenticationClient) PatchRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *requestAuthenticationClient) DeleteAllOfRequestAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &security_istio_io_v1.RequestAuthentication{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *requestAuthenticationClient) UpsertRequestAuthentication(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, transitionFuncs ...RequestAuthenticationTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*security_istio_io_v1.RequestAuthentication), desired.(*security_istio_io_v1.RequestAuthentication)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *requestAuthenticationClient) UpdateRequestAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *requestAuthenticationClient) PatchRequestAuthenticationStatus(ctx context.Context, obj *security_istio_io_v1.RequestAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides RequestAuthenticationClients for multiple clusters.
+type MulticlusterRequestAuthenticationClient interface {
+	// Cluster returns a RequestAuthenticationClient for the given cluster
+	Cluster(cluster string) (RequestAuthenticationClient, error)
+}
+
+type multiclusterRequestAuthenticationClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterRequestAuthenticationClient(client multicluster.Client) MulticlusterRequestAuthenticationClient {
+	return &multiclusterRequestAuthenticationClient{client: client}
+}
+
+func (m *multiclusterRequestAuthenticationClient) Cluster(cluster string) (RequestAuthenticationClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewRequestAuthenticationClient(client), nil
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/event_handlers.go b/pkg/api/istio/security.istio.io/v1/controller/event_handlers.go
new file mode 100644
index 0000000..c50567b
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/event_handlers.go
@@ -0,0 +1,339 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./event_handlers.go -destination mocks/event_handlers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	security_istio_io_v1 "istio.io/client-go/pkg/apis/security/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/events"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Handle events for the AuthorizationPolicy Resource
+// DEPRECATED: Prefer reconciler pattern.
+type AuthorizationPolicyEventHandler interface {
+	CreateAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error
+	UpdateAuthorizationPolicy(old, new *security_istio_io_v1.AuthorizationPolicy) error
+	DeleteAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error
+	GenericAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error
+}
+
+type AuthorizationPolicyEventHandlerFuncs struct {
+	OnCreate  func(obj *security_istio_io_v1.AuthorizationPolicy) error
+	OnUpdate  func(old, new *security_istio_io_v1.AuthorizationPolicy) error
+	OnDelete  func(obj *security_istio_io_v1.AuthorizationPolicy) error
+	OnGeneric func(obj *security_istio_io_v1.AuthorizationPolicy) error
+}
+
+func (f *AuthorizationPolicyEventHandlerFuncs) CreateAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *AuthorizationPolicyEventHandlerFuncs) DeleteAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *AuthorizationPolicyEventHandlerFuncs) UpdateAuthorizationPolicy(objOld, objNew *security_istio_io_v1.AuthorizationPolicy) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *AuthorizationPolicyEventHandlerFuncs) GenericAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type AuthorizationPolicyEventWatcher interface {
+	AddEventHandler(ctx context.Context, h AuthorizationPolicyEventHandler, predicates ...predicate.Predicate) error
+}
+
+type authorizationPolicyEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewAuthorizationPolicyEventWatcher(name string, mgr manager.Manager) AuthorizationPolicyEventWatcher {
+	return &authorizationPolicyEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &security_istio_io_v1.AuthorizationPolicy{}),
+	}
+}
+
+func (c *authorizationPolicyEventWatcher) AddEventHandler(ctx context.Context, h AuthorizationPolicyEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericAuthorizationPolicyHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericAuthorizationPolicyHandler implements a generic events.EventHandler
+type genericAuthorizationPolicyHandler struct {
+	handler AuthorizationPolicyEventHandler
+}
+
+func (h genericAuthorizationPolicyHandler) Create(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return h.handler.CreateAuthorizationPolicy(obj)
+}
+
+func (h genericAuthorizationPolicyHandler) Delete(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return h.handler.DeleteAuthorizationPolicy(obj)
+}
+
+func (h genericAuthorizationPolicyHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", old)
+	}
+	objNew, ok := new.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", new)
+	}
+	return h.handler.UpdateAuthorizationPolicy(objOld, objNew)
+}
+
+func (h genericAuthorizationPolicyHandler) Generic(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return h.handler.GenericAuthorizationPolicy(obj)
+}
+
+// Handle events for the PeerAuthentication Resource
+// DEPRECATED: Prefer reconciler pattern.
+type PeerAuthenticationEventHandler interface {
+	CreatePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error
+	UpdatePeerAuthentication(old, new *security_istio_io_v1.PeerAuthentication) error
+	DeletePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error
+	GenericPeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error
+}
+
+type PeerAuthenticationEventHandlerFuncs struct {
+	OnCreate  func(obj *security_istio_io_v1.PeerAuthentication) error
+	OnUpdate  func(old, new *security_istio_io_v1.PeerAuthentication) error
+	OnDelete  func(obj *security_istio_io_v1.PeerAuthentication) error
+	OnGeneric func(obj *security_istio_io_v1.PeerAuthentication) error
+}
+
+func (f *PeerAuthenticationEventHandlerFuncs) CreatePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *PeerAuthenticationEventHandlerFuncs) DeletePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *PeerAuthenticationEventHandlerFuncs) UpdatePeerAuthentication(objOld, objNew *security_istio_io_v1.PeerAuthentication) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *PeerAuthenticationEventHandlerFuncs) GenericPeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type PeerAuthenticationEventWatcher interface {
+	AddEventHandler(ctx context.Context, h PeerAuthenticationEventHandler, predicates ...predicate.Predicate) error
+}
+
+type peerAuthenticationEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewPeerAuthenticationEventWatcher(name string, mgr manager.Manager) PeerAuthenticationEventWatcher {
+	return &peerAuthenticationEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &security_istio_io_v1.PeerAuthentication{}),
+	}
+}
+
+func (c *peerAuthenticationEventWatcher) AddEventHandler(ctx context.Context, h PeerAuthenticationEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericPeerAuthenticationHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericPeerAuthenticationHandler implements a generic events.EventHandler
+type genericPeerAuthenticationHandler struct {
+	handler PeerAuthenticationEventHandler
+}
+
+func (h genericPeerAuthenticationHandler) Create(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return h.handler.CreatePeerAuthentication(obj)
+}
+
+func (h genericPeerAuthenticationHandler) Delete(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return h.handler.DeletePeerAuthentication(obj)
+}
+
+func (h genericPeerAuthenticationHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", old)
+	}
+	objNew, ok := new.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", new)
+	}
+	return h.handler.UpdatePeerAuthentication(objOld, objNew)
+}
+
+func (h genericPeerAuthenticationHandler) Generic(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return h.handler.GenericPeerAuthentication(obj)
+}
+
+// Handle events for the RequestAuthentication Resource
+// DEPRECATED: Prefer reconciler pattern.
+type RequestAuthenticationEventHandler interface {
+	CreateRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error
+	UpdateRequestAuthentication(old, new *security_istio_io_v1.RequestAuthentication) error
+	DeleteRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error
+	GenericRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error
+}
+
+type RequestAuthenticationEventHandlerFuncs struct {
+	OnCreate  func(obj *security_istio_io_v1.RequestAuthentication) error
+	OnUpdate  func(old, new *security_istio_io_v1.RequestAuthentication) error
+	OnDelete  func(obj *security_istio_io_v1.RequestAuthentication) error
+	OnGeneric func(obj *security_istio_io_v1.RequestAuthentication) error
+}
+
+func (f *RequestAuthenticationEventHandlerFuncs) CreateRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *RequestAuthenticationEventHandlerFuncs) DeleteRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *RequestAuthenticationEventHandlerFuncs) UpdateRequestAuthentication(objOld, objNew *security_istio_io_v1.RequestAuthentication) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *RequestAuthenticationEventHandlerFuncs) GenericRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type RequestAuthenticationEventWatcher interface {
+	AddEventHandler(ctx context.Context, h RequestAuthenticationEventHandler, predicates ...predicate.Predicate) error
+}
+
+type requestAuthenticationEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewRequestAuthenticationEventWatcher(name string, mgr manager.Manager) RequestAuthenticationEventWatcher {
+	return &requestAuthenticationEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &security_istio_io_v1.RequestAuthentication{}),
+	}
+}
+
+func (c *requestAuthenticationEventWatcher) AddEventHandler(ctx context.Context, h RequestAuthenticationEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericRequestAuthenticationHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericRequestAuthenticationHandler implements a generic events.EventHandler
+type genericRequestAuthenticationHandler struct {
+	handler RequestAuthenticationEventHandler
+}
+
+func (h genericRequestAuthenticationHandler) Create(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return h.handler.CreateRequestAuthentication(obj)
+}
+
+func (h genericRequestAuthenticationHandler) Delete(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return h.handler.DeleteRequestAuthentication(obj)
+}
+
+func (h genericRequestAuthenticationHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", old)
+	}
+	objNew, ok := new.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", new)
+	}
+	return h.handler.UpdateRequestAuthentication(objOld, objNew)
+}
+
+func (h genericRequestAuthenticationHandler) Generic(object client.Object) error {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return h.handler.GenericRequestAuthentication(obj)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/mocks/event_handlers.go b/pkg/api/istio/security.istio.io/v1/controller/mocks/event_handlers.go
new file mode 100644
index 0000000..22cd23d
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/mocks/event_handlers.go
@@ -0,0 +1,378 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./event_handlers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1/controller"
+	v1 "istio.io/client-go/pkg/apis/security/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockAuthorizationPolicyEventHandler is a mock of AuthorizationPolicyEventHandler interface.
+type MockAuthorizationPolicyEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyEventHandlerMockRecorder
+}
+
+// MockAuthorizationPolicyEventHandlerMockRecorder is the mock recorder for MockAuthorizationPolicyEventHandler.
+type MockAuthorizationPolicyEventHandlerMockRecorder struct {
+	mock *MockAuthorizationPolicyEventHandler
+}
+
+// NewMockAuthorizationPolicyEventHandler creates a new mock instance.
+func NewMockAuthorizationPolicyEventHandler(ctrl *gomock.Controller) *MockAuthorizationPolicyEventHandler {
+	mock := &MockAuthorizationPolicyEventHandler{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyEventHandler) EXPECT() *MockAuthorizationPolicyEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyEventHandler) CreateAuthorizationPolicy(obj *v1.AuthorizationPolicy) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateAuthorizationPolicy indicates an expected call of CreateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyEventHandlerMockRecorder) CreateAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyEventHandler)(nil).CreateAuthorizationPolicy), obj)
+}
+
+// DeleteAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyEventHandler) DeleteAuthorizationPolicy(obj *v1.AuthorizationPolicy) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAuthorizationPolicy indicates an expected call of DeleteAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyEventHandlerMockRecorder) DeleteAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyEventHandler)(nil).DeleteAuthorizationPolicy), obj)
+}
+
+// GenericAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyEventHandler) GenericAuthorizationPolicy(obj *v1.AuthorizationPolicy) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericAuthorizationPolicy indicates an expected call of GenericAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyEventHandlerMockRecorder) GenericAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyEventHandler)(nil).GenericAuthorizationPolicy), obj)
+}
+
+// UpdateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyEventHandler) UpdateAuthorizationPolicy(old, new *v1.AuthorizationPolicy) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateAuthorizationPolicy", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateAuthorizationPolicy indicates an expected call of UpdateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyEventHandlerMockRecorder) UpdateAuthorizationPolicy(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyEventHandler)(nil).UpdateAuthorizationPolicy), old, new)
+}
+
+// MockAuthorizationPolicyEventWatcher is a mock of AuthorizationPolicyEventWatcher interface.
+type MockAuthorizationPolicyEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyEventWatcherMockRecorder
+}
+
+// MockAuthorizationPolicyEventWatcherMockRecorder is the mock recorder for MockAuthorizationPolicyEventWatcher.
+type MockAuthorizationPolicyEventWatcherMockRecorder struct {
+	mock *MockAuthorizationPolicyEventWatcher
+}
+
+// NewMockAuthorizationPolicyEventWatcher creates a new mock instance.
+func NewMockAuthorizationPolicyEventWatcher(ctrl *gomock.Controller) *MockAuthorizationPolicyEventWatcher {
+	mock := &MockAuthorizationPolicyEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyEventWatcher) EXPECT() *MockAuthorizationPolicyEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockAuthorizationPolicyEventWatcher) AddEventHandler(ctx context.Context, h controller.AuthorizationPolicyEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockAuthorizationPolicyEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockAuthorizationPolicyEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockPeerAuthenticationEventHandler is a mock of PeerAuthenticationEventHandler interface.
+type MockPeerAuthenticationEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationEventHandlerMockRecorder
+}
+
+// MockPeerAuthenticationEventHandlerMockRecorder is the mock recorder for MockPeerAuthenticationEventHandler.
+type MockPeerAuthenticationEventHandlerMockRecorder struct {
+	mock *MockPeerAuthenticationEventHandler
+}
+
+// NewMockPeerAuthenticationEventHandler creates a new mock instance.
+func NewMockPeerAuthenticationEventHandler(ctrl *gomock.Controller) *MockPeerAuthenticationEventHandler {
+	mock := &MockPeerAuthenticationEventHandler{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationEventHandler) EXPECT() *MockPeerAuthenticationEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationEventHandler) CreatePeerAuthentication(obj *v1.PeerAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreatePeerAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreatePeerAuthentication indicates an expected call of CreatePeerAuthentication.
+func (mr *MockPeerAuthenticationEventHandlerMockRecorder) CreatePeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationEventHandler)(nil).CreatePeerAuthentication), obj)
+}
+
+// DeletePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationEventHandler) DeletePeerAuthentication(obj *v1.PeerAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeletePeerAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeletePeerAuthentication indicates an expected call of DeletePeerAuthentication.
+func (mr *MockPeerAuthenticationEventHandlerMockRecorder) DeletePeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationEventHandler)(nil).DeletePeerAuthentication), obj)
+}
+
+// GenericPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationEventHandler) GenericPeerAuthentication(obj *v1.PeerAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericPeerAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericPeerAuthentication indicates an expected call of GenericPeerAuthentication.
+func (mr *MockPeerAuthenticationEventHandlerMockRecorder) GenericPeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationEventHandler)(nil).GenericPeerAuthentication), obj)
+}
+
+// UpdatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationEventHandler) UpdatePeerAuthentication(old, new *v1.PeerAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdatePeerAuthentication", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdatePeerAuthentication indicates an expected call of UpdatePeerAuthentication.
+func (mr *MockPeerAuthenticationEventHandlerMockRecorder) UpdatePeerAuthentication(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationEventHandler)(nil).UpdatePeerAuthentication), old, new)
+}
+
+// MockPeerAuthenticationEventWatcher is a mock of PeerAuthenticationEventWatcher interface.
+type MockPeerAuthenticationEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationEventWatcherMockRecorder
+}
+
+// MockPeerAuthenticationEventWatcherMockRecorder is the mock recorder for MockPeerAuthenticationEventWatcher.
+type MockPeerAuthenticationEventWatcherMockRecorder struct {
+	mock *MockPeerAuthenticationEventWatcher
+}
+
+// NewMockPeerAuthenticationEventWatcher creates a new mock instance.
+func NewMockPeerAuthenticationEventWatcher(ctrl *gomock.Controller) *MockPeerAuthenticationEventWatcher {
+	mock := &MockPeerAuthenticationEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationEventWatcher) EXPECT() *MockPeerAuthenticationEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockPeerAuthenticationEventWatcher) AddEventHandler(ctx context.Context, h controller.PeerAuthenticationEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockPeerAuthenticationEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockPeerAuthenticationEventWatcher)(nil).AddEventHandler), varargs...)
+}
+
+// MockRequestAuthenticationEventHandler is a mock of RequestAuthenticationEventHandler interface.
+type MockRequestAuthenticationEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationEventHandlerMockRecorder
+}
+
+// MockRequestAuthenticationEventHandlerMockRecorder is the mock recorder for MockRequestAuthenticationEventHandler.
+type MockRequestAuthenticationEventHandlerMockRecorder struct {
+	mock *MockRequestAuthenticationEventHandler
+}
+
+// NewMockRequestAuthenticationEventHandler creates a new mock instance.
+func NewMockRequestAuthenticationEventHandler(ctrl *gomock.Controller) *MockRequestAuthenticationEventHandler {
+	mock := &MockRequestAuthenticationEventHandler{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationEventHandler) EXPECT() *MockRequestAuthenticationEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationEventHandler) CreateRequestAuthentication(obj *v1.RequestAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateRequestAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateRequestAuthentication indicates an expected call of CreateRequestAuthentication.
+func (mr *MockRequestAuthenticationEventHandlerMockRecorder) CreateRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationEventHandler)(nil).CreateRequestAuthentication), obj)
+}
+
+// DeleteRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationEventHandler) DeleteRequestAuthentication(obj *v1.RequestAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteRequestAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteRequestAuthentication indicates an expected call of DeleteRequestAuthentication.
+func (mr *MockRequestAuthenticationEventHandlerMockRecorder) DeleteRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationEventHandler)(nil).DeleteRequestAuthentication), obj)
+}
+
+// GenericRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationEventHandler) GenericRequestAuthentication(obj *v1.RequestAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericRequestAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericRequestAuthentication indicates an expected call of GenericRequestAuthentication.
+func (mr *MockRequestAuthenticationEventHandlerMockRecorder) GenericRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationEventHandler)(nil).GenericRequestAuthentication), obj)
+}
+
+// UpdateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationEventHandler) UpdateRequestAuthentication(old, new *v1.RequestAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateRequestAuthentication", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateRequestAuthentication indicates an expected call of UpdateRequestAuthentication.
+func (mr *MockRequestAuthenticationEventHandlerMockRecorder) UpdateRequestAuthentication(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationEventHandler)(nil).UpdateRequestAuthentication), old, new)
+}
+
+// MockRequestAuthenticationEventWatcher is a mock of RequestAuthenticationEventWatcher interface.
+type MockRequestAuthenticationEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationEventWatcherMockRecorder
+}
+
+// MockRequestAuthenticationEventWatcherMockRecorder is the mock recorder for MockRequestAuthenticationEventWatcher.
+type MockRequestAuthenticationEventWatcherMockRecorder struct {
+	mock *MockRequestAuthenticationEventWatcher
+}
+
+// NewMockRequestAuthenticationEventWatcher creates a new mock instance.
+func NewMockRequestAuthenticationEventWatcher(ctrl *gomock.Controller) *MockRequestAuthenticationEventWatcher {
+	mock := &MockRequestAuthenticationEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationEventWatcher) EXPECT() *MockRequestAuthenticationEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockRequestAuthenticationEventWatcher) AddEventHandler(ctx context.Context, h controller.RequestAuthenticationEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockRequestAuthenticationEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockRequestAuthenticationEventWatcher)(nil).AddEventHandler), varargs...)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/mocks/multicluster_reconcilers.go b/pkg/api/istio/security.istio.io/v1/controller/mocks/multicluster_reconcilers.go
new file mode 100644
index 0000000..efc5149
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/mocks/multicluster_reconcilers.go
@@ -0,0 +1,361 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./multicluster_reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/security/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockMulticlusterAuthorizationPolicyReconciler is a mock of MulticlusterAuthorizationPolicyReconciler interface.
+type MockMulticlusterAuthorizationPolicyReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterAuthorizationPolicyReconcilerMockRecorder
+}
+
+// MockMulticlusterAuthorizationPolicyReconcilerMockRecorder is the mock recorder for MockMulticlusterAuthorizationPolicyReconciler.
+type MockMulticlusterAuthorizationPolicyReconcilerMockRecorder struct {
+	mock *MockMulticlusterAuthorizationPolicyReconciler
+}
+
+// NewMockMulticlusterAuthorizationPolicyReconciler creates a new mock instance.
+func NewMockMulticlusterAuthorizationPolicyReconciler(ctrl *gomock.Controller) *MockMulticlusterAuthorizationPolicyReconciler {
+	mock := &MockMulticlusterAuthorizationPolicyReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterAuthorizationPolicyReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterAuthorizationPolicyReconciler) EXPECT() *MockMulticlusterAuthorizationPolicyReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileAuthorizationPolicy mocks base method.
+func (m *MockMulticlusterAuthorizationPolicyReconciler) ReconcileAuthorizationPolicy(clusterName string, obj *v1.AuthorizationPolicy) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileAuthorizationPolicy", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileAuthorizationPolicy indicates an expected call of ReconcileAuthorizationPolicy.
+func (mr *MockMulticlusterAuthorizationPolicyReconcilerMockRecorder) ReconcileAuthorizationPolicy(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileAuthorizationPolicy", reflect.TypeOf((*MockMulticlusterAuthorizationPolicyReconciler)(nil).ReconcileAuthorizationPolicy), clusterName, obj)
+}
+
+// MockMulticlusterAuthorizationPolicyDeletionReconciler is a mock of MulticlusterAuthorizationPolicyDeletionReconciler interface.
+type MockMulticlusterAuthorizationPolicyDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterAuthorizationPolicyDeletionReconciler.
+type MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterAuthorizationPolicyDeletionReconciler
+}
+
+// NewMockMulticlusterAuthorizationPolicyDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterAuthorizationPolicyDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterAuthorizationPolicyDeletionReconciler {
+	mock := &MockMulticlusterAuthorizationPolicyDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterAuthorizationPolicyDeletionReconciler) EXPECT() *MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileAuthorizationPolicyDeletion mocks base method.
+func (m *MockMulticlusterAuthorizationPolicyDeletionReconciler) ReconcileAuthorizationPolicyDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileAuthorizationPolicyDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileAuthorizationPolicyDeletion indicates an expected call of ReconcileAuthorizationPolicyDeletion.
+func (mr *MockMulticlusterAuthorizationPolicyDeletionReconcilerMockRecorder) ReconcileAuthorizationPolicyDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileAuthorizationPolicyDeletion", reflect.TypeOf((*MockMulticlusterAuthorizationPolicyDeletionReconciler)(nil).ReconcileAuthorizationPolicyDeletion), clusterName, req)
+}
+
+// MockMulticlusterAuthorizationPolicyReconcileLoop is a mock of MulticlusterAuthorizationPolicyReconcileLoop interface.
+type MockMulticlusterAuthorizationPolicyReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder
+}
+
+// MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder is the mock recorder for MockMulticlusterAuthorizationPolicyReconcileLoop.
+type MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterAuthorizationPolicyReconcileLoop
+}
+
+// NewMockMulticlusterAuthorizationPolicyReconcileLoop creates a new mock instance.
+func NewMockMulticlusterAuthorizationPolicyReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterAuthorizationPolicyReconcileLoop {
+	mock := &MockMulticlusterAuthorizationPolicyReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterAuthorizationPolicyReconcileLoop) EXPECT() *MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterAuthorizationPolicyReconciler mocks base method.
+func (m *MockMulticlusterAuthorizationPolicyReconcileLoop) AddMulticlusterAuthorizationPolicyReconciler(ctx context.Context, rec controller.MulticlusterAuthorizationPolicyReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterAuthorizationPolicyReconciler", varargs...)
+}
+
+// AddMulticlusterAuthorizationPolicyReconciler indicates an expected call of AddMulticlusterAuthorizationPolicyReconciler.
+func (mr *MockMulticlusterAuthorizationPolicyReconcileLoopMockRecorder) AddMulticlusterAuthorizationPolicyReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterAuthorizationPolicyReconciler", reflect.TypeOf((*MockMulticlusterAuthorizationPolicyReconcileLoop)(nil).AddMulticlusterAuthorizationPolicyReconciler), varargs...)
+}
+
+// MockMulticlusterPeerAuthenticationReconciler is a mock of MulticlusterPeerAuthenticationReconciler interface.
+type MockMulticlusterPeerAuthenticationReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterPeerAuthenticationReconcilerMockRecorder
+}
+
+// MockMulticlusterPeerAuthenticationReconcilerMockRecorder is the mock recorder for MockMulticlusterPeerAuthenticationReconciler.
+type MockMulticlusterPeerAuthenticationReconcilerMockRecorder struct {
+	mock *MockMulticlusterPeerAuthenticationReconciler
+}
+
+// NewMockMulticlusterPeerAuthenticationReconciler creates a new mock instance.
+func NewMockMulticlusterPeerAuthenticationReconciler(ctrl *gomock.Controller) *MockMulticlusterPeerAuthenticationReconciler {
+	mock := &MockMulticlusterPeerAuthenticationReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterPeerAuthenticationReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterPeerAuthenticationReconciler) EXPECT() *MockMulticlusterPeerAuthenticationReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcilePeerAuthentication mocks base method.
+func (m *MockMulticlusterPeerAuthenticationReconciler) ReconcilePeerAuthentication(clusterName string, obj *v1.PeerAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcilePeerAuthentication", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcilePeerAuthentication indicates an expected call of ReconcilePeerAuthentication.
+func (mr *MockMulticlusterPeerAuthenticationReconcilerMockRecorder) ReconcilePeerAuthentication(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcilePeerAuthentication", reflect.TypeOf((*MockMulticlusterPeerAuthenticationReconciler)(nil).ReconcilePeerAuthentication), clusterName, obj)
+}
+
+// MockMulticlusterPeerAuthenticationDeletionReconciler is a mock of MulticlusterPeerAuthenticationDeletionReconciler interface.
+type MockMulticlusterPeerAuthenticationDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterPeerAuthenticationDeletionReconciler.
+type MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterPeerAuthenticationDeletionReconciler
+}
+
+// NewMockMulticlusterPeerAuthenticationDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterPeerAuthenticationDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterPeerAuthenticationDeletionReconciler {
+	mock := &MockMulticlusterPeerAuthenticationDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterPeerAuthenticationDeletionReconciler) EXPECT() *MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcilePeerAuthenticationDeletion mocks base method.
+func (m *MockMulticlusterPeerAuthenticationDeletionReconciler) ReconcilePeerAuthenticationDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcilePeerAuthenticationDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcilePeerAuthenticationDeletion indicates an expected call of ReconcilePeerAuthenticationDeletion.
+func (mr *MockMulticlusterPeerAuthenticationDeletionReconcilerMockRecorder) ReconcilePeerAuthenticationDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcilePeerAuthenticationDeletion", reflect.TypeOf((*MockMulticlusterPeerAuthenticationDeletionReconciler)(nil).ReconcilePeerAuthenticationDeletion), clusterName, req)
+}
+
+// MockMulticlusterPeerAuthenticationReconcileLoop is a mock of MulticlusterPeerAuthenticationReconcileLoop interface.
+type MockMulticlusterPeerAuthenticationReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder
+}
+
+// MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder is the mock recorder for MockMulticlusterPeerAuthenticationReconcileLoop.
+type MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterPeerAuthenticationReconcileLoop
+}
+
+// NewMockMulticlusterPeerAuthenticationReconcileLoop creates a new mock instance.
+func NewMockMulticlusterPeerAuthenticationReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterPeerAuthenticationReconcileLoop {
+	mock := &MockMulticlusterPeerAuthenticationReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterPeerAuthenticationReconcileLoop) EXPECT() *MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterPeerAuthenticationReconciler mocks base method.
+func (m *MockMulticlusterPeerAuthenticationReconcileLoop) AddMulticlusterPeerAuthenticationReconciler(ctx context.Context, rec controller.MulticlusterPeerAuthenticationReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterPeerAuthenticationReconciler", varargs...)
+}
+
+// AddMulticlusterPeerAuthenticationReconciler indicates an expected call of AddMulticlusterPeerAuthenticationReconciler.
+func (mr *MockMulticlusterPeerAuthenticationReconcileLoopMockRecorder) AddMulticlusterPeerAuthenticationReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterPeerAuthenticationReconciler", reflect.TypeOf((*MockMulticlusterPeerAuthenticationReconcileLoop)(nil).AddMulticlusterPeerAuthenticationReconciler), varargs...)
+}
+
+// MockMulticlusterRequestAuthenticationReconciler is a mock of MulticlusterRequestAuthenticationReconciler interface.
+type MockMulticlusterRequestAuthenticationReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterRequestAuthenticationReconcilerMockRecorder
+}
+
+// MockMulticlusterRequestAuthenticationReconcilerMockRecorder is the mock recorder for MockMulticlusterRequestAuthenticationReconciler.
+type MockMulticlusterRequestAuthenticationReconcilerMockRecorder struct {
+	mock *MockMulticlusterRequestAuthenticationReconciler
+}
+
+// NewMockMulticlusterRequestAuthenticationReconciler creates a new mock instance.
+func NewMockMulticlusterRequestAuthenticationReconciler(ctrl *gomock.Controller) *MockMulticlusterRequestAuthenticationReconciler {
+	mock := &MockMulticlusterRequestAuthenticationReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterRequestAuthenticationReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterRequestAuthenticationReconciler) EXPECT() *MockMulticlusterRequestAuthenticationReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileRequestAuthentication mocks base method.
+func (m *MockMulticlusterRequestAuthenticationReconciler) ReconcileRequestAuthentication(clusterName string, obj *v1.RequestAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileRequestAuthentication", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileRequestAuthentication indicates an expected call of ReconcileRequestAuthentication.
+func (mr *MockMulticlusterRequestAuthenticationReconcilerMockRecorder) ReconcileRequestAuthentication(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileRequestAuthentication", reflect.TypeOf((*MockMulticlusterRequestAuthenticationReconciler)(nil).ReconcileRequestAuthentication), clusterName, obj)
+}
+
+// MockMulticlusterRequestAuthenticationDeletionReconciler is a mock of MulticlusterRequestAuthenticationDeletionReconciler interface.
+type MockMulticlusterRequestAuthenticationDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterRequestAuthenticationDeletionReconciler.
+type MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterRequestAuthenticationDeletionReconciler
+}
+
+// NewMockMulticlusterRequestAuthenticationDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterRequestAuthenticationDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterRequestAuthenticationDeletionReconciler {
+	mock := &MockMulticlusterRequestAuthenticationDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterRequestAuthenticationDeletionReconciler) EXPECT() *MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileRequestAuthenticationDeletion mocks base method.
+func (m *MockMulticlusterRequestAuthenticationDeletionReconciler) ReconcileRequestAuthenticationDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileRequestAuthenticationDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileRequestAuthenticationDeletion indicates an expected call of ReconcileRequestAuthenticationDeletion.
+func (mr *MockMulticlusterRequestAuthenticationDeletionReconcilerMockRecorder) ReconcileRequestAuthenticationDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileRequestAuthenticationDeletion", reflect.TypeOf((*MockMulticlusterRequestAuthenticationDeletionReconciler)(nil).ReconcileRequestAuthenticationDeletion), clusterName, req)
+}
+
+// MockMulticlusterRequestAuthenticationReconcileLoop is a mock of MulticlusterRequestAuthenticationReconcileLoop interface.
+type MockMulticlusterRequestAuthenticationReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder
+}
+
+// MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder is the mock recorder for MockMulticlusterRequestAuthenticationReconcileLoop.
+type MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterRequestAuthenticationReconcileLoop
+}
+
+// NewMockMulticlusterRequestAuthenticationReconcileLoop creates a new mock instance.
+func NewMockMulticlusterRequestAuthenticationReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterRequestAuthenticationReconcileLoop {
+	mock := &MockMulticlusterRequestAuthenticationReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterRequestAuthenticationReconcileLoop) EXPECT() *MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterRequestAuthenticationReconciler mocks base method.
+func (m *MockMulticlusterRequestAuthenticationReconcileLoop) AddMulticlusterRequestAuthenticationReconciler(ctx context.Context, rec controller.MulticlusterRequestAuthenticationReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterRequestAuthenticationReconciler", varargs...)
+}
+
+// AddMulticlusterRequestAuthenticationReconciler indicates an expected call of AddMulticlusterRequestAuthenticationReconciler.
+func (mr *MockMulticlusterRequestAuthenticationReconcileLoopMockRecorder) AddMulticlusterRequestAuthenticationReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterRequestAuthenticationReconciler", reflect.TypeOf((*MockMulticlusterRequestAuthenticationReconcileLoop)(nil).AddMulticlusterRequestAuthenticationReconciler), varargs...)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/mocks/reconcilers.go b/pkg/api/istio/security.istio.io/v1/controller/mocks/reconcilers.go
new file mode 100644
index 0000000..edf16af
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/mocks/reconcilers.go
@@ -0,0 +1,565 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/security/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockAuthorizationPolicyReconciler is a mock of AuthorizationPolicyReconciler interface.
+type MockAuthorizationPolicyReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyReconcilerMockRecorder
+}
+
+// MockAuthorizationPolicyReconcilerMockRecorder is the mock recorder for MockAuthorizationPolicyReconciler.
+type MockAuthorizationPolicyReconcilerMockRecorder struct {
+	mock *MockAuthorizationPolicyReconciler
+}
+
+// NewMockAuthorizationPolicyReconciler creates a new mock instance.
+func NewMockAuthorizationPolicyReconciler(ctrl *gomock.Controller) *MockAuthorizationPolicyReconciler {
+	mock := &MockAuthorizationPolicyReconciler{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyReconciler) EXPECT() *MockAuthorizationPolicyReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyReconciler) ReconcileAuthorizationPolicy(obj *v1.AuthorizationPolicy) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileAuthorizationPolicy indicates an expected call of ReconcileAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyReconcilerMockRecorder) ReconcileAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyReconciler)(nil).ReconcileAuthorizationPolicy), obj)
+}
+
+// MockAuthorizationPolicyDeletionReconciler is a mock of AuthorizationPolicyDeletionReconciler interface.
+type MockAuthorizationPolicyDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyDeletionReconcilerMockRecorder
+}
+
+// MockAuthorizationPolicyDeletionReconcilerMockRecorder is the mock recorder for MockAuthorizationPolicyDeletionReconciler.
+type MockAuthorizationPolicyDeletionReconcilerMockRecorder struct {
+	mock *MockAuthorizationPolicyDeletionReconciler
+}
+
+// NewMockAuthorizationPolicyDeletionReconciler creates a new mock instance.
+func NewMockAuthorizationPolicyDeletionReconciler(ctrl *gomock.Controller) *MockAuthorizationPolicyDeletionReconciler {
+	mock := &MockAuthorizationPolicyDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyDeletionReconciler) EXPECT() *MockAuthorizationPolicyDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileAuthorizationPolicyDeletion mocks base method.
+func (m *MockAuthorizationPolicyDeletionReconciler) ReconcileAuthorizationPolicyDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileAuthorizationPolicyDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileAuthorizationPolicyDeletion indicates an expected call of ReconcileAuthorizationPolicyDeletion.
+func (mr *MockAuthorizationPolicyDeletionReconcilerMockRecorder) ReconcileAuthorizationPolicyDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileAuthorizationPolicyDeletion", reflect.TypeOf((*MockAuthorizationPolicyDeletionReconciler)(nil).ReconcileAuthorizationPolicyDeletion), req)
+}
+
+// MockAuthorizationPolicyFinalizer is a mock of AuthorizationPolicyFinalizer interface.
+type MockAuthorizationPolicyFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyFinalizerMockRecorder
+}
+
+// MockAuthorizationPolicyFinalizerMockRecorder is the mock recorder for MockAuthorizationPolicyFinalizer.
+type MockAuthorizationPolicyFinalizerMockRecorder struct {
+	mock *MockAuthorizationPolicyFinalizer
+}
+
+// NewMockAuthorizationPolicyFinalizer creates a new mock instance.
+func NewMockAuthorizationPolicyFinalizer(ctrl *gomock.Controller) *MockAuthorizationPolicyFinalizer {
+	mock := &MockAuthorizationPolicyFinalizer{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyFinalizer) EXPECT() *MockAuthorizationPolicyFinalizerMockRecorder {
+	return m.recorder
+}
+
+// AuthorizationPolicyFinalizerName mocks base method.
+func (m *MockAuthorizationPolicyFinalizer) AuthorizationPolicyFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "AuthorizationPolicyFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// AuthorizationPolicyFinalizerName indicates an expected call of AuthorizationPolicyFinalizerName.
+func (mr *MockAuthorizationPolicyFinalizerMockRecorder) AuthorizationPolicyFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthorizationPolicyFinalizerName", reflect.TypeOf((*MockAuthorizationPolicyFinalizer)(nil).AuthorizationPolicyFinalizerName))
+}
+
+// FinalizeAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyFinalizer) FinalizeAuthorizationPolicy(obj *v1.AuthorizationPolicy) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeAuthorizationPolicy indicates an expected call of FinalizeAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyFinalizerMockRecorder) FinalizeAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyFinalizer)(nil).FinalizeAuthorizationPolicy), obj)
+}
+
+// ReconcileAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyFinalizer) ReconcileAuthorizationPolicy(obj *v1.AuthorizationPolicy) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileAuthorizationPolicy", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileAuthorizationPolicy indicates an expected call of ReconcileAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyFinalizerMockRecorder) ReconcileAuthorizationPolicy(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyFinalizer)(nil).ReconcileAuthorizationPolicy), obj)
+}
+
+// MockAuthorizationPolicyReconcileLoop is a mock of AuthorizationPolicyReconcileLoop interface.
+type MockAuthorizationPolicyReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyReconcileLoopMockRecorder
+}
+
+// MockAuthorizationPolicyReconcileLoopMockRecorder is the mock recorder for MockAuthorizationPolicyReconcileLoop.
+type MockAuthorizationPolicyReconcileLoopMockRecorder struct {
+	mock *MockAuthorizationPolicyReconcileLoop
+}
+
+// NewMockAuthorizationPolicyReconcileLoop creates a new mock instance.
+func NewMockAuthorizationPolicyReconcileLoop(ctrl *gomock.Controller) *MockAuthorizationPolicyReconcileLoop {
+	mock := &MockAuthorizationPolicyReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyReconcileLoop) EXPECT() *MockAuthorizationPolicyReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunAuthorizationPolicyReconciler mocks base method.
+func (m *MockAuthorizationPolicyReconcileLoop) RunAuthorizationPolicyReconciler(ctx context.Context, rec controller.AuthorizationPolicyReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunAuthorizationPolicyReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunAuthorizationPolicyReconciler indicates an expected call of RunAuthorizationPolicyReconciler.
+func (mr *MockAuthorizationPolicyReconcileLoopMockRecorder) RunAuthorizationPolicyReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunAuthorizationPolicyReconciler", reflect.TypeOf((*MockAuthorizationPolicyReconcileLoop)(nil).RunAuthorizationPolicyReconciler), varargs...)
+}
+
+// MockPeerAuthenticationReconciler is a mock of PeerAuthenticationReconciler interface.
+type MockPeerAuthenticationReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationReconcilerMockRecorder
+}
+
+// MockPeerAuthenticationReconcilerMockRecorder is the mock recorder for MockPeerAuthenticationReconciler.
+type MockPeerAuthenticationReconcilerMockRecorder struct {
+	mock *MockPeerAuthenticationReconciler
+}
+
+// NewMockPeerAuthenticationReconciler creates a new mock instance.
+func NewMockPeerAuthenticationReconciler(ctrl *gomock.Controller) *MockPeerAuthenticationReconciler {
+	mock := &MockPeerAuthenticationReconciler{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationReconciler) EXPECT() *MockPeerAuthenticationReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcilePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationReconciler) ReconcilePeerAuthentication(obj *v1.PeerAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcilePeerAuthentication", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcilePeerAuthentication indicates an expected call of ReconcilePeerAuthentication.
+func (mr *MockPeerAuthenticationReconcilerMockRecorder) ReconcilePeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcilePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationReconciler)(nil).ReconcilePeerAuthentication), obj)
+}
+
+// MockPeerAuthenticationDeletionReconciler is a mock of PeerAuthenticationDeletionReconciler interface.
+type MockPeerAuthenticationDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationDeletionReconcilerMockRecorder
+}
+
+// MockPeerAuthenticationDeletionReconcilerMockRecorder is the mock recorder for MockPeerAuthenticationDeletionReconciler.
+type MockPeerAuthenticationDeletionReconcilerMockRecorder struct {
+	mock *MockPeerAuthenticationDeletionReconciler
+}
+
+// NewMockPeerAuthenticationDeletionReconciler creates a new mock instance.
+func NewMockPeerAuthenticationDeletionReconciler(ctrl *gomock.Controller) *MockPeerAuthenticationDeletionReconciler {
+	mock := &MockPeerAuthenticationDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationDeletionReconciler) EXPECT() *MockPeerAuthenticationDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcilePeerAuthenticationDeletion mocks base method.
+func (m *MockPeerAuthenticationDeletionReconciler) ReconcilePeerAuthenticationDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcilePeerAuthenticationDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcilePeerAuthenticationDeletion indicates an expected call of ReconcilePeerAuthenticationDeletion.
+func (mr *MockPeerAuthenticationDeletionReconcilerMockRecorder) ReconcilePeerAuthenticationDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcilePeerAuthenticationDeletion", reflect.TypeOf((*MockPeerAuthenticationDeletionReconciler)(nil).ReconcilePeerAuthenticationDeletion), req)
+}
+
+// MockPeerAuthenticationFinalizer is a mock of PeerAuthenticationFinalizer interface.
+type MockPeerAuthenticationFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationFinalizerMockRecorder
+}
+
+// MockPeerAuthenticationFinalizerMockRecorder is the mock recorder for MockPeerAuthenticationFinalizer.
+type MockPeerAuthenticationFinalizerMockRecorder struct {
+	mock *MockPeerAuthenticationFinalizer
+}
+
+// NewMockPeerAuthenticationFinalizer creates a new mock instance.
+func NewMockPeerAuthenticationFinalizer(ctrl *gomock.Controller) *MockPeerAuthenticationFinalizer {
+	mock := &MockPeerAuthenticationFinalizer{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationFinalizer) EXPECT() *MockPeerAuthenticationFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationFinalizer) FinalizePeerAuthentication(obj *v1.PeerAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizePeerAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizePeerAuthentication indicates an expected call of FinalizePeerAuthentication.
+func (mr *MockPeerAuthenticationFinalizerMockRecorder) FinalizePeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationFinalizer)(nil).FinalizePeerAuthentication), obj)
+}
+
+// PeerAuthenticationFinalizerName mocks base method.
+func (m *MockPeerAuthenticationFinalizer) PeerAuthenticationFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "PeerAuthenticationFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// PeerAuthenticationFinalizerName indicates an expected call of PeerAuthenticationFinalizerName.
+func (mr *MockPeerAuthenticationFinalizerMockRecorder) PeerAuthenticationFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PeerAuthenticationFinalizerName", reflect.TypeOf((*MockPeerAuthenticationFinalizer)(nil).PeerAuthenticationFinalizerName))
+}
+
+// ReconcilePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationFinalizer) ReconcilePeerAuthentication(obj *v1.PeerAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcilePeerAuthentication", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcilePeerAuthentication indicates an expected call of ReconcilePeerAuthentication.
+func (mr *MockPeerAuthenticationFinalizerMockRecorder) ReconcilePeerAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcilePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationFinalizer)(nil).ReconcilePeerAuthentication), obj)
+}
+
+// MockPeerAuthenticationReconcileLoop is a mock of PeerAuthenticationReconcileLoop interface.
+type MockPeerAuthenticationReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationReconcileLoopMockRecorder
+}
+
+// MockPeerAuthenticationReconcileLoopMockRecorder is the mock recorder for MockPeerAuthenticationReconcileLoop.
+type MockPeerAuthenticationReconcileLoopMockRecorder struct {
+	mock *MockPeerAuthenticationReconcileLoop
+}
+
+// NewMockPeerAuthenticationReconcileLoop creates a new mock instance.
+func NewMockPeerAuthenticationReconcileLoop(ctrl *gomock.Controller) *MockPeerAuthenticationReconcileLoop {
+	mock := &MockPeerAuthenticationReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationReconcileLoop) EXPECT() *MockPeerAuthenticationReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunPeerAuthenticationReconciler mocks base method.
+func (m *MockPeerAuthenticationReconcileLoop) RunPeerAuthenticationReconciler(ctx context.Context, rec controller.PeerAuthenticationReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunPeerAuthenticationReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunPeerAuthenticationReconciler indicates an expected call of RunPeerAuthenticationReconciler.
+func (mr *MockPeerAuthenticationReconcileLoopMockRecorder) RunPeerAuthenticationReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunPeerAuthenticationReconciler", reflect.TypeOf((*MockPeerAuthenticationReconcileLoop)(nil).RunPeerAuthenticationReconciler), varargs...)
+}
+
+// MockRequestAuthenticationReconciler is a mock of RequestAuthenticationReconciler interface.
+type MockRequestAuthenticationReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationReconcilerMockRecorder
+}
+
+// MockRequestAuthenticationReconcilerMockRecorder is the mock recorder for MockRequestAuthenticationReconciler.
+type MockRequestAuthenticationReconcilerMockRecorder struct {
+	mock *MockRequestAuthenticationReconciler
+}
+
+// NewMockRequestAuthenticationReconciler creates a new mock instance.
+func NewMockRequestAuthenticationReconciler(ctrl *gomock.Controller) *MockRequestAuthenticationReconciler {
+	mock := &MockRequestAuthenticationReconciler{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationReconciler) EXPECT() *MockRequestAuthenticationReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationReconciler) ReconcileRequestAuthentication(obj *v1.RequestAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileRequestAuthentication", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileRequestAuthentication indicates an expected call of ReconcileRequestAuthentication.
+func (mr *MockRequestAuthenticationReconcilerMockRecorder) ReconcileRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationReconciler)(nil).ReconcileRequestAuthentication), obj)
+}
+
+// MockRequestAuthenticationDeletionReconciler is a mock of RequestAuthenticationDeletionReconciler interface.
+type MockRequestAuthenticationDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationDeletionReconcilerMockRecorder
+}
+
+// MockRequestAuthenticationDeletionReconcilerMockRecorder is the mock recorder for MockRequestAuthenticationDeletionReconciler.
+type MockRequestAuthenticationDeletionReconcilerMockRecorder struct {
+	mock *MockRequestAuthenticationDeletionReconciler
+}
+
+// NewMockRequestAuthenticationDeletionReconciler creates a new mock instance.
+func NewMockRequestAuthenticationDeletionReconciler(ctrl *gomock.Controller) *MockRequestAuthenticationDeletionReconciler {
+	mock := &MockRequestAuthenticationDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationDeletionReconciler) EXPECT() *MockRequestAuthenticationDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileRequestAuthenticationDeletion mocks base method.
+func (m *MockRequestAuthenticationDeletionReconciler) ReconcileRequestAuthenticationDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileRequestAuthenticationDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileRequestAuthenticationDeletion indicates an expected call of ReconcileRequestAuthenticationDeletion.
+func (mr *MockRequestAuthenticationDeletionReconcilerMockRecorder) ReconcileRequestAuthenticationDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileRequestAuthenticationDeletion", reflect.TypeOf((*MockRequestAuthenticationDeletionReconciler)(nil).ReconcileRequestAuthenticationDeletion), req)
+}
+
+// MockRequestAuthenticationFinalizer is a mock of RequestAuthenticationFinalizer interface.
+type MockRequestAuthenticationFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationFinalizerMockRecorder
+}
+
+// MockRequestAuthenticationFinalizerMockRecorder is the mock recorder for MockRequestAuthenticationFinalizer.
+type MockRequestAuthenticationFinalizerMockRecorder struct {
+	mock *MockRequestAuthenticationFinalizer
+}
+
+// NewMockRequestAuthenticationFinalizer creates a new mock instance.
+func NewMockRequestAuthenticationFinalizer(ctrl *gomock.Controller) *MockRequestAuthenticationFinalizer {
+	mock := &MockRequestAuthenticationFinalizer{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationFinalizer) EXPECT() *MockRequestAuthenticationFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationFinalizer) FinalizeRequestAuthentication(obj *v1.RequestAuthentication) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeRequestAuthentication", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeRequestAuthentication indicates an expected call of FinalizeRequestAuthentication.
+func (mr *MockRequestAuthenticationFinalizerMockRecorder) FinalizeRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationFinalizer)(nil).FinalizeRequestAuthentication), obj)
+}
+
+// ReconcileRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationFinalizer) ReconcileRequestAuthentication(obj *v1.RequestAuthentication) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileRequestAuthentication", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileRequestAuthentication indicates an expected call of ReconcileRequestAuthentication.
+func (mr *MockRequestAuthenticationFinalizerMockRecorder) ReconcileRequestAuthentication(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationFinalizer)(nil).ReconcileRequestAuthentication), obj)
+}
+
+// RequestAuthenticationFinalizerName mocks base method.
+func (m *MockRequestAuthenticationFinalizer) RequestAuthenticationFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "RequestAuthenticationFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// RequestAuthenticationFinalizerName indicates an expected call of RequestAuthenticationFinalizerName.
+func (mr *MockRequestAuthenticationFinalizerMockRecorder) RequestAuthenticationFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestAuthenticationFinalizerName", reflect.TypeOf((*MockRequestAuthenticationFinalizer)(nil).RequestAuthenticationFinalizerName))
+}
+
+// MockRequestAuthenticationReconcileLoop is a mock of RequestAuthenticationReconcileLoop interface.
+type MockRequestAuthenticationReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationReconcileLoopMockRecorder
+}
+
+// MockRequestAuthenticationReconcileLoopMockRecorder is the mock recorder for MockRequestAuthenticationReconcileLoop.
+type MockRequestAuthenticationReconcileLoopMockRecorder struct {
+	mock *MockRequestAuthenticationReconcileLoop
+}
+
+// NewMockRequestAuthenticationReconcileLoop creates a new mock instance.
+func NewMockRequestAuthenticationReconcileLoop(ctrl *gomock.Controller) *MockRequestAuthenticationReconcileLoop {
+	mock := &MockRequestAuthenticationReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationReconcileLoop) EXPECT() *MockRequestAuthenticationReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunRequestAuthenticationReconciler mocks base method.
+func (m *MockRequestAuthenticationReconcileLoop) RunRequestAuthenticationReconciler(ctx context.Context, rec controller.RequestAuthenticationReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunRequestAuthenticationReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunRequestAuthenticationReconciler indicates an expected call of RunRequestAuthenticationReconciler.
+func (mr *MockRequestAuthenticationReconcileLoopMockRecorder) RunRequestAuthenticationReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunRequestAuthenticationReconciler", reflect.TypeOf((*MockRequestAuthenticationReconcileLoop)(nil).RunRequestAuthenticationReconciler), varargs...)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/multicluster_reconcilers.go b/pkg/api/istio/security.istio.io/v1/controller/multicluster_reconcilers.go
new file mode 100644
index 0000000..3bd590d
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/multicluster_reconcilers.go
@@ -0,0 +1,232 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./multicluster_reconcilers.go -destination mocks/multicluster_reconcilers.go
+
+// Definitions for the multicluster Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	security_istio_io_v1 "istio.io/client-go/pkg/apis/security/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	mc_reconcile "github.com/solo-io/skv2/pkg/multicluster/reconcile"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the AuthorizationPolicy Resource across clusters.
+// implemented by the user
+type MulticlusterAuthorizationPolicyReconciler interface {
+	ReconcileAuthorizationPolicy(clusterName string, obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the AuthorizationPolicy Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterAuthorizationPolicyDeletionReconciler interface {
+	ReconcileAuthorizationPolicyDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterAuthorizationPolicyReconcilerFuncs struct {
+	OnReconcileAuthorizationPolicy         func(clusterName string, obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error)
+	OnReconcileAuthorizationPolicyDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterAuthorizationPolicyReconcilerFuncs) ReconcileAuthorizationPolicy(clusterName string, obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error) {
+	if f.OnReconcileAuthorizationPolicy == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileAuthorizationPolicy(clusterName, obj)
+}
+
+func (f *MulticlusterAuthorizationPolicyReconcilerFuncs) ReconcileAuthorizationPolicyDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileAuthorizationPolicyDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileAuthorizationPolicyDeletion(clusterName, req)
+}
+
+type MulticlusterAuthorizationPolicyReconcileLoop interface {
+	// AddMulticlusterAuthorizationPolicyReconciler adds a MulticlusterAuthorizationPolicyReconciler to the MulticlusterAuthorizationPolicyReconcileLoop.
+	AddMulticlusterAuthorizationPolicyReconciler(ctx context.Context, rec MulticlusterAuthorizationPolicyReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterAuthorizationPolicyReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterAuthorizationPolicyReconcileLoop) AddMulticlusterAuthorizationPolicyReconciler(ctx context.Context, rec MulticlusterAuthorizationPolicyReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericAuthorizationPolicyMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterAuthorizationPolicyReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterAuthorizationPolicyReconcileLoop {
+	return &multiclusterAuthorizationPolicyReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &security_istio_io_v1.AuthorizationPolicy{}, options)}
+}
+
+type genericAuthorizationPolicyMulticlusterReconciler struct {
+	reconciler MulticlusterAuthorizationPolicyReconciler
+}
+
+func (g genericAuthorizationPolicyMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterAuthorizationPolicyDeletionReconciler); ok {
+		return deletionReconciler.ReconcileAuthorizationPolicyDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericAuthorizationPolicyMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileAuthorizationPolicy(cluster, obj)
+}
+
+// Reconcile Upsert events for the PeerAuthentication Resource across clusters.
+// implemented by the user
+type MulticlusterPeerAuthenticationReconciler interface {
+	ReconcilePeerAuthentication(clusterName string, obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the PeerAuthentication Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterPeerAuthenticationDeletionReconciler interface {
+	ReconcilePeerAuthenticationDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterPeerAuthenticationReconcilerFuncs struct {
+	OnReconcilePeerAuthentication         func(clusterName string, obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error)
+	OnReconcilePeerAuthenticationDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterPeerAuthenticationReconcilerFuncs) ReconcilePeerAuthentication(clusterName string, obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error) {
+	if f.OnReconcilePeerAuthentication == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcilePeerAuthentication(clusterName, obj)
+}
+
+func (f *MulticlusterPeerAuthenticationReconcilerFuncs) ReconcilePeerAuthenticationDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcilePeerAuthenticationDeletion == nil {
+		return nil
+	}
+	return f.OnReconcilePeerAuthenticationDeletion(clusterName, req)
+}
+
+type MulticlusterPeerAuthenticationReconcileLoop interface {
+	// AddMulticlusterPeerAuthenticationReconciler adds a MulticlusterPeerAuthenticationReconciler to the MulticlusterPeerAuthenticationReconcileLoop.
+	AddMulticlusterPeerAuthenticationReconciler(ctx context.Context, rec MulticlusterPeerAuthenticationReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterPeerAuthenticationReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterPeerAuthenticationReconcileLoop) AddMulticlusterPeerAuthenticationReconciler(ctx context.Context, rec MulticlusterPeerAuthenticationReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericPeerAuthenticationMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterPeerAuthenticationReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterPeerAuthenticationReconcileLoop {
+	return &multiclusterPeerAuthenticationReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &security_istio_io_v1.PeerAuthentication{}, options)}
+}
+
+type genericPeerAuthenticationMulticlusterReconciler struct {
+	reconciler MulticlusterPeerAuthenticationReconciler
+}
+
+func (g genericPeerAuthenticationMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterPeerAuthenticationDeletionReconciler); ok {
+		return deletionReconciler.ReconcilePeerAuthenticationDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericPeerAuthenticationMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return g.reconciler.ReconcilePeerAuthentication(cluster, obj)
+}
+
+// Reconcile Upsert events for the RequestAuthentication Resource across clusters.
+// implemented by the user
+type MulticlusterRequestAuthenticationReconciler interface {
+	ReconcileRequestAuthentication(clusterName string, obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the RequestAuthentication Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterRequestAuthenticationDeletionReconciler interface {
+	ReconcileRequestAuthenticationDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterRequestAuthenticationReconcilerFuncs struct {
+	OnReconcileRequestAuthentication         func(clusterName string, obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error)
+	OnReconcileRequestAuthenticationDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterRequestAuthenticationReconcilerFuncs) ReconcileRequestAuthentication(clusterName string, obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error) {
+	if f.OnReconcileRequestAuthentication == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileRequestAuthentication(clusterName, obj)
+}
+
+func (f *MulticlusterRequestAuthenticationReconcilerFuncs) ReconcileRequestAuthenticationDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileRequestAuthenticationDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileRequestAuthenticationDeletion(clusterName, req)
+}
+
+type MulticlusterRequestAuthenticationReconcileLoop interface {
+	// AddMulticlusterRequestAuthenticationReconciler adds a MulticlusterRequestAuthenticationReconciler to the MulticlusterRequestAuthenticationReconcileLoop.
+	AddMulticlusterRequestAuthenticationReconciler(ctx context.Context, rec MulticlusterRequestAuthenticationReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterRequestAuthenticationReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterRequestAuthenticationReconcileLoop) AddMulticlusterRequestAuthenticationReconciler(ctx context.Context, rec MulticlusterRequestAuthenticationReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericRequestAuthenticationMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterRequestAuthenticationReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterRequestAuthenticationReconcileLoop {
+	return &multiclusterRequestAuthenticationReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &security_istio_io_v1.RequestAuthentication{}, options)}
+}
+
+type genericRequestAuthenticationMulticlusterReconciler struct {
+	reconciler MulticlusterRequestAuthenticationReconciler
+}
+
+func (g genericRequestAuthenticationMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterRequestAuthenticationDeletionReconciler); ok {
+		return deletionReconciler.ReconcileRequestAuthenticationDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericRequestAuthenticationMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileRequestAuthentication(cluster, obj)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/controller/reconcilers.go b/pkg/api/istio/security.istio.io/v1/controller/reconcilers.go
new file mode 100644
index 0000000..fbc7607
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/controller/reconcilers.go
@@ -0,0 +1,369 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./reconcilers.go -destination mocks/reconcilers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	security_istio_io_v1 "istio.io/client-go/pkg/apis/security/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the AuthorizationPolicy Resource.
+// implemented by the user
+type AuthorizationPolicyReconciler interface {
+	ReconcileAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the AuthorizationPolicy Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type AuthorizationPolicyDeletionReconciler interface {
+	ReconcileAuthorizationPolicyDeletion(req reconcile.Request) error
+}
+
+type AuthorizationPolicyReconcilerFuncs struct {
+	OnReconcileAuthorizationPolicy         func(obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error)
+	OnReconcileAuthorizationPolicyDeletion func(req reconcile.Request) error
+}
+
+func (f *AuthorizationPolicyReconcilerFuncs) ReconcileAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) (reconcile.Result, error) {
+	if f.OnReconcileAuthorizationPolicy == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileAuthorizationPolicy(obj)
+}
+
+func (f *AuthorizationPolicyReconcilerFuncs) ReconcileAuthorizationPolicyDeletion(req reconcile.Request) error {
+	if f.OnReconcileAuthorizationPolicyDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileAuthorizationPolicyDeletion(req)
+}
+
+// Reconcile and finalize the AuthorizationPolicy Resource
+// implemented by the user
+type AuthorizationPolicyFinalizer interface {
+	AuthorizationPolicyReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	AuthorizationPolicyFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeAuthorizationPolicy(obj *security_istio_io_v1.AuthorizationPolicy) error
+}
+
+type AuthorizationPolicyReconcileLoop interface {
+	RunAuthorizationPolicyReconciler(ctx context.Context, rec AuthorizationPolicyReconciler, predicates ...predicate.Predicate) error
+}
+
+type authorizationPolicyReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewAuthorizationPolicyReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) AuthorizationPolicyReconcileLoop {
+	return &authorizationPolicyReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &security_istio_io_v1.AuthorizationPolicy{}, options),
+	}
+}
+
+func (c *authorizationPolicyReconcileLoop) RunAuthorizationPolicyReconciler(ctx context.Context, reconciler AuthorizationPolicyReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericAuthorizationPolicyReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(AuthorizationPolicyFinalizer); ok {
+		reconcilerWrapper = genericAuthorizationPolicyFinalizer{
+			genericAuthorizationPolicyReconciler: genericReconciler,
+			finalizingReconciler:                 finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericAuthorizationPolicyHandler implements a generic reconcile.Reconciler
+type genericAuthorizationPolicyReconciler struct {
+	reconciler AuthorizationPolicyReconciler
+}
+
+func (r genericAuthorizationPolicyReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileAuthorizationPolicy(obj)
+}
+
+func (r genericAuthorizationPolicyReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(AuthorizationPolicyDeletionReconciler); ok {
+		return deletionReconciler.ReconcileAuthorizationPolicyDeletion(request)
+	}
+	return nil
+}
+
+// genericAuthorizationPolicyFinalizer implements a generic reconcile.FinalizingReconciler
+type genericAuthorizationPolicyFinalizer struct {
+	genericAuthorizationPolicyReconciler
+	finalizingReconciler AuthorizationPolicyFinalizer
+}
+
+func (r genericAuthorizationPolicyFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.AuthorizationPolicyFinalizerName()
+}
+
+func (r genericAuthorizationPolicyFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*security_istio_io_v1.AuthorizationPolicy)
+	if !ok {
+		return errors.Errorf("internal error: AuthorizationPolicy handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeAuthorizationPolicy(obj)
+}
+
+// Reconcile Upsert events for the PeerAuthentication Resource.
+// implemented by the user
+type PeerAuthenticationReconciler interface {
+	ReconcilePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the PeerAuthentication Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type PeerAuthenticationDeletionReconciler interface {
+	ReconcilePeerAuthenticationDeletion(req reconcile.Request) error
+}
+
+type PeerAuthenticationReconcilerFuncs struct {
+	OnReconcilePeerAuthentication         func(obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error)
+	OnReconcilePeerAuthenticationDeletion func(req reconcile.Request) error
+}
+
+func (f *PeerAuthenticationReconcilerFuncs) ReconcilePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) (reconcile.Result, error) {
+	if f.OnReconcilePeerAuthentication == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcilePeerAuthentication(obj)
+}
+
+func (f *PeerAuthenticationReconcilerFuncs) ReconcilePeerAuthenticationDeletion(req reconcile.Request) error {
+	if f.OnReconcilePeerAuthenticationDeletion == nil {
+		return nil
+	}
+	return f.OnReconcilePeerAuthenticationDeletion(req)
+}
+
+// Reconcile and finalize the PeerAuthentication Resource
+// implemented by the user
+type PeerAuthenticationFinalizer interface {
+	PeerAuthenticationReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	PeerAuthenticationFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizePeerAuthentication(obj *security_istio_io_v1.PeerAuthentication) error
+}
+
+type PeerAuthenticationReconcileLoop interface {
+	RunPeerAuthenticationReconciler(ctx context.Context, rec PeerAuthenticationReconciler, predicates ...predicate.Predicate) error
+}
+
+type peerAuthenticationReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewPeerAuthenticationReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) PeerAuthenticationReconcileLoop {
+	return &peerAuthenticationReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &security_istio_io_v1.PeerAuthentication{}, options),
+	}
+}
+
+func (c *peerAuthenticationReconcileLoop) RunPeerAuthenticationReconciler(ctx context.Context, reconciler PeerAuthenticationReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericPeerAuthenticationReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(PeerAuthenticationFinalizer); ok {
+		reconcilerWrapper = genericPeerAuthenticationFinalizer{
+			genericPeerAuthenticationReconciler: genericReconciler,
+			finalizingReconciler:                finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericPeerAuthenticationHandler implements a generic reconcile.Reconciler
+type genericPeerAuthenticationReconciler struct {
+	reconciler PeerAuthenticationReconciler
+}
+
+func (r genericPeerAuthenticationReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return r.reconciler.ReconcilePeerAuthentication(obj)
+}
+
+func (r genericPeerAuthenticationReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(PeerAuthenticationDeletionReconciler); ok {
+		return deletionReconciler.ReconcilePeerAuthenticationDeletion(request)
+	}
+	return nil
+}
+
+// genericPeerAuthenticationFinalizer implements a generic reconcile.FinalizingReconciler
+type genericPeerAuthenticationFinalizer struct {
+	genericPeerAuthenticationReconciler
+	finalizingReconciler PeerAuthenticationFinalizer
+}
+
+func (r genericPeerAuthenticationFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.PeerAuthenticationFinalizerName()
+}
+
+func (r genericPeerAuthenticationFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*security_istio_io_v1.PeerAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: PeerAuthentication handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizePeerAuthentication(obj)
+}
+
+// Reconcile Upsert events for the RequestAuthentication Resource.
+// implemented by the user
+type RequestAuthenticationReconciler interface {
+	ReconcileRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the RequestAuthentication Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type RequestAuthenticationDeletionReconciler interface {
+	ReconcileRequestAuthenticationDeletion(req reconcile.Request) error
+}
+
+type RequestAuthenticationReconcilerFuncs struct {
+	OnReconcileRequestAuthentication         func(obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error)
+	OnReconcileRequestAuthenticationDeletion func(req reconcile.Request) error
+}
+
+func (f *RequestAuthenticationReconcilerFuncs) ReconcileRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) (reconcile.Result, error) {
+	if f.OnReconcileRequestAuthentication == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileRequestAuthentication(obj)
+}
+
+func (f *RequestAuthenticationReconcilerFuncs) ReconcileRequestAuthenticationDeletion(req reconcile.Request) error {
+	if f.OnReconcileRequestAuthenticationDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileRequestAuthenticationDeletion(req)
+}
+
+// Reconcile and finalize the RequestAuthentication Resource
+// implemented by the user
+type RequestAuthenticationFinalizer interface {
+	RequestAuthenticationReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	RequestAuthenticationFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeRequestAuthentication(obj *security_istio_io_v1.RequestAuthentication) error
+}
+
+type RequestAuthenticationReconcileLoop interface {
+	RunRequestAuthenticationReconciler(ctx context.Context, rec RequestAuthenticationReconciler, predicates ...predicate.Predicate) error
+}
+
+type requestAuthenticationReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewRequestAuthenticationReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) RequestAuthenticationReconcileLoop {
+	return &requestAuthenticationReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &security_istio_io_v1.RequestAuthentication{}, options),
+	}
+}
+
+func (c *requestAuthenticationReconcileLoop) RunRequestAuthenticationReconciler(ctx context.Context, reconciler RequestAuthenticationReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericRequestAuthenticationReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(RequestAuthenticationFinalizer); ok {
+		reconcilerWrapper = genericRequestAuthenticationFinalizer{
+			genericRequestAuthenticationReconciler: genericReconciler,
+			finalizingReconciler:                   finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericRequestAuthenticationHandler implements a generic reconcile.Reconciler
+type genericRequestAuthenticationReconciler struct {
+	reconciler RequestAuthenticationReconciler
+}
+
+func (r genericRequestAuthenticationReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileRequestAuthentication(obj)
+}
+
+func (r genericRequestAuthenticationReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(RequestAuthenticationDeletionReconciler); ok {
+		return deletionReconciler.ReconcileRequestAuthenticationDeletion(request)
+	}
+	return nil
+}
+
+// genericRequestAuthenticationFinalizer implements a generic reconcile.FinalizingReconciler
+type genericRequestAuthenticationFinalizer struct {
+	genericRequestAuthenticationReconciler
+	finalizingReconciler RequestAuthenticationFinalizer
+}
+
+func (r genericRequestAuthenticationFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.RequestAuthenticationFinalizerName()
+}
+
+func (r genericRequestAuthenticationFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*security_istio_io_v1.RequestAuthentication)
+	if !ok {
+		return errors.Errorf("internal error: RequestAuthentication handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeRequestAuthentication(obj)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/mocks/clients.go b/pkg/api/istio/security.istio.io/v1/mocks/clients.go
new file mode 100644
index 0000000..45b98fe
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/mocks/clients.go
@@ -0,0 +1,1630 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./clients.go
+
+// Package mock_v1 is a generated GoMock package.
+package mock_v1
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1 "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1"
+	v10 "istio.io/client-go/pkg/apis/security/v1"
+	client "sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MockMulticlusterClientset is a mock of MulticlusterClientset interface.
+type MockMulticlusterClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterClientsetMockRecorder
+}
+
+// MockMulticlusterClientsetMockRecorder is the mock recorder for MockMulticlusterClientset.
+type MockMulticlusterClientsetMockRecorder struct {
+	mock *MockMulticlusterClientset
+}
+
+// NewMockMulticlusterClientset creates a new mock instance.
+func NewMockMulticlusterClientset(ctrl *gomock.Controller) *MockMulticlusterClientset {
+	mock := &MockMulticlusterClientset{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterClientset) EXPECT() *MockMulticlusterClientsetMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterClientset) Cluster(cluster string) (v1.Clientset, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.Clientset)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterClientsetMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterClientset)(nil).Cluster), cluster)
+}
+
+// MockClientset is a mock of Clientset interface.
+type MockClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockClientsetMockRecorder
+}
+
+// MockClientsetMockRecorder is the mock recorder for MockClientset.
+type MockClientsetMockRecorder struct {
+	mock *MockClientset
+}
+
+// NewMockClientset creates a new mock instance.
+func NewMockClientset(ctrl *gomock.Controller) *MockClientset {
+	mock := &MockClientset{ctrl: ctrl}
+	mock.recorder = &MockClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockClientset) EXPECT() *MockClientsetMockRecorder {
+	return m.recorder
+}
+
+// AuthorizationPolicies mocks base method.
+func (m *MockClientset) AuthorizationPolicies() v1.AuthorizationPolicyClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "AuthorizationPolicies")
+	ret0, _ := ret[0].(v1.AuthorizationPolicyClient)
+	return ret0
+}
+
+// AuthorizationPolicies indicates an expected call of AuthorizationPolicies.
+func (mr *MockClientsetMockRecorder) AuthorizationPolicies() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthorizationPolicies", reflect.TypeOf((*MockClientset)(nil).AuthorizationPolicies))
+}
+
+// PeerAuthentications mocks base method.
+func (m *MockClientset) PeerAuthentications() v1.PeerAuthenticationClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "PeerAuthentications")
+	ret0, _ := ret[0].(v1.PeerAuthenticationClient)
+	return ret0
+}
+
+// PeerAuthentications indicates an expected call of PeerAuthentications.
+func (mr *MockClientsetMockRecorder) PeerAuthentications() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PeerAuthentications", reflect.TypeOf((*MockClientset)(nil).PeerAuthentications))
+}
+
+// RequestAuthentications mocks base method.
+func (m *MockClientset) RequestAuthentications() v1.RequestAuthenticationClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "RequestAuthentications")
+	ret0, _ := ret[0].(v1.RequestAuthenticationClient)
+	return ret0
+}
+
+// RequestAuthentications indicates an expected call of RequestAuthentications.
+func (mr *MockClientsetMockRecorder) RequestAuthentications() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestAuthentications", reflect.TypeOf((*MockClientset)(nil).RequestAuthentications))
+}
+
+// MockAuthorizationPolicyReader is a mock of AuthorizationPolicyReader interface.
+type MockAuthorizationPolicyReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyReaderMockRecorder
+}
+
+// MockAuthorizationPolicyReaderMockRecorder is the mock recorder for MockAuthorizationPolicyReader.
+type MockAuthorizationPolicyReaderMockRecorder struct {
+	mock *MockAuthorizationPolicyReader
+}
+
+// NewMockAuthorizationPolicyReader creates a new mock instance.
+func NewMockAuthorizationPolicyReader(ctrl *gomock.Controller) *MockAuthorizationPolicyReader {
+	mock := &MockAuthorizationPolicyReader{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyReader) EXPECT() *MockAuthorizationPolicyReaderMockRecorder {
+	return m.recorder
+}
+
+// GetAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyReader) GetAuthorizationPolicy(ctx context.Context, key client.ObjectKey) (*v10.AuthorizationPolicy, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetAuthorizationPolicy", ctx, key)
+	ret0, _ := ret[0].(*v10.AuthorizationPolicy)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetAuthorizationPolicy indicates an expected call of GetAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyReaderMockRecorder) GetAuthorizationPolicy(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyReader)(nil).GetAuthorizationPolicy), ctx, key)
+}
+
+// ListAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyReader) ListAuthorizationPolicy(ctx context.Context, opts ...client.ListOption) (*v10.AuthorizationPolicyList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(*v10.AuthorizationPolicyList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListAuthorizationPolicy indicates an expected call of ListAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyReaderMockRecorder) ListAuthorizationPolicy(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyReader)(nil).ListAuthorizationPolicy), varargs...)
+}
+
+// MockAuthorizationPolicyWriter is a mock of AuthorizationPolicyWriter interface.
+type MockAuthorizationPolicyWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyWriterMockRecorder
+}
+
+// MockAuthorizationPolicyWriterMockRecorder is the mock recorder for MockAuthorizationPolicyWriter.
+type MockAuthorizationPolicyWriterMockRecorder struct {
+	mock *MockAuthorizationPolicyWriter
+}
+
+// NewMockAuthorizationPolicyWriter creates a new mock instance.
+func NewMockAuthorizationPolicyWriter(ctrl *gomock.Controller) *MockAuthorizationPolicyWriter {
+	mock := &MockAuthorizationPolicyWriter{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyWriter) EXPECT() *MockAuthorizationPolicyWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) CreateAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateAuthorizationPolicy indicates an expected call of CreateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) CreateAuthorizationPolicy(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).CreateAuthorizationPolicy), varargs...)
+}
+
+// DeleteAllOfAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) DeleteAllOfAuthorizationPolicy(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfAuthorizationPolicy indicates an expected call of DeleteAllOfAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) DeleteAllOfAuthorizationPolicy(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).DeleteAllOfAuthorizationPolicy), varargs...)
+}
+
+// DeleteAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) DeleteAuthorizationPolicy(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAuthorizationPolicy indicates an expected call of DeleteAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) DeleteAuthorizationPolicy(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).DeleteAuthorizationPolicy), varargs...)
+}
+
+// PatchAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) PatchAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchAuthorizationPolicy indicates an expected call of PatchAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) PatchAuthorizationPolicy(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).PatchAuthorizationPolicy), varargs...)
+}
+
+// UpdateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) UpdateAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateAuthorizationPolicy indicates an expected call of UpdateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) UpdateAuthorizationPolicy(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).UpdateAuthorizationPolicy), varargs...)
+}
+
+// UpsertAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyWriter) UpsertAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, transitionFuncs ...v1.AuthorizationPolicyTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertAuthorizationPolicy indicates an expected call of UpsertAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyWriterMockRecorder) UpsertAuthorizationPolicy(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyWriter)(nil).UpsertAuthorizationPolicy), varargs...)
+}
+
+// MockAuthorizationPolicyStatusWriter is a mock of AuthorizationPolicyStatusWriter interface.
+type MockAuthorizationPolicyStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyStatusWriterMockRecorder
+}
+
+// MockAuthorizationPolicyStatusWriterMockRecorder is the mock recorder for MockAuthorizationPolicyStatusWriter.
+type MockAuthorizationPolicyStatusWriterMockRecorder struct {
+	mock *MockAuthorizationPolicyStatusWriter
+}
+
+// NewMockAuthorizationPolicyStatusWriter creates a new mock instance.
+func NewMockAuthorizationPolicyStatusWriter(ctrl *gomock.Controller) *MockAuthorizationPolicyStatusWriter {
+	mock := &MockAuthorizationPolicyStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyStatusWriter) EXPECT() *MockAuthorizationPolicyStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchAuthorizationPolicyStatus mocks base method.
+func (m *MockAuthorizationPolicyStatusWriter) PatchAuthorizationPolicyStatus(ctx context.Context, obj *v10.AuthorizationPolicy, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchAuthorizationPolicyStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchAuthorizationPolicyStatus indicates an expected call of PatchAuthorizationPolicyStatus.
+func (mr *MockAuthorizationPolicyStatusWriterMockRecorder) PatchAuthorizationPolicyStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchAuthorizationPolicyStatus", reflect.TypeOf((*MockAuthorizationPolicyStatusWriter)(nil).PatchAuthorizationPolicyStatus), varargs...)
+}
+
+// UpdateAuthorizationPolicyStatus mocks base method.
+func (m *MockAuthorizationPolicyStatusWriter) UpdateAuthorizationPolicyStatus(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateAuthorizationPolicyStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateAuthorizationPolicyStatus indicates an expected call of UpdateAuthorizationPolicyStatus.
+func (mr *MockAuthorizationPolicyStatusWriterMockRecorder) UpdateAuthorizationPolicyStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAuthorizationPolicyStatus", reflect.TypeOf((*MockAuthorizationPolicyStatusWriter)(nil).UpdateAuthorizationPolicyStatus), varargs...)
+}
+
+// MockAuthorizationPolicyClient is a mock of AuthorizationPolicyClient interface.
+type MockAuthorizationPolicyClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicyClientMockRecorder
+}
+
+// MockAuthorizationPolicyClientMockRecorder is the mock recorder for MockAuthorizationPolicyClient.
+type MockAuthorizationPolicyClientMockRecorder struct {
+	mock *MockAuthorizationPolicyClient
+}
+
+// NewMockAuthorizationPolicyClient creates a new mock instance.
+func NewMockAuthorizationPolicyClient(ctrl *gomock.Controller) *MockAuthorizationPolicyClient {
+	mock := &MockAuthorizationPolicyClient{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicyClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicyClient) EXPECT() *MockAuthorizationPolicyClientMockRecorder {
+	return m.recorder
+}
+
+// CreateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) CreateAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateAuthorizationPolicy indicates an expected call of CreateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) CreateAuthorizationPolicy(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).CreateAuthorizationPolicy), varargs...)
+}
+
+// DeleteAllOfAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) DeleteAllOfAuthorizationPolicy(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfAuthorizationPolicy indicates an expected call of DeleteAllOfAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) DeleteAllOfAuthorizationPolicy(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).DeleteAllOfAuthorizationPolicy), varargs...)
+}
+
+// DeleteAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) DeleteAuthorizationPolicy(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAuthorizationPolicy indicates an expected call of DeleteAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) DeleteAuthorizationPolicy(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).DeleteAuthorizationPolicy), varargs...)
+}
+
+// GetAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) GetAuthorizationPolicy(ctx context.Context, key client.ObjectKey) (*v10.AuthorizationPolicy, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetAuthorizationPolicy", ctx, key)
+	ret0, _ := ret[0].(*v10.AuthorizationPolicy)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetAuthorizationPolicy indicates an expected call of GetAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) GetAuthorizationPolicy(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).GetAuthorizationPolicy), ctx, key)
+}
+
+// ListAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) ListAuthorizationPolicy(ctx context.Context, opts ...client.ListOption) (*v10.AuthorizationPolicyList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(*v10.AuthorizationPolicyList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListAuthorizationPolicy indicates an expected call of ListAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) ListAuthorizationPolicy(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).ListAuthorizationPolicy), varargs...)
+}
+
+// PatchAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) PatchAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchAuthorizationPolicy indicates an expected call of PatchAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) PatchAuthorizationPolicy(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).PatchAuthorizationPolicy), varargs...)
+}
+
+// PatchAuthorizationPolicyStatus mocks base method.
+func (m *MockAuthorizationPolicyClient) PatchAuthorizationPolicyStatus(ctx context.Context, obj *v10.AuthorizationPolicy, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchAuthorizationPolicyStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchAuthorizationPolicyStatus indicates an expected call of PatchAuthorizationPolicyStatus.
+func (mr *MockAuthorizationPolicyClientMockRecorder) PatchAuthorizationPolicyStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchAuthorizationPolicyStatus", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).PatchAuthorizationPolicyStatus), varargs...)
+}
+
+// UpdateAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) UpdateAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateAuthorizationPolicy indicates an expected call of UpdateAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) UpdateAuthorizationPolicy(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).UpdateAuthorizationPolicy), varargs...)
+}
+
+// UpdateAuthorizationPolicyStatus mocks base method.
+func (m *MockAuthorizationPolicyClient) UpdateAuthorizationPolicyStatus(ctx context.Context, obj *v10.AuthorizationPolicy, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateAuthorizationPolicyStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateAuthorizationPolicyStatus indicates an expected call of UpdateAuthorizationPolicyStatus.
+func (mr *MockAuthorizationPolicyClientMockRecorder) UpdateAuthorizationPolicyStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAuthorizationPolicyStatus", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).UpdateAuthorizationPolicyStatus), varargs...)
+}
+
+// UpsertAuthorizationPolicy mocks base method.
+func (m *MockAuthorizationPolicyClient) UpsertAuthorizationPolicy(ctx context.Context, obj *v10.AuthorizationPolicy, transitionFuncs ...v1.AuthorizationPolicyTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertAuthorizationPolicy", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertAuthorizationPolicy indicates an expected call of UpsertAuthorizationPolicy.
+func (mr *MockAuthorizationPolicyClientMockRecorder) UpsertAuthorizationPolicy(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertAuthorizationPolicy", reflect.TypeOf((*MockAuthorizationPolicyClient)(nil).UpsertAuthorizationPolicy), varargs...)
+}
+
+// MockMulticlusterAuthorizationPolicyClient is a mock of MulticlusterAuthorizationPolicyClient interface.
+type MockMulticlusterAuthorizationPolicyClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterAuthorizationPolicyClientMockRecorder
+}
+
+// MockMulticlusterAuthorizationPolicyClientMockRecorder is the mock recorder for MockMulticlusterAuthorizationPolicyClient.
+type MockMulticlusterAuthorizationPolicyClientMockRecorder struct {
+	mock *MockMulticlusterAuthorizationPolicyClient
+}
+
+// NewMockMulticlusterAuthorizationPolicyClient creates a new mock instance.
+func NewMockMulticlusterAuthorizationPolicyClient(ctrl *gomock.Controller) *MockMulticlusterAuthorizationPolicyClient {
+	mock := &MockMulticlusterAuthorizationPolicyClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterAuthorizationPolicyClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterAuthorizationPolicyClient) EXPECT() *MockMulticlusterAuthorizationPolicyClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterAuthorizationPolicyClient) Cluster(cluster string) (v1.AuthorizationPolicyClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.AuthorizationPolicyClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterAuthorizationPolicyClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterAuthorizationPolicyClient)(nil).Cluster), cluster)
+}
+
+// MockPeerAuthenticationReader is a mock of PeerAuthenticationReader interface.
+type MockPeerAuthenticationReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationReaderMockRecorder
+}
+
+// MockPeerAuthenticationReaderMockRecorder is the mock recorder for MockPeerAuthenticationReader.
+type MockPeerAuthenticationReaderMockRecorder struct {
+	mock *MockPeerAuthenticationReader
+}
+
+// NewMockPeerAuthenticationReader creates a new mock instance.
+func NewMockPeerAuthenticationReader(ctrl *gomock.Controller) *MockPeerAuthenticationReader {
+	mock := &MockPeerAuthenticationReader{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationReader) EXPECT() *MockPeerAuthenticationReaderMockRecorder {
+	return m.recorder
+}
+
+// GetPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationReader) GetPeerAuthentication(ctx context.Context, key client.ObjectKey) (*v10.PeerAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetPeerAuthentication", ctx, key)
+	ret0, _ := ret[0].(*v10.PeerAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetPeerAuthentication indicates an expected call of GetPeerAuthentication.
+func (mr *MockPeerAuthenticationReaderMockRecorder) GetPeerAuthentication(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationReader)(nil).GetPeerAuthentication), ctx, key)
+}
+
+// ListPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationReader) ListPeerAuthentication(ctx context.Context, opts ...client.ListOption) (*v10.PeerAuthenticationList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(*v10.PeerAuthenticationList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListPeerAuthentication indicates an expected call of ListPeerAuthentication.
+func (mr *MockPeerAuthenticationReaderMockRecorder) ListPeerAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationReader)(nil).ListPeerAuthentication), varargs...)
+}
+
+// MockPeerAuthenticationWriter is a mock of PeerAuthenticationWriter interface.
+type MockPeerAuthenticationWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationWriterMockRecorder
+}
+
+// MockPeerAuthenticationWriterMockRecorder is the mock recorder for MockPeerAuthenticationWriter.
+type MockPeerAuthenticationWriterMockRecorder struct {
+	mock *MockPeerAuthenticationWriter
+}
+
+// NewMockPeerAuthenticationWriter creates a new mock instance.
+func NewMockPeerAuthenticationWriter(ctrl *gomock.Controller) *MockPeerAuthenticationWriter {
+	mock := &MockPeerAuthenticationWriter{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationWriter) EXPECT() *MockPeerAuthenticationWriterMockRecorder {
+	return m.recorder
+}
+
+// CreatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) CreatePeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreatePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreatePeerAuthentication indicates an expected call of CreatePeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) CreatePeerAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).CreatePeerAuthentication), varargs...)
+}
+
+// DeleteAllOfPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) DeleteAllOfPeerAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfPeerAuthentication indicates an expected call of DeleteAllOfPeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) DeleteAllOfPeerAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).DeleteAllOfPeerAuthentication), varargs...)
+}
+
+// DeletePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) DeletePeerAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeletePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeletePeerAuthentication indicates an expected call of DeletePeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) DeletePeerAuthentication(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).DeletePeerAuthentication), varargs...)
+}
+
+// PatchPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) PatchPeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchPeerAuthentication indicates an expected call of PatchPeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) PatchPeerAuthentication(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).PatchPeerAuthentication), varargs...)
+}
+
+// UpdatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) UpdatePeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdatePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdatePeerAuthentication indicates an expected call of UpdatePeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) UpdatePeerAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).UpdatePeerAuthentication), varargs...)
+}
+
+// UpsertPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationWriter) UpsertPeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, transitionFuncs ...v1.PeerAuthenticationTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertPeerAuthentication indicates an expected call of UpsertPeerAuthentication.
+func (mr *MockPeerAuthenticationWriterMockRecorder) UpsertPeerAuthentication(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationWriter)(nil).UpsertPeerAuthentication), varargs...)
+}
+
+// MockPeerAuthenticationStatusWriter is a mock of PeerAuthenticationStatusWriter interface.
+type MockPeerAuthenticationStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationStatusWriterMockRecorder
+}
+
+// MockPeerAuthenticationStatusWriterMockRecorder is the mock recorder for MockPeerAuthenticationStatusWriter.
+type MockPeerAuthenticationStatusWriterMockRecorder struct {
+	mock *MockPeerAuthenticationStatusWriter
+}
+
+// NewMockPeerAuthenticationStatusWriter creates a new mock instance.
+func NewMockPeerAuthenticationStatusWriter(ctrl *gomock.Controller) *MockPeerAuthenticationStatusWriter {
+	mock := &MockPeerAuthenticationStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationStatusWriter) EXPECT() *MockPeerAuthenticationStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchPeerAuthenticationStatus mocks base method.
+func (m *MockPeerAuthenticationStatusWriter) PatchPeerAuthenticationStatus(ctx context.Context, obj *v10.PeerAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchPeerAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchPeerAuthenticationStatus indicates an expected call of PatchPeerAuthenticationStatus.
+func (mr *MockPeerAuthenticationStatusWriterMockRecorder) PatchPeerAuthenticationStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchPeerAuthenticationStatus", reflect.TypeOf((*MockPeerAuthenticationStatusWriter)(nil).PatchPeerAuthenticationStatus), varargs...)
+}
+
+// UpdatePeerAuthenticationStatus mocks base method.
+func (m *MockPeerAuthenticationStatusWriter) UpdatePeerAuthenticationStatus(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdatePeerAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdatePeerAuthenticationStatus indicates an expected call of UpdatePeerAuthenticationStatus.
+func (mr *MockPeerAuthenticationStatusWriterMockRecorder) UpdatePeerAuthenticationStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdatePeerAuthenticationStatus", reflect.TypeOf((*MockPeerAuthenticationStatusWriter)(nil).UpdatePeerAuthenticationStatus), varargs...)
+}
+
+// MockPeerAuthenticationClient is a mock of PeerAuthenticationClient interface.
+type MockPeerAuthenticationClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationClientMockRecorder
+}
+
+// MockPeerAuthenticationClientMockRecorder is the mock recorder for MockPeerAuthenticationClient.
+type MockPeerAuthenticationClientMockRecorder struct {
+	mock *MockPeerAuthenticationClient
+}
+
+// NewMockPeerAuthenticationClient creates a new mock instance.
+func NewMockPeerAuthenticationClient(ctrl *gomock.Controller) *MockPeerAuthenticationClient {
+	mock := &MockPeerAuthenticationClient{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationClient) EXPECT() *MockPeerAuthenticationClientMockRecorder {
+	return m.recorder
+}
+
+// CreatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) CreatePeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreatePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreatePeerAuthentication indicates an expected call of CreatePeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) CreatePeerAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).CreatePeerAuthentication), varargs...)
+}
+
+// DeleteAllOfPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) DeleteAllOfPeerAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfPeerAuthentication indicates an expected call of DeleteAllOfPeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) DeleteAllOfPeerAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).DeleteAllOfPeerAuthentication), varargs...)
+}
+
+// DeletePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) DeletePeerAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeletePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeletePeerAuthentication indicates an expected call of DeletePeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) DeletePeerAuthentication(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).DeletePeerAuthentication), varargs...)
+}
+
+// GetPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) GetPeerAuthentication(ctx context.Context, key client.ObjectKey) (*v10.PeerAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetPeerAuthentication", ctx, key)
+	ret0, _ := ret[0].(*v10.PeerAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetPeerAuthentication indicates an expected call of GetPeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) GetPeerAuthentication(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).GetPeerAuthentication), ctx, key)
+}
+
+// ListPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) ListPeerAuthentication(ctx context.Context, opts ...client.ListOption) (*v10.PeerAuthenticationList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(*v10.PeerAuthenticationList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListPeerAuthentication indicates an expected call of ListPeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) ListPeerAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).ListPeerAuthentication), varargs...)
+}
+
+// PatchPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) PatchPeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchPeerAuthentication indicates an expected call of PatchPeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) PatchPeerAuthentication(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).PatchPeerAuthentication), varargs...)
+}
+
+// PatchPeerAuthenticationStatus mocks base method.
+func (m *MockPeerAuthenticationClient) PatchPeerAuthenticationStatus(ctx context.Context, obj *v10.PeerAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchPeerAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchPeerAuthenticationStatus indicates an expected call of PatchPeerAuthenticationStatus.
+func (mr *MockPeerAuthenticationClientMockRecorder) PatchPeerAuthenticationStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchPeerAuthenticationStatus", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).PatchPeerAuthenticationStatus), varargs...)
+}
+
+// UpdatePeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) UpdatePeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdatePeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdatePeerAuthentication indicates an expected call of UpdatePeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) UpdatePeerAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdatePeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).UpdatePeerAuthentication), varargs...)
+}
+
+// UpdatePeerAuthenticationStatus mocks base method.
+func (m *MockPeerAuthenticationClient) UpdatePeerAuthenticationStatus(ctx context.Context, obj *v10.PeerAuthentication, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdatePeerAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdatePeerAuthenticationStatus indicates an expected call of UpdatePeerAuthenticationStatus.
+func (mr *MockPeerAuthenticationClientMockRecorder) UpdatePeerAuthenticationStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdatePeerAuthenticationStatus", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).UpdatePeerAuthenticationStatus), varargs...)
+}
+
+// UpsertPeerAuthentication mocks base method.
+func (m *MockPeerAuthenticationClient) UpsertPeerAuthentication(ctx context.Context, obj *v10.PeerAuthentication, transitionFuncs ...v1.PeerAuthenticationTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertPeerAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertPeerAuthentication indicates an expected call of UpsertPeerAuthentication.
+func (mr *MockPeerAuthenticationClientMockRecorder) UpsertPeerAuthentication(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertPeerAuthentication", reflect.TypeOf((*MockPeerAuthenticationClient)(nil).UpsertPeerAuthentication), varargs...)
+}
+
+// MockMulticlusterPeerAuthenticationClient is a mock of MulticlusterPeerAuthenticationClient interface.
+type MockMulticlusterPeerAuthenticationClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterPeerAuthenticationClientMockRecorder
+}
+
+// MockMulticlusterPeerAuthenticationClientMockRecorder is the mock recorder for MockMulticlusterPeerAuthenticationClient.
+type MockMulticlusterPeerAuthenticationClientMockRecorder struct {
+	mock *MockMulticlusterPeerAuthenticationClient
+}
+
+// NewMockMulticlusterPeerAuthenticationClient creates a new mock instance.
+func NewMockMulticlusterPeerAuthenticationClient(ctrl *gomock.Controller) *MockMulticlusterPeerAuthenticationClient {
+	mock := &MockMulticlusterPeerAuthenticationClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterPeerAuthenticationClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterPeerAuthenticationClient) EXPECT() *MockMulticlusterPeerAuthenticationClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterPeerAuthenticationClient) Cluster(cluster string) (v1.PeerAuthenticationClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.PeerAuthenticationClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterPeerAuthenticationClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterPeerAuthenticationClient)(nil).Cluster), cluster)
+}
+
+// MockRequestAuthenticationReader is a mock of RequestAuthenticationReader interface.
+type MockRequestAuthenticationReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationReaderMockRecorder
+}
+
+// MockRequestAuthenticationReaderMockRecorder is the mock recorder for MockRequestAuthenticationReader.
+type MockRequestAuthenticationReaderMockRecorder struct {
+	mock *MockRequestAuthenticationReader
+}
+
+// NewMockRequestAuthenticationReader creates a new mock instance.
+func NewMockRequestAuthenticationReader(ctrl *gomock.Controller) *MockRequestAuthenticationReader {
+	mock := &MockRequestAuthenticationReader{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationReader) EXPECT() *MockRequestAuthenticationReaderMockRecorder {
+	return m.recorder
+}
+
+// GetRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationReader) GetRequestAuthentication(ctx context.Context, key client.ObjectKey) (*v10.RequestAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetRequestAuthentication", ctx, key)
+	ret0, _ := ret[0].(*v10.RequestAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetRequestAuthentication indicates an expected call of GetRequestAuthentication.
+func (mr *MockRequestAuthenticationReaderMockRecorder) GetRequestAuthentication(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationReader)(nil).GetRequestAuthentication), ctx, key)
+}
+
+// ListRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationReader) ListRequestAuthentication(ctx context.Context, opts ...client.ListOption) (*v10.RequestAuthenticationList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(*v10.RequestAuthenticationList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListRequestAuthentication indicates an expected call of ListRequestAuthentication.
+func (mr *MockRequestAuthenticationReaderMockRecorder) ListRequestAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationReader)(nil).ListRequestAuthentication), varargs...)
+}
+
+// MockRequestAuthenticationWriter is a mock of RequestAuthenticationWriter interface.
+type MockRequestAuthenticationWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationWriterMockRecorder
+}
+
+// MockRequestAuthenticationWriterMockRecorder is the mock recorder for MockRequestAuthenticationWriter.
+type MockRequestAuthenticationWriterMockRecorder struct {
+	mock *MockRequestAuthenticationWriter
+}
+
+// NewMockRequestAuthenticationWriter creates a new mock instance.
+func NewMockRequestAuthenticationWriter(ctrl *gomock.Controller) *MockRequestAuthenticationWriter {
+	mock := &MockRequestAuthenticationWriter{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationWriter) EXPECT() *MockRequestAuthenticationWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) CreateRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateRequestAuthentication indicates an expected call of CreateRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) CreateRequestAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).CreateRequestAuthentication), varargs...)
+}
+
+// DeleteAllOfRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) DeleteAllOfRequestAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfRequestAuthentication indicates an expected call of DeleteAllOfRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) DeleteAllOfRequestAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).DeleteAllOfRequestAuthentication), varargs...)
+}
+
+// DeleteRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) DeleteRequestAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteRequestAuthentication indicates an expected call of DeleteRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) DeleteRequestAuthentication(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).DeleteRequestAuthentication), varargs...)
+}
+
+// PatchRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) PatchRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchRequestAuthentication indicates an expected call of PatchRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) PatchRequestAuthentication(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).PatchRequestAuthentication), varargs...)
+}
+
+// UpdateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) UpdateRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateRequestAuthentication indicates an expected call of UpdateRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) UpdateRequestAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).UpdateRequestAuthentication), varargs...)
+}
+
+// UpsertRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationWriter) UpsertRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, transitionFuncs ...v1.RequestAuthenticationTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertRequestAuthentication indicates an expected call of UpsertRequestAuthentication.
+func (mr *MockRequestAuthenticationWriterMockRecorder) UpsertRequestAuthentication(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationWriter)(nil).UpsertRequestAuthentication), varargs...)
+}
+
+// MockRequestAuthenticationStatusWriter is a mock of RequestAuthenticationStatusWriter interface.
+type MockRequestAuthenticationStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationStatusWriterMockRecorder
+}
+
+// MockRequestAuthenticationStatusWriterMockRecorder is the mock recorder for MockRequestAuthenticationStatusWriter.
+type MockRequestAuthenticationStatusWriterMockRecorder struct {
+	mock *MockRequestAuthenticationStatusWriter
+}
+
+// NewMockRequestAuthenticationStatusWriter creates a new mock instance.
+func NewMockRequestAuthenticationStatusWriter(ctrl *gomock.Controller) *MockRequestAuthenticationStatusWriter {
+	mock := &MockRequestAuthenticationStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationStatusWriter) EXPECT() *MockRequestAuthenticationStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchRequestAuthenticationStatus mocks base method.
+func (m *MockRequestAuthenticationStatusWriter) PatchRequestAuthenticationStatus(ctx context.Context, obj *v10.RequestAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchRequestAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchRequestAuthenticationStatus indicates an expected call of PatchRequestAuthenticationStatus.
+func (mr *MockRequestAuthenticationStatusWriterMockRecorder) PatchRequestAuthenticationStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchRequestAuthenticationStatus", reflect.TypeOf((*MockRequestAuthenticationStatusWriter)(nil).PatchRequestAuthenticationStatus), varargs...)
+}
+
+// UpdateRequestAuthenticationStatus mocks base method.
+func (m *MockRequestAuthenticationStatusWriter) UpdateRequestAuthenticationStatus(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateRequestAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateRequestAuthenticationStatus indicates an expected call of UpdateRequestAuthenticationStatus.
+func (mr *MockRequestAuthenticationStatusWriterMockRecorder) UpdateRequestAuthenticationStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequestAuthenticationStatus", reflect.TypeOf((*MockRequestAuthenticationStatusWriter)(nil).UpdateRequestAuthenticationStatus), varargs...)
+}
+
+// MockRequestAuthenticationClient is a mock of RequestAuthenticationClient interface.
+type MockRequestAuthenticationClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationClientMockRecorder
+}
+
+// MockRequestAuthenticationClientMockRecorder is the mock recorder for MockRequestAuthenticationClient.
+type MockRequestAuthenticationClientMockRecorder struct {
+	mock *MockRequestAuthenticationClient
+}
+
+// NewMockRequestAuthenticationClient creates a new mock instance.
+func NewMockRequestAuthenticationClient(ctrl *gomock.Controller) *MockRequestAuthenticationClient {
+	mock := &MockRequestAuthenticationClient{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationClient) EXPECT() *MockRequestAuthenticationClientMockRecorder {
+	return m.recorder
+}
+
+// CreateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) CreateRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateRequestAuthentication indicates an expected call of CreateRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) CreateRequestAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).CreateRequestAuthentication), varargs...)
+}
+
+// DeleteAllOfRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) DeleteAllOfRequestAuthentication(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfRequestAuthentication indicates an expected call of DeleteAllOfRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) DeleteAllOfRequestAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).DeleteAllOfRequestAuthentication), varargs...)
+}
+
+// DeleteRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) DeleteRequestAuthentication(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteRequestAuthentication indicates an expected call of DeleteRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) DeleteRequestAuthentication(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).DeleteRequestAuthentication), varargs...)
+}
+
+// GetRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) GetRequestAuthentication(ctx context.Context, key client.ObjectKey) (*v10.RequestAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetRequestAuthentication", ctx, key)
+	ret0, _ := ret[0].(*v10.RequestAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetRequestAuthentication indicates an expected call of GetRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) GetRequestAuthentication(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).GetRequestAuthentication), ctx, key)
+}
+
+// ListRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) ListRequestAuthentication(ctx context.Context, opts ...client.ListOption) (*v10.RequestAuthenticationList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(*v10.RequestAuthenticationList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListRequestAuthentication indicates an expected call of ListRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) ListRequestAuthentication(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).ListRequestAuthentication), varargs...)
+}
+
+// PatchRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) PatchRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchRequestAuthentication indicates an expected call of PatchRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) PatchRequestAuthentication(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).PatchRequestAuthentication), varargs...)
+}
+
+// PatchRequestAuthenticationStatus mocks base method.
+func (m *MockRequestAuthenticationClient) PatchRequestAuthenticationStatus(ctx context.Context, obj *v10.RequestAuthentication, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchRequestAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchRequestAuthenticationStatus indicates an expected call of PatchRequestAuthenticationStatus.
+func (mr *MockRequestAuthenticationClientMockRecorder) PatchRequestAuthenticationStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchRequestAuthenticationStatus", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).PatchRequestAuthenticationStatus), varargs...)
+}
+
+// UpdateRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) UpdateRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateRequestAuthentication indicates an expected call of UpdateRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) UpdateRequestAuthentication(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).UpdateRequestAuthentication), varargs...)
+}
+
+// UpdateRequestAuthenticationStatus mocks base method.
+func (m *MockRequestAuthenticationClient) UpdateRequestAuthenticationStatus(ctx context.Context, obj *v10.RequestAuthentication, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateRequestAuthenticationStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateRequestAuthenticationStatus indicates an expected call of UpdateRequestAuthenticationStatus.
+func (mr *MockRequestAuthenticationClientMockRecorder) UpdateRequestAuthenticationStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequestAuthenticationStatus", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).UpdateRequestAuthenticationStatus), varargs...)
+}
+
+// UpsertRequestAuthentication mocks base method.
+func (m *MockRequestAuthenticationClient) UpsertRequestAuthentication(ctx context.Context, obj *v10.RequestAuthentication, transitionFuncs ...v1.RequestAuthenticationTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertRequestAuthentication", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertRequestAuthentication indicates an expected call of UpsertRequestAuthentication.
+func (mr *MockRequestAuthenticationClientMockRecorder) UpsertRequestAuthentication(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertRequestAuthentication", reflect.TypeOf((*MockRequestAuthenticationClient)(nil).UpsertRequestAuthentication), varargs...)
+}
+
+// MockMulticlusterRequestAuthenticationClient is a mock of MulticlusterRequestAuthenticationClient interface.
+type MockMulticlusterRequestAuthenticationClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterRequestAuthenticationClientMockRecorder
+}
+
+// MockMulticlusterRequestAuthenticationClientMockRecorder is the mock recorder for MockMulticlusterRequestAuthenticationClient.
+type MockMulticlusterRequestAuthenticationClientMockRecorder struct {
+	mock *MockMulticlusterRequestAuthenticationClient
+}
+
+// NewMockMulticlusterRequestAuthenticationClient creates a new mock instance.
+func NewMockMulticlusterRequestAuthenticationClient(ctrl *gomock.Controller) *MockMulticlusterRequestAuthenticationClient {
+	mock := &MockMulticlusterRequestAuthenticationClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterRequestAuthenticationClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterRequestAuthenticationClient) EXPECT() *MockMulticlusterRequestAuthenticationClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterRequestAuthenticationClient) Cluster(cluster string) (v1.RequestAuthenticationClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.RequestAuthenticationClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterRequestAuthenticationClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterRequestAuthenticationClient)(nil).Cluster), cluster)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/providers/client_providers.go b/pkg/api/istio/security.istio.io/v1/providers/client_providers.go
new file mode 100644
index 0000000..ed743b6
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/providers/client_providers.go
@@ -0,0 +1,102 @@
+// Code generated by skv2. DO NOT EDIT.
+
+package v1
+
+import (
+	security_istio_io_v1 "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1"
+
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+/*
+  The intention of these providers are to be used for Mocking.
+  They expose the Clients as interfaces, as well as factories to provide mocked versions
+  of the clients when they require building within a component.
+
+  See package `github.com/solo-io/skv2/pkg/multicluster/register` for example
+*/
+
+// Provider for AuthorizationPolicyClient from Clientset
+func AuthorizationPolicyClientFromClientsetProvider(clients security_istio_io_v1.Clientset) security_istio_io_v1.AuthorizationPolicyClient {
+	return clients.AuthorizationPolicies()
+}
+
+// Provider for AuthorizationPolicy Client from Client
+func AuthorizationPolicyClientProvider(client client.Client) security_istio_io_v1.AuthorizationPolicyClient {
+	return security_istio_io_v1.NewAuthorizationPolicyClient(client)
+}
+
+type AuthorizationPolicyClientFactory func(client client.Client) security_istio_io_v1.AuthorizationPolicyClient
+
+func AuthorizationPolicyClientFactoryProvider() AuthorizationPolicyClientFactory {
+	return AuthorizationPolicyClientProvider
+}
+
+type AuthorizationPolicyClientFromConfigFactory func(cfg *rest.Config) (security_istio_io_v1.AuthorizationPolicyClient, error)
+
+func AuthorizationPolicyClientFromConfigFactoryProvider() AuthorizationPolicyClientFromConfigFactory {
+	return func(cfg *rest.Config) (security_istio_io_v1.AuthorizationPolicyClient, error) {
+		clients, err := security_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.AuthorizationPolicies(), nil
+	}
+}
+
+// Provider for PeerAuthenticationClient from Clientset
+func PeerAuthenticationClientFromClientsetProvider(clients security_istio_io_v1.Clientset) security_istio_io_v1.PeerAuthenticationClient {
+	return clients.PeerAuthentications()
+}
+
+// Provider for PeerAuthentication Client from Client
+func PeerAuthenticationClientProvider(client client.Client) security_istio_io_v1.PeerAuthenticationClient {
+	return security_istio_io_v1.NewPeerAuthenticationClient(client)
+}
+
+type PeerAuthenticationClientFactory func(client client.Client) security_istio_io_v1.PeerAuthenticationClient
+
+func PeerAuthenticationClientFactoryProvider() PeerAuthenticationClientFactory {
+	return PeerAuthenticationClientProvider
+}
+
+type PeerAuthenticationClientFromConfigFactory func(cfg *rest.Config) (security_istio_io_v1.PeerAuthenticationClient, error)
+
+func PeerAuthenticationClientFromConfigFactoryProvider() PeerAuthenticationClientFromConfigFactory {
+	return func(cfg *rest.Config) (security_istio_io_v1.PeerAuthenticationClient, error) {
+		clients, err := security_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.PeerAuthentications(), nil
+	}
+}
+
+// Provider for RequestAuthenticationClient from Clientset
+func RequestAuthenticationClientFromClientsetProvider(clients security_istio_io_v1.Clientset) security_istio_io_v1.RequestAuthenticationClient {
+	return clients.RequestAuthentications()
+}
+
+// Provider for RequestAuthentication Client from Client
+func RequestAuthenticationClientProvider(client client.Client) security_istio_io_v1.RequestAuthenticationClient {
+	return security_istio_io_v1.NewRequestAuthenticationClient(client)
+}
+
+type RequestAuthenticationClientFactory func(client client.Client) security_istio_io_v1.RequestAuthenticationClient
+
+func RequestAuthenticationClientFactoryProvider() RequestAuthenticationClientFactory {
+	return RequestAuthenticationClientProvider
+}
+
+type RequestAuthenticationClientFromConfigFactory func(cfg *rest.Config) (security_istio_io_v1.RequestAuthenticationClient, error)
+
+func RequestAuthenticationClientFromConfigFactoryProvider() RequestAuthenticationClientFromConfigFactory {
+	return func(cfg *rest.Config) (security_istio_io_v1.RequestAuthenticationClient, error) {
+		clients, err := security_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.RequestAuthentications(), nil
+	}
+}
diff --git a/pkg/api/istio/security.istio.io/v1/sets/mocks/sets.go b/pkg/api/istio/security.istio.io/v1/sets/mocks/sets.go
new file mode 100644
index 0000000..408a435
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/sets/mocks/sets.go
@@ -0,0 +1,784 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./sets.go
+
+// Package mock_v1sets is a generated GoMock package.
+package mock_v1sets
+
+import (
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1sets "github.com/solo-io/external-apis/pkg/api/istio/security.istio.io/v1/sets"
+	sets "github.com/solo-io/skv2/contrib/pkg/sets"
+	ezkube "github.com/solo-io/skv2/pkg/ezkube"
+	v1 "istio.io/client-go/pkg/apis/security/v1"
+	sets0 "k8s.io/apimachinery/pkg/util/sets"
+)
+
+// MockAuthorizationPolicySet is a mock of AuthorizationPolicySet interface.
+type MockAuthorizationPolicySet struct {
+	ctrl     *gomock.Controller
+	recorder *MockAuthorizationPolicySetMockRecorder
+}
+
+// MockAuthorizationPolicySetMockRecorder is the mock recorder for MockAuthorizationPolicySet.
+type MockAuthorizationPolicySetMockRecorder struct {
+	mock *MockAuthorizationPolicySet
+}
+
+// NewMockAuthorizationPolicySet creates a new mock instance.
+func NewMockAuthorizationPolicySet(ctrl *gomock.Controller) *MockAuthorizationPolicySet {
+	mock := &MockAuthorizationPolicySet{ctrl: ctrl}
+	mock.recorder = &MockAuthorizationPolicySetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockAuthorizationPolicySet) EXPECT() *MockAuthorizationPolicySetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockAuthorizationPolicySet) Clone() v1sets.AuthorizationPolicySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.AuthorizationPolicySet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockAuthorizationPolicySetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockAuthorizationPolicySet) Delete(authorizationPolicy ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", authorizationPolicy)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockAuthorizationPolicySetMockRecorder) Delete(authorizationPolicy interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Delete), authorizationPolicy)
+}
+
+// Delta mocks base method.
+func (m *MockAuthorizationPolicySet) Delta(newSet v1sets.AuthorizationPolicySet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockAuthorizationPolicySetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockAuthorizationPolicySet) Difference(set v1sets.AuthorizationPolicySet) v1sets.AuthorizationPolicySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.AuthorizationPolicySet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockAuthorizationPolicySetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockAuthorizationPolicySet) Equal(authorizationPolicySet v1sets.AuthorizationPolicySet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", authorizationPolicySet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockAuthorizationPolicySetMockRecorder) Equal(authorizationPolicySet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Equal), authorizationPolicySet)
+}
+
+// Find mocks base method.
+func (m *MockAuthorizationPolicySet) Find(id ezkube.ResourceId) (*v1.AuthorizationPolicy, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.AuthorizationPolicy)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockAuthorizationPolicySetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockAuthorizationPolicySet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockAuthorizationPolicySetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockAuthorizationPolicySet) Has(authorizationPolicy ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", authorizationPolicy)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockAuthorizationPolicySetMockRecorder) Has(authorizationPolicy interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Has), authorizationPolicy)
+}
+
+// Insert mocks base method.
+func (m *MockAuthorizationPolicySet) Insert(authorizationPolicy ...*v1.AuthorizationPolicy) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range authorizationPolicy {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockAuthorizationPolicySetMockRecorder) Insert(authorizationPolicy ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Insert), authorizationPolicy...)
+}
+
+// Intersection mocks base method.
+func (m *MockAuthorizationPolicySet) Intersection(set v1sets.AuthorizationPolicySet) v1sets.AuthorizationPolicySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.AuthorizationPolicySet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockAuthorizationPolicySetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockAuthorizationPolicySet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockAuthorizationPolicySetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockAuthorizationPolicySet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockAuthorizationPolicySetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockAuthorizationPolicySet) List(filterResource ...func(*v1.AuthorizationPolicy) bool) []*v1.AuthorizationPolicy {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.AuthorizationPolicy)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockAuthorizationPolicySetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockAuthorizationPolicySet) Map() map[string]*v1.AuthorizationPolicy {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.AuthorizationPolicy)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockAuthorizationPolicySetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockAuthorizationPolicySet) Union(set v1sets.AuthorizationPolicySet) v1sets.AuthorizationPolicySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.AuthorizationPolicySet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockAuthorizationPolicySetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockAuthorizationPolicySet) UnsortedList(filterResource ...func(*v1.AuthorizationPolicy) bool) []*v1.AuthorizationPolicy {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.AuthorizationPolicy)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockAuthorizationPolicySetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockAuthorizationPolicySet)(nil).UnsortedList), filterResource...)
+}
+
+// MockPeerAuthenticationSet is a mock of PeerAuthenticationSet interface.
+type MockPeerAuthenticationSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockPeerAuthenticationSetMockRecorder
+}
+
+// MockPeerAuthenticationSetMockRecorder is the mock recorder for MockPeerAuthenticationSet.
+type MockPeerAuthenticationSetMockRecorder struct {
+	mock *MockPeerAuthenticationSet
+}
+
+// NewMockPeerAuthenticationSet creates a new mock instance.
+func NewMockPeerAuthenticationSet(ctrl *gomock.Controller) *MockPeerAuthenticationSet {
+	mock := &MockPeerAuthenticationSet{ctrl: ctrl}
+	mock.recorder = &MockPeerAuthenticationSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockPeerAuthenticationSet) EXPECT() *MockPeerAuthenticationSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockPeerAuthenticationSet) Clone() v1sets.PeerAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.PeerAuthenticationSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockPeerAuthenticationSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockPeerAuthenticationSet) Delete(peerAuthentication ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", peerAuthentication)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockPeerAuthenticationSetMockRecorder) Delete(peerAuthentication interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Delete), peerAuthentication)
+}
+
+// Delta mocks base method.
+func (m *MockPeerAuthenticationSet) Delta(newSet v1sets.PeerAuthenticationSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockPeerAuthenticationSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockPeerAuthenticationSet) Difference(set v1sets.PeerAuthenticationSet) v1sets.PeerAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.PeerAuthenticationSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockPeerAuthenticationSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockPeerAuthenticationSet) Equal(peerAuthenticationSet v1sets.PeerAuthenticationSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", peerAuthenticationSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockPeerAuthenticationSetMockRecorder) Equal(peerAuthenticationSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Equal), peerAuthenticationSet)
+}
+
+// Find mocks base method.
+func (m *MockPeerAuthenticationSet) Find(id ezkube.ResourceId) (*v1.PeerAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.PeerAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockPeerAuthenticationSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockPeerAuthenticationSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockPeerAuthenticationSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockPeerAuthenticationSet) Has(peerAuthentication ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", peerAuthentication)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockPeerAuthenticationSetMockRecorder) Has(peerAuthentication interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Has), peerAuthentication)
+}
+
+// Insert mocks base method.
+func (m *MockPeerAuthenticationSet) Insert(peerAuthentication ...*v1.PeerAuthentication) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range peerAuthentication {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockPeerAuthenticationSetMockRecorder) Insert(peerAuthentication ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Insert), peerAuthentication...)
+}
+
+// Intersection mocks base method.
+func (m *MockPeerAuthenticationSet) Intersection(set v1sets.PeerAuthenticationSet) v1sets.PeerAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.PeerAuthenticationSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockPeerAuthenticationSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockPeerAuthenticationSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockPeerAuthenticationSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockPeerAuthenticationSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockPeerAuthenticationSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockPeerAuthenticationSet) List(filterResource ...func(*v1.PeerAuthentication) bool) []*v1.PeerAuthentication {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.PeerAuthentication)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockPeerAuthenticationSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockPeerAuthenticationSet) Map() map[string]*v1.PeerAuthentication {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.PeerAuthentication)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockPeerAuthenticationSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockPeerAuthenticationSet) Union(set v1sets.PeerAuthenticationSet) v1sets.PeerAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.PeerAuthenticationSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockPeerAuthenticationSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockPeerAuthenticationSet) UnsortedList(filterResource ...func(*v1.PeerAuthentication) bool) []*v1.PeerAuthentication {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.PeerAuthentication)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockPeerAuthenticationSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockPeerAuthenticationSet)(nil).UnsortedList), filterResource...)
+}
+
+// MockRequestAuthenticationSet is a mock of RequestAuthenticationSet interface.
+type MockRequestAuthenticationSet struct {
+	ctrl     *gomock.Controller
+	recorder *MockRequestAuthenticationSetMockRecorder
+}
+
+// MockRequestAuthenticationSetMockRecorder is the mock recorder for MockRequestAuthenticationSet.
+type MockRequestAuthenticationSetMockRecorder struct {
+	mock *MockRequestAuthenticationSet
+}
+
+// NewMockRequestAuthenticationSet creates a new mock instance.
+func NewMockRequestAuthenticationSet(ctrl *gomock.Controller) *MockRequestAuthenticationSet {
+	mock := &MockRequestAuthenticationSet{ctrl: ctrl}
+	mock.recorder = &MockRequestAuthenticationSetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockRequestAuthenticationSet) EXPECT() *MockRequestAuthenticationSetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockRequestAuthenticationSet) Clone() v1sets.RequestAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.RequestAuthenticationSet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockRequestAuthenticationSetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockRequestAuthenticationSet) Delete(requestAuthentication ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", requestAuthentication)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockRequestAuthenticationSetMockRecorder) Delete(requestAuthentication interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Delete), requestAuthentication)
+}
+
+// Delta mocks base method.
+func (m *MockRequestAuthenticationSet) Delta(newSet v1sets.RequestAuthenticationSet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockRequestAuthenticationSetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockRequestAuthenticationSet) Difference(set v1sets.RequestAuthenticationSet) v1sets.RequestAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.RequestAuthenticationSet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockRequestAuthenticationSetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockRequestAuthenticationSet) Equal(requestAuthenticationSet v1sets.RequestAuthenticationSet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", requestAuthenticationSet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockRequestAuthenticationSetMockRecorder) Equal(requestAuthenticationSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Equal), requestAuthenticationSet)
+}
+
+// Find mocks base method.
+func (m *MockRequestAuthenticationSet) Find(id ezkube.ResourceId) (*v1.RequestAuthentication, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.RequestAuthentication)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockRequestAuthenticationSetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockRequestAuthenticationSet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockRequestAuthenticationSetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockRequestAuthenticationSet) Has(requestAuthentication ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", requestAuthentication)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockRequestAuthenticationSetMockRecorder) Has(requestAuthentication interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Has), requestAuthentication)
+}
+
+// Insert mocks base method.
+func (m *MockRequestAuthenticationSet) Insert(requestAuthentication ...*v1.RequestAuthentication) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range requestAuthentication {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockRequestAuthenticationSetMockRecorder) Insert(requestAuthentication ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Insert), requestAuthentication...)
+}
+
+// Intersection mocks base method.
+func (m *MockRequestAuthenticationSet) Intersection(set v1sets.RequestAuthenticationSet) v1sets.RequestAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.RequestAuthenticationSet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockRequestAuthenticationSetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockRequestAuthenticationSet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockRequestAuthenticationSetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockRequestAuthenticationSet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockRequestAuthenticationSetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockRequestAuthenticationSet) List(filterResource ...func(*v1.RequestAuthentication) bool) []*v1.RequestAuthentication {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.RequestAuthentication)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockRequestAuthenticationSetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockRequestAuthenticationSet) Map() map[string]*v1.RequestAuthentication {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.RequestAuthentication)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockRequestAuthenticationSetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockRequestAuthenticationSet) Union(set v1sets.RequestAuthenticationSet) v1sets.RequestAuthenticationSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.RequestAuthenticationSet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockRequestAuthenticationSetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockRequestAuthenticationSet) UnsortedList(filterResource ...func(*v1.RequestAuthentication) bool) []*v1.RequestAuthentication {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.RequestAuthentication)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockRequestAuthenticationSetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockRequestAuthenticationSet)(nil).UnsortedList), filterResource...)
+}
diff --git a/pkg/api/istio/security.istio.io/v1/sets/sets.go b/pkg/api/istio/security.istio.io/v1/sets/sets.go
new file mode 100644
index 0000000..d9fb467
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/sets/sets.go
@@ -0,0 +1,683 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./sets.go -destination mocks/sets.go
+
+package v1sets
+
+import (
+	security_istio_io_v1 "istio.io/client-go/pkg/apis/security/v1"
+
+	"github.com/rotisserie/eris"
+	sksets "github.com/solo-io/skv2/contrib/pkg/sets"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+type AuthorizationPolicySet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*security_istio_io_v1.AuthorizationPolicy) bool) []*security_istio_io_v1.AuthorizationPolicy
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*security_istio_io_v1.AuthorizationPolicy) bool) []*security_istio_io_v1.AuthorizationPolicy
+	// Return the Set as a map of key to resource.
+	Map() map[string]*security_istio_io_v1.AuthorizationPolicy
+	// Insert a resource into the set.
+	Insert(authorizationPolicy ...*security_istio_io_v1.AuthorizationPolicy)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(authorizationPolicySet AuthorizationPolicySet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(authorizationPolicy ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(authorizationPolicy ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set AuthorizationPolicySet) AuthorizationPolicySet
+	// Return the difference with the provided set
+	Difference(set AuthorizationPolicySet) AuthorizationPolicySet
+	// Return the intersection with the provided set
+	Intersection(set AuthorizationPolicySet) AuthorizationPolicySet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*security_istio_io_v1.AuthorizationPolicy, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another AuthorizationPolicySet
+	Delta(newSet AuthorizationPolicySet) sksets.ResourceDelta
+	// Create a deep copy of the current AuthorizationPolicySet
+	Clone() AuthorizationPolicySet
+}
+
+func makeGenericAuthorizationPolicySet(authorizationPolicyList []*security_istio_io_v1.AuthorizationPolicy) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range authorizationPolicyList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type authorizationPolicySet struct {
+	set sksets.ResourceSet
+}
+
+func NewAuthorizationPolicySet(authorizationPolicyList ...*security_istio_io_v1.AuthorizationPolicy) AuthorizationPolicySet {
+	return &authorizationPolicySet{set: makeGenericAuthorizationPolicySet(authorizationPolicyList)}
+}
+
+func NewAuthorizationPolicySetFromList(authorizationPolicyList *security_istio_io_v1.AuthorizationPolicyList) AuthorizationPolicySet {
+	list := make([]*security_istio_io_v1.AuthorizationPolicy, 0, len(authorizationPolicyList.Items))
+	for idx := range authorizationPolicyList.Items {
+		list = append(list, authorizationPolicyList.Items[idx])
+	}
+	return &authorizationPolicySet{set: makeGenericAuthorizationPolicySet(list)}
+}
+
+func (s *authorizationPolicySet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *authorizationPolicySet) List(filterResource ...func(*security_istio_io_v1.AuthorizationPolicy) bool) []*security_istio_io_v1.AuthorizationPolicy {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.AuthorizationPolicy))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	authorizationPolicyList := make([]*security_istio_io_v1.AuthorizationPolicy, 0, len(objs))
+	for _, obj := range objs {
+		authorizationPolicyList = append(authorizationPolicyList, obj.(*security_istio_io_v1.AuthorizationPolicy))
+	}
+	return authorizationPolicyList
+}
+
+func (s *authorizationPolicySet) UnsortedList(filterResource ...func(*security_istio_io_v1.AuthorizationPolicy) bool) []*security_istio_io_v1.AuthorizationPolicy {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.AuthorizationPolicy))
+		})
+	}
+
+	var authorizationPolicyList []*security_istio_io_v1.AuthorizationPolicy
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		authorizationPolicyList = append(authorizationPolicyList, obj.(*security_istio_io_v1.AuthorizationPolicy))
+	}
+	return authorizationPolicyList
+}
+
+func (s *authorizationPolicySet) Map() map[string]*security_istio_io_v1.AuthorizationPolicy {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*security_istio_io_v1.AuthorizationPolicy{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*security_istio_io_v1.AuthorizationPolicy)
+	}
+	return newMap
+}
+
+func (s *authorizationPolicySet) Insert(
+	authorizationPolicyList ...*security_istio_io_v1.AuthorizationPolicy,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range authorizationPolicyList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *authorizationPolicySet) Has(authorizationPolicy ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(authorizationPolicy)
+}
+
+func (s *authorizationPolicySet) Equal(
+	authorizationPolicySet AuthorizationPolicySet,
+) bool {
+	if s == nil {
+		return authorizationPolicySet == nil
+	}
+	return s.Generic().Equal(authorizationPolicySet.Generic())
+}
+
+func (s *authorizationPolicySet) Delete(AuthorizationPolicy ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(AuthorizationPolicy)
+}
+
+func (s *authorizationPolicySet) Union(set AuthorizationPolicySet) AuthorizationPolicySet {
+	if s == nil {
+		return set
+	}
+	return NewAuthorizationPolicySet(append(s.List(), set.List()...)...)
+}
+
+func (s *authorizationPolicySet) Difference(set AuthorizationPolicySet) AuthorizationPolicySet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &authorizationPolicySet{set: newSet}
+}
+
+func (s *authorizationPolicySet) Intersection(set AuthorizationPolicySet) AuthorizationPolicySet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var authorizationPolicyList []*security_istio_io_v1.AuthorizationPolicy
+	for _, obj := range newSet.List() {
+		authorizationPolicyList = append(authorizationPolicyList, obj.(*security_istio_io_v1.AuthorizationPolicy))
+	}
+	return NewAuthorizationPolicySet(authorizationPolicyList...)
+}
+
+func (s *authorizationPolicySet) Find(id ezkube.ResourceId) (*security_istio_io_v1.AuthorizationPolicy, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find AuthorizationPolicy %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&security_istio_io_v1.AuthorizationPolicy{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*security_istio_io_v1.AuthorizationPolicy), nil
+}
+
+func (s *authorizationPolicySet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *authorizationPolicySet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *authorizationPolicySet) Delta(newSet AuthorizationPolicySet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *authorizationPolicySet) Clone() AuthorizationPolicySet {
+	if s == nil {
+		return nil
+	}
+	return &authorizationPolicySet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type PeerAuthenticationSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*security_istio_io_v1.PeerAuthentication) bool) []*security_istio_io_v1.PeerAuthentication
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*security_istio_io_v1.PeerAuthentication) bool) []*security_istio_io_v1.PeerAuthentication
+	// Return the Set as a map of key to resource.
+	Map() map[string]*security_istio_io_v1.PeerAuthentication
+	// Insert a resource into the set.
+	Insert(peerAuthentication ...*security_istio_io_v1.PeerAuthentication)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(peerAuthenticationSet PeerAuthenticationSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(peerAuthentication ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(peerAuthentication ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set PeerAuthenticationSet) PeerAuthenticationSet
+	// Return the difference with the provided set
+	Difference(set PeerAuthenticationSet) PeerAuthenticationSet
+	// Return the intersection with the provided set
+	Intersection(set PeerAuthenticationSet) PeerAuthenticationSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*security_istio_io_v1.PeerAuthentication, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another PeerAuthenticationSet
+	Delta(newSet PeerAuthenticationSet) sksets.ResourceDelta
+	// Create a deep copy of the current PeerAuthenticationSet
+	Clone() PeerAuthenticationSet
+}
+
+func makeGenericPeerAuthenticationSet(peerAuthenticationList []*security_istio_io_v1.PeerAuthentication) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range peerAuthenticationList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type peerAuthenticationSet struct {
+	set sksets.ResourceSet
+}
+
+func NewPeerAuthenticationSet(peerAuthenticationList ...*security_istio_io_v1.PeerAuthentication) PeerAuthenticationSet {
+	return &peerAuthenticationSet{set: makeGenericPeerAuthenticationSet(peerAuthenticationList)}
+}
+
+func NewPeerAuthenticationSetFromList(peerAuthenticationList *security_istio_io_v1.PeerAuthenticationList) PeerAuthenticationSet {
+	list := make([]*security_istio_io_v1.PeerAuthentication, 0, len(peerAuthenticationList.Items))
+	for idx := range peerAuthenticationList.Items {
+		list = append(list, peerAuthenticationList.Items[idx])
+	}
+	return &peerAuthenticationSet{set: makeGenericPeerAuthenticationSet(list)}
+}
+
+func (s *peerAuthenticationSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *peerAuthenticationSet) List(filterResource ...func(*security_istio_io_v1.PeerAuthentication) bool) []*security_istio_io_v1.PeerAuthentication {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.PeerAuthentication))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	peerAuthenticationList := make([]*security_istio_io_v1.PeerAuthentication, 0, len(objs))
+	for _, obj := range objs {
+		peerAuthenticationList = append(peerAuthenticationList, obj.(*security_istio_io_v1.PeerAuthentication))
+	}
+	return peerAuthenticationList
+}
+
+func (s *peerAuthenticationSet) UnsortedList(filterResource ...func(*security_istio_io_v1.PeerAuthentication) bool) []*security_istio_io_v1.PeerAuthentication {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.PeerAuthentication))
+		})
+	}
+
+	var peerAuthenticationList []*security_istio_io_v1.PeerAuthentication
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		peerAuthenticationList = append(peerAuthenticationList, obj.(*security_istio_io_v1.PeerAuthentication))
+	}
+	return peerAuthenticationList
+}
+
+func (s *peerAuthenticationSet) Map() map[string]*security_istio_io_v1.PeerAuthentication {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*security_istio_io_v1.PeerAuthentication{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*security_istio_io_v1.PeerAuthentication)
+	}
+	return newMap
+}
+
+func (s *peerAuthenticationSet) Insert(
+	peerAuthenticationList ...*security_istio_io_v1.PeerAuthentication,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range peerAuthenticationList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *peerAuthenticationSet) Has(peerAuthentication ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(peerAuthentication)
+}
+
+func (s *peerAuthenticationSet) Equal(
+	peerAuthenticationSet PeerAuthenticationSet,
+) bool {
+	if s == nil {
+		return peerAuthenticationSet == nil
+	}
+	return s.Generic().Equal(peerAuthenticationSet.Generic())
+}
+
+func (s *peerAuthenticationSet) Delete(PeerAuthentication ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(PeerAuthentication)
+}
+
+func (s *peerAuthenticationSet) Union(set PeerAuthenticationSet) PeerAuthenticationSet {
+	if s == nil {
+		return set
+	}
+	return NewPeerAuthenticationSet(append(s.List(), set.List()...)...)
+}
+
+func (s *peerAuthenticationSet) Difference(set PeerAuthenticationSet) PeerAuthenticationSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &peerAuthenticationSet{set: newSet}
+}
+
+func (s *peerAuthenticationSet) Intersection(set PeerAuthenticationSet) PeerAuthenticationSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var peerAuthenticationList []*security_istio_io_v1.PeerAuthentication
+	for _, obj := range newSet.List() {
+		peerAuthenticationList = append(peerAuthenticationList, obj.(*security_istio_io_v1.PeerAuthentication))
+	}
+	return NewPeerAuthenticationSet(peerAuthenticationList...)
+}
+
+func (s *peerAuthenticationSet) Find(id ezkube.ResourceId) (*security_istio_io_v1.PeerAuthentication, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find PeerAuthentication %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&security_istio_io_v1.PeerAuthentication{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*security_istio_io_v1.PeerAuthentication), nil
+}
+
+func (s *peerAuthenticationSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *peerAuthenticationSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *peerAuthenticationSet) Delta(newSet PeerAuthenticationSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *peerAuthenticationSet) Clone() PeerAuthenticationSet {
+	if s == nil {
+		return nil
+	}
+	return &peerAuthenticationSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
+
+type RequestAuthenticationSet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*security_istio_io_v1.RequestAuthentication) bool) []*security_istio_io_v1.RequestAuthentication
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*security_istio_io_v1.RequestAuthentication) bool) []*security_istio_io_v1.RequestAuthentication
+	// Return the Set as a map of key to resource.
+	Map() map[string]*security_istio_io_v1.RequestAuthentication
+	// Insert a resource into the set.
+	Insert(requestAuthentication ...*security_istio_io_v1.RequestAuthentication)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(requestAuthenticationSet RequestAuthenticationSet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(requestAuthentication ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(requestAuthentication ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set RequestAuthenticationSet) RequestAuthenticationSet
+	// Return the difference with the provided set
+	Difference(set RequestAuthenticationSet) RequestAuthenticationSet
+	// Return the intersection with the provided set
+	Intersection(set RequestAuthenticationSet) RequestAuthenticationSet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*security_istio_io_v1.RequestAuthentication, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another RequestAuthenticationSet
+	Delta(newSet RequestAuthenticationSet) sksets.ResourceDelta
+	// Create a deep copy of the current RequestAuthenticationSet
+	Clone() RequestAuthenticationSet
+}
+
+func makeGenericRequestAuthenticationSet(requestAuthenticationList []*security_istio_io_v1.RequestAuthentication) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range requestAuthenticationList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type requestAuthenticationSet struct {
+	set sksets.ResourceSet
+}
+
+func NewRequestAuthenticationSet(requestAuthenticationList ...*security_istio_io_v1.RequestAuthentication) RequestAuthenticationSet {
+	return &requestAuthenticationSet{set: makeGenericRequestAuthenticationSet(requestAuthenticationList)}
+}
+
+func NewRequestAuthenticationSetFromList(requestAuthenticationList *security_istio_io_v1.RequestAuthenticationList) RequestAuthenticationSet {
+	list := make([]*security_istio_io_v1.RequestAuthentication, 0, len(requestAuthenticationList.Items))
+	for idx := range requestAuthenticationList.Items {
+		list = append(list, requestAuthenticationList.Items[idx])
+	}
+	return &requestAuthenticationSet{set: makeGenericRequestAuthenticationSet(list)}
+}
+
+func (s *requestAuthenticationSet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *requestAuthenticationSet) List(filterResource ...func(*security_istio_io_v1.RequestAuthentication) bool) []*security_istio_io_v1.RequestAuthentication {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.RequestAuthentication))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	requestAuthenticationList := make([]*security_istio_io_v1.RequestAuthentication, 0, len(objs))
+	for _, obj := range objs {
+		requestAuthenticationList = append(requestAuthenticationList, obj.(*security_istio_io_v1.RequestAuthentication))
+	}
+	return requestAuthenticationList
+}
+
+func (s *requestAuthenticationSet) UnsortedList(filterResource ...func(*security_istio_io_v1.RequestAuthentication) bool) []*security_istio_io_v1.RequestAuthentication {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*security_istio_io_v1.RequestAuthentication))
+		})
+	}
+
+	var requestAuthenticationList []*security_istio_io_v1.RequestAuthentication
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		requestAuthenticationList = append(requestAuthenticationList, obj.(*security_istio_io_v1.RequestAuthentication))
+	}
+	return requestAuthenticationList
+}
+
+func (s *requestAuthenticationSet) Map() map[string]*security_istio_io_v1.RequestAuthentication {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*security_istio_io_v1.RequestAuthentication{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*security_istio_io_v1.RequestAuthentication)
+	}
+	return newMap
+}
+
+func (s *requestAuthenticationSet) Insert(
+	requestAuthenticationList ...*security_istio_io_v1.RequestAuthentication,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range requestAuthenticationList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *requestAuthenticationSet) Has(requestAuthentication ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(requestAuthentication)
+}
+
+func (s *requestAuthenticationSet) Equal(
+	requestAuthenticationSet RequestAuthenticationSet,
+) bool {
+	if s == nil {
+		return requestAuthenticationSet == nil
+	}
+	return s.Generic().Equal(requestAuthenticationSet.Generic())
+}
+
+func (s *requestAuthenticationSet) Delete(RequestAuthentication ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(RequestAuthentication)
+}
+
+func (s *requestAuthenticationSet) Union(set RequestAuthenticationSet) RequestAuthenticationSet {
+	if s == nil {
+		return set
+	}
+	return NewRequestAuthenticationSet(append(s.List(), set.List()...)...)
+}
+
+func (s *requestAuthenticationSet) Difference(set RequestAuthenticationSet) RequestAuthenticationSet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &requestAuthenticationSet{set: newSet}
+}
+
+func (s *requestAuthenticationSet) Intersection(set RequestAuthenticationSet) RequestAuthenticationSet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var requestAuthenticationList []*security_istio_io_v1.RequestAuthentication
+	for _, obj := range newSet.List() {
+		requestAuthenticationList = append(requestAuthenticationList, obj.(*security_istio_io_v1.RequestAuthentication))
+	}
+	return NewRequestAuthenticationSet(requestAuthenticationList...)
+}
+
+func (s *requestAuthenticationSet) Find(id ezkube.ResourceId) (*security_istio_io_v1.RequestAuthentication, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find RequestAuthentication %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&security_istio_io_v1.RequestAuthentication{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*security_istio_io_v1.RequestAuthentication), nil
+}
+
+func (s *requestAuthenticationSet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *requestAuthenticationSet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *requestAuthenticationSet) Delta(newSet RequestAuthenticationSet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *requestAuthenticationSet) Clone() RequestAuthenticationSet {
+	if s == nil {
+		return nil
+	}
+	return &requestAuthenticationSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
diff --git a/pkg/api/istio/security.istio.io/v1/type_helpers.go b/pkg/api/istio/security.istio.io/v1/type_helpers.go
new file mode 100644
index 0000000..d3c4bf5
--- /dev/null
+++ b/pkg/api/istio/security.istio.io/v1/type_helpers.go
@@ -0,0 +1,17 @@
+// Code generated by skv2. DO NOT EDIT.
+
+// Definitions for the Kubernetes types
+package v1
+
+import (
+	. "istio.io/client-go/pkg/apis/security/v1"
+)
+
+// AuthorizationPolicySlice represents a slice of *AuthorizationPolicy
+type AuthorizationPolicySlice []*AuthorizationPolicy
+
+// PeerAuthenticationSlice represents a slice of *PeerAuthentication
+type PeerAuthenticationSlice []*PeerAuthentication
+
+// RequestAuthenticationSlice represents a slice of *RequestAuthentication
+type RequestAuthenticationSlice []*RequestAuthentication
diff --git a/pkg/api/istio/telemetry.istio.io/v1/clients.go b/pkg/api/istio/telemetry.istio.io/v1/clients.go
new file mode 100644
index 0000000..a9b741e
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/clients.go
@@ -0,0 +1,214 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./clients.go -destination mocks/clients.go
+
+package v1
+
+import (
+	"context"
+
+	"github.com/solo-io/skv2/pkg/controllerutils"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	telemetry_istio_io_v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/kubernetes/scheme"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MulticlusterClientset for the telemetry.istio.io/v1 APIs
+type MulticlusterClientset interface {
+	// Cluster returns a Clientset for the given cluster
+	Cluster(cluster string) (Clientset, error)
+}
+
+type multiclusterClientset struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterClientset(client multicluster.Client) MulticlusterClientset {
+	return &multiclusterClientset{client: client}
+}
+
+func (m *multiclusterClientset) Cluster(cluster string) (Clientset, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+// clienset for the telemetry.istio.io/v1 APIs
+type Clientset interface {
+	// clienset for the telemetry.istio.io/v1/v1 APIs
+	Telemetries() TelemetryClient
+}
+
+type clientSet struct {
+	client client.Client
+}
+
+func NewClientsetFromConfig(cfg *rest.Config) (Clientset, error) {
+	scheme := scheme.Scheme
+	if err := telemetry_istio_io_v1.SchemeBuilder.AddToScheme(scheme); err != nil {
+		return nil, err
+	}
+	client, err := client.New(cfg, client.Options{
+		Scheme: scheme,
+	})
+	if err != nil {
+		return nil, err
+	}
+	return NewClientset(client), nil
+}
+
+func NewClientset(client client.Client) Clientset {
+	return &clientSet{client: client}
+}
+
+// clienset for the telemetry.istio.io/v1/v1 APIs
+func (c *clientSet) Telemetries() TelemetryClient {
+	return NewTelemetryClient(c.client)
+}
+
+// Reader knows how to read and list Telemetrys.
+type TelemetryReader interface {
+	// Get retrieves a Telemetry for the given object key
+	GetTelemetry(ctx context.Context, key client.ObjectKey) (*telemetry_istio_io_v1.Telemetry, error)
+
+	// List retrieves list of Telemetrys for a given namespace and list options.
+	ListTelemetry(ctx context.Context, opts ...client.ListOption) (*telemetry_istio_io_v1.TelemetryList, error)
+}
+
+// TelemetryTransitionFunction instructs the TelemetryWriter how to transition between an existing
+// Telemetry object and a desired on an Upsert
+type TelemetryTransitionFunction func(existing, desired *telemetry_istio_io_v1.Telemetry) error
+
+// Writer knows how to create, delete, and update Telemetrys.
+type TelemetryWriter interface {
+	// Create saves the Telemetry object.
+	CreateTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.CreateOption) error
+
+	// Delete deletes the Telemetry object.
+	DeleteTelemetry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error
+
+	// Update updates the given Telemetry object.
+	UpdateTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.UpdateOption) error
+
+	// Patch patches the given Telemetry object.
+	PatchTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, patch client.Patch, opts ...client.PatchOption) error
+
+	// DeleteAllOf deletes all Telemetry objects matching the given options.
+	DeleteAllOfTelemetry(ctx context.Context, opts ...client.DeleteAllOfOption) error
+
+	// Create or Update the Telemetry object.
+	UpsertTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, transitionFuncs ...TelemetryTransitionFunction) error
+}
+
+// StatusWriter knows how to update status subresource of a Telemetry object.
+type TelemetryStatusWriter interface {
+	// Update updates the fields corresponding to the status subresource for the
+	// given Telemetry object.
+	UpdateTelemetryStatus(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.SubResourceUpdateOption) error
+
+	// Patch patches the given Telemetry object's subresource.
+	PatchTelemetryStatus(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, patch client.Patch, opts ...client.SubResourcePatchOption) error
+}
+
+// Client knows how to perform CRUD operations on Telemetrys.
+type TelemetryClient interface {
+	TelemetryReader
+	TelemetryWriter
+	TelemetryStatusWriter
+}
+
+type telemetryClient struct {
+	client client.Client
+}
+
+func NewTelemetryClient(client client.Client) *telemetryClient {
+	return &telemetryClient{client: client}
+}
+
+func (c *telemetryClient) GetTelemetry(ctx context.Context, key client.ObjectKey) (*telemetry_istio_io_v1.Telemetry, error) {
+	obj := &telemetry_istio_io_v1.Telemetry{}
+	if err := c.client.Get(ctx, key, obj); err != nil {
+		return nil, err
+	}
+	return obj, nil
+}
+
+func (c *telemetryClient) ListTelemetry(ctx context.Context, opts ...client.ListOption) (*telemetry_istio_io_v1.TelemetryList, error) {
+	list := &telemetry_istio_io_v1.TelemetryList{}
+	if err := c.client.List(ctx, list, opts...); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+func (c *telemetryClient) CreateTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.CreateOption) error {
+	return c.client.Create(ctx, obj, opts...)
+}
+
+func (c *telemetryClient) DeleteTelemetry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	obj := &telemetry_istio_io_v1.Telemetry{}
+	obj.SetName(key.Name)
+	obj.SetNamespace(key.Namespace)
+	return c.client.Delete(ctx, obj, opts...)
+}
+
+func (c *telemetryClient) UpdateTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.UpdateOption) error {
+	return c.client.Update(ctx, obj, opts...)
+}
+
+func (c *telemetryClient) PatchTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, patch client.Patch, opts ...client.PatchOption) error {
+	return c.client.Patch(ctx, obj, patch, opts...)
+}
+
+func (c *telemetryClient) DeleteAllOfTelemetry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	obj := &telemetry_istio_io_v1.Telemetry{}
+	return c.client.DeleteAllOf(ctx, obj, opts...)
+}
+
+func (c *telemetryClient) UpsertTelemetry(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, transitionFuncs ...TelemetryTransitionFunction) error {
+	genericTxFunc := func(existing, desired runtime.Object) error {
+		for _, txFunc := range transitionFuncs {
+			if err := txFunc(existing.(*telemetry_istio_io_v1.Telemetry), desired.(*telemetry_istio_io_v1.Telemetry)); err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	_, err := controllerutils.Upsert(ctx, c.client, obj, genericTxFunc)
+	return err
+}
+
+func (c *telemetryClient) UpdateTelemetryStatus(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, opts ...client.SubResourceUpdateOption) error {
+	return c.client.Status().Update(ctx, obj, opts...)
+}
+
+func (c *telemetryClient) PatchTelemetryStatus(ctx context.Context, obj *telemetry_istio_io_v1.Telemetry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	return c.client.Status().Patch(ctx, obj, patch, opts...)
+}
+
+// Provides TelemetryClients for multiple clusters.
+type MulticlusterTelemetryClient interface {
+	// Cluster returns a TelemetryClient for the given cluster
+	Cluster(cluster string) (TelemetryClient, error)
+}
+
+type multiclusterTelemetryClient struct {
+	client multicluster.Client
+}
+
+func NewMulticlusterTelemetryClient(client multicluster.Client) MulticlusterTelemetryClient {
+	return &multiclusterTelemetryClient{client: client}
+}
+
+func (m *multiclusterTelemetryClient) Cluster(cluster string) (TelemetryClient, error) {
+	client, err := m.client.Cluster(cluster)
+	if err != nil {
+		return nil, err
+	}
+	return NewTelemetryClient(client), nil
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/event_handlers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/event_handlers.go
new file mode 100644
index 0000000..d5a8400
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/event_handlers.go
@@ -0,0 +1,125 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./event_handlers.go -destination mocks/event_handlers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	telemetry_istio_io_v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/events"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Handle events for the Telemetry Resource
+// DEPRECATED: Prefer reconciler pattern.
+type TelemetryEventHandler interface {
+	CreateTelemetry(obj *telemetry_istio_io_v1.Telemetry) error
+	UpdateTelemetry(old, new *telemetry_istio_io_v1.Telemetry) error
+	DeleteTelemetry(obj *telemetry_istio_io_v1.Telemetry) error
+	GenericTelemetry(obj *telemetry_istio_io_v1.Telemetry) error
+}
+
+type TelemetryEventHandlerFuncs struct {
+	OnCreate  func(obj *telemetry_istio_io_v1.Telemetry) error
+	OnUpdate  func(old, new *telemetry_istio_io_v1.Telemetry) error
+	OnDelete  func(obj *telemetry_istio_io_v1.Telemetry) error
+	OnGeneric func(obj *telemetry_istio_io_v1.Telemetry) error
+}
+
+func (f *TelemetryEventHandlerFuncs) CreateTelemetry(obj *telemetry_istio_io_v1.Telemetry) error {
+	if f.OnCreate == nil {
+		return nil
+	}
+	return f.OnCreate(obj)
+}
+
+func (f *TelemetryEventHandlerFuncs) DeleteTelemetry(obj *telemetry_istio_io_v1.Telemetry) error {
+	if f.OnDelete == nil {
+		return nil
+	}
+	return f.OnDelete(obj)
+}
+
+func (f *TelemetryEventHandlerFuncs) UpdateTelemetry(objOld, objNew *telemetry_istio_io_v1.Telemetry) error {
+	if f.OnUpdate == nil {
+		return nil
+	}
+	return f.OnUpdate(objOld, objNew)
+}
+
+func (f *TelemetryEventHandlerFuncs) GenericTelemetry(obj *telemetry_istio_io_v1.Telemetry) error {
+	if f.OnGeneric == nil {
+		return nil
+	}
+	return f.OnGeneric(obj)
+}
+
+type TelemetryEventWatcher interface {
+	AddEventHandler(ctx context.Context, h TelemetryEventHandler, predicates ...predicate.Predicate) error
+}
+
+type telemetryEventWatcher struct {
+	watcher events.EventWatcher
+}
+
+func NewTelemetryEventWatcher(name string, mgr manager.Manager) TelemetryEventWatcher {
+	return &telemetryEventWatcher{
+		watcher: events.NewWatcher(name, mgr, &telemetry_istio_io_v1.Telemetry{}),
+	}
+}
+
+func (c *telemetryEventWatcher) AddEventHandler(ctx context.Context, h TelemetryEventHandler, predicates ...predicate.Predicate) error {
+	handler := genericTelemetryHandler{handler: h}
+	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// genericTelemetryHandler implements a generic events.EventHandler
+type genericTelemetryHandler struct {
+	handler TelemetryEventHandler
+}
+
+func (h genericTelemetryHandler) Create(object client.Object) error {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return h.handler.CreateTelemetry(obj)
+}
+
+func (h genericTelemetryHandler) Delete(object client.Object) error {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return h.handler.DeleteTelemetry(obj)
+}
+
+func (h genericTelemetryHandler) Update(old, new client.Object) error {
+	objOld, ok := old.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", old)
+	}
+	objNew, ok := new.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", new)
+	}
+	return h.handler.UpdateTelemetry(objOld, objNew)
+}
+
+func (h genericTelemetryHandler) Generic(object client.Object) error {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return h.handler.GenericTelemetry(obj)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/event_handlers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/event_handlers.go
new file mode 100644
index 0000000..7523e92
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/event_handlers.go
@@ -0,0 +1,136 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./event_handlers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1/controller"
+	v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockTelemetryEventHandler is a mock of TelemetryEventHandler interface.
+type MockTelemetryEventHandler struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryEventHandlerMockRecorder
+}
+
+// MockTelemetryEventHandlerMockRecorder is the mock recorder for MockTelemetryEventHandler.
+type MockTelemetryEventHandlerMockRecorder struct {
+	mock *MockTelemetryEventHandler
+}
+
+// NewMockTelemetryEventHandler creates a new mock instance.
+func NewMockTelemetryEventHandler(ctrl *gomock.Controller) *MockTelemetryEventHandler {
+	mock := &MockTelemetryEventHandler{ctrl: ctrl}
+	mock.recorder = &MockTelemetryEventHandlerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryEventHandler) EXPECT() *MockTelemetryEventHandlerMockRecorder {
+	return m.recorder
+}
+
+// CreateTelemetry mocks base method.
+func (m *MockTelemetryEventHandler) CreateTelemetry(obj *v1.Telemetry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "CreateTelemetry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateTelemetry indicates an expected call of CreateTelemetry.
+func (mr *MockTelemetryEventHandlerMockRecorder) CreateTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTelemetry", reflect.TypeOf((*MockTelemetryEventHandler)(nil).CreateTelemetry), obj)
+}
+
+// DeleteTelemetry mocks base method.
+func (m *MockTelemetryEventHandler) DeleteTelemetry(obj *v1.Telemetry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DeleteTelemetry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteTelemetry indicates an expected call of DeleteTelemetry.
+func (mr *MockTelemetryEventHandlerMockRecorder) DeleteTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTelemetry", reflect.TypeOf((*MockTelemetryEventHandler)(nil).DeleteTelemetry), obj)
+}
+
+// GenericTelemetry mocks base method.
+func (m *MockTelemetryEventHandler) GenericTelemetry(obj *v1.Telemetry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GenericTelemetry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// GenericTelemetry indicates an expected call of GenericTelemetry.
+func (mr *MockTelemetryEventHandlerMockRecorder) GenericTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenericTelemetry", reflect.TypeOf((*MockTelemetryEventHandler)(nil).GenericTelemetry), obj)
+}
+
+// UpdateTelemetry mocks base method.
+func (m *MockTelemetryEventHandler) UpdateTelemetry(old, new *v1.Telemetry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "UpdateTelemetry", old, new)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateTelemetry indicates an expected call of UpdateTelemetry.
+func (mr *MockTelemetryEventHandlerMockRecorder) UpdateTelemetry(old, new interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTelemetry", reflect.TypeOf((*MockTelemetryEventHandler)(nil).UpdateTelemetry), old, new)
+}
+
+// MockTelemetryEventWatcher is a mock of TelemetryEventWatcher interface.
+type MockTelemetryEventWatcher struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryEventWatcherMockRecorder
+}
+
+// MockTelemetryEventWatcherMockRecorder is the mock recorder for MockTelemetryEventWatcher.
+type MockTelemetryEventWatcherMockRecorder struct {
+	mock *MockTelemetryEventWatcher
+}
+
+// NewMockTelemetryEventWatcher creates a new mock instance.
+func NewMockTelemetryEventWatcher(ctrl *gomock.Controller) *MockTelemetryEventWatcher {
+	mock := &MockTelemetryEventWatcher{ctrl: ctrl}
+	mock.recorder = &MockTelemetryEventWatcherMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryEventWatcher) EXPECT() *MockTelemetryEventWatcherMockRecorder {
+	return m.recorder
+}
+
+// AddEventHandler mocks base method.
+func (m *MockTelemetryEventWatcher) AddEventHandler(ctx context.Context, h controller.TelemetryEventHandler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, h}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "AddEventHandler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// AddEventHandler indicates an expected call of AddEventHandler.
+func (mr *MockTelemetryEventWatcherMockRecorder) AddEventHandler(ctx, h interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, h}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddEventHandler", reflect.TypeOf((*MockTelemetryEventWatcher)(nil).AddEventHandler), varargs...)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/multicluster_reconcilers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/multicluster_reconcilers.go
new file mode 100644
index 0000000..aa7c18a
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/multicluster_reconcilers.go
@@ -0,0 +1,131 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./multicluster_reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockMulticlusterTelemetryReconciler is a mock of MulticlusterTelemetryReconciler interface.
+type MockMulticlusterTelemetryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterTelemetryReconcilerMockRecorder
+}
+
+// MockMulticlusterTelemetryReconcilerMockRecorder is the mock recorder for MockMulticlusterTelemetryReconciler.
+type MockMulticlusterTelemetryReconcilerMockRecorder struct {
+	mock *MockMulticlusterTelemetryReconciler
+}
+
+// NewMockMulticlusterTelemetryReconciler creates a new mock instance.
+func NewMockMulticlusterTelemetryReconciler(ctrl *gomock.Controller) *MockMulticlusterTelemetryReconciler {
+	mock := &MockMulticlusterTelemetryReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterTelemetryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterTelemetryReconciler) EXPECT() *MockMulticlusterTelemetryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileTelemetry mocks base method.
+func (m *MockMulticlusterTelemetryReconciler) ReconcileTelemetry(clusterName string, obj *v1.Telemetry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileTelemetry", clusterName, obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileTelemetry indicates an expected call of ReconcileTelemetry.
+func (mr *MockMulticlusterTelemetryReconcilerMockRecorder) ReconcileTelemetry(clusterName, obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileTelemetry", reflect.TypeOf((*MockMulticlusterTelemetryReconciler)(nil).ReconcileTelemetry), clusterName, obj)
+}
+
+// MockMulticlusterTelemetryDeletionReconciler is a mock of MulticlusterTelemetryDeletionReconciler interface.
+type MockMulticlusterTelemetryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterTelemetryDeletionReconcilerMockRecorder
+}
+
+// MockMulticlusterTelemetryDeletionReconcilerMockRecorder is the mock recorder for MockMulticlusterTelemetryDeletionReconciler.
+type MockMulticlusterTelemetryDeletionReconcilerMockRecorder struct {
+	mock *MockMulticlusterTelemetryDeletionReconciler
+}
+
+// NewMockMulticlusterTelemetryDeletionReconciler creates a new mock instance.
+func NewMockMulticlusterTelemetryDeletionReconciler(ctrl *gomock.Controller) *MockMulticlusterTelemetryDeletionReconciler {
+	mock := &MockMulticlusterTelemetryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterTelemetryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterTelemetryDeletionReconciler) EXPECT() *MockMulticlusterTelemetryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileTelemetryDeletion mocks base method.
+func (m *MockMulticlusterTelemetryDeletionReconciler) ReconcileTelemetryDeletion(clusterName string, req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileTelemetryDeletion", clusterName, req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileTelemetryDeletion indicates an expected call of ReconcileTelemetryDeletion.
+func (mr *MockMulticlusterTelemetryDeletionReconcilerMockRecorder) ReconcileTelemetryDeletion(clusterName, req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileTelemetryDeletion", reflect.TypeOf((*MockMulticlusterTelemetryDeletionReconciler)(nil).ReconcileTelemetryDeletion), clusterName, req)
+}
+
+// MockMulticlusterTelemetryReconcileLoop is a mock of MulticlusterTelemetryReconcileLoop interface.
+type MockMulticlusterTelemetryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterTelemetryReconcileLoopMockRecorder
+}
+
+// MockMulticlusterTelemetryReconcileLoopMockRecorder is the mock recorder for MockMulticlusterTelemetryReconcileLoop.
+type MockMulticlusterTelemetryReconcileLoopMockRecorder struct {
+	mock *MockMulticlusterTelemetryReconcileLoop
+}
+
+// NewMockMulticlusterTelemetryReconcileLoop creates a new mock instance.
+func NewMockMulticlusterTelemetryReconcileLoop(ctrl *gomock.Controller) *MockMulticlusterTelemetryReconcileLoop {
+	mock := &MockMulticlusterTelemetryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterTelemetryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterTelemetryReconcileLoop) EXPECT() *MockMulticlusterTelemetryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// AddMulticlusterTelemetryReconciler mocks base method.
+func (m *MockMulticlusterTelemetryReconcileLoop) AddMulticlusterTelemetryReconciler(ctx context.Context, rec controller.MulticlusterTelemetryReconciler, predicates ...predicate.Predicate) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "AddMulticlusterTelemetryReconciler", varargs...)
+}
+
+// AddMulticlusterTelemetryReconciler indicates an expected call of AddMulticlusterTelemetryReconciler.
+func (mr *MockMulticlusterTelemetryReconcileLoopMockRecorder) AddMulticlusterTelemetryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMulticlusterTelemetryReconciler", reflect.TypeOf((*MockMulticlusterTelemetryReconcileLoop)(nil).AddMulticlusterTelemetryReconciler), varargs...)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/reconcilers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/reconcilers.go
new file mode 100644
index 0000000..a8de699
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/mocks/reconcilers.go
@@ -0,0 +1,199 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./reconcilers.go
+
+// Package mock_controller is a generated GoMock package.
+package mock_controller
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	controller "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1/controller"
+	reconcile "github.com/solo-io/skv2/pkg/reconcile"
+	v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+	predicate "sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// MockTelemetryReconciler is a mock of TelemetryReconciler interface.
+type MockTelemetryReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryReconcilerMockRecorder
+}
+
+// MockTelemetryReconcilerMockRecorder is the mock recorder for MockTelemetryReconciler.
+type MockTelemetryReconcilerMockRecorder struct {
+	mock *MockTelemetryReconciler
+}
+
+// NewMockTelemetryReconciler creates a new mock instance.
+func NewMockTelemetryReconciler(ctrl *gomock.Controller) *MockTelemetryReconciler {
+	mock := &MockTelemetryReconciler{ctrl: ctrl}
+	mock.recorder = &MockTelemetryReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryReconciler) EXPECT() *MockTelemetryReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileTelemetry mocks base method.
+func (m *MockTelemetryReconciler) ReconcileTelemetry(obj *v1.Telemetry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileTelemetry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileTelemetry indicates an expected call of ReconcileTelemetry.
+func (mr *MockTelemetryReconcilerMockRecorder) ReconcileTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileTelemetry", reflect.TypeOf((*MockTelemetryReconciler)(nil).ReconcileTelemetry), obj)
+}
+
+// MockTelemetryDeletionReconciler is a mock of TelemetryDeletionReconciler interface.
+type MockTelemetryDeletionReconciler struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryDeletionReconcilerMockRecorder
+}
+
+// MockTelemetryDeletionReconcilerMockRecorder is the mock recorder for MockTelemetryDeletionReconciler.
+type MockTelemetryDeletionReconcilerMockRecorder struct {
+	mock *MockTelemetryDeletionReconciler
+}
+
+// NewMockTelemetryDeletionReconciler creates a new mock instance.
+func NewMockTelemetryDeletionReconciler(ctrl *gomock.Controller) *MockTelemetryDeletionReconciler {
+	mock := &MockTelemetryDeletionReconciler{ctrl: ctrl}
+	mock.recorder = &MockTelemetryDeletionReconcilerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryDeletionReconciler) EXPECT() *MockTelemetryDeletionReconcilerMockRecorder {
+	return m.recorder
+}
+
+// ReconcileTelemetryDeletion mocks base method.
+func (m *MockTelemetryDeletionReconciler) ReconcileTelemetryDeletion(req reconcile.Request) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileTelemetryDeletion", req)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// ReconcileTelemetryDeletion indicates an expected call of ReconcileTelemetryDeletion.
+func (mr *MockTelemetryDeletionReconcilerMockRecorder) ReconcileTelemetryDeletion(req interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileTelemetryDeletion", reflect.TypeOf((*MockTelemetryDeletionReconciler)(nil).ReconcileTelemetryDeletion), req)
+}
+
+// MockTelemetryFinalizer is a mock of TelemetryFinalizer interface.
+type MockTelemetryFinalizer struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryFinalizerMockRecorder
+}
+
+// MockTelemetryFinalizerMockRecorder is the mock recorder for MockTelemetryFinalizer.
+type MockTelemetryFinalizerMockRecorder struct {
+	mock *MockTelemetryFinalizer
+}
+
+// NewMockTelemetryFinalizer creates a new mock instance.
+func NewMockTelemetryFinalizer(ctrl *gomock.Controller) *MockTelemetryFinalizer {
+	mock := &MockTelemetryFinalizer{ctrl: ctrl}
+	mock.recorder = &MockTelemetryFinalizerMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryFinalizer) EXPECT() *MockTelemetryFinalizerMockRecorder {
+	return m.recorder
+}
+
+// FinalizeTelemetry mocks base method.
+func (m *MockTelemetryFinalizer) FinalizeTelemetry(obj *v1.Telemetry) error {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "FinalizeTelemetry", obj)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// FinalizeTelemetry indicates an expected call of FinalizeTelemetry.
+func (mr *MockTelemetryFinalizerMockRecorder) FinalizeTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalizeTelemetry", reflect.TypeOf((*MockTelemetryFinalizer)(nil).FinalizeTelemetry), obj)
+}
+
+// ReconcileTelemetry mocks base method.
+func (m *MockTelemetryFinalizer) ReconcileTelemetry(obj *v1.Telemetry) (reconcile.Result, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ReconcileTelemetry", obj)
+	ret0, _ := ret[0].(reconcile.Result)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ReconcileTelemetry indicates an expected call of ReconcileTelemetry.
+func (mr *MockTelemetryFinalizerMockRecorder) ReconcileTelemetry(obj interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReconcileTelemetry", reflect.TypeOf((*MockTelemetryFinalizer)(nil).ReconcileTelemetry), obj)
+}
+
+// TelemetryFinalizerName mocks base method.
+func (m *MockTelemetryFinalizer) TelemetryFinalizerName() string {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "TelemetryFinalizerName")
+	ret0, _ := ret[0].(string)
+	return ret0
+}
+
+// TelemetryFinalizerName indicates an expected call of TelemetryFinalizerName.
+func (mr *MockTelemetryFinalizerMockRecorder) TelemetryFinalizerName() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TelemetryFinalizerName", reflect.TypeOf((*MockTelemetryFinalizer)(nil).TelemetryFinalizerName))
+}
+
+// MockTelemetryReconcileLoop is a mock of TelemetryReconcileLoop interface.
+type MockTelemetryReconcileLoop struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryReconcileLoopMockRecorder
+}
+
+// MockTelemetryReconcileLoopMockRecorder is the mock recorder for MockTelemetryReconcileLoop.
+type MockTelemetryReconcileLoopMockRecorder struct {
+	mock *MockTelemetryReconcileLoop
+}
+
+// NewMockTelemetryReconcileLoop creates a new mock instance.
+func NewMockTelemetryReconcileLoop(ctrl *gomock.Controller) *MockTelemetryReconcileLoop {
+	mock := &MockTelemetryReconcileLoop{ctrl: ctrl}
+	mock.recorder = &MockTelemetryReconcileLoopMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryReconcileLoop) EXPECT() *MockTelemetryReconcileLoopMockRecorder {
+	return m.recorder
+}
+
+// RunTelemetryReconciler mocks base method.
+func (m *MockTelemetryReconcileLoop) RunTelemetryReconciler(ctx context.Context, rec controller.TelemetryReconciler, predicates ...predicate.Predicate) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, rec}
+	for _, a := range predicates {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "RunTelemetryReconciler", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// RunTelemetryReconciler indicates an expected call of RunTelemetryReconciler.
+func (mr *MockTelemetryReconcileLoopMockRecorder) RunTelemetryReconciler(ctx, rec interface{}, predicates ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, rec}, predicates...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunTelemetryReconciler", reflect.TypeOf((*MockTelemetryReconcileLoop)(nil).RunTelemetryReconciler), varargs...)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/multicluster_reconcilers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/multicluster_reconcilers.go
new file mode 100644
index 0000000..87d6b66
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/multicluster_reconcilers.go
@@ -0,0 +1,90 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./multicluster_reconcilers.go -destination mocks/multicluster_reconcilers.go
+
+// Definitions for the multicluster Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	telemetry_istio_io_v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/multicluster"
+	mc_reconcile "github.com/solo-io/skv2/pkg/multicluster/reconcile"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the Telemetry Resource across clusters.
+// implemented by the user
+type MulticlusterTelemetryReconciler interface {
+	ReconcileTelemetry(clusterName string, obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Telemetry Resource across clusters.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type MulticlusterTelemetryDeletionReconciler interface {
+	ReconcileTelemetryDeletion(clusterName string, req reconcile.Request) error
+}
+
+type MulticlusterTelemetryReconcilerFuncs struct {
+	OnReconcileTelemetry         func(clusterName string, obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error)
+	OnReconcileTelemetryDeletion func(clusterName string, req reconcile.Request) error
+}
+
+func (f *MulticlusterTelemetryReconcilerFuncs) ReconcileTelemetry(clusterName string, obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error) {
+	if f.OnReconcileTelemetry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileTelemetry(clusterName, obj)
+}
+
+func (f *MulticlusterTelemetryReconcilerFuncs) ReconcileTelemetryDeletion(clusterName string, req reconcile.Request) error {
+	if f.OnReconcileTelemetryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileTelemetryDeletion(clusterName, req)
+}
+
+type MulticlusterTelemetryReconcileLoop interface {
+	// AddMulticlusterTelemetryReconciler adds a MulticlusterTelemetryReconciler to the MulticlusterTelemetryReconcileLoop.
+	AddMulticlusterTelemetryReconciler(ctx context.Context, rec MulticlusterTelemetryReconciler, predicates ...predicate.Predicate)
+}
+
+type multiclusterTelemetryReconcileLoop struct {
+	loop multicluster.Loop
+}
+
+func (m *multiclusterTelemetryReconcileLoop) AddMulticlusterTelemetryReconciler(ctx context.Context, rec MulticlusterTelemetryReconciler, predicates ...predicate.Predicate) {
+	genericReconciler := genericTelemetryMulticlusterReconciler{reconciler: rec}
+
+	m.loop.AddReconciler(ctx, genericReconciler, predicates...)
+}
+
+func NewMulticlusterTelemetryReconcileLoop(name string, cw multicluster.ClusterWatcher, options reconcile.Options) MulticlusterTelemetryReconcileLoop {
+	return &multiclusterTelemetryReconcileLoop{loop: mc_reconcile.NewLoop(name, cw, &telemetry_istio_io_v1.Telemetry{}, options)}
+}
+
+type genericTelemetryMulticlusterReconciler struct {
+	reconciler MulticlusterTelemetryReconciler
+}
+
+func (g genericTelemetryMulticlusterReconciler) ReconcileDeletion(cluster string, req reconcile.Request) error {
+	if deletionReconciler, ok := g.reconciler.(MulticlusterTelemetryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileTelemetryDeletion(cluster, req)
+	}
+	return nil
+}
+
+func (g genericTelemetryMulticlusterReconciler) Reconcile(cluster string, object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return g.reconciler.ReconcileTelemetry(cluster, obj)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/controller/reconcilers.go b/pkg/api/istio/telemetry.istio.io/v1/controller/reconcilers.go
new file mode 100644
index 0000000..de66267
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/controller/reconcilers.go
@@ -0,0 +1,135 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./reconcilers.go -destination mocks/reconcilers.go
+
+// Definitions for the Kubernetes Controllers
+package controller
+
+import (
+	"context"
+
+	telemetry_istio_io_v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+
+	"github.com/pkg/errors"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"github.com/solo-io/skv2/pkg/reconcile"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+	"sigs.k8s.io/controller-runtime/pkg/predicate"
+)
+
+// Reconcile Upsert events for the Telemetry Resource.
+// implemented by the user
+type TelemetryReconciler interface {
+	ReconcileTelemetry(obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error)
+}
+
+// Reconcile deletion events for the Telemetry Resource.
+// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
+// before being deleted.
+// implemented by the user
+type TelemetryDeletionReconciler interface {
+	ReconcileTelemetryDeletion(req reconcile.Request) error
+}
+
+type TelemetryReconcilerFuncs struct {
+	OnReconcileTelemetry         func(obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error)
+	OnReconcileTelemetryDeletion func(req reconcile.Request) error
+}
+
+func (f *TelemetryReconcilerFuncs) ReconcileTelemetry(obj *telemetry_istio_io_v1.Telemetry) (reconcile.Result, error) {
+	if f.OnReconcileTelemetry == nil {
+		return reconcile.Result{}, nil
+	}
+	return f.OnReconcileTelemetry(obj)
+}
+
+func (f *TelemetryReconcilerFuncs) ReconcileTelemetryDeletion(req reconcile.Request) error {
+	if f.OnReconcileTelemetryDeletion == nil {
+		return nil
+	}
+	return f.OnReconcileTelemetryDeletion(req)
+}
+
+// Reconcile and finalize the Telemetry Resource
+// implemented by the user
+type TelemetryFinalizer interface {
+	TelemetryReconciler
+
+	// name of the finalizer used by this handler.
+	// finalizer names should be unique for a single task
+	TelemetryFinalizerName() string
+
+	// finalize the object before it is deleted.
+	// Watchers created with a finalizing handler will a
+	FinalizeTelemetry(obj *telemetry_istio_io_v1.Telemetry) error
+}
+
+type TelemetryReconcileLoop interface {
+	RunTelemetryReconciler(ctx context.Context, rec TelemetryReconciler, predicates ...predicate.Predicate) error
+}
+
+type telemetryReconcileLoop struct {
+	loop reconcile.Loop
+}
+
+func NewTelemetryReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) TelemetryReconcileLoop {
+	return &telemetryReconcileLoop{
+		// empty cluster indicates this reconciler is built for the local cluster
+		loop: reconcile.NewLoop(name, "", mgr, &telemetry_istio_io_v1.Telemetry{}, options),
+	}
+}
+
+func (c *telemetryReconcileLoop) RunTelemetryReconciler(ctx context.Context, reconciler TelemetryReconciler, predicates ...predicate.Predicate) error {
+	genericReconciler := genericTelemetryReconciler{
+		reconciler: reconciler,
+	}
+
+	var reconcilerWrapper reconcile.Reconciler
+	if finalizingReconciler, ok := reconciler.(TelemetryFinalizer); ok {
+		reconcilerWrapper = genericTelemetryFinalizer{
+			genericTelemetryReconciler: genericReconciler,
+			finalizingReconciler:       finalizingReconciler,
+		}
+	} else {
+		reconcilerWrapper = genericReconciler
+	}
+	return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
+}
+
+// genericTelemetryHandler implements a generic reconcile.Reconciler
+type genericTelemetryReconciler struct {
+	reconciler TelemetryReconciler
+}
+
+func (r genericTelemetryReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return reconcile.Result{}, errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return r.reconciler.ReconcileTelemetry(obj)
+}
+
+func (r genericTelemetryReconciler) ReconcileDeletion(request reconcile.Request) error {
+	if deletionReconciler, ok := r.reconciler.(TelemetryDeletionReconciler); ok {
+		return deletionReconciler.ReconcileTelemetryDeletion(request)
+	}
+	return nil
+}
+
+// genericTelemetryFinalizer implements a generic reconcile.FinalizingReconciler
+type genericTelemetryFinalizer struct {
+	genericTelemetryReconciler
+	finalizingReconciler TelemetryFinalizer
+}
+
+func (r genericTelemetryFinalizer) FinalizerName() string {
+	return r.finalizingReconciler.TelemetryFinalizerName()
+}
+
+func (r genericTelemetryFinalizer) Finalize(object ezkube.Object) error {
+	obj, ok := object.(*telemetry_istio_io_v1.Telemetry)
+	if !ok {
+		return errors.Errorf("internal error: Telemetry handler received event for %T", object)
+	}
+	return r.finalizingReconciler.FinalizeTelemetry(obj)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/mocks/clients.go b/pkg/api/istio/telemetry.istio.io/v1/mocks/clients.go
new file mode 100644
index 0000000..72d47c2
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/mocks/clients.go
@@ -0,0 +1,594 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./clients.go
+
+// Package mock_v1 is a generated GoMock package.
+package mock_v1
+
+import (
+	context "context"
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1 "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1"
+	v10 "istio.io/client-go/pkg/apis/telemetry/v1"
+	client "sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+// MockMulticlusterClientset is a mock of MulticlusterClientset interface.
+type MockMulticlusterClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterClientsetMockRecorder
+}
+
+// MockMulticlusterClientsetMockRecorder is the mock recorder for MockMulticlusterClientset.
+type MockMulticlusterClientsetMockRecorder struct {
+	mock *MockMulticlusterClientset
+}
+
+// NewMockMulticlusterClientset creates a new mock instance.
+func NewMockMulticlusterClientset(ctrl *gomock.Controller) *MockMulticlusterClientset {
+	mock := &MockMulticlusterClientset{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterClientset) EXPECT() *MockMulticlusterClientsetMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterClientset) Cluster(cluster string) (v1.Clientset, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.Clientset)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterClientsetMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterClientset)(nil).Cluster), cluster)
+}
+
+// MockClientset is a mock of Clientset interface.
+type MockClientset struct {
+	ctrl     *gomock.Controller
+	recorder *MockClientsetMockRecorder
+}
+
+// MockClientsetMockRecorder is the mock recorder for MockClientset.
+type MockClientsetMockRecorder struct {
+	mock *MockClientset
+}
+
+// NewMockClientset creates a new mock instance.
+func NewMockClientset(ctrl *gomock.Controller) *MockClientset {
+	mock := &MockClientset{ctrl: ctrl}
+	mock.recorder = &MockClientsetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockClientset) EXPECT() *MockClientsetMockRecorder {
+	return m.recorder
+}
+
+// Telemetries mocks base method.
+func (m *MockClientset) Telemetries() v1.TelemetryClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Telemetries")
+	ret0, _ := ret[0].(v1.TelemetryClient)
+	return ret0
+}
+
+// Telemetries indicates an expected call of Telemetries.
+func (mr *MockClientsetMockRecorder) Telemetries() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Telemetries", reflect.TypeOf((*MockClientset)(nil).Telemetries))
+}
+
+// MockTelemetryReader is a mock of TelemetryReader interface.
+type MockTelemetryReader struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryReaderMockRecorder
+}
+
+// MockTelemetryReaderMockRecorder is the mock recorder for MockTelemetryReader.
+type MockTelemetryReaderMockRecorder struct {
+	mock *MockTelemetryReader
+}
+
+// NewMockTelemetryReader creates a new mock instance.
+func NewMockTelemetryReader(ctrl *gomock.Controller) *MockTelemetryReader {
+	mock := &MockTelemetryReader{ctrl: ctrl}
+	mock.recorder = &MockTelemetryReaderMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryReader) EXPECT() *MockTelemetryReaderMockRecorder {
+	return m.recorder
+}
+
+// GetTelemetry mocks base method.
+func (m *MockTelemetryReader) GetTelemetry(ctx context.Context, key client.ObjectKey) (*v10.Telemetry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetTelemetry", ctx, key)
+	ret0, _ := ret[0].(*v10.Telemetry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetTelemetry indicates an expected call of GetTelemetry.
+func (mr *MockTelemetryReaderMockRecorder) GetTelemetry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTelemetry", reflect.TypeOf((*MockTelemetryReader)(nil).GetTelemetry), ctx, key)
+}
+
+// ListTelemetry mocks base method.
+func (m *MockTelemetryReader) ListTelemetry(ctx context.Context, opts ...client.ListOption) (*v10.TelemetryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListTelemetry", varargs...)
+	ret0, _ := ret[0].(*v10.TelemetryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListTelemetry indicates an expected call of ListTelemetry.
+func (mr *MockTelemetryReaderMockRecorder) ListTelemetry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTelemetry", reflect.TypeOf((*MockTelemetryReader)(nil).ListTelemetry), varargs...)
+}
+
+// MockTelemetryWriter is a mock of TelemetryWriter interface.
+type MockTelemetryWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryWriterMockRecorder
+}
+
+// MockTelemetryWriterMockRecorder is the mock recorder for MockTelemetryWriter.
+type MockTelemetryWriterMockRecorder struct {
+	mock *MockTelemetryWriter
+}
+
+// NewMockTelemetryWriter creates a new mock instance.
+func NewMockTelemetryWriter(ctrl *gomock.Controller) *MockTelemetryWriter {
+	mock := &MockTelemetryWriter{ctrl: ctrl}
+	mock.recorder = &MockTelemetryWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryWriter) EXPECT() *MockTelemetryWriterMockRecorder {
+	return m.recorder
+}
+
+// CreateTelemetry mocks base method.
+func (m *MockTelemetryWriter) CreateTelemetry(ctx context.Context, obj *v10.Telemetry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateTelemetry indicates an expected call of CreateTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) CreateTelemetry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).CreateTelemetry), varargs...)
+}
+
+// DeleteAllOfTelemetry mocks base method.
+func (m *MockTelemetryWriter) DeleteAllOfTelemetry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfTelemetry indicates an expected call of DeleteAllOfTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) DeleteAllOfTelemetry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).DeleteAllOfTelemetry), varargs...)
+}
+
+// DeleteTelemetry mocks base method.
+func (m *MockTelemetryWriter) DeleteTelemetry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteTelemetry indicates an expected call of DeleteTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) DeleteTelemetry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).DeleteTelemetry), varargs...)
+}
+
+// PatchTelemetry mocks base method.
+func (m *MockTelemetryWriter) PatchTelemetry(ctx context.Context, obj *v10.Telemetry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchTelemetry indicates an expected call of PatchTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) PatchTelemetry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).PatchTelemetry), varargs...)
+}
+
+// UpdateTelemetry mocks base method.
+func (m *MockTelemetryWriter) UpdateTelemetry(ctx context.Context, obj *v10.Telemetry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateTelemetry indicates an expected call of UpdateTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) UpdateTelemetry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).UpdateTelemetry), varargs...)
+}
+
+// UpsertTelemetry mocks base method.
+func (m *MockTelemetryWriter) UpsertTelemetry(ctx context.Context, obj *v10.Telemetry, transitionFuncs ...v1.TelemetryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertTelemetry indicates an expected call of UpsertTelemetry.
+func (mr *MockTelemetryWriterMockRecorder) UpsertTelemetry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertTelemetry", reflect.TypeOf((*MockTelemetryWriter)(nil).UpsertTelemetry), varargs...)
+}
+
+// MockTelemetryStatusWriter is a mock of TelemetryStatusWriter interface.
+type MockTelemetryStatusWriter struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryStatusWriterMockRecorder
+}
+
+// MockTelemetryStatusWriterMockRecorder is the mock recorder for MockTelemetryStatusWriter.
+type MockTelemetryStatusWriterMockRecorder struct {
+	mock *MockTelemetryStatusWriter
+}
+
+// NewMockTelemetryStatusWriter creates a new mock instance.
+func NewMockTelemetryStatusWriter(ctrl *gomock.Controller) *MockTelemetryStatusWriter {
+	mock := &MockTelemetryStatusWriter{ctrl: ctrl}
+	mock.recorder = &MockTelemetryStatusWriterMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryStatusWriter) EXPECT() *MockTelemetryStatusWriterMockRecorder {
+	return m.recorder
+}
+
+// PatchTelemetryStatus mocks base method.
+func (m *MockTelemetryStatusWriter) PatchTelemetryStatus(ctx context.Context, obj *v10.Telemetry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchTelemetryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchTelemetryStatus indicates an expected call of PatchTelemetryStatus.
+func (mr *MockTelemetryStatusWriterMockRecorder) PatchTelemetryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchTelemetryStatus", reflect.TypeOf((*MockTelemetryStatusWriter)(nil).PatchTelemetryStatus), varargs...)
+}
+
+// UpdateTelemetryStatus mocks base method.
+func (m *MockTelemetryStatusWriter) UpdateTelemetryStatus(ctx context.Context, obj *v10.Telemetry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateTelemetryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateTelemetryStatus indicates an expected call of UpdateTelemetryStatus.
+func (mr *MockTelemetryStatusWriterMockRecorder) UpdateTelemetryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTelemetryStatus", reflect.TypeOf((*MockTelemetryStatusWriter)(nil).UpdateTelemetryStatus), varargs...)
+}
+
+// MockTelemetryClient is a mock of TelemetryClient interface.
+type MockTelemetryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetryClientMockRecorder
+}
+
+// MockTelemetryClientMockRecorder is the mock recorder for MockTelemetryClient.
+type MockTelemetryClientMockRecorder struct {
+	mock *MockTelemetryClient
+}
+
+// NewMockTelemetryClient creates a new mock instance.
+func NewMockTelemetryClient(ctrl *gomock.Controller) *MockTelemetryClient {
+	mock := &MockTelemetryClient{ctrl: ctrl}
+	mock.recorder = &MockTelemetryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetryClient) EXPECT() *MockTelemetryClientMockRecorder {
+	return m.recorder
+}
+
+// CreateTelemetry mocks base method.
+func (m *MockTelemetryClient) CreateTelemetry(ctx context.Context, obj *v10.Telemetry, opts ...client.CreateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "CreateTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// CreateTelemetry indicates an expected call of CreateTelemetry.
+func (mr *MockTelemetryClientMockRecorder) CreateTelemetry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).CreateTelemetry), varargs...)
+}
+
+// DeleteAllOfTelemetry mocks base method.
+func (m *MockTelemetryClient) DeleteAllOfTelemetry(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteAllOfTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteAllOfTelemetry indicates an expected call of DeleteAllOfTelemetry.
+func (mr *MockTelemetryClientMockRecorder) DeleteAllOfTelemetry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllOfTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).DeleteAllOfTelemetry), varargs...)
+}
+
+// DeleteTelemetry mocks base method.
+func (m *MockTelemetryClient) DeleteTelemetry(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, key}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "DeleteTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// DeleteTelemetry indicates an expected call of DeleteTelemetry.
+func (mr *MockTelemetryClientMockRecorder) DeleteTelemetry(ctx, key interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, key}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).DeleteTelemetry), varargs...)
+}
+
+// GetTelemetry mocks base method.
+func (m *MockTelemetryClient) GetTelemetry(ctx context.Context, key client.ObjectKey) (*v10.Telemetry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetTelemetry", ctx, key)
+	ret0, _ := ret[0].(*v10.Telemetry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// GetTelemetry indicates an expected call of GetTelemetry.
+func (mr *MockTelemetryClientMockRecorder) GetTelemetry(ctx, key interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).GetTelemetry), ctx, key)
+}
+
+// ListTelemetry mocks base method.
+func (m *MockTelemetryClient) ListTelemetry(ctx context.Context, opts ...client.ListOption) (*v10.TelemetryList, error) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "ListTelemetry", varargs...)
+	ret0, _ := ret[0].(*v10.TelemetryList)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// ListTelemetry indicates an expected call of ListTelemetry.
+func (mr *MockTelemetryClientMockRecorder) ListTelemetry(ctx interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).ListTelemetry), varargs...)
+}
+
+// PatchTelemetry mocks base method.
+func (m *MockTelemetryClient) PatchTelemetry(ctx context.Context, obj *v10.Telemetry, patch client.Patch, opts ...client.PatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchTelemetry indicates an expected call of PatchTelemetry.
+func (mr *MockTelemetryClientMockRecorder) PatchTelemetry(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).PatchTelemetry), varargs...)
+}
+
+// PatchTelemetryStatus mocks base method.
+func (m *MockTelemetryClient) PatchTelemetryStatus(ctx context.Context, obj *v10.Telemetry, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj, patch}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "PatchTelemetryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// PatchTelemetryStatus indicates an expected call of PatchTelemetryStatus.
+func (mr *MockTelemetryClientMockRecorder) PatchTelemetryStatus(ctx, obj, patch interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj, patch}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchTelemetryStatus", reflect.TypeOf((*MockTelemetryClient)(nil).PatchTelemetryStatus), varargs...)
+}
+
+// UpdateTelemetry mocks base method.
+func (m *MockTelemetryClient) UpdateTelemetry(ctx context.Context, obj *v10.Telemetry, opts ...client.UpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateTelemetry indicates an expected call of UpdateTelemetry.
+func (mr *MockTelemetryClientMockRecorder) UpdateTelemetry(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).UpdateTelemetry), varargs...)
+}
+
+// UpdateTelemetryStatus mocks base method.
+func (m *MockTelemetryClient) UpdateTelemetryStatus(ctx context.Context, obj *v10.Telemetry, opts ...client.SubResourceUpdateOption) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range opts {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpdateTelemetryStatus", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpdateTelemetryStatus indicates an expected call of UpdateTelemetryStatus.
+func (mr *MockTelemetryClientMockRecorder) UpdateTelemetryStatus(ctx, obj interface{}, opts ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, opts...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTelemetryStatus", reflect.TypeOf((*MockTelemetryClient)(nil).UpdateTelemetryStatus), varargs...)
+}
+
+// UpsertTelemetry mocks base method.
+func (m *MockTelemetryClient) UpsertTelemetry(ctx context.Context, obj *v10.Telemetry, transitionFuncs ...v1.TelemetryTransitionFunction) error {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{ctx, obj}
+	for _, a := range transitionFuncs {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UpsertTelemetry", varargs...)
+	ret0, _ := ret[0].(error)
+	return ret0
+}
+
+// UpsertTelemetry indicates an expected call of UpsertTelemetry.
+func (mr *MockTelemetryClientMockRecorder) UpsertTelemetry(ctx, obj interface{}, transitionFuncs ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	varargs := append([]interface{}{ctx, obj}, transitionFuncs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertTelemetry", reflect.TypeOf((*MockTelemetryClient)(nil).UpsertTelemetry), varargs...)
+}
+
+// MockMulticlusterTelemetryClient is a mock of MulticlusterTelemetryClient interface.
+type MockMulticlusterTelemetryClient struct {
+	ctrl     *gomock.Controller
+	recorder *MockMulticlusterTelemetryClientMockRecorder
+}
+
+// MockMulticlusterTelemetryClientMockRecorder is the mock recorder for MockMulticlusterTelemetryClient.
+type MockMulticlusterTelemetryClientMockRecorder struct {
+	mock *MockMulticlusterTelemetryClient
+}
+
+// NewMockMulticlusterTelemetryClient creates a new mock instance.
+func NewMockMulticlusterTelemetryClient(ctrl *gomock.Controller) *MockMulticlusterTelemetryClient {
+	mock := &MockMulticlusterTelemetryClient{ctrl: ctrl}
+	mock.recorder = &MockMulticlusterTelemetryClientMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockMulticlusterTelemetryClient) EXPECT() *MockMulticlusterTelemetryClientMockRecorder {
+	return m.recorder
+}
+
+// Cluster mocks base method.
+func (m *MockMulticlusterTelemetryClient) Cluster(cluster string) (v1.TelemetryClient, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Cluster", cluster)
+	ret0, _ := ret[0].(v1.TelemetryClient)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Cluster indicates an expected call of Cluster.
+func (mr *MockMulticlusterTelemetryClientMockRecorder) Cluster(cluster interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cluster", reflect.TypeOf((*MockMulticlusterTelemetryClient)(nil).Cluster), cluster)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/providers/client_providers.go b/pkg/api/istio/telemetry.istio.io/v1/providers/client_providers.go
new file mode 100644
index 0000000..c901e13
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/providers/client_providers.go
@@ -0,0 +1,46 @@
+// Code generated by skv2. DO NOT EDIT.
+
+package v1
+
+import (
+	telemetry_istio_io_v1 "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1"
+
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+/*
+  The intention of these providers are to be used for Mocking.
+  They expose the Clients as interfaces, as well as factories to provide mocked versions
+  of the clients when they require building within a component.
+
+  See package `github.com/solo-io/skv2/pkg/multicluster/register` for example
+*/
+
+// Provider for TelemetryClient from Clientset
+func TelemetryClientFromClientsetProvider(clients telemetry_istio_io_v1.Clientset) telemetry_istio_io_v1.TelemetryClient {
+	return clients.Telemetries()
+}
+
+// Provider for Telemetry Client from Client
+func TelemetryClientProvider(client client.Client) telemetry_istio_io_v1.TelemetryClient {
+	return telemetry_istio_io_v1.NewTelemetryClient(client)
+}
+
+type TelemetryClientFactory func(client client.Client) telemetry_istio_io_v1.TelemetryClient
+
+func TelemetryClientFactoryProvider() TelemetryClientFactory {
+	return TelemetryClientProvider
+}
+
+type TelemetryClientFromConfigFactory func(cfg *rest.Config) (telemetry_istio_io_v1.TelemetryClient, error)
+
+func TelemetryClientFromConfigFactoryProvider() TelemetryClientFromConfigFactory {
+	return func(cfg *rest.Config) (telemetry_istio_io_v1.TelemetryClient, error) {
+		clients, err := telemetry_istio_io_v1.NewClientsetFromConfig(cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clients.Telemetries(), nil
+	}
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/sets/mocks/sets.go b/pkg/api/istio/telemetry.istio.io/v1/sets/mocks/sets.go
new file mode 100644
index 0000000..d93e7d7
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/sets/mocks/sets.go
@@ -0,0 +1,272 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: ./sets.go
+
+// Package mock_v1sets is a generated GoMock package.
+package mock_v1sets
+
+import (
+	reflect "reflect"
+
+	gomock "github.com/golang/mock/gomock"
+	v1sets "github.com/solo-io/external-apis/pkg/api/istio/telemetry.istio.io/v1/sets"
+	sets "github.com/solo-io/skv2/contrib/pkg/sets"
+	ezkube "github.com/solo-io/skv2/pkg/ezkube"
+	v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+	sets0 "k8s.io/apimachinery/pkg/util/sets"
+)
+
+// MockTelemetrySet is a mock of TelemetrySet interface.
+type MockTelemetrySet struct {
+	ctrl     *gomock.Controller
+	recorder *MockTelemetrySetMockRecorder
+}
+
+// MockTelemetrySetMockRecorder is the mock recorder for MockTelemetrySet.
+type MockTelemetrySetMockRecorder struct {
+	mock *MockTelemetrySet
+}
+
+// NewMockTelemetrySet creates a new mock instance.
+func NewMockTelemetrySet(ctrl *gomock.Controller) *MockTelemetrySet {
+	mock := &MockTelemetrySet{ctrl: ctrl}
+	mock.recorder = &MockTelemetrySetMockRecorder{mock}
+	return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use.
+func (m *MockTelemetrySet) EXPECT() *MockTelemetrySetMockRecorder {
+	return m.recorder
+}
+
+// Clone mocks base method.
+func (m *MockTelemetrySet) Clone() v1sets.TelemetrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Clone")
+	ret0, _ := ret[0].(v1sets.TelemetrySet)
+	return ret0
+}
+
+// Clone indicates an expected call of Clone.
+func (mr *MockTelemetrySetMockRecorder) Clone() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockTelemetrySet)(nil).Clone))
+}
+
+// Delete mocks base method.
+func (m *MockTelemetrySet) Delete(telemetry ezkube.ResourceId) {
+	m.ctrl.T.Helper()
+	m.ctrl.Call(m, "Delete", telemetry)
+}
+
+// Delete indicates an expected call of Delete.
+func (mr *MockTelemetrySetMockRecorder) Delete(telemetry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockTelemetrySet)(nil).Delete), telemetry)
+}
+
+// Delta mocks base method.
+func (m *MockTelemetrySet) Delta(newSet v1sets.TelemetrySet) sets.ResourceDelta {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Delta", newSet)
+	ret0, _ := ret[0].(sets.ResourceDelta)
+	return ret0
+}
+
+// Delta indicates an expected call of Delta.
+func (mr *MockTelemetrySetMockRecorder) Delta(newSet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delta", reflect.TypeOf((*MockTelemetrySet)(nil).Delta), newSet)
+}
+
+// Difference mocks base method.
+func (m *MockTelemetrySet) Difference(set v1sets.TelemetrySet) v1sets.TelemetrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Difference", set)
+	ret0, _ := ret[0].(v1sets.TelemetrySet)
+	return ret0
+}
+
+// Difference indicates an expected call of Difference.
+func (mr *MockTelemetrySetMockRecorder) Difference(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockTelemetrySet)(nil).Difference), set)
+}
+
+// Equal mocks base method.
+func (m *MockTelemetrySet) Equal(telemetrySet v1sets.TelemetrySet) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Equal", telemetrySet)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Equal indicates an expected call of Equal.
+func (mr *MockTelemetrySetMockRecorder) Equal(telemetrySet interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockTelemetrySet)(nil).Equal), telemetrySet)
+}
+
+// Find mocks base method.
+func (m *MockTelemetrySet) Find(id ezkube.ResourceId) (*v1.Telemetry, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Find", id)
+	ret0, _ := ret[0].(*v1.Telemetry)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// Find indicates an expected call of Find.
+func (mr *MockTelemetrySetMockRecorder) Find(id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Find", reflect.TypeOf((*MockTelemetrySet)(nil).Find), id)
+}
+
+// Generic mocks base method.
+func (m *MockTelemetrySet) Generic() sets.ResourceSet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Generic")
+	ret0, _ := ret[0].(sets.ResourceSet)
+	return ret0
+}
+
+// Generic indicates an expected call of Generic.
+func (mr *MockTelemetrySetMockRecorder) Generic() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Generic", reflect.TypeOf((*MockTelemetrySet)(nil).Generic))
+}
+
+// Has mocks base method.
+func (m *MockTelemetrySet) Has(telemetry ezkube.ResourceId) bool {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Has", telemetry)
+	ret0, _ := ret[0].(bool)
+	return ret0
+}
+
+// Has indicates an expected call of Has.
+func (mr *MockTelemetrySetMockRecorder) Has(telemetry interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockTelemetrySet)(nil).Has), telemetry)
+}
+
+// Insert mocks base method.
+func (m *MockTelemetrySet) Insert(telemetry ...*v1.Telemetry) {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range telemetry {
+		varargs = append(varargs, a)
+	}
+	m.ctrl.Call(m, "Insert", varargs...)
+}
+
+// Insert indicates an expected call of Insert.
+func (mr *MockTelemetrySetMockRecorder) Insert(telemetry ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockTelemetrySet)(nil).Insert), telemetry...)
+}
+
+// Intersection mocks base method.
+func (m *MockTelemetrySet) Intersection(set v1sets.TelemetrySet) v1sets.TelemetrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Intersection", set)
+	ret0, _ := ret[0].(v1sets.TelemetrySet)
+	return ret0
+}
+
+// Intersection indicates an expected call of Intersection.
+func (mr *MockTelemetrySetMockRecorder) Intersection(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersection", reflect.TypeOf((*MockTelemetrySet)(nil).Intersection), set)
+}
+
+// Keys mocks base method.
+func (m *MockTelemetrySet) Keys() sets0.String {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Keys")
+	ret0, _ := ret[0].(sets0.String)
+	return ret0
+}
+
+// Keys indicates an expected call of Keys.
+func (mr *MockTelemetrySetMockRecorder) Keys() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Keys", reflect.TypeOf((*MockTelemetrySet)(nil).Keys))
+}
+
+// Length mocks base method.
+func (m *MockTelemetrySet) Length() int {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Length")
+	ret0, _ := ret[0].(int)
+	return ret0
+}
+
+// Length indicates an expected call of Length.
+func (mr *MockTelemetrySetMockRecorder) Length() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Length", reflect.TypeOf((*MockTelemetrySet)(nil).Length))
+}
+
+// List mocks base method.
+func (m *MockTelemetrySet) List(filterResource ...func(*v1.Telemetry) bool) []*v1.Telemetry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "List", varargs...)
+	ret0, _ := ret[0].([]*v1.Telemetry)
+	return ret0
+}
+
+// List indicates an expected call of List.
+func (mr *MockTelemetrySetMockRecorder) List(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockTelemetrySet)(nil).List), filterResource...)
+}
+
+// Map mocks base method.
+func (m *MockTelemetrySet) Map() map[string]*v1.Telemetry {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Map")
+	ret0, _ := ret[0].(map[string]*v1.Telemetry)
+	return ret0
+}
+
+// Map indicates an expected call of Map.
+func (mr *MockTelemetrySetMockRecorder) Map() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockTelemetrySet)(nil).Map))
+}
+
+// Union mocks base method.
+func (m *MockTelemetrySet) Union(set v1sets.TelemetrySet) v1sets.TelemetrySet {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "Union", set)
+	ret0, _ := ret[0].(v1sets.TelemetrySet)
+	return ret0
+}
+
+// Union indicates an expected call of Union.
+func (mr *MockTelemetrySetMockRecorder) Union(set interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockTelemetrySet)(nil).Union), set)
+}
+
+// UnsortedList mocks base method.
+func (m *MockTelemetrySet) UnsortedList(filterResource ...func(*v1.Telemetry) bool) []*v1.Telemetry {
+	m.ctrl.T.Helper()
+	varargs := []interface{}{}
+	for _, a := range filterResource {
+		varargs = append(varargs, a)
+	}
+	ret := m.ctrl.Call(m, "UnsortedList", varargs...)
+	ret0, _ := ret[0].([]*v1.Telemetry)
+	return ret0
+}
+
+// UnsortedList indicates an expected call of UnsortedList.
+func (mr *MockTelemetrySetMockRecorder) UnsortedList(filterResource ...interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsortedList", reflect.TypeOf((*MockTelemetrySet)(nil).UnsortedList), filterResource...)
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/sets/sets.go b/pkg/api/istio/telemetry.istio.io/v1/sets/sets.go
new file mode 100644
index 0000000..36067b6
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/sets/sets.go
@@ -0,0 +1,237 @@
+// Code generated by skv2. DO NOT EDIT.
+
+//go:generate mockgen -source ./sets.go -destination mocks/sets.go
+
+package v1sets
+
+import (
+	telemetry_istio_io_v1 "istio.io/client-go/pkg/apis/telemetry/v1"
+
+	"github.com/rotisserie/eris"
+	sksets "github.com/solo-io/skv2/contrib/pkg/sets"
+	"github.com/solo-io/skv2/pkg/ezkube"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+type TelemetrySet interface {
+	// Get the set stored keys
+	Keys() sets.String
+	// List of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	List(filterResource ...func(*telemetry_istio_io_v1.Telemetry) bool) []*telemetry_istio_io_v1.Telemetry
+	// Unsorted list of resources stored in the set. Pass an optional filter function to filter on the list.
+	// The filter function should return false to keep the resource, true to drop it.
+	UnsortedList(filterResource ...func(*telemetry_istio_io_v1.Telemetry) bool) []*telemetry_istio_io_v1.Telemetry
+	// Return the Set as a map of key to resource.
+	Map() map[string]*telemetry_istio_io_v1.Telemetry
+	// Insert a resource into the set.
+	Insert(telemetry ...*telemetry_istio_io_v1.Telemetry)
+	// Compare the equality of the keys in two sets (not the resources themselves)
+	Equal(telemetrySet TelemetrySet) bool
+	// Check if the set contains a key matching the resource (not the resource itself)
+	Has(telemetry ezkube.ResourceId) bool
+	// Delete the key matching the resource
+	Delete(telemetry ezkube.ResourceId)
+	// Return the union with the provided set
+	Union(set TelemetrySet) TelemetrySet
+	// Return the difference with the provided set
+	Difference(set TelemetrySet) TelemetrySet
+	// Return the intersection with the provided set
+	Intersection(set TelemetrySet) TelemetrySet
+	// Find the resource with the given ID
+	Find(id ezkube.ResourceId) (*telemetry_istio_io_v1.Telemetry, error)
+	// Get the length of the set
+	Length() int
+	// returns the generic implementation of the set
+	Generic() sksets.ResourceSet
+	// returns the delta between this and and another TelemetrySet
+	Delta(newSet TelemetrySet) sksets.ResourceDelta
+	// Create a deep copy of the current TelemetrySet
+	Clone() TelemetrySet
+}
+
+func makeGenericTelemetrySet(telemetryList []*telemetry_istio_io_v1.Telemetry) sksets.ResourceSet {
+	var genericResources []ezkube.ResourceId
+	for _, obj := range telemetryList {
+		genericResources = append(genericResources, obj)
+	}
+	return sksets.NewResourceSet(genericResources...)
+}
+
+type telemetrySet struct {
+	set sksets.ResourceSet
+}
+
+func NewTelemetrySet(telemetryList ...*telemetry_istio_io_v1.Telemetry) TelemetrySet {
+	return &telemetrySet{set: makeGenericTelemetrySet(telemetryList)}
+}
+
+func NewTelemetrySetFromList(telemetryList *telemetry_istio_io_v1.TelemetryList) TelemetrySet {
+	list := make([]*telemetry_istio_io_v1.Telemetry, 0, len(telemetryList.Items))
+	for idx := range telemetryList.Items {
+		list = append(list, telemetryList.Items[idx])
+	}
+	return &telemetrySet{set: makeGenericTelemetrySet(list)}
+}
+
+func (s *telemetrySet) Keys() sets.String {
+	if s == nil {
+		return sets.String{}
+	}
+	return s.Generic().Keys()
+}
+
+func (s *telemetrySet) List(filterResource ...func(*telemetry_istio_io_v1.Telemetry) bool) []*telemetry_istio_io_v1.Telemetry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*telemetry_istio_io_v1.Telemetry))
+		})
+	}
+
+	objs := s.Generic().List(genericFilters...)
+	telemetryList := make([]*telemetry_istio_io_v1.Telemetry, 0, len(objs))
+	for _, obj := range objs {
+		telemetryList = append(telemetryList, obj.(*telemetry_istio_io_v1.Telemetry))
+	}
+	return telemetryList
+}
+
+func (s *telemetrySet) UnsortedList(filterResource ...func(*telemetry_istio_io_v1.Telemetry) bool) []*telemetry_istio_io_v1.Telemetry {
+	if s == nil {
+		return nil
+	}
+	var genericFilters []func(ezkube.ResourceId) bool
+	for _, filter := range filterResource {
+		filter := filter
+		genericFilters = append(genericFilters, func(obj ezkube.ResourceId) bool {
+			return filter(obj.(*telemetry_istio_io_v1.Telemetry))
+		})
+	}
+
+	var telemetryList []*telemetry_istio_io_v1.Telemetry
+	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
+		telemetryList = append(telemetryList, obj.(*telemetry_istio_io_v1.Telemetry))
+	}
+	return telemetryList
+}
+
+func (s *telemetrySet) Map() map[string]*telemetry_istio_io_v1.Telemetry {
+	if s == nil {
+		return nil
+	}
+
+	newMap := map[string]*telemetry_istio_io_v1.Telemetry{}
+	for k, v := range s.Generic().Map() {
+		newMap[k] = v.(*telemetry_istio_io_v1.Telemetry)
+	}
+	return newMap
+}
+
+func (s *telemetrySet) Insert(
+	telemetryList ...*telemetry_istio_io_v1.Telemetry,
+) {
+	if s == nil {
+		panic("cannot insert into nil set")
+	}
+
+	for _, obj := range telemetryList {
+		s.Generic().Insert(obj)
+	}
+}
+
+func (s *telemetrySet) Has(telemetry ezkube.ResourceId) bool {
+	if s == nil {
+		return false
+	}
+	return s.Generic().Has(telemetry)
+}
+
+func (s *telemetrySet) Equal(
+	telemetrySet TelemetrySet,
+) bool {
+	if s == nil {
+		return telemetrySet == nil
+	}
+	return s.Generic().Equal(telemetrySet.Generic())
+}
+
+func (s *telemetrySet) Delete(Telemetry ezkube.ResourceId) {
+	if s == nil {
+		return
+	}
+	s.Generic().Delete(Telemetry)
+}
+
+func (s *telemetrySet) Union(set TelemetrySet) TelemetrySet {
+	if s == nil {
+		return set
+	}
+	return NewTelemetrySet(append(s.List(), set.List()...)...)
+}
+
+func (s *telemetrySet) Difference(set TelemetrySet) TelemetrySet {
+	if s == nil {
+		return set
+	}
+	newSet := s.Generic().Difference(set.Generic())
+	return &telemetrySet{set: newSet}
+}
+
+func (s *telemetrySet) Intersection(set TelemetrySet) TelemetrySet {
+	if s == nil {
+		return nil
+	}
+	newSet := s.Generic().Intersection(set.Generic())
+	var telemetryList []*telemetry_istio_io_v1.Telemetry
+	for _, obj := range newSet.List() {
+		telemetryList = append(telemetryList, obj.(*telemetry_istio_io_v1.Telemetry))
+	}
+	return NewTelemetrySet(telemetryList...)
+}
+
+func (s *telemetrySet) Find(id ezkube.ResourceId) (*telemetry_istio_io_v1.Telemetry, error) {
+	if s == nil {
+		return nil, eris.Errorf("empty set, cannot find Telemetry %v", sksets.Key(id))
+	}
+	obj, err := s.Generic().Find(&telemetry_istio_io_v1.Telemetry{}, id)
+	if err != nil {
+		return nil, err
+	}
+
+	return obj.(*telemetry_istio_io_v1.Telemetry), nil
+}
+
+func (s *telemetrySet) Length() int {
+	if s == nil {
+		return 0
+	}
+	return s.Generic().Length()
+}
+
+func (s *telemetrySet) Generic() sksets.ResourceSet {
+	if s == nil {
+		return nil
+	}
+	return s.set
+}
+
+func (s *telemetrySet) Delta(newSet TelemetrySet) sksets.ResourceDelta {
+	if s == nil {
+		return sksets.ResourceDelta{
+			Inserted: newSet.Generic(),
+		}
+	}
+	return s.Generic().Delta(newSet.Generic())
+}
+
+func (s *telemetrySet) Clone() TelemetrySet {
+	if s == nil {
+		return nil
+	}
+	return &telemetrySet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+}
diff --git a/pkg/api/istio/telemetry.istio.io/v1/type_helpers.go b/pkg/api/istio/telemetry.istio.io/v1/type_helpers.go
new file mode 100644
index 0000000..ebc39d7
--- /dev/null
+++ b/pkg/api/istio/telemetry.istio.io/v1/type_helpers.go
@@ -0,0 +1,11 @@
+// Code generated by skv2. DO NOT EDIT.
+
+// Definitions for the Kubernetes types
+package v1
+
+import (
+	. "istio.io/client-go/pkg/apis/telemetry/v1"
+)
+
+// TelemetrySlice represents a slice of *Telemetry
+type TelemetrySlice []*Telemetry
diff --git a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/clients.go b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/clients.go
index 7c15c4b..111c3ec 100644
--- a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/clients.go
+++ b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/clients.go
@@ -422,15 +422,15 @@ type HTTPRouteClient interface {
 	HTTPRouteStatusWriter
 }
 
-type hTTPRouteClient struct {
+type httprouteClient struct {
 	client client.Client
 }
 
-func NewHTTPRouteClient(client client.Client) *hTTPRouteClient {
-	return &hTTPRouteClient{client: client}
+func NewHTTPRouteClient(client client.Client) *httprouteClient {
+	return &httprouteClient{client: client}
 }
 
-func (c *hTTPRouteClient) GetHTTPRoute(ctx context.Context, key client.ObjectKey) (*gateway_networking_k8s_io_v1beta1.HTTPRoute, error) {
+func (c *httprouteClient) GetHTTPRoute(ctx context.Context, key client.ObjectKey) (*gateway_networking_k8s_io_v1beta1.HTTPRoute, error) {
 	obj := &gateway_networking_k8s_io_v1beta1.HTTPRoute{}
 	if err := c.client.Get(ctx, key, obj); err != nil {
 		return nil, err
@@ -438,7 +438,7 @@ func (c *hTTPRouteClient) GetHTTPRoute(ctx context.Context, key client.ObjectKey
 	return obj, nil
 }
 
-func (c *hTTPRouteClient) ListHTTPRoute(ctx context.Context, opts ...client.ListOption) (*gateway_networking_k8s_io_v1beta1.HTTPRouteList, error) {
+func (c *httprouteClient) ListHTTPRoute(ctx context.Context, opts ...client.ListOption) (*gateway_networking_k8s_io_v1beta1.HTTPRouteList, error) {
 	list := &gateway_networking_k8s_io_v1beta1.HTTPRouteList{}
 	if err := c.client.List(ctx, list, opts...); err != nil {
 		return nil, err
@@ -446,31 +446,31 @@ func (c *hTTPRouteClient) ListHTTPRoute(ctx context.Context, opts ...client.List
 	return list, nil
 }
 
-func (c *hTTPRouteClient) CreateHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.CreateOption) error {
+func (c *httprouteClient) CreateHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.CreateOption) error {
 	return c.client.Create(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteClient) DeleteHTTPRoute(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+func (c *httprouteClient) DeleteHTTPRoute(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
 	obj := &gateway_networking_k8s_io_v1beta1.HTTPRoute{}
 	obj.SetName(key.Name)
 	obj.SetNamespace(key.Namespace)
 	return c.client.Delete(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteClient) UpdateHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.UpdateOption) error {
+func (c *httprouteClient) UpdateHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.UpdateOption) error {
 	return c.client.Update(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteClient) PatchHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, patch client.Patch, opts ...client.PatchOption) error {
+func (c *httprouteClient) PatchHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, patch client.Patch, opts ...client.PatchOption) error {
 	return c.client.Patch(ctx, obj, patch, opts...)
 }
 
-func (c *hTTPRouteClient) DeleteAllOfHTTPRoute(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+func (c *httprouteClient) DeleteAllOfHTTPRoute(ctx context.Context, opts ...client.DeleteAllOfOption) error {
 	obj := &gateway_networking_k8s_io_v1beta1.HTTPRoute{}
 	return c.client.DeleteAllOf(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteClient) UpsertHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, transitionFuncs ...HTTPRouteTransitionFunction) error {
+func (c *httprouteClient) UpsertHTTPRoute(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, transitionFuncs ...HTTPRouteTransitionFunction) error {
 	genericTxFunc := func(existing, desired runtime.Object) error {
 		for _, txFunc := range transitionFuncs {
 			if err := txFunc(existing.(*gateway_networking_k8s_io_v1beta1.HTTPRoute), desired.(*gateway_networking_k8s_io_v1beta1.HTTPRoute)); err != nil {
@@ -483,11 +483,11 @@ func (c *hTTPRouteClient) UpsertHTTPRoute(ctx context.Context, obj *gateway_netw
 	return err
 }
 
-func (c *hTTPRouteClient) UpdateHTTPRouteStatus(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.SubResourceUpdateOption) error {
+func (c *httprouteClient) UpdateHTTPRouteStatus(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, opts ...client.SubResourceUpdateOption) error {
 	return c.client.Status().Update(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteClient) PatchHTTPRouteStatus(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+func (c *httprouteClient) PatchHTTPRouteStatus(ctx context.Context, obj *gateway_networking_k8s_io_v1beta1.HTTPRoute, patch client.Patch, opts ...client.SubResourcePatchOption) error {
 	return c.client.Status().Patch(ctx, obj, patch, opts...)
 }
 
diff --git a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/event_handlers.go b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/event_handlers.go
index c7b16c8..cd44838 100644
--- a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/event_handlers.go
+++ b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/event_handlers.go
@@ -279,17 +279,17 @@ type HTTPRouteEventWatcher interface {
 	AddEventHandler(ctx context.Context, h HTTPRouteEventHandler, predicates ...predicate.Predicate) error
 }
 
-type hTTPRouteEventWatcher struct {
+type httprouteEventWatcher struct {
 	watcher events.EventWatcher
 }
 
 func NewHTTPRouteEventWatcher(name string, mgr manager.Manager) HTTPRouteEventWatcher {
-	return &hTTPRouteEventWatcher{
+	return &httprouteEventWatcher{
 		watcher: events.NewWatcher(name, mgr, &gateway_networking_k8s_io_v1beta1.HTTPRoute{}),
 	}
 }
 
-func (c *hTTPRouteEventWatcher) AddEventHandler(ctx context.Context, h HTTPRouteEventHandler, predicates ...predicate.Predicate) error {
+func (c *httprouteEventWatcher) AddEventHandler(ctx context.Context, h HTTPRouteEventHandler, predicates ...predicate.Predicate) error {
 	handler := genericHTTPRouteHandler{handler: h}
 	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
 		return err
diff --git a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/reconcilers.go b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/reconcilers.go
index 24865fe..8e7213f 100644
--- a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/reconcilers.go
+++ b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/controller/reconcilers.go
@@ -302,18 +302,18 @@ type HTTPRouteReconcileLoop interface {
 	RunHTTPRouteReconciler(ctx context.Context, rec HTTPRouteReconciler, predicates ...predicate.Predicate) error
 }
 
-type hTTPRouteReconcileLoop struct {
+type httprouteReconcileLoop struct {
 	loop reconcile.Loop
 }
 
 func NewHTTPRouteReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) HTTPRouteReconcileLoop {
-	return &hTTPRouteReconcileLoop{
+	return &httprouteReconcileLoop{
 		// empty cluster indicates this reconciler is built for the local cluster
 		loop: reconcile.NewLoop(name, "", mgr, &gateway_networking_k8s_io_v1beta1.HTTPRoute{}, options),
 	}
 }
 
-func (c *hTTPRouteReconcileLoop) RunHTTPRouteReconciler(ctx context.Context, reconciler HTTPRouteReconciler, predicates ...predicate.Predicate) error {
+func (c *httprouteReconcileLoop) RunHTTPRouteReconciler(ctx context.Context, reconciler HTTPRouteReconciler, predicates ...predicate.Predicate) error {
 	genericReconciler := genericHTTPRouteReconciler{
 		reconciler: reconciler,
 	}
diff --git a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/mocks/sets.go b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/mocks/sets.go
index 9d91b1f..a897405 100644
--- a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/mocks/sets.go
+++ b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/mocks/sets.go
@@ -565,15 +565,15 @@ func (mr *MockHTTPRouteSetMockRecorder) Clone() *gomock.Call {
 }
 
 // Delete mocks base method.
-func (m *MockHTTPRouteSet) Delete(hTTPRoute ezkube.ResourceId) {
+func (m *MockHTTPRouteSet) Delete(httproute ezkube.ResourceId) {
 	m.ctrl.T.Helper()
-	m.ctrl.Call(m, "Delete", hTTPRoute)
+	m.ctrl.Call(m, "Delete", httproute)
 }
 
 // Delete indicates an expected call of Delete.
-func (mr *MockHTTPRouteSetMockRecorder) Delete(hTTPRoute interface{}) *gomock.Call {
+func (mr *MockHTTPRouteSetMockRecorder) Delete(httproute interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockHTTPRouteSet)(nil).Delete), hTTPRoute)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockHTTPRouteSet)(nil).Delete), httproute)
 }
 
 // Delta mocks base method.
@@ -605,17 +605,17 @@ func (mr *MockHTTPRouteSetMockRecorder) Difference(set interface{}) *gomock.Call
 }
 
 // Equal mocks base method.
-func (m *MockHTTPRouteSet) Equal(hTTPRouteSet v1beta1sets.HTTPRouteSet) bool {
+func (m *MockHTTPRouteSet) Equal(httprouteSet v1beta1sets.HTTPRouteSet) bool {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Equal", hTTPRouteSet)
+	ret := m.ctrl.Call(m, "Equal", httprouteSet)
 	ret0, _ := ret[0].(bool)
 	return ret0
 }
 
 // Equal indicates an expected call of Equal.
-func (mr *MockHTTPRouteSetMockRecorder) Equal(hTTPRouteSet interface{}) *gomock.Call {
+func (mr *MockHTTPRouteSetMockRecorder) Equal(httprouteSet interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockHTTPRouteSet)(nil).Equal), hTTPRouteSet)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockHTTPRouteSet)(nil).Equal), httprouteSet)
 }
 
 // Find mocks base method.
@@ -648,33 +648,33 @@ func (mr *MockHTTPRouteSetMockRecorder) Generic() *gomock.Call {
 }
 
 // Has mocks base method.
-func (m *MockHTTPRouteSet) Has(hTTPRoute ezkube.ResourceId) bool {
+func (m *MockHTTPRouteSet) Has(httproute ezkube.ResourceId) bool {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Has", hTTPRoute)
+	ret := m.ctrl.Call(m, "Has", httproute)
 	ret0, _ := ret[0].(bool)
 	return ret0
 }
 
 // Has indicates an expected call of Has.
-func (mr *MockHTTPRouteSetMockRecorder) Has(hTTPRoute interface{}) *gomock.Call {
+func (mr *MockHTTPRouteSetMockRecorder) Has(httproute interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockHTTPRouteSet)(nil).Has), hTTPRoute)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockHTTPRouteSet)(nil).Has), httproute)
 }
 
 // Insert mocks base method.
-func (m *MockHTTPRouteSet) Insert(hTTPRoute ...*v1beta1.HTTPRoute) {
+func (m *MockHTTPRouteSet) Insert(httproute ...*v1beta1.HTTPRoute) {
 	m.ctrl.T.Helper()
 	varargs := []interface{}{}
-	for _, a := range hTTPRoute {
+	for _, a := range httproute {
 		varargs = append(varargs, a)
 	}
 	m.ctrl.Call(m, "Insert", varargs...)
 }
 
 // Insert indicates an expected call of Insert.
-func (mr *MockHTTPRouteSetMockRecorder) Insert(hTTPRoute ...interface{}) *gomock.Call {
+func (mr *MockHTTPRouteSetMockRecorder) Insert(httproute ...interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockHTTPRouteSet)(nil).Insert), hTTPRoute...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockHTTPRouteSet)(nil).Insert), httproute...)
 }
 
 // Intersection mocks base method.
diff --git a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/sets.go b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/sets.go
index bfa04d4..9bed97a 100644
--- a/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/sets.go
+++ b/pkg/api/k8s/gateway.networking.k8s.io/v1beta1/sets/sets.go
@@ -471,13 +471,13 @@ type HTTPRouteSet interface {
 	// Return the Set as a map of key to resource.
 	Map() map[string]*gateway_networking_k8s_io_v1beta1.HTTPRoute
 	// Insert a resource into the set.
-	Insert(hTTPRoute ...*gateway_networking_k8s_io_v1beta1.HTTPRoute)
+	Insert(httproute ...*gateway_networking_k8s_io_v1beta1.HTTPRoute)
 	// Compare the equality of the keys in two sets (not the resources themselves)
-	Equal(hTTPRouteSet HTTPRouteSet) bool
+	Equal(httprouteSet HTTPRouteSet) bool
 	// Check if the set contains a key matching the resource (not the resource itself)
-	Has(hTTPRoute ezkube.ResourceId) bool
+	Has(httproute ezkube.ResourceId) bool
 	// Delete the key matching the resource
-	Delete(hTTPRoute ezkube.ResourceId)
+	Delete(httproute ezkube.ResourceId)
 	// Return the union with the provided set
 	Union(set HTTPRouteSet) HTTPRouteSet
 	// Return the difference with the provided set
@@ -496,38 +496,38 @@ type HTTPRouteSet interface {
 	Clone() HTTPRouteSet
 }
 
-func makeGenericHTTPRouteSet(hTTPRouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute) sksets.ResourceSet {
+func makeGenericHTTPRouteSet(httprouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute) sksets.ResourceSet {
 	var genericResources []ezkube.ResourceId
-	for _, obj := range hTTPRouteList {
+	for _, obj := range httprouteList {
 		genericResources = append(genericResources, obj)
 	}
 	return sksets.NewResourceSet(genericResources...)
 }
 
-type hTTPRouteSet struct {
+type httprouteSet struct {
 	set sksets.ResourceSet
 }
 
-func NewHTTPRouteSet(hTTPRouteList ...*gateway_networking_k8s_io_v1beta1.HTTPRoute) HTTPRouteSet {
-	return &hTTPRouteSet{set: makeGenericHTTPRouteSet(hTTPRouteList)}
+func NewHTTPRouteSet(httprouteList ...*gateway_networking_k8s_io_v1beta1.HTTPRoute) HTTPRouteSet {
+	return &httprouteSet{set: makeGenericHTTPRouteSet(httprouteList)}
 }
 
-func NewHTTPRouteSetFromList(hTTPRouteList *gateway_networking_k8s_io_v1beta1.HTTPRouteList) HTTPRouteSet {
-	list := make([]*gateway_networking_k8s_io_v1beta1.HTTPRoute, 0, len(hTTPRouteList.Items))
-	for idx := range hTTPRouteList.Items {
-		list = append(list, &hTTPRouteList.Items[idx])
+func NewHTTPRouteSetFromList(httprouteList *gateway_networking_k8s_io_v1beta1.HTTPRouteList) HTTPRouteSet {
+	list := make([]*gateway_networking_k8s_io_v1beta1.HTTPRoute, 0, len(httprouteList.Items))
+	for idx := range httprouteList.Items {
+		list = append(list, &httprouteList.Items[idx])
 	}
-	return &hTTPRouteSet{set: makeGenericHTTPRouteSet(list)}
+	return &httprouteSet{set: makeGenericHTTPRouteSet(list)}
 }
 
-func (s *hTTPRouteSet) Keys() sets.String {
+func (s *httprouteSet) Keys() sets.String {
 	if s == nil {
 		return sets.String{}
 	}
 	return s.Generic().Keys()
 }
 
-func (s *hTTPRouteSet) List(filterResource ...func(*gateway_networking_k8s_io_v1beta1.HTTPRoute) bool) []*gateway_networking_k8s_io_v1beta1.HTTPRoute {
+func (s *httprouteSet) List(filterResource ...func(*gateway_networking_k8s_io_v1beta1.HTTPRoute) bool) []*gateway_networking_k8s_io_v1beta1.HTTPRoute {
 	if s == nil {
 		return nil
 	}
@@ -540,14 +540,14 @@ func (s *hTTPRouteSet) List(filterResource ...func(*gateway_networking_k8s_io_v1
 	}
 
 	objs := s.Generic().List(genericFilters...)
-	hTTPRouteList := make([]*gateway_networking_k8s_io_v1beta1.HTTPRoute, 0, len(objs))
+	httprouteList := make([]*gateway_networking_k8s_io_v1beta1.HTTPRoute, 0, len(objs))
 	for _, obj := range objs {
-		hTTPRouteList = append(hTTPRouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
+		httprouteList = append(httprouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
 	}
-	return hTTPRouteList
+	return httprouteList
 }
 
-func (s *hTTPRouteSet) UnsortedList(filterResource ...func(*gateway_networking_k8s_io_v1beta1.HTTPRoute) bool) []*gateway_networking_k8s_io_v1beta1.HTTPRoute {
+func (s *httprouteSet) UnsortedList(filterResource ...func(*gateway_networking_k8s_io_v1beta1.HTTPRoute) bool) []*gateway_networking_k8s_io_v1beta1.HTTPRoute {
 	if s == nil {
 		return nil
 	}
@@ -559,14 +559,14 @@ func (s *hTTPRouteSet) UnsortedList(filterResource ...func(*gateway_networking_k
 		})
 	}
 
-	var hTTPRouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute
+	var httprouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute
 	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
-		hTTPRouteList = append(hTTPRouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
+		httprouteList = append(httprouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
 	}
-	return hTTPRouteList
+	return httprouteList
 }
 
-func (s *hTTPRouteSet) Map() map[string]*gateway_networking_k8s_io_v1beta1.HTTPRoute {
+func (s *httprouteSet) Map() map[string]*gateway_networking_k8s_io_v1beta1.HTTPRoute {
 	if s == nil {
 		return nil
 	}
@@ -578,69 +578,69 @@ func (s *hTTPRouteSet) Map() map[string]*gateway_networking_k8s_io_v1beta1.HTTPR
 	return newMap
 }
 
-func (s *hTTPRouteSet) Insert(
-	hTTPRouteList ...*gateway_networking_k8s_io_v1beta1.HTTPRoute,
+func (s *httprouteSet) Insert(
+	httprouteList ...*gateway_networking_k8s_io_v1beta1.HTTPRoute,
 ) {
 	if s == nil {
 		panic("cannot insert into nil set")
 	}
 
-	for _, obj := range hTTPRouteList {
+	for _, obj := range httprouteList {
 		s.Generic().Insert(obj)
 	}
 }
 
-func (s *hTTPRouteSet) Has(hTTPRoute ezkube.ResourceId) bool {
+func (s *httprouteSet) Has(httproute ezkube.ResourceId) bool {
 	if s == nil {
 		return false
 	}
-	return s.Generic().Has(hTTPRoute)
+	return s.Generic().Has(httproute)
 }
 
-func (s *hTTPRouteSet) Equal(
-	hTTPRouteSet HTTPRouteSet,
+func (s *httprouteSet) Equal(
+	httprouteSet HTTPRouteSet,
 ) bool {
 	if s == nil {
-		return hTTPRouteSet == nil
+		return httprouteSet == nil
 	}
-	return s.Generic().Equal(hTTPRouteSet.Generic())
+	return s.Generic().Equal(httprouteSet.Generic())
 }
 
-func (s *hTTPRouteSet) Delete(HTTPRoute ezkube.ResourceId) {
+func (s *httprouteSet) Delete(HTTPRoute ezkube.ResourceId) {
 	if s == nil {
 		return
 	}
 	s.Generic().Delete(HTTPRoute)
 }
 
-func (s *hTTPRouteSet) Union(set HTTPRouteSet) HTTPRouteSet {
+func (s *httprouteSet) Union(set HTTPRouteSet) HTTPRouteSet {
 	if s == nil {
 		return set
 	}
 	return NewHTTPRouteSet(append(s.List(), set.List()...)...)
 }
 
-func (s *hTTPRouteSet) Difference(set HTTPRouteSet) HTTPRouteSet {
+func (s *httprouteSet) Difference(set HTTPRouteSet) HTTPRouteSet {
 	if s == nil {
 		return set
 	}
 	newSet := s.Generic().Difference(set.Generic())
-	return &hTTPRouteSet{set: newSet}
+	return &httprouteSet{set: newSet}
 }
 
-func (s *hTTPRouteSet) Intersection(set HTTPRouteSet) HTTPRouteSet {
+func (s *httprouteSet) Intersection(set HTTPRouteSet) HTTPRouteSet {
 	if s == nil {
 		return nil
 	}
 	newSet := s.Generic().Intersection(set.Generic())
-	var hTTPRouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute
+	var httprouteList []*gateway_networking_k8s_io_v1beta1.HTTPRoute
 	for _, obj := range newSet.List() {
-		hTTPRouteList = append(hTTPRouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
+		httprouteList = append(httprouteList, obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute))
 	}
-	return NewHTTPRouteSet(hTTPRouteList...)
+	return NewHTTPRouteSet(httprouteList...)
 }
 
-func (s *hTTPRouteSet) Find(id ezkube.ResourceId) (*gateway_networking_k8s_io_v1beta1.HTTPRoute, error) {
+func (s *httprouteSet) Find(id ezkube.ResourceId) (*gateway_networking_k8s_io_v1beta1.HTTPRoute, error) {
 	if s == nil {
 		return nil, eris.Errorf("empty set, cannot find HTTPRoute %v", sksets.Key(id))
 	}
@@ -652,21 +652,21 @@ func (s *hTTPRouteSet) Find(id ezkube.ResourceId) (*gateway_networking_k8s_io_v1
 	return obj.(*gateway_networking_k8s_io_v1beta1.HTTPRoute), nil
 }
 
-func (s *hTTPRouteSet) Length() int {
+func (s *httprouteSet) Length() int {
 	if s == nil {
 		return 0
 	}
 	return s.Generic().Length()
 }
 
-func (s *hTTPRouteSet) Generic() sksets.ResourceSet {
+func (s *httprouteSet) Generic() sksets.ResourceSet {
 	if s == nil {
 		return nil
 	}
 	return s.set
 }
 
-func (s *hTTPRouteSet) Delta(newSet HTTPRouteSet) sksets.ResourceDelta {
+func (s *httprouteSet) Delta(newSet HTTPRouteSet) sksets.ResourceDelta {
 	if s == nil {
 		return sksets.ResourceDelta{
 			Inserted: newSet.Generic(),
@@ -675,9 +675,9 @@ func (s *hTTPRouteSet) Delta(newSet HTTPRouteSet) sksets.ResourceDelta {
 	return s.Generic().Delta(newSet.Generic())
 }
 
-func (s *hTTPRouteSet) Clone() HTTPRouteSet {
+func (s *httprouteSet) Clone() HTTPRouteSet {
 	if s == nil {
 		return nil
 	}
-	return &hTTPRouteSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+	return &httprouteSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
 }
diff --git a/pkg/api/smi/specs.smi-spec.io/v1alpha3/clients.go b/pkg/api/smi/specs.smi-spec.io/v1alpha3/clients.go
index 5020278..82cd97c 100644
--- a/pkg/api/smi/specs.smi-spec.io/v1alpha3/clients.go
+++ b/pkg/api/smi/specs.smi-spec.io/v1alpha3/clients.go
@@ -122,15 +122,15 @@ type HTTPRouteGroupClient interface {
 	HTTPRouteGroupStatusWriter
 }
 
-type hTTPRouteGroupClient struct {
+type httprouteGroupClient struct {
 	client client.Client
 }
 
-func NewHTTPRouteGroupClient(client client.Client) *hTTPRouteGroupClient {
-	return &hTTPRouteGroupClient{client: client}
+func NewHTTPRouteGroupClient(client client.Client) *httprouteGroupClient {
+	return &httprouteGroupClient{client: client}
 }
 
-func (c *hTTPRouteGroupClient) GetHTTPRouteGroup(ctx context.Context, key client.ObjectKey) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, error) {
+func (c *httprouteGroupClient) GetHTTPRouteGroup(ctx context.Context, key client.ObjectKey) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, error) {
 	obj := &specs_smi_spec_io_v1alpha3.HTTPRouteGroup{}
 	if err := c.client.Get(ctx, key, obj); err != nil {
 		return nil, err
@@ -138,7 +138,7 @@ func (c *hTTPRouteGroupClient) GetHTTPRouteGroup(ctx context.Context, key client
 	return obj, nil
 }
 
-func (c *hTTPRouteGroupClient) ListHTTPRouteGroup(ctx context.Context, opts ...client.ListOption) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroupList, error) {
+func (c *httprouteGroupClient) ListHTTPRouteGroup(ctx context.Context, opts ...client.ListOption) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroupList, error) {
 	list := &specs_smi_spec_io_v1alpha3.HTTPRouteGroupList{}
 	if err := c.client.List(ctx, list, opts...); err != nil {
 		return nil, err
@@ -146,31 +146,31 @@ func (c *hTTPRouteGroupClient) ListHTTPRouteGroup(ctx context.Context, opts ...c
 	return list, nil
 }
 
-func (c *hTTPRouteGroupClient) CreateHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.CreateOption) error {
+func (c *httprouteGroupClient) CreateHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.CreateOption) error {
 	return c.client.Create(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteGroupClient) DeleteHTTPRouteGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
+func (c *httprouteGroupClient) DeleteHTTPRouteGroup(ctx context.Context, key client.ObjectKey, opts ...client.DeleteOption) error {
 	obj := &specs_smi_spec_io_v1alpha3.HTTPRouteGroup{}
 	obj.SetName(key.Name)
 	obj.SetNamespace(key.Namespace)
 	return c.client.Delete(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteGroupClient) UpdateHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.UpdateOption) error {
+func (c *httprouteGroupClient) UpdateHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.UpdateOption) error {
 	return c.client.Update(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteGroupClient) PatchHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, patch client.Patch, opts ...client.PatchOption) error {
+func (c *httprouteGroupClient) PatchHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, patch client.Patch, opts ...client.PatchOption) error {
 	return c.client.Patch(ctx, obj, patch, opts...)
 }
 
-func (c *hTTPRouteGroupClient) DeleteAllOfHTTPRouteGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error {
+func (c *httprouteGroupClient) DeleteAllOfHTTPRouteGroup(ctx context.Context, opts ...client.DeleteAllOfOption) error {
 	obj := &specs_smi_spec_io_v1alpha3.HTTPRouteGroup{}
 	return c.client.DeleteAllOf(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteGroupClient) UpsertHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, transitionFuncs ...HTTPRouteGroupTransitionFunction) error {
+func (c *httprouteGroupClient) UpsertHTTPRouteGroup(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, transitionFuncs ...HTTPRouteGroupTransitionFunction) error {
 	genericTxFunc := func(existing, desired runtime.Object) error {
 		for _, txFunc := range transitionFuncs {
 			if err := txFunc(existing.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup), desired.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup)); err != nil {
@@ -183,11 +183,11 @@ func (c *hTTPRouteGroupClient) UpsertHTTPRouteGroup(ctx context.Context, obj *sp
 	return err
 }
 
-func (c *hTTPRouteGroupClient) UpdateHTTPRouteGroupStatus(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.SubResourceUpdateOption) error {
+func (c *httprouteGroupClient) UpdateHTTPRouteGroupStatus(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, opts ...client.SubResourceUpdateOption) error {
 	return c.client.Status().Update(ctx, obj, opts...)
 }
 
-func (c *hTTPRouteGroupClient) PatchHTTPRouteGroupStatus(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+func (c *httprouteGroupClient) PatchHTTPRouteGroupStatus(ctx context.Context, obj *specs_smi_spec_io_v1alpha3.HTTPRouteGroup, patch client.Patch, opts ...client.SubResourcePatchOption) error {
 	return c.client.Status().Patch(ctx, obj, patch, opts...)
 }
 
diff --git a/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/event_handlers.go b/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/event_handlers.go
index 684a4e2..badb267 100644
--- a/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/event_handlers.go
+++ b/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/event_handlers.go
@@ -65,17 +65,17 @@ type HTTPRouteGroupEventWatcher interface {
 	AddEventHandler(ctx context.Context, h HTTPRouteGroupEventHandler, predicates ...predicate.Predicate) error
 }
 
-type hTTPRouteGroupEventWatcher struct {
+type httprouteGroupEventWatcher struct {
 	watcher events.EventWatcher
 }
 
 func NewHTTPRouteGroupEventWatcher(name string, mgr manager.Manager) HTTPRouteGroupEventWatcher {
-	return &hTTPRouteGroupEventWatcher{
+	return &httprouteGroupEventWatcher{
 		watcher: events.NewWatcher(name, mgr, &specs_smi_spec_io_v1alpha3.HTTPRouteGroup{}),
 	}
 }
 
-func (c *hTTPRouteGroupEventWatcher) AddEventHandler(ctx context.Context, h HTTPRouteGroupEventHandler, predicates ...predicate.Predicate) error {
+func (c *httprouteGroupEventWatcher) AddEventHandler(ctx context.Context, h HTTPRouteGroupEventHandler, predicates ...predicate.Predicate) error {
 	handler := genericHTTPRouteGroupHandler{handler: h}
 	if err := c.watcher.Watch(ctx, handler, predicates...); err != nil {
 		return err
diff --git a/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/reconcilers.go b/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/reconcilers.go
index dee45b6..b9c7c77 100644
--- a/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/reconcilers.go
+++ b/pkg/api/smi/specs.smi-spec.io/v1alpha3/controller/reconcilers.go
@@ -68,18 +68,18 @@ type HTTPRouteGroupReconcileLoop interface {
 	RunHTTPRouteGroupReconciler(ctx context.Context, rec HTTPRouteGroupReconciler, predicates ...predicate.Predicate) error
 }
 
-type hTTPRouteGroupReconcileLoop struct {
+type httprouteGroupReconcileLoop struct {
 	loop reconcile.Loop
 }
 
 func NewHTTPRouteGroupReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) HTTPRouteGroupReconcileLoop {
-	return &hTTPRouteGroupReconcileLoop{
+	return &httprouteGroupReconcileLoop{
 		// empty cluster indicates this reconciler is built for the local cluster
 		loop: reconcile.NewLoop(name, "", mgr, &specs_smi_spec_io_v1alpha3.HTTPRouteGroup{}, options),
 	}
 }
 
-func (c *hTTPRouteGroupReconcileLoop) RunHTTPRouteGroupReconciler(ctx context.Context, reconciler HTTPRouteGroupReconciler, predicates ...predicate.Predicate) error {
+func (c *httprouteGroupReconcileLoop) RunHTTPRouteGroupReconciler(ctx context.Context, reconciler HTTPRouteGroupReconciler, predicates ...predicate.Predicate) error {
 	genericReconciler := genericHTTPRouteGroupReconciler{
 		reconciler: reconciler,
 	}
diff --git a/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/mocks/sets.go b/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/mocks/sets.go
index fcacd61..12bf2d0 100644
--- a/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/mocks/sets.go
+++ b/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/mocks/sets.go
@@ -53,15 +53,15 @@ func (mr *MockHTTPRouteGroupSetMockRecorder) Clone() *gomock.Call {
 }
 
 // Delete mocks base method.
-func (m *MockHTTPRouteGroupSet) Delete(hTTPRouteGroup ezkube.ResourceId) {
+func (m *MockHTTPRouteGroupSet) Delete(httprouteGroup ezkube.ResourceId) {
 	m.ctrl.T.Helper()
-	m.ctrl.Call(m, "Delete", hTTPRouteGroup)
+	m.ctrl.Call(m, "Delete", httprouteGroup)
 }
 
 // Delete indicates an expected call of Delete.
-func (mr *MockHTTPRouteGroupSetMockRecorder) Delete(hTTPRouteGroup interface{}) *gomock.Call {
+func (mr *MockHTTPRouteGroupSetMockRecorder) Delete(httprouteGroup interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Delete), hTTPRouteGroup)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Delete), httprouteGroup)
 }
 
 // Delta mocks base method.
@@ -93,17 +93,17 @@ func (mr *MockHTTPRouteGroupSetMockRecorder) Difference(set interface{}) *gomock
 }
 
 // Equal mocks base method.
-func (m *MockHTTPRouteGroupSet) Equal(hTTPRouteGroupSet v1alpha3sets.HTTPRouteGroupSet) bool {
+func (m *MockHTTPRouteGroupSet) Equal(httprouteGroupSet v1alpha3sets.HTTPRouteGroupSet) bool {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Equal", hTTPRouteGroupSet)
+	ret := m.ctrl.Call(m, "Equal", httprouteGroupSet)
 	ret0, _ := ret[0].(bool)
 	return ret0
 }
 
 // Equal indicates an expected call of Equal.
-func (mr *MockHTTPRouteGroupSetMockRecorder) Equal(hTTPRouteGroupSet interface{}) *gomock.Call {
+func (mr *MockHTTPRouteGroupSetMockRecorder) Equal(httprouteGroupSet interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Equal), hTTPRouteGroupSet)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Equal), httprouteGroupSet)
 }
 
 // Find mocks base method.
@@ -136,33 +136,33 @@ func (mr *MockHTTPRouteGroupSetMockRecorder) Generic() *gomock.Call {
 }
 
 // Has mocks base method.
-func (m *MockHTTPRouteGroupSet) Has(hTTPRouteGroup ezkube.ResourceId) bool {
+func (m *MockHTTPRouteGroupSet) Has(httprouteGroup ezkube.ResourceId) bool {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Has", hTTPRouteGroup)
+	ret := m.ctrl.Call(m, "Has", httprouteGroup)
 	ret0, _ := ret[0].(bool)
 	return ret0
 }
 
 // Has indicates an expected call of Has.
-func (mr *MockHTTPRouteGroupSetMockRecorder) Has(hTTPRouteGroup interface{}) *gomock.Call {
+func (mr *MockHTTPRouteGroupSetMockRecorder) Has(httprouteGroup interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Has), hTTPRouteGroup)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Has", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Has), httprouteGroup)
 }
 
 // Insert mocks base method.
-func (m *MockHTTPRouteGroupSet) Insert(hTTPRouteGroup ...*v1alpha3.HTTPRouteGroup) {
+func (m *MockHTTPRouteGroupSet) Insert(httprouteGroup ...*v1alpha3.HTTPRouteGroup) {
 	m.ctrl.T.Helper()
 	varargs := []interface{}{}
-	for _, a := range hTTPRouteGroup {
+	for _, a := range httprouteGroup {
 		varargs = append(varargs, a)
 	}
 	m.ctrl.Call(m, "Insert", varargs...)
 }
 
 // Insert indicates an expected call of Insert.
-func (mr *MockHTTPRouteGroupSetMockRecorder) Insert(hTTPRouteGroup ...interface{}) *gomock.Call {
+func (mr *MockHTTPRouteGroupSetMockRecorder) Insert(httprouteGroup ...interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Insert), hTTPRouteGroup...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockHTTPRouteGroupSet)(nil).Insert), httprouteGroup...)
 }
 
 // Intersection mocks base method.
diff --git a/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/sets.go b/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/sets.go
index 2e3903c..c33406c 100644
--- a/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/sets.go
+++ b/pkg/api/smi/specs.smi-spec.io/v1alpha3/sets/sets.go
@@ -25,13 +25,13 @@ type HTTPRouteGroupSet interface {
 	// Return the Set as a map of key to resource.
 	Map() map[string]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup
 	// Insert a resource into the set.
-	Insert(hTTPRouteGroup ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup)
+	Insert(httprouteGroup ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup)
 	// Compare the equality of the keys in two sets (not the resources themselves)
-	Equal(hTTPRouteGroupSet HTTPRouteGroupSet) bool
+	Equal(httprouteGroupSet HTTPRouteGroupSet) bool
 	// Check if the set contains a key matching the resource (not the resource itself)
-	Has(hTTPRouteGroup ezkube.ResourceId) bool
+	Has(httprouteGroup ezkube.ResourceId) bool
 	// Delete the key matching the resource
-	Delete(hTTPRouteGroup ezkube.ResourceId)
+	Delete(httprouteGroup ezkube.ResourceId)
 	// Return the union with the provided set
 	Union(set HTTPRouteGroupSet) HTTPRouteGroupSet
 	// Return the difference with the provided set
@@ -50,38 +50,38 @@ type HTTPRouteGroupSet interface {
 	Clone() HTTPRouteGroupSet
 }
 
-func makeGenericHTTPRouteGroupSet(hTTPRouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) sksets.ResourceSet {
+func makeGenericHTTPRouteGroupSet(httprouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) sksets.ResourceSet {
 	var genericResources []ezkube.ResourceId
-	for _, obj := range hTTPRouteGroupList {
+	for _, obj := range httprouteGroupList {
 		genericResources = append(genericResources, obj)
 	}
 	return sksets.NewResourceSet(genericResources...)
 }
 
-type hTTPRouteGroupSet struct {
+type httprouteGroupSet struct {
 	set sksets.ResourceSet
 }
 
-func NewHTTPRouteGroupSet(hTTPRouteGroupList ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) HTTPRouteGroupSet {
-	return &hTTPRouteGroupSet{set: makeGenericHTTPRouteGroupSet(hTTPRouteGroupList)}
+func NewHTTPRouteGroupSet(httprouteGroupList ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) HTTPRouteGroupSet {
+	return &httprouteGroupSet{set: makeGenericHTTPRouteGroupSet(httprouteGroupList)}
 }
 
-func NewHTTPRouteGroupSetFromList(hTTPRouteGroupList *specs_smi_spec_io_v1alpha3.HTTPRouteGroupList) HTTPRouteGroupSet {
-	list := make([]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, 0, len(hTTPRouteGroupList.Items))
-	for idx := range hTTPRouteGroupList.Items {
-		list = append(list, &hTTPRouteGroupList.Items[idx])
+func NewHTTPRouteGroupSetFromList(httprouteGroupList *specs_smi_spec_io_v1alpha3.HTTPRouteGroupList) HTTPRouteGroupSet {
+	list := make([]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, 0, len(httprouteGroupList.Items))
+	for idx := range httprouteGroupList.Items {
+		list = append(list, &httprouteGroupList.Items[idx])
 	}
-	return &hTTPRouteGroupSet{set: makeGenericHTTPRouteGroupSet(list)}
+	return &httprouteGroupSet{set: makeGenericHTTPRouteGroupSet(list)}
 }
 
-func (s *hTTPRouteGroupSet) Keys() sets.String {
+func (s *httprouteGroupSet) Keys() sets.String {
 	if s == nil {
 		return sets.String{}
 	}
 	return s.Generic().Keys()
 }
 
-func (s *hTTPRouteGroupSet) List(filterResource ...func(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) bool) []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
+func (s *httprouteGroupSet) List(filterResource ...func(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) bool) []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
 	if s == nil {
 		return nil
 	}
@@ -94,14 +94,14 @@ func (s *hTTPRouteGroupSet) List(filterResource ...func(*specs_smi_spec_io_v1alp
 	}
 
 	objs := s.Generic().List(genericFilters...)
-	hTTPRouteGroupList := make([]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, 0, len(objs))
+	httprouteGroupList := make([]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, 0, len(objs))
 	for _, obj := range objs {
-		hTTPRouteGroupList = append(hTTPRouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
+		httprouteGroupList = append(httprouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
 	}
-	return hTTPRouteGroupList
+	return httprouteGroupList
 }
 
-func (s *hTTPRouteGroupSet) UnsortedList(filterResource ...func(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) bool) []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
+func (s *httprouteGroupSet) UnsortedList(filterResource ...func(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup) bool) []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
 	if s == nil {
 		return nil
 	}
@@ -113,14 +113,14 @@ func (s *hTTPRouteGroupSet) UnsortedList(filterResource ...func(*specs_smi_spec_
 		})
 	}
 
-	var hTTPRouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup
+	var httprouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup
 	for _, obj := range s.Generic().UnsortedList(genericFilters...) {
-		hTTPRouteGroupList = append(hTTPRouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
+		httprouteGroupList = append(httprouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
 	}
-	return hTTPRouteGroupList
+	return httprouteGroupList
 }
 
-func (s *hTTPRouteGroupSet) Map() map[string]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
+func (s *httprouteGroupSet) Map() map[string]*specs_smi_spec_io_v1alpha3.HTTPRouteGroup {
 	if s == nil {
 		return nil
 	}
@@ -132,69 +132,69 @@ func (s *hTTPRouteGroupSet) Map() map[string]*specs_smi_spec_io_v1alpha3.HTTPRou
 	return newMap
 }
 
-func (s *hTTPRouteGroupSet) Insert(
-	hTTPRouteGroupList ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup,
+func (s *httprouteGroupSet) Insert(
+	httprouteGroupList ...*specs_smi_spec_io_v1alpha3.HTTPRouteGroup,
 ) {
 	if s == nil {
 		panic("cannot insert into nil set")
 	}
 
-	for _, obj := range hTTPRouteGroupList {
+	for _, obj := range httprouteGroupList {
 		s.Generic().Insert(obj)
 	}
 }
 
-func (s *hTTPRouteGroupSet) Has(hTTPRouteGroup ezkube.ResourceId) bool {
+func (s *httprouteGroupSet) Has(httprouteGroup ezkube.ResourceId) bool {
 	if s == nil {
 		return false
 	}
-	return s.Generic().Has(hTTPRouteGroup)
+	return s.Generic().Has(httprouteGroup)
 }
 
-func (s *hTTPRouteGroupSet) Equal(
-	hTTPRouteGroupSet HTTPRouteGroupSet,
+func (s *httprouteGroupSet) Equal(
+	httprouteGroupSet HTTPRouteGroupSet,
 ) bool {
 	if s == nil {
-		return hTTPRouteGroupSet == nil
+		return httprouteGroupSet == nil
 	}
-	return s.Generic().Equal(hTTPRouteGroupSet.Generic())
+	return s.Generic().Equal(httprouteGroupSet.Generic())
 }
 
-func (s *hTTPRouteGroupSet) Delete(HTTPRouteGroup ezkube.ResourceId) {
+func (s *httprouteGroupSet) Delete(HTTPRouteGroup ezkube.ResourceId) {
 	if s == nil {
 		return
 	}
 	s.Generic().Delete(HTTPRouteGroup)
 }
 
-func (s *hTTPRouteGroupSet) Union(set HTTPRouteGroupSet) HTTPRouteGroupSet {
+func (s *httprouteGroupSet) Union(set HTTPRouteGroupSet) HTTPRouteGroupSet {
 	if s == nil {
 		return set
 	}
 	return NewHTTPRouteGroupSet(append(s.List(), set.List()...)...)
 }
 
-func (s *hTTPRouteGroupSet) Difference(set HTTPRouteGroupSet) HTTPRouteGroupSet {
+func (s *httprouteGroupSet) Difference(set HTTPRouteGroupSet) HTTPRouteGroupSet {
 	if s == nil {
 		return set
 	}
 	newSet := s.Generic().Difference(set.Generic())
-	return &hTTPRouteGroupSet{set: newSet}
+	return &httprouteGroupSet{set: newSet}
 }
 
-func (s *hTTPRouteGroupSet) Intersection(set HTTPRouteGroupSet) HTTPRouteGroupSet {
+func (s *httprouteGroupSet) Intersection(set HTTPRouteGroupSet) HTTPRouteGroupSet {
 	if s == nil {
 		return nil
 	}
 	newSet := s.Generic().Intersection(set.Generic())
-	var hTTPRouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup
+	var httprouteGroupList []*specs_smi_spec_io_v1alpha3.HTTPRouteGroup
 	for _, obj := range newSet.List() {
-		hTTPRouteGroupList = append(hTTPRouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
+		httprouteGroupList = append(httprouteGroupList, obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup))
 	}
-	return NewHTTPRouteGroupSet(hTTPRouteGroupList...)
+	return NewHTTPRouteGroupSet(httprouteGroupList...)
 }
 
-func (s *hTTPRouteGroupSet) Find(id ezkube.ResourceId) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, error) {
+func (s *httprouteGroupSet) Find(id ezkube.ResourceId) (*specs_smi_spec_io_v1alpha3.HTTPRouteGroup, error) {
 	if s == nil {
 		return nil, eris.Errorf("empty set, cannot find HTTPRouteGroup %v", sksets.Key(id))
 	}
@@ -206,21 +206,21 @@ func (s *hTTPRouteGroupSet) Find(id ezkube.ResourceId) (*specs_smi_spec_io_v1alp
 	return obj.(*specs_smi_spec_io_v1alpha3.HTTPRouteGroup), nil
 }
 
-func (s *hTTPRouteGroupSet) Length() int {
+func (s *httprouteGroupSet) Length() int {
 	if s == nil {
 		return 0
 	}
 	return s.Generic().Length()
 }
 
-func (s *hTTPRouteGroupSet) Generic() sksets.ResourceSet {
+func (s *httprouteGroupSet) Generic() sksets.ResourceSet {
 	if s == nil {
 		return nil
 	}
 	return s.set
 }
 
-func (s *hTTPRouteGroupSet) Delta(newSet HTTPRouteGroupSet) sksets.ResourceDelta {
+func (s *httprouteGroupSet) Delta(newSet HTTPRouteGroupSet) sksets.ResourceDelta {
 	if s == nil {
 		return sksets.ResourceDelta{
 			Inserted: newSet.Generic(),
@@ -229,9 +229,9 @@ func (s *hTTPRouteGroupSet) Delta(newSet HTTPRouteGroupSet) sksets.ResourceDelta
 	return s.Generic().Delta(newSet.Generic())
 }
 
-func (s *hTTPRouteGroupSet) Clone() HTTPRouteGroupSet {
+func (s *httprouteGroupSet) Clone() HTTPRouteGroupSet {
 	if s == nil {
 		return nil
 	}
-	return &hTTPRouteGroupSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
+	return &httprouteGroupSet{set: sksets.NewResourceSet(s.Generic().Clone().List()...)}
 }