From 7cea7ccd8de894dbe5e2cd1dcf041b9baae03176 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 31 May 2016 16:26:36 -0700 Subject: [PATCH] retry GetThirdPartyGroupVersions --- pkg/kubectl/cmd/util/factory.go | 14 +++++++++++++- pkg/kubectl/cmd/util/helpers.go | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 3f1c73ed41a..abf578607a1 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -38,6 +38,7 @@ import ( "k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/pkg/api" + apierrors "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/service" "k8s.io/kubernetes/pkg/api/unversioned" @@ -260,7 +261,18 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { client, err := clients.ClientForVersion(&unversioned.GroupVersion{Version: "v1"}) CheckErr(err) - versions, gvks, err := GetThirdPartyGroupVersions(client.Discovery()) + var versions []unversioned.GroupVersion + var gvks []unversioned.GroupVersionKind + retries := 3 + for i := 0; i < retries; i++ { + versions, gvks, err = GetThirdPartyGroupVersions(client.Discovery()) + // Retry if we got a NotFound error, because user may delete + // a thirdparty group when the GetThirdPartyGroupVersions is + // running. + if err == nil || !apierrors.IsNotFound(err) { + break + } + } CheckErr(err) if len(versions) > 0 { priorityMapper, ok := mapper.RESTMapper.(meta.PriorityRESTMapper) diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index d65841e2f38..02201aa7664 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -488,6 +488,10 @@ func ShouldRecord(cmd *cobra.Command, info *resource.Info) bool { return GetRecordFlag(cmd) || ContainsChangeCause(info) } +// GetThirdPartyGroupVersions returns the thirdparty "group/versions"s and +// resources supported by the server. A user may delete a thirdparty resource +// when this function is running, so this function may return a "NotFound" error +// due to the race. func GetThirdPartyGroupVersions(discovery discovery.DiscoveryInterface) ([]unversioned.GroupVersion, []unversioned.GroupVersionKind, error) { result := []unversioned.GroupVersion{} gvks := []unversioned.GroupVersionKind{}