@@ -17,6 +17,7 @@ package kube
1717import (
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
4042type (
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.\n See 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+ }
0 commit comments