Skip to content

Commit 9898cc6

Browse files
sbueringerk8s-infra-cherrypick-robot
authored and
k8s-infra-cherrypick-robot
committed
Export runtime.Client interface and cache package
Signed-off-by: Stefan Büringer [email protected]
1 parent 05ddeac commit 9898cc6

26 files changed

+145
-110
lines changed

.golangci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ linters-settings:
163163
- pkg: sigs.k8s.io/cluster-api/exp/runtime/catalog
164164
alias: runtimecatalog
165165
- pkg: sigs.k8s.io/cluster-api/internal/runtime/client
166+
alias: internalruntimeclient
167+
- pkg: sigs.k8s.io/cluster-api/exp/runtime/client
166168
alias: runtimeclient
167169
- pkg: sigs.k8s.io/cluster-api/internal/runtime/registry
168170
alias: runtimeregistry

controllers/alias.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"sigs.k8s.io/controller-runtime/pkg/controller"
2626

2727
"sigs.k8s.io/cluster-api/controllers/clustercache"
28+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
2829
clustercontroller "sigs.k8s.io/cluster-api/internal/controllers/cluster"
2930
clusterclasscontroller "sigs.k8s.io/cluster-api/internal/controllers/clusterclass"
3031
machinecontroller "sigs.k8s.io/cluster-api/internal/controllers/machine"
@@ -34,7 +35,6 @@ import (
3435
clustertopologycontroller "sigs.k8s.io/cluster-api/internal/controllers/topology/cluster"
3536
machinedeploymenttopologycontroller "sigs.k8s.io/cluster-api/internal/controllers/topology/machinedeployment"
3637
machinesettopologycontroller "sigs.k8s.io/cluster-api/internal/controllers/topology/machineset"
37-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
3838
)
3939

4040
// Following types provides access to reconcilers implemented in internal/controllers, thus

exp/runtime/client/client.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
Copyright 2024 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
// Package client provides the Runtime SDK client.
18+
package client
19+
20+
import (
21+
"context"
22+
23+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
25+
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
26+
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
27+
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
28+
"sigs.k8s.io/cluster-api/util/cache"
29+
)
30+
31+
// CallExtensionOption is the interface for configuration that modifies CallExtensionOptions for a CallExtension call.
32+
type CallExtensionOption interface {
33+
// ApplyToOptions applies this configuration to the given CallExtensionOptions.
34+
ApplyToOptions(*CallExtensionOptions)
35+
}
36+
37+
// CallExtensionCacheEntry is a cache entry for the cache that can be used with the CallExtension call via
38+
// the WithCaching option.
39+
type CallExtensionCacheEntry struct {
40+
CacheKey string
41+
Response runtimehooksv1.ResponseObject
42+
}
43+
44+
// Key returns the cache key of a CallExtensionCacheEntry.
45+
func (c CallExtensionCacheEntry) Key() string {
46+
return c.CacheKey
47+
}
48+
49+
// WithCaching enables caching for the CallExtension call.
50+
type WithCaching struct {
51+
Cache cache.Cache[CallExtensionCacheEntry]
52+
CacheKeyFunc func(extensionName, extensionConfigResourceVersion string, request runtimehooksv1.RequestObject) string
53+
}
54+
55+
// ApplyToOptions applies WithCaching to the given CallExtensionOptions.
56+
func (w WithCaching) ApplyToOptions(in *CallExtensionOptions) {
57+
in.WithCaching = true
58+
in.Cache = w.Cache
59+
in.CacheKeyFunc = w.CacheKeyFunc
60+
}
61+
62+
// CallExtensionOptions contains the options for the CallExtension call.
63+
type CallExtensionOptions struct {
64+
WithCaching bool
65+
Cache cache.Cache[CallExtensionCacheEntry]
66+
CacheKeyFunc func(extensionName, extensionConfigResourceVersion string, request runtimehooksv1.RequestObject) string
67+
}
68+
69+
// Client is the runtime client to interact with extensions.
70+
type Client interface {
71+
// WarmUp can be used to initialize a "cold" RuntimeClient with all
72+
// known runtimev1.ExtensionConfigs at a given time.
73+
// After WarmUp completes the RuntimeClient is considered ready.
74+
WarmUp(extensionConfigList *runtimev1.ExtensionConfigList) error
75+
76+
// IsReady return true after the RuntimeClient finishes warmup.
77+
IsReady() bool
78+
79+
// Discover makes the discovery call on the extension and returns an updated ExtensionConfig
80+
// with extension handlers information in the ExtensionConfig status.
81+
Discover(context.Context, *runtimev1.ExtensionConfig) (*runtimev1.ExtensionConfig, error)
82+
83+
// Register registers the ExtensionConfig.
84+
Register(extensionConfig *runtimev1.ExtensionConfig) error
85+
86+
// Unregister unregisters the ExtensionConfig.
87+
Unregister(extensionConfig *runtimev1.ExtensionConfig) error
88+
89+
// CallAllExtensions calls all the ExtensionHandler registered for the hook.
90+
CallAllExtensions(ctx context.Context, hook runtimecatalog.Hook, forObject metav1.Object, request runtimehooksv1.RequestObject, response runtimehooksv1.ResponseObject) error
91+
92+
// CallExtension calls the ExtensionHandler with the given name.
93+
CallExtension(ctx context.Context, hook runtimecatalog.Hook, forObject metav1.Object, name string, request runtimehooksv1.RequestObject, response runtimehooksv1.ResponseObject, opts ...CallExtensionOption) error
94+
}

