From 4a340b7c6502774929f93b195192e73372e66845 Mon Sep 17 00:00:00 2001 From: Charly Molter Date: Wed, 22 May 2024 16:19:36 +0200 Subject: [PATCH] feat(kds): add a flag to avoid creating a zone on connection on kds This behaviour is not valid in Mink where we create zones before connecting them Signed-off-by: Charly Molter --- pkg/kds/context/context.go | 16 +++++++++------- pkg/kds/global/components.go | 8 ++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pkg/kds/context/context.go b/pkg/kds/context/context.go index 3a00753f2595..fdb4da775a6f 100644 --- a/pkg/kds/context/context.go +++ b/pkg/kds/context/context.go @@ -54,6 +54,7 @@ type Context struct { EnvoyAdminRPCs service.EnvoyAdminRPCs ServerStreamInterceptors []grpc.StreamServerInterceptor ServerUnaryInterceptor []grpc.UnaryServerInterceptor + CreateZoneOnFirstConnect bool } func DefaultContext( @@ -100,13 +101,14 @@ func DefaultContext( ctx = metadata.AppendToOutgoingContext(ctx, VersionHeader, version.Build.Version) return &Context{ - ZoneClientCtx: ctx, - GlobalProvidedFilter: GlobalProvidedFilter(manager, configs), - ZoneProvidedFilter: ZoneProvidedFilter, - Configs: configs, - GlobalResourceMapper: CompositeResourceMapper(globalMappers...), - ZoneResourceMapper: CompositeResourceMapper(zoneMappers...), - EnvoyAdminRPCs: service.NewEnvoyAdminRPCs(), + ZoneClientCtx: ctx, + GlobalProvidedFilter: GlobalProvidedFilter(manager, configs), + ZoneProvidedFilter: ZoneProvidedFilter, + Configs: configs, + GlobalResourceMapper: CompositeResourceMapper(globalMappers...), + ZoneResourceMapper: CompositeResourceMapper(zoneMappers...), + EnvoyAdminRPCs: service.NewEnvoyAdminRPCs(), + CreateZoneOnFirstConnect: true, } } diff --git a/pkg/kds/global/components.go b/pkg/kds/global/components.go index 1cb1e701d019..ebbd418c12a4 100644 --- a/pkg/kds/global/components.go +++ b/pkg/kds/global/components.go @@ -98,7 +98,7 @@ func Setup(rt runtime.Runtime) error { } }() kdsStream := client.NewKDSStream(session.ClientStream(), session.PeerID(), "") // we only care about Zone CP config. Zone CP should not receive Global CP config. - if err := createZoneIfAbsent(session.ClientStream().Context(), log, session.PeerID(), rt.ResourceManager()); err != nil { + if err := createZoneIfAbsent(session.ClientStream().Context(), log, session.PeerID(), rt.ResourceManager(), rt.KDSContext().CreateZoneOnFirstConnect); err != nil { log.Error(err, "Global CP could not create a zone") return errors.New("Global CP could not create a zone") // send back message without details. Zone CP will retry } @@ -127,7 +127,7 @@ func Setup(rt runtime.Runtime) error { log := kdsDeltaGlobalLog.WithValues("peer-id", zoneID) log = kuma_log.AddFieldsFromCtx(log, stream.Context(), rt.Extensions()) log.Info("Global To Zone new session created") - if err := createZoneIfAbsent(stream.Context(), log, zoneID, rt.ResourceManager()); err != nil { + if err := createZoneIfAbsent(stream.Context(), log, zoneID, rt.ResourceManager(), rt.KDSContext().CreateZoneOnFirstConnect); err != nil { if errors.Is(err, context.Canceled) { return } @@ -240,10 +240,10 @@ func Setup(rt runtime.Runtime) error { ) } -func createZoneIfAbsent(ctx context.Context, log logr.Logger, name string, resManager core_manager.ResourceManager) error { +func createZoneIfAbsent(ctx context.Context, log logr.Logger, name string, resManager core_manager.ResourceManager, createZoneOnConnect bool) error { ctx = user.Ctx(ctx, user.ControlPlane) if err := resManager.Get(ctx, system.NewZoneResource(), store.GetByKey(name, model.NoMesh)); err != nil { - if !store.IsResourceNotFound(err) { + if !store.IsResourceNotFound(err) || !createZoneOnConnect { return err } log.Info("creating Zone", "name", name)