Skip to content

Commit bdf0d33

Browse files
authored
Merge pull request #886 from akgalwas/registry-cache-1
Registry cache implementation: add a property to the Runtime CR that enables the cache
2 parents 815ef3c + 62b4928 commit bdf0d33

File tree

18 files changed

+610
-161
lines changed

18 files changed

+610
-161
lines changed

api/v1/runtime_types.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ const (
9797
ConditionReasonOidcConfigured = RuntimeConditionReason("OidcConfigured")
9898
ConditionReasonOidcError = RuntimeConditionReason("OidcConfigurationErr")
9999
ConditionReasonSeedNotFound = RuntimeConditionReason("SeedNotFound")
100+
ConditionReasonRegistryCacheError = RuntimeConditionReason("RegistryCacheConfigurationErr")
100101
)
101102

102103
//+kubebuilder:object:root=true
@@ -126,8 +127,13 @@ type RuntimeList struct {
126127

127128
// RuntimeSpec defines the desired state of Runtime
128129
type RuntimeSpec struct {
129-
Shoot RuntimeShoot `json:"shoot"`
130-
Security Security `json:"security"`
130+
Shoot RuntimeShoot `json:"shoot"`
131+
Security Security `json:"security"`
132+
Caching *ImageRegistryCache `json:"imageRegistryCache,omitempty"`
133+
}
134+
135+
type ImageRegistryCache struct {
136+
Enabled bool `json:"enabled"`
131137
}
132138

133139
// RuntimeStatus defines the observed state of Runtime

api/v1/zz_generated.deepcopy.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"encoding/json"
2222
"flag"
2323
"fmt"
24+
registrycache "github.com/kyma-project/kim-snatch/api/v1beta1"
2425
"io"
2526
"os"
2627
"time"
@@ -288,6 +289,11 @@ func initGardenerClients(kubeconfigPath string, namespace string, timeout time.D
288289
return nil, nil, nil, errors.Wrap(err, "failed to register Gardener schema")
289290
}
290291

292+
err = registrycache.AddToScheme(gardenerClient.Scheme())
293+
if err != nil {
294+
return nil, nil, nil, errors.Wrap(err, "failed to register Gardener schema")
295+
}
296+
291297
shootClient := gardenerClientSet.Shoots(namespace)
292298
dynamicKubeconfigAPI := gardenerClient.SubResource("adminkubeconfig")
293299

config/crd/bases/infrastructuremanager.kyma-project.io_runtimes.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ spec:
5252
spec:
5353
description: RuntimeSpec defines the desired state of Runtime
5454
properties:
55+
imageRegistryCache:
56+
properties:
57+
enabled:
58+
type: boolean
59+
required:
60+
- enabled
61+
type: object
5562
security:
5663
properties:
5764
administrators:

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/kyma-project/infrastructure-manager
22

3-
go 1.24.0
3+
go 1.24.2
44

55
toolchain go1.24.3
66

@@ -10,9 +10,11 @@ require (
1010
github.com/gardener/gardener-extension-provider-aws v1.61.1
1111
github.com/gardener/gardener-extension-provider-gcp v1.43.2
1212
github.com/gardener/gardener-extension-provider-openstack v1.47.0
13+
github.com/gardener/gardener-extension-registry-cache v0.13.0
1314
github.com/gardener/oidc-webhook-authenticator v0.35.0
1415
github.com/go-logr/logr v1.4.2
1516
github.com/go-playground/validator/v10 v10.26.0
17+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb
1618
github.com/onsi/ginkgo/v2 v2.23.4
1719
github.com/onsi/gomega v1.37.0
1820
github.com/pkg/errors v0.9.1

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ github.com/gardener/gardener-extension-provider-gcp v1.43.2 h1:LcMxg6qlH7Jm3EhBZ
4848
github.com/gardener/gardener-extension-provider-gcp v1.43.2/go.mod h1:dnW8Xd+1HTmFgsPBeKm3SQmPGzPjgInfnhxvlG6RIk8=
4949
github.com/gardener/gardener-extension-provider-openstack v1.47.0 h1:g4AiLyNSLRZYYRKSfgHf5MUZY0xBe4v+o5toxcY8YDU=
5050
github.com/gardener/gardener-extension-provider-openstack v1.47.0/go.mod h1:7uT3jCkSoJbYyN2TTJ1B6/vWwrUVw+xXJCtDrv3i0aQ=
51+
github.com/gardener/gardener-extension-registry-cache v0.13.0 h1:CcmcqUbYz3WLeJKk+sSQCAmHezvOmk8RgVgmFzVLTiA=
52+
github.com/gardener/gardener-extension-registry-cache v0.13.0/go.mod h1:vtyyHXh+3tmtxYhpT+ynEYfYkDXi8yCSLtC1gS4Y32A=
5153
github.com/gardener/machine-controller-manager v0.57.2 h1:3rTFvOmUnBSBW9ui3jnNhdkcRiyALJbqEb8FTPpR4U0=
5254
github.com/gardener/machine-controller-manager v0.57.2/go.mod h1:eCng7De6OE15rndmMm6Q1fwMQI39esASCd3WKZ/lLmY=
5355
github.com/gardener/oidc-webhook-authenticator v0.35.0 h1:VfIClVIi/1F0pHd4j/ue0ByGy0TJZI2lGJWaoES+vtE=
@@ -122,6 +124,8 @@ github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyP
122124
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys=
123125
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
124126
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
127+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb h1:ez9JwsTsK4hliF0WTO787bXmkataJ08L4P0y6SLpJow=
128+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb/go.mod h1:S78TWWPO6T7IPoF2RHapMyzHlQfQU4M2KGbH6zfpXHg=
125129
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
126130
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
127131
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=

hack/patch-converter-runner/go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/kyma-project/infrastructure-manager/hack/patch-converter-runner
22

3-
go 1.24.0
3+
go 1.24.2
44

55
toolchain go1.24.3
66

@@ -23,6 +23,7 @@ require (
2323
github.com/gardener/gardener-extension-provider-aws v1.61.1 // indirect
2424
github.com/gardener/gardener-extension-provider-gcp v1.43.2 // indirect
2525
github.com/gardener/gardener-extension-provider-openstack v1.47.0 // indirect
26+
github.com/gardener/gardener-extension-registry-cache v0.13.0 // indirect
2627
github.com/go-logr/logr v1.4.2 // indirect
2728
github.com/go-openapi/jsonpointer v0.21.1 // indirect
2829
github.com/go-openapi/jsonreference v0.21.0 // indirect
@@ -33,6 +34,7 @@ require (
3334
github.com/google/uuid v1.6.0 // indirect
3435
github.com/josharian/intern v1.0.0 // indirect
3536
github.com/json-iterator/go v1.1.12 // indirect
37+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb // indirect
3638
github.com/mailru/easyjson v0.9.0 // indirect
3739
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3840
github.com/modern-go/reflect2 v1.0.2 // indirect

hack/patch-converter-runner/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ github.com/gardener/gardener-extension-provider-gcp v1.43.2 h1:LcMxg6qlH7Jm3EhBZ
4444
github.com/gardener/gardener-extension-provider-gcp v1.43.2/go.mod h1:dnW8Xd+1HTmFgsPBeKm3SQmPGzPjgInfnhxvlG6RIk8=
4545
github.com/gardener/gardener-extension-provider-openstack v1.47.0 h1:g4AiLyNSLRZYYRKSfgHf5MUZY0xBe4v+o5toxcY8YDU=
4646
github.com/gardener/gardener-extension-provider-openstack v1.47.0/go.mod h1:7uT3jCkSoJbYyN2TTJ1B6/vWwrUVw+xXJCtDrv3i0aQ=
47+
github.com/gardener/gardener-extension-registry-cache v0.13.0 h1:CcmcqUbYz3WLeJKk+sSQCAmHezvOmk8RgVgmFzVLTiA=
48+
github.com/gardener/gardener-extension-registry-cache v0.13.0/go.mod h1:vtyyHXh+3tmtxYhpT+ynEYfYkDXi8yCSLtC1gS4Y32A=
4749
github.com/gardener/machine-controller-manager v0.57.2 h1:3rTFvOmUnBSBW9ui3jnNhdkcRiyALJbqEb8FTPpR4U0=
4850
github.com/gardener/machine-controller-manager v0.57.2/go.mod h1:eCng7De6OE15rndmMm6Q1fwMQI39esASCd3WKZ/lLmY=
4951
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
@@ -103,6 +105,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
103105
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
104106
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA=
105107
github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys=
108+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb h1:ez9JwsTsK4hliF0WTO787bXmkataJ08L4P0y6SLpJow=
109+
github.com/kyma-project/kim-snatch v0.0.0-20250430122050-3c3bdc3b74bb/go.mod h1:S78TWWPO6T7IPoF2RHapMyzHlQfQU4M2KGbH6zfpXHg=
106110
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
107111
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
108112
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=

hack/runtime-migrator/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/kyma-project/infrastructure-manager/hack/runtime-migrator-app
22

3-
go 1.24.0
3+
go 1.24.2
44

55
toolchain go1.24.3
66

internal/controller/runtime/fsm/runtime_fsm_create_shoot.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import (
1515
)
1616

1717
const (
18-
msgFailedToConfigureAuditlogs = "Failed to configure audit logs"
19-
msgFailedStructuredConfigMap = "Failed to create structured authentication config map"
18+
msgFailedToConfigureAuditlogs = "Failed to configure audit logs"
19+
msgFailedStructuredConfigMap = "Failed to create structured authentication config map"
20+
msgFailedToConfigureRegistryCache = "Failed to configure registry cache"
2021
)
2122

2223
func sFnCreateShoot(ctx context.Context, m *fsm, s *systemState) (stateFn, *ctrl.Result, error) {

internal/controller/runtime/fsm/runtime_fsm_patch_shoot.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import (
1212
gardener "github.com/gardener/gardener/pkg/apis/core/v1beta1"
1313
imv1 "github.com/kyma-project/infrastructure-manager/api/v1"
1414
"github.com/kyma-project/infrastructure-manager/internal/log_level"
15+
"github.com/kyma-project/infrastructure-manager/internal/registrycache"
1516
gardener_shoot "github.com/kyma-project/infrastructure-manager/pkg/gardener/shoot"
1617
"github.com/kyma-project/infrastructure-manager/pkg/reconciler"
1718
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1819
"k8s.io/apimachinery/pkg/types"
1920
"k8s.io/utils/ptr"
2021
ctrl "sigs.k8s.io/controller-runtime"
2122
"sigs.k8s.io/controller-runtime/pkg/client"
23+
"github.com/kyma-project/kim-snatch/api/v1beta1"
2224
)
2325

2426
const fieldManagerName = "kim"
@@ -62,6 +64,22 @@ func sFnPatchExistingShoot(ctx context.Context, m *fsm, s *systemState) (stateFn
6264
}
6365
}
6466

67+
var registrycache []v1beta1.RegistryCache
68+
if s.instance.Spec.Caching != nil && s.instance.Spec.Caching.Enabled {
69+
registrycache, err = getRegistryCache(ctx, m.Client, s.instance)
70+
71+
if err != nil {
72+
m.log.Error(err, "Failed to get Registry Cache Config")
73+
74+
m.Metrics.IncRuntimeFSMStopCounter()
75+
return updateStatePendingWithErrorAndStop(
76+
&s.instance,
77+
imv1.ConditionTypeRuntimeProvisioned,
78+
imv1.ConditionReasonRegistryCacheError,
79+
msgFailedToConfigureRegistryCache)
80+
}
81+
}
82+
6583
// NOTE: In the future we want to pass the whole shoot object here
6684
updatedShoot, err := convertPatch(&s.instance, gardener_shoot.PatchOpts{
6785
ConverterConfig: m.ConverterConfig,
@@ -75,6 +93,7 @@ func sFnPatchExistingShoot(ctx context.Context, m *fsm, s *systemState) (stateFn
7593
ControlPlaneConfig: s.shoot.Spec.Provider.ControlPlaneConfig,
7694
Log: ptr.To(m.log),
7795
StructuredAuthEnabled: m.StructuredAuthEnabled,
96+
RegistryCache: registrycache,
7897
})
7998

8099
if err != nil {
@@ -317,3 +336,17 @@ func migrateOIDCToStructuredAuth(ctx context.Context, shootToUpdate gardener.Sho
317336

318337
return err
319338
}
339+
340+
func getRegistryCache(ctx context.Context, client client.Client, runtime imv1.Runtime) ([]v1beta1.RegistryCache, error) {
341+
secret, err := getKubeconfigSecret(ctx, client, runtime.Labels[imv1.LabelKymaRuntimeID], runtime.Namespace)
342+
if err != nil {
343+
return nil, err
344+
}
345+
346+
configExplorer, err := registrycache.NewConfigExplorer(ctx, secret)
347+
if err != nil {
348+
return nil, err
349+
}
350+
351+
return configExplorer.GetRegistryCacheConfig()
352+
}

internal/registrycache/explorer.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package registrycache
2+
3+
import (
4+
"context"
5+
"github.com/kyma-project/infrastructure-manager/pkg/gardener"
6+
registrycache "github.com/kyma-project/kim-snatch/api/v1beta1"
7+
corev1 "k8s.io/api/core/v1"
8+
"sigs.k8s.io/controller-runtime/pkg/client"
9+
)
10+
11+
type ConfigExplorer struct {
12+
shootClient client.Client
13+
Context context.Context
14+
}
15+
16+
type GetSecretFunc func() (corev1.Secret, error)
17+
18+
func NewConfigExplorer(ctx context.Context, kubeconfigSecret corev1.Secret) (ConfigExplorer, error) {
19+
20+
shootClient, err := gardener.GetShootClient(kubeconfigSecret)
21+
if err != nil {
22+
return ConfigExplorer{}, err
23+
}
24+
25+
return ConfigExplorer{
26+
shootClient: shootClient,
27+
Context: ctx,
28+
}, nil
29+
}
30+
31+
func (c *ConfigExplorer) RegistryCacheConfigExists() (bool, error) {
32+
var customConfigList registrycache.CustomConfigList
33+
err := c.shootClient.List(c.Context, &customConfigList)
34+
if err != nil {
35+
return false, err
36+
}
37+
38+
for _, customConfig := range customConfigList.Items {
39+
if len(customConfig.Spec.RegistryCaches) > 0 {
40+
return true, nil
41+
}
42+
}
43+
44+
return false, nil
45+
}
46+
47+
func (c *ConfigExplorer) GetRegistryCacheConfig() ([]registrycache.RegistryCache, error) {
48+
var customConfigList registrycache.CustomConfigList
49+
err := c.shootClient.List(c.Context, &customConfigList)
50+
if err != nil {
51+
return nil, err
52+
}
53+
registryCacheConfigs := make([]registrycache.RegistryCache, 0)
54+
55+
for _, customConfig := range customConfigList.Items {
56+
registryCacheConfigs = append(registryCacheConfigs, customConfig.Spec.RegistryCaches...)
57+
}
58+
59+
return registryCacheConfigs, nil
60+
}

pkg/gardener/client.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package gardener
33
import (
44
"context"
55
"fmt"
6+
corev1 "k8s.io/api/core/v1"
67
"os"
8+
"sigs.k8s.io/controller-runtime/pkg/client"
79

810
gardener_api "github.com/gardener/gardener/pkg/apis/core/v1beta1"
911
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -34,3 +36,23 @@ func NewRestConfigFromFile(kubeconfigFilePath string) (*restclient.Config, error
3436

3537
return restConfig, err
3638
}
39+
40+
const (
41+
kubeconfigSecretKey = "config"
42+
)
43+
44+
// TODO: Use this function in the Runtime Controller's FSM
45+
func GetShootClient(secret corev1.Secret) (client.Client, error) {
46+
47+
restConfig, err := clientcmd.RESTConfigFromKubeConfig(secret.Data[kubeconfigSecretKey])
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
shootClientWithAdmin, err := client.New(restConfig, client.Options{})
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
return shootClientWithAdmin, nil
58+
}

pkg/gardener/shoot/converter.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/kyma-project/infrastructure-manager/pkg/gardener/shoot/extender/maintenance"
77
"github.com/kyma-project/infrastructure-manager/pkg/gardener/shoot/extender/provider"
88
"github.com/kyma-project/infrastructure-manager/pkg/gardener/shoot/extender/restrictions"
9+
registrycache "github.com/kyma-project/kim-snatch/api/v1beta1"
910
"k8s.io/apimachinery/pkg/runtime"
1011

1112
gardener "github.com/gardener/gardener/pkg/apis/core/v1beta1"
@@ -74,6 +75,7 @@ type PatchOpts struct {
7475
ControlPlaneConfig *runtime.RawExtension
7576
Log *logr.Logger
7677
StructuredAuthEnabled bool
78+
RegistryCache []registrycache.RegistryCache
7779
}
7880

7981
func NewConverterCreate(opts CreateOpts) Converter {
@@ -91,7 +93,7 @@ func NewConverterCreate(opts CreateOpts) Converter {
9193
if !opts.DNS.IsGardenerInternal() {
9294
extendersForCreate = append(extendersForCreate, extender2.NewDNSExtender(opts.DNS.SecretName, opts.DNS.DomainPrefix, opts.DNS.ProviderType))
9395
}
94-
extendersForCreate = append(extendersForCreate, extensions.NewExtensionsExtenderForCreate(opts.ConverterConfig, opts.AuditLogData))
96+
extendersForCreate = append(extendersForCreate, extensions.NewExtensionsExtenderForCreate(opts.ConverterConfig, opts.AuditLogData, nil))
9597
extendersForCreate = append(extendersForCreate,
9698
extender2.NewKubernetesExtender(opts.Kubernetes.DefaultVersion, ""))
9799

@@ -120,7 +122,7 @@ func NewConverterPatch(opts PatchOpts) Converter {
120122
opts.ControlPlaneConfig))
121123

122124
extendersForPatch = append(extendersForPatch,
123-
extensions.NewExtensionsExtenderForPatch(opts.AuditLogData, opts.Extensions),
125+
extensions.NewExtensionsExtenderForPatch(opts.AuditLogData, opts.RegistryCache, opts.Extensions),
124126
extender2.NewResourcesExtenderForPatch(opts.Resources))
125127

126128
extendersForPatch = append(extendersForPatch, extender2.NewKubernetesExtender(opts.Kubernetes.DefaultVersion, opts.ShootK8SVersion))

0 commit comments

Comments
 (0)