Skip to content

Commit

Permalink
fix:add logic in connect command to check if vcluster can be connecte…
Browse files Browse the repository at this point in the history
…d using the kubeconfig.
  • Loading branch information
kale-amruta committed Jan 17, 2025
1 parent a014dba commit 3505235
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
36 changes: 36 additions & 0 deletions pkg/cli/connect_helm.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ func (cmd *connectHelm) connect(ctx context.Context, vCluster *find.VCluster, co
return err
}

// check if vcluster is ready
err = cmd.isVclusterReady(ctx, *kubeConfig, cmd.errorChan)
if err != nil {
return err
}

// check if we should execute command
if len(command) > 0 {
if !cmd.portForwarding {
Expand Down Expand Up @@ -141,6 +147,36 @@ func (cmd *connectHelm) connect(ctx context.Context, vCluster *find.VCluster, co
return nil
}

func (cmd *connectHelm) isVclusterReady(ctx context.Context, vKubeConfig clientcmdapi.Config, errorChan chan error) error {
vRestConfig, err := clientcmd.NewDefaultClientConfig(vKubeConfig, &clientcmd.ConfigOverrides{}).ClientConfig()
if err != nil {
return fmt.Errorf("create virtual rest config: %w", err)
}

vKubeClient, err := kubernetes.NewForConfig(vRestConfig)
if err != nil {
return fmt.Errorf("create virtual kube client: %w", err)
}

werr := wait.PollUntilContextTimeout(ctx, time.Millisecond*200, time.Minute*2, true, func(ctx context.Context) (bool, error) {
select {
case err := <-errorChan:
return false, err
default:
// check if service account exists
_, err := vKubeClient.CoreV1().ServiceAccounts("default").Get(ctx, "default", metav1.GetOptions{})
if err != nil {
cmd.Log.Debugf("failed to list default service account %v", err)
}
return err == nil, nil
}
})
if werr != nil {
return fmt.Errorf("failed connecting to vcluster, verify connection arguments: %w ", werr)
}
return nil
}

func writeKubeConfig(kubeConfig *clientcmdapi.Config, vClusterName string, options *ConnectOptions, globalFlags *flags.GlobalFlags, portForwarding bool, log log.Logger) error {
if kubeConfig == nil {
return errors.New("nil kubeconfig")
Expand Down
11 changes: 11 additions & 0 deletions test/e2e_cli/connect/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,15 @@ var _ = ginkgo.Describe("Connect to vCluster", func() {
err := connectCmd.Execute()
framework.ExpectNoError(err)
})

ginkgo.It("should fail saying the client timeout exceeded", func() {
connectCmd := cmd.NewConnectCmd(&flags.GlobalFlags{})
connectCmd.SetArgs([]string{f.VclusterName})
err := connectCmd.Flags().Set("kube-config", f.VClusterKubeConfigFile.Name())
framework.ExpectNoError(err)
err = connectCmd.Flags().Set("server", "testdomain.org")
framework.ExpectNoError(err)
err = connectCmd.Execute()
framework.ExpectError(err)
})
})

0 comments on commit 3505235

Please sign in to comment.