From 564074a097dc9b8ab6ef7114e2155d60525290c8 Mon Sep 17 00:00:00 2001 From: Thomas Hallgren Date: Sun, 18 Aug 2024 08:21:35 +0200 Subject: [PATCH] Fix backward incompatibility regression. The introduction of argo-rollouts introduced a call to the new traffic-manager function `GetKnownWorkloadKinds` from the user client, and a client connecting to older traffic-managers that don't have this method would therefore fail with an error. This commit checks if the returned error has code `Unimplemented`, and if so, assumes the default set of workload kinds. Signed-off-by: Thomas Hallgren --- pkg/client/userd/daemon/grpc.go | 13 ++++++++++++- pkg/client/userd/trafficmgr/session.go | 10 +++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/client/userd/daemon/grpc.go b/pkg/client/userd/daemon/grpc.go index 11b6691d5b..8329a61bfb 100644 --- a/pkg/client/userd/daemon/grpc.go +++ b/pkg/client/userd/daemon/grpc.go @@ -345,7 +345,18 @@ func (s *service) List(c context.Context, lr *rpc.ListRequest) (result *rpc.Work func (s *service) GetKnownWorkloadKinds(ctx context.Context, _ *empty.Empty) (result *manager.KnownWorkloadKinds, err error) { err = s.WithSession(ctx, "GetKnownWorkloadKinds", func(ctx context.Context, session userd.Session) error { result, err = session.ManagerClient().GetKnownWorkloadKinds(ctx, session.SessionInfo()) - return err + if err != nil { + if status.Code(err) != codes.Unimplemented { + return err + } + // Talking to an older traffic-manager, use legacy default types + result = &manager.KnownWorkloadKinds{Kinds: []manager.WorkloadInfo_Kind{ + manager.WorkloadInfo_DEPLOYMENT, + manager.WorkloadInfo_REPLICASET, + manager.WorkloadInfo_STATEFULSET, + }} + } + return nil }) return result, err } diff --git a/pkg/client/userd/trafficmgr/session.go b/pkg/client/userd/trafficmgr/session.go index 83ae2a0fb9..ae6b4ff0e0 100644 --- a/pkg/client/userd/trafficmgr/session.go +++ b/pkg/client/userd/trafficmgr/session.go @@ -441,7 +441,15 @@ func connectMgr( knownWorkloadKinds, err := mClient.GetKnownWorkloadKinds(ctx, si) if err != nil { - return nil, fmt.Errorf("failed to get known workload kinds: %w", err) + if status.Code(err) != codes.Unimplemented { + return nil, fmt.Errorf("failed to get known workload kinds: %w", err) + } + // Talking to an older traffic-manager, use legacy default types + knownWorkloadKinds = &manager.KnownWorkloadKinds{Kinds: []manager.WorkloadInfo_Kind{ + manager.WorkloadInfo_DEPLOYMENT, + manager.WorkloadInfo_REPLICASET, + manager.WorkloadInfo_STATEFULSET, + }} } sess := &session{