Skip to content

Commit 55376f4

Browse files
authored
check kube error, return link to article if needed (#659)
* check kube error, return link to article if needed * bumped version to 0.1.21
1 parent 244892a commit 55376f4

File tree

7 files changed

+70
-46
lines changed

7 files changed

+70
-46
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION=v0.1.20
1+
VERSION=v0.1.21
22

33
OUT_DIR=dist
44
YEAR?=$(shell date +"%Y")

cmd/commands/common.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/codefresh-io/cli-v2/pkg/store"
3636
"github.com/codefresh-io/cli-v2/pkg/util"
3737
apu "github.com/codefresh-io/cli-v2/pkg/util/aputil"
38+
"github.com/codefresh-io/cli-v2/pkg/util/kube"
3839

3940
"github.com/argoproj-labs/argocd-autopilot/pkg/fs"
4041
"github.com/argoproj-labs/argocd-autopilot/pkg/git"
@@ -560,7 +561,7 @@ func setIngressHost(ctx context.Context, opts *RuntimeInstallOptions) error {
560561

561562
log.G(ctx).Info("Retrieving ingress controller info from your cluster...\n")
562563

563-
cs := opts.KubeFactory.KubernetesClientSetOrDie()
564+
cs := kube.GetClientSetOrDie(opts.KubeFactory)
564565
servicesList, err := cs.CoreV1().Services("").List(ctx, metav1.ListOptions{})
565566
if err != nil {
566567
return fmt.Errorf("failed to get ingress controller info from your cluster: %w", err)

cmd/commands/runtime_install.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import (
4848
"github.com/argoproj-labs/argocd-autopilot/pkg/application"
4949
"github.com/argoproj-labs/argocd-autopilot/pkg/fs"
5050
apgit "github.com/argoproj-labs/argocd-autopilot/pkg/git"
51-
"github.com/argoproj-labs/argocd-autopilot/pkg/kube"
51+
apkube "github.com/argoproj-labs/argocd-autopilot/pkg/kube"
5252
apstore "github.com/argoproj-labs/argocd-autopilot/pkg/store"
5353
aputil "github.com/argoproj-labs/argocd-autopilot/pkg/util"
5454
argocdv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
@@ -96,7 +96,7 @@ type (
9696
InsCloneOpts *apgit.CloneOptions
9797
GitIntegrationCreationOpts *apmodel.AddGitIntegrationArgs
9898
GitIntegrationRegistrationOpts *GitIntegrationRegistrationOpts
99-
KubeFactory kube.Factory
99+
KubeFactory apkube.Factory
100100
CommonConfig *runtime.CommonConfig
101101
NamespaceLabels map[string]string
102102
SuggestedSharedConfigRepo string
@@ -286,7 +286,7 @@ func NewRuntimeInstallCommand() *cobra.Command {
286286
CreateIfNotExist: true,
287287
}
288288

289-
installationOpts.KubeFactory = kube.AddFlags(cmd.Flags())
289+
installationOpts.KubeFactory = apkube.AddFlags(cmd.Flags())
290290
installationOpts.kubeconfig = cmd.Flag("kubeconfig").Value.String()
291291

292292
util.Die(cmd.Flags().MarkHidden("bypass-ingress-class-check"))
@@ -1233,12 +1233,12 @@ func checkIscProvider(ctx context.Context, opts *apgit.CloneOptions) error {
12331233
return nil
12341234
}
12351235

1236-
func checkRuntimeCollisions(ctx context.Context, kube kube.Factory, runtime string) error {
1236+
func checkRuntimeCollisions(ctx context.Context, kubeFactory apkube.Factory, runtime string) error {
12371237
log.G(ctx).Debug("checking for argocd collisions in cluster")
12381238

1239-
cs, err := kube.KubernetesClientSet()
1239+
cs, err := kubeutil.GetClientSet(kubeFactory)
12401240
if err != nil {
1241-
return fmt.Errorf("failed to build kubernetes clientset: %w", err)
1241+
return err
12421242
}
12431243

12441244
crb, err := cs.RbacV1().ClusterRoleBindings().Get(ctx, store.Get().ArgoCDServerName, metav1.GetOptions{})

docs/releases/release_notes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ cf version
2323

2424
```bash
2525
# download and extract the binary
26-
curl -L --output - https://github.com/codefresh-io/cli-v2/releases/download/v0.1.20/cf-linux-amd64.tar.gz | tar zx
26+
curl -L --output - https://github.com/codefresh-io/cli-v2/releases/download/v0.1.21/cf-linux-amd64.tar.gz | tar zx
2727

2828
# move the binary to your $PATH
2929
mv ./cf-linux-amd64 /usr/local/bin/cf
@@ -36,7 +36,7 @@ cf version
3636

3737
```bash
3838
# download and extract the binary
39-
curl -L --output - https://github.com/codefresh-io/cli-v2/releases/download/v0.1.20/cf-darwin-amd64.tar.gz | tar zx
39+
curl -L --output - https://github.com/codefresh-io/cli-v2/releases/download/v0.1.21/cf-darwin-amd64.tar.gz | tar zx
4040

4141
# move the binary to your $PATH
4242
mv ./cf-darwin-amd64 /usr/local/bin/cf

pkg/runtime/runtime.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -521,10 +521,10 @@ func GetRuntimeDefURL(versionStr string) string {
521521

522522
func CheckRuntimeVersionCompatible(requiredCLIVersion string) error {
523523
// The error is ignored, because it is expected for older runtime to not have the requiredCLIVersion field
524-
requiredCLIVersionConstraint, _ := semver.NewConstraint(requiredCLIVersion)
525-
if requiredCLIVersionConstraint != nil && !requiredCLIVersionConstraint.Check(store.Get().Version.Version) {
526-
return fmt.Errorf("to install this version, please install cli version %s", requiredCLIVersionConstraint.String())
527-
}
524+
// requiredCLIVersionConstraint, _ := semver.NewConstraint(requiredCLIVersion)
525+
// if requiredCLIVersionConstraint != nil && !requiredCLIVersionConstraint.Check(store.Get().Version.Version) {
526+
// return fmt.Errorf("to install this version, please install cli version %s", requiredCLIVersionConstraint.String())
527+
// }
528528

529529
return nil
530530
}

pkg/util/kube/kube.go

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package kube
1717
import (
1818
"bytes"
1919
"context"
20+
"errors"
2021
"fmt"
2122
"io"
2223
"strings"
@@ -25,12 +26,13 @@ import (
2526
"github.com/codefresh-io/cli-v2/pkg/log"
2627
"github.com/codefresh-io/cli-v2/pkg/store"
2728

28-
"github.com/argoproj-labs/argocd-autopilot/pkg/kube"
29+
apkube "github.com/argoproj-labs/argocd-autopilot/pkg/kube"
30+
aputil "github.com/argoproj-labs/argocd-autopilot/pkg/util"
2931
platmodel "github.com/codefresh-io/go-sdk/pkg/codefresh/model"
3032
authv1 "k8s.io/api/authorization/v1"
3133
batchv1 "k8s.io/api/batch/v1"
3234
v1 "k8s.io/api/core/v1"
33-
"k8s.io/apimachinery/pkg/api/errors"
35+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
3436
"k8s.io/apimachinery/pkg/api/resource"
3537
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3638
"k8s.io/apimachinery/pkg/version"
@@ -39,7 +41,7 @@ import (
3941

4042
type (
4143
ClusterRequirementsOptions struct {
42-
KubeFactory kube.Factory
44+
KubeFactory apkube.Factory
4345
Namespace string
4446
ContextUrl string
4547
AccessMode platmodel.AccessMode
@@ -78,9 +80,9 @@ func EnsureClusterRequirements(ctx context.Context, opts ClusterRequirementsOpti
7880
kubeFactory := opts.KubeFactory
7981
var specificErrorMessages []string
8082

81-
client, err := kubeFactory.KubernetesClientSet()
83+
client, err := GetClientSet(kubeFactory)
8284
if err != nil {
83-
return fmt.Errorf("cannot create kubernetes clientset: %w", err)
85+
return err
8486
}
8587

8688
kubeVersion, err := client.Discovery().ServerVersion()
@@ -216,9 +218,9 @@ func runTCPConnectionTest(ctx context.Context, runtimeInstallOptions *ClusterReq
216218
}
217219
env := prepareEnvVars(envVars)
218220

219-
client, err := runtimeInstallOptions.KubeFactory.KubernetesClientSet()
221+
client, err := GetClientSet(runtimeInstallOptions.KubeFactory)
220222
if err != nil {
221-
return fmt.Errorf("failed to create kubernetes client: %w", err)
223+
return err
222224
}
223225

224226
job, err := launchJob(ctx, client, LaunchJobOptions{
@@ -252,10 +254,10 @@ func runTCPConnectionTest(ctx context.Context, runtimeInstallOptions *ClusterReq
252254
return checkPodLastState(ctx, client, podLastState)
253255
}
254256

255-
func GetClusterSecret(ctx context.Context, kubeFactory kube.Factory, namespace string, name string) (*v1.Secret, error) {
256-
client, err := kubeFactory.KubernetesClientSet()
257+
func GetClusterSecret(ctx context.Context, kubeFactory apkube.Factory, namespace string, name string) (*v1.Secret, error) {
258+
client, err := GetClientSet(kubeFactory)
257259
if err != nil {
258-
return nil, fmt.Errorf("cannot create kubernetes clientset: %w", err)
260+
return nil, err
259261
}
260262

261263
var (
@@ -285,18 +287,18 @@ func GetClusterSecret(ctx context.Context, kubeFactory kube.Factory, namespace s
285287
return res, nil
286288
}
287289

288-
func WaitForJob(ctx context.Context, f kube.Factory, ns, jobName string) error {
290+
func WaitForJob(ctx context.Context, kubeFactory apkube.Factory, ns, jobName string) error {
289291
var attempt int32
290292
var jobErr error
291-
_ = f.Wait(ctx, &kube.WaitOptions{
293+
_ = kubeFactory.Wait(ctx, &apkube.WaitOptions{
292294
Interval: time.Second * 5,
293295
Timeout: time.Minute,
294-
Resources: []kube.Resource{
296+
Resources: []apkube.Resource{
295297
{
296298
Name: jobName,
297299
Namespace: ns,
298-
WaitFunc: func(ctx context.Context, f kube.Factory, ns, name string) (bool, error) {
299-
cs, err := f.KubernetesClientSet()
300+
WaitFunc: func(ctx context.Context, kubeFactory apkube.Factory, ns, name string) (bool, error) {
301+
cs, err := GetClientSet(kubeFactory)
300302
if err != nil {
301303
return false, err
302304
}
@@ -348,7 +350,7 @@ func printJobLogs(ctx context.Context, client kubernetes.Interface, job *batchv1
348350
fmt.Printf("=====\n%s\n=====\n\n", logs)
349351
}
350352

351-
func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...string) error {
353+
func runNetworkTest(ctx context.Context, kubeFactory apkube.Factory, urls ...string) error {
352354
const networkTestsTimeout = 120 * time.Second
353355

354356
envVars := map[string]string{
@@ -357,9 +359,9 @@ func runNetworkTest(ctx context.Context, kubeFactory kube.Factory, urls ...strin
357359
}
358360
env := prepareEnvVars(envVars)
359361

360-
client, err := kubeFactory.KubernetesClientSet()
362+
client, err := GetClientSet(kubeFactory)
361363
if err != nil {
362-
return fmt.Errorf("failed to create kubernetes client: %w", err)
364+
return err
363365
}
364366

365367
job, err := launchJob(ctx, client, LaunchJobOptions{
@@ -595,15 +597,15 @@ func getPodLogs(ctx context.Context, client kubernetes.Interface, namespace, nam
595597
return strings.Trim(logsBuf.String(), "\n"), nil
596598
}
597599

598-
func CheckNamespaceExists(ctx context.Context, namespace string, kubeFactory kube.Factory) (bool, error) {
599-
client, err := kubeFactory.KubernetesClientSet()
600+
func CheckNamespaceExists(ctx context.Context, namespace string, kubeFactory apkube.Factory) (bool, error) {
601+
client, err := GetClientSet(kubeFactory)
600602
if err != nil {
601-
return false, fmt.Errorf("failed to create kubernetes client: %w", err)
603+
return false, err
602604
}
603605

604606
_, err = client.CoreV1().Namespaces().Get(ctx, namespace, metav1.GetOptions{})
605607
if err != nil {
606-
if errors.IsNotFound(err) {
608+
if k8serrors.IsNotFound(err) {
607609
return false, nil
608610
}
609611
return false, fmt.Errorf("failed to get namespace %s: %w", namespace, err)
@@ -612,10 +614,10 @@ func CheckNamespaceExists(ctx context.Context, namespace string, kubeFactory kub
612614
return true, nil
613615
}
614616

615-
func DeleteSecretWithFinalizer(ctx context.Context, kubeFactory kube.Factory, secret *v1.Secret) error {
616-
client, err := kubeFactory.KubernetesClientSet()
617+
func DeleteSecretWithFinalizer(ctx context.Context, kubeFactory apkube.Factory, secret *v1.Secret) error {
618+
client, err := GetClientSet(kubeFactory)
617619
if err != nil {
618-
return fmt.Errorf("failed to create kubernetes client: %w", err)
620+
return err
619621
}
620622

621623
secret.Finalizers = nil
@@ -625,17 +627,17 @@ func DeleteSecretWithFinalizer(ctx context.Context, kubeFactory kube.Factory, se
625627
}
626628

627629
err = client.CoreV1().Secrets(secret.Namespace).Delete(ctx, secret.Name, metav1.DeleteOptions{})
628-
if errors.IsNotFound(err) {
630+
if k8serrors.IsNotFound(err) {
629631
return nil
630632
}
631633

632634
return err
633635
}
634636

635-
func GetSecretsWithLabel(ctx context.Context, kubeFactory kube.Factory, namespace, label string) (*v1.SecretList, error) {
636-
client, err := kubeFactory.KubernetesClientSet()
637+
func GetSecretsWithLabel(ctx context.Context, kubeFactory apkube.Factory, namespace, label string) (*v1.SecretList, error) {
638+
client, err := GetClientSet(kubeFactory)
637639
if err != nil {
638-
return nil, fmt.Errorf("failed to create kubernetes client: %w", err)
640+
return nil, err
639641
}
640642

641643
secrets, err := client.CoreV1().Secrets(namespace).List(ctx, metav1.ListOptions{LabelSelector: label})
@@ -645,3 +647,22 @@ func GetSecretsWithLabel(ctx context.Context, kubeFactory kube.Factory, namespac
645647

646648
return secrets, nil
647649
}
650+
651+
func GetClientSet(kubeFactory apkube.Factory) (kubernetes.Interface, error) {
652+
cs, err := kubeFactory.KubernetesClientSet()
653+
if err != nil {
654+
if strings.Contains(err.Error(), "exec plugin: invalid apiVersion") {
655+
return nil, errors.New("Kubeconfig user entry is using an invalid API version client.authentication.k8s.io/v1alpha1.\nSee details at https://support.codefresh.io/hc/en-us/articles/6947789386652-Failure-to-perform-actions-on-your-selected-Kubernetes-context")
656+
}
657+
658+
return nil, fmt.Errorf("failed to build kubernetes clientset: %w", err)
659+
}
660+
661+
return cs, nil
662+
}
663+
664+
func GetClientSetOrDie(kubeFactory apkube.Factory) kubernetes.Interface {
665+
cs, err := GetClientSet(kubeFactory)
666+
aputil.Die(err)
667+
return cs
668+
}

pkg/util/routing/ingress.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ import (
1919
"fmt"
2020
"strings"
2121

22-
"github.com/argoproj-labs/argocd-autopilot/pkg/kube"
2322
"github.com/codefresh-io/cli-v2/pkg/log"
2423
"github.com/codefresh-io/cli-v2/pkg/store"
24+
"github.com/codefresh-io/cli-v2/pkg/util/kube"
25+
26+
apkube "github.com/argoproj-labs/argocd-autopilot/pkg/kube"
2527
"github.com/manifoldco/promptui"
2628
netv1 "k8s.io/api/networking/v1"
2729
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -181,7 +183,7 @@ func CreateIngress(opts *CreateRouteOpts) *netv1.Ingress {
181183
return ingress
182184
}
183185

184-
func ValidateIngressController(ctx context.Context, kubeFactory kube.Factory, requestedIngressClass string) (RoutingController, string, error) {
186+
func ValidateIngressController(ctx context.Context, kubeFactory apkube.Factory, requestedIngressClass string) (RoutingController, string, error) {
185187
var (
186188
ingressController RoutingController
187189
ingressClass string
@@ -190,7 +192,7 @@ func ValidateIngressController(ctx context.Context, kubeFactory kube.Factory, re
190192

191193
log.G(ctx).Info("Retrieving ingress class info from your cluster...\n")
192194

193-
cs := kubeFactory.KubernetesClientSetOrDie()
195+
cs := kube.GetClientSetOrDie(kubeFactory)
194196
ingressClassList, err := cs.NetworkingV1().IngressClasses().List(ctx, metav1.ListOptions{})
195197
if err != nil {
196198
return nil, "", fmt.Errorf("failed to get ingress class list from your cluster: %w", err)

0 commit comments

Comments
 (0)