exp/runtime/controllers/alias.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/client"
2525
"sigs.k8s.io/controller-runtime/pkg/controller"
2626

27+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
2728
runtimecontrollers "sigs.k8s.io/cluster-api/exp/runtime/internal/controllers"
28-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
2929
)
3030

3131
// ExtensionConfigReconciler reconciles an ExtensionConfig object.

exp/runtime/internal/controllers/extensionconfig_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import (
3838

3939
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4040
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
41-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
41+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
4242
"sigs.k8s.io/cluster-api/util/annotations"
4343
"sigs.k8s.io/cluster-api/util/conditions"
4444
"sigs.k8s.io/cluster-api/util/patch"

exp/runtime/internal/controllers/extensionconfig_controller_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import (
4141
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
4242
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
4343
"sigs.k8s.io/cluster-api/feature"
44-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
44+
internalruntimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
4545
runtimeregistry "sigs.k8s.io/cluster-api/internal/runtime/registry"
4646
fakev1alpha1 "sigs.k8s.io/cluster-api/internal/runtime/test/v1alpha1"
4747
"sigs.k8s.io/cluster-api/util"
@@ -59,7 +59,7 @@ func TestExtensionReconciler_Reconcile(t *testing.T) {
5959
g.Expect(fakev1alpha1.AddToCatalog(cat)).To(Succeed())
6060

6161
registry := runtimeregistry.New()
62-
runtimeClient := runtimeclient.New(runtimeclient.Options{
62+
runtimeClient := internalruntimeclient.New(internalruntimeclient.Options{
6363
Catalog: cat,
6464
Registry: registry,
6565
})
@@ -214,7 +214,7 @@ func TestExtensionReconciler_discoverExtensionConfig(t *testing.T) {
214214
g.Expect(err).ToNot(HaveOccurred())
215215
defer srv1.Close()
216216

217-
runtimeClient := runtimeclient.New(runtimeclient.Options{
217+
runtimeClient := internalruntimeclient.New(internalruntimeclient.Options{
218218
Catalog: cat,
219219
Registry: registry,
220220
})
@@ -248,7 +248,7 @@ func TestExtensionReconciler_discoverExtensionConfig(t *testing.T) {
248248
// srv1 := fakeSecureExtensionServer(discoveryHandler("first"))
249249
// defer srv1.Close()
250250

251-
runtimeClient := runtimeclient.New(runtimeclient.Options{
251+
runtimeClient := internalruntimeclient.New(internalruntimeclient.Options{
252252
Catalog: cat,
253253
Registry: registry,
254254
})

exp/runtime/internal/controllers/warmup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
"sigs.k8s.io/controller-runtime/pkg/manager"
3030

3131
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
32-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
32+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
3333
)
3434

3535
const (

exp/runtime/internal/controllers/warmup_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
3232
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
3333
"sigs.k8s.io/cluster-api/feature"
34-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
34+
internalruntimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
3535
runtimeregistry "sigs.k8s.io/cluster-api/internal/runtime/registry"
3636
fakev1alpha1 "sigs.k8s.io/cluster-api/internal/runtime/test/v1alpha1"
3737
)
@@ -75,7 +75,7 @@ func Test_warmupRunnable_Start(t *testing.T) {
7575
r := &warmupRunnable{
7676
Client: env.GetClient(),
7777
APIReader: env.GetAPIReader(),
78-
RuntimeClient: runtimeclient.New(runtimeclient.Options{
78+
RuntimeClient: internalruntimeclient.New(internalruntimeclient.Options{
7979
Catalog: cat,
8080
Registry: registry,
8181
}),
@@ -140,7 +140,7 @@ func Test_warmupRunnable_Start(t *testing.T) {
140140
r := &warmupRunnable{
141141
Client: env.GetClient(),
142142
APIReader: env.GetAPIReader(),
143-
RuntimeClient: runtimeclient.New(runtimeclient.Options{
143+
RuntimeClient: internalruntimeclient.New(internalruntimeclient.Options{
144144
Catalog: cat,
145145
Registry: registry,
146146
}),

exp/topology/desiredstate/desired_state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ import (
3636
"sigs.k8s.io/cluster-api/controllers/external"
3737
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
3838
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
39+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
3940
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
4041
"sigs.k8s.io/cluster-api/exp/topology/scope"
4142
"sigs.k8s.io/cluster-api/feature"
4243
"sigs.k8s.io/cluster-api/internal/contract"
4344
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches"
4445
"sigs.k8s.io/cluster-api/internal/hooks"
45-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
4646
"sigs.k8s.io/cluster-api/internal/topology/clustershim"
4747
topologynames "sigs.k8s.io/cluster-api/internal/topology/names"
4848
"sigs.k8s.io/cluster-api/internal/topology/ownerrefs"

internal/controllers/clusterclass/clusterclass_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ import (
4444
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4545
"sigs.k8s.io/cluster-api/controllers/external"
4646
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
47+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
4748
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
4849
"sigs.k8s.io/cluster-api/feature"
49-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
50-
runtimeregistry "sigs.k8s.io/cluster-api/internal/runtime/registry"
50+
internalruntimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
5151
"sigs.k8s.io/cluster-api/internal/topology/variables"
52-
"sigs.k8s.io/cluster-api/internal/util/cache"
5352
"sigs.k8s.io/cluster-api/util"
53+
"sigs.k8s.io/cluster-api/util/cache"
5454
"sigs.k8s.io/cluster-api/util/conversion"
5555
"sigs.k8s.io/cluster-api/util/patch"
5656
"sigs.k8s.io/cluster-api/util/paused"
@@ -473,7 +473,7 @@ func (r *Reconciler) extensionConfigToClusterClass(ctx context.Context, o client
473473
}
474474
for _, patch := range clusterClass.Spec.Patches {
475475
if patch.External != nil && patch.External.DiscoverVariablesExtension != nil {
476-
extName, err := runtimeclient.ExtensionNameFromHandlerName(*patch.External.DiscoverVariablesExtension)
476+
extName, err := internalruntimeclient.ExtensionNameFromHandlerName(*patch.External.DiscoverVariablesExtension)
477477
if err != nil {
478478
log.Error(err, "failed to reconcile ClusterClass for ExtensionConfig")
479479
continue
@@ -508,9 +508,9 @@ func matchNamespace(ctx context.Context, c client.Client, selector labels.Select
508508
return selector.Matches(labels.Set(ns.GetLabels()))
509509
}
510510

511-
func cacheKeyFunc(registration *runtimeregistry.ExtensionRegistration, request runtimehooksv1.RequestObject) string {
511+
func cacheKeyFunc(extensionName, extensionConfigResourceVersion string, request runtimehooksv1.RequestObject) string {
512512
// Note: registration.Name is identical to the value of the patch.External.DiscoverVariablesExtension field in the ClusterClass.
513-
s := fmt.Sprintf("%s-%s", registration.Name, registration.ExtensionConfigResourceVersion)
513+
s := fmt.Sprintf("%s-%s", extensionName, extensionConfigResourceVersion)
514514
for k, v := range request.GetSettings() {
515515
s += fmt.Sprintf(",%s=%s", k, v)
516516
}

internal/controllers/clusterclass/clusterclass_controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ import (
4141
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4242
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
4343
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
44+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
4445
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
4546
"sigs.k8s.io/cluster-api/feature"
46-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
4747
fakeruntimeclient "sigs.k8s.io/cluster-api/internal/runtime/client/fake"
48-
"sigs.k8s.io/cluster-api/internal/util/cache"
48+
"sigs.k8s.io/cluster-api/util/cache"
4949
"sigs.k8s.io/cluster-api/util/test/builder"
5050
)
5151

internal/controllers/machine/machine_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ import (
5353
"sigs.k8s.io/cluster-api/controllers/noderefutil"
5454
"sigs.k8s.io/cluster-api/feature"
5555
"sigs.k8s.io/cluster-api/internal/controllers/machine/drain"
56-
"sigs.k8s.io/cluster-api/internal/util/cache"
5756
"sigs.k8s.io/cluster-api/internal/util/ssa"
5857
"sigs.k8s.io/cluster-api/util"
5958
"sigs.k8s.io/cluster-api/util/annotations"
59+
"sigs.k8s.io/cluster-api/util/cache"
6060
"sigs.k8s.io/cluster-api/util/collections"
6161
"sigs.k8s.io/cluster-api/util/conditions"
6262
"sigs.k8s.io/cluster-api/util/finalizers"

internal/controllers/machine/machine_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ import (
4848
"sigs.k8s.io/cluster-api/controllers/external"
4949
externalfake "sigs.k8s.io/cluster-api/controllers/external/fake"
5050
"sigs.k8s.io/cluster-api/feature"
51-
"sigs.k8s.io/cluster-api/internal/util/cache"
5251
"sigs.k8s.io/cluster-api/internal/util/ssa"
5352
"sigs.k8s.io/cluster-api/util"
53+
"sigs.k8s.io/cluster-api/util/cache"
5454
"sigs.k8s.io/cluster-api/util/conditions"
5555
"sigs.k8s.io/cluster-api/util/patch"
5656
"sigs.k8s.io/cluster-api/util/test/builder"

internal/controllers/topology/cluster/cluster_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ import (
5050
externalfake "sigs.k8s.io/cluster-api/controllers/external/fake"
5151
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
5252
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
53+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
5354
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
5455
"sigs.k8s.io/cluster-api/exp/topology/desiredstate"
5556
"sigs.k8s.io/cluster-api/exp/topology/scope"
5657
"sigs.k8s.io/cluster-api/feature"
5758
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/structuredmerge"
5859
"sigs.k8s.io/cluster-api/internal/hooks"
59-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
6060
"sigs.k8s.io/cluster-api/internal/util/ssa"
6161
"sigs.k8s.io/cluster-api/internal/webhooks"
6262
"sigs.k8s.io/cluster-api/util"

internal/controllers/topology/cluster/patches/engine.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131

3232
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3333
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
34+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
3435
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
3536
"sigs.k8s.io/cluster-api/exp/topology/scope"
3637
"sigs.k8s.io/cluster-api/feature"
@@ -39,7 +40,6 @@ import (
3940
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches/external"
4041
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches/inline"
4142
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches/variables"
42-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
4343
)
4444

4545
// Engine is a patch engine which applies patches defined in a ClusterBlueprint to a ClusterState.

internal/controllers/topology/cluster/patches/external/external_patch_generator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/client"
2525

2626
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
27+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
2728
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
2829
"sigs.k8s.io/cluster-api/feature"
2930
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches/api"
30-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
3131
)
3232

3333
// externalPatchGenerator generates JSON patches for a GeneratePatchesRequest based on a ClusterClassPatch.

internal/controllers/topology/cluster/patches/external/external_patch_generator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import (
2828
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2929
runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1"
3030
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
31+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
3132
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
3233
"sigs.k8s.io/cluster-api/feature"
33-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
3434
)
3535

3636
func TestExternalPatchGenerator_Generate(t *testing.T) {

internal/controllers/topology/cluster/patches/external/external_validator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/client"
2525

2626
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
27+
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
2728
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
2829
"sigs.k8s.io/cluster-api/feature"
2930
"sigs.k8s.io/cluster-api/internal/controllers/topology/cluster/patches/api"
30-
runtimeclient "sigs.k8s.io/cluster-api/internal/runtime/client"
3131
)
3232

3333
// externalValidator validates templates.

0 commit comments

Comments
 (0)