feat: install kubectx and kubens

This commit is contained in:
Jose Diaz-Gonzalez
2024-01-30 08:01:42 -05:00
parent a277c5da1b
commit 06429a384e
3 changed files with 94 additions and 7 deletions

View File

@@ -154,8 +154,8 @@ func ReadFirstLine(filename string) (text string) {
// SetPermissionsInput is the input struct for SetPermissions
type SetPermissionInput struct {
Filename string
Mode os.FileMode
GroupName string
Mode os.FileMode
Username string
}
@@ -214,9 +214,11 @@ func TouchFile(filename string) error {
}
type WriteSliceToFileInput struct {
Filename string
Lines []string
Mode os.FileMode
Filename string
GroupName string
Lines []string
Mode os.FileMode
Username string
}
// WriteSliceToFile writes a slice of strings to a file
@@ -239,8 +241,17 @@ func WriteSliceToFile(input WriteSliceToFileInput) error {
return err
}
return SetPermissions(SetPermissionInput{
permissionsInput := SetPermissionInput{
Filename: input.Filename,
Mode: input.Mode,
})
}
if input.GroupName != "" {
permissionsInput.GroupName = input.GroupName
}
if input.Username != "" {
permissionsInput.Username = input.Username
}
return SetPermissions(permissionsInput)
}

View File

@@ -14,6 +14,8 @@ import (
appjson "github.com/dokku/dokku/plugins/app-json"
"github.com/dokku/dokku/plugins/common"
resty "github.com/go-resty/resty/v2"
"golang.org/x/sync/errgroup"
"gopkg.in/yaml.v3"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
@@ -722,6 +724,61 @@ func installHelmCharts(ctx context.Context, clientset KubernetesClient) error {
return nil
}
func installHelperCommands(ctx context.Context) error {
urls := map[string]string{
"kubectx": "https://github.com/ahmetb/kubectx/releases/latest/download/kubectx",
"kubens": "https://github.com/ahmetb/kubectx/releases/latest/download/kubens",
}
client := resty.New()
for binaryName, url := range urls {
resp, err := client.R().
SetContext(ctx).
Get(url)
if err != nil {
return fmt.Errorf("Unable to download %s: %w", binaryName, err)
}
if resp == nil {
return fmt.Errorf("Missing response from %s download: %w", binaryName, err)
}
if resp.StatusCode() != 200 {
return fmt.Errorf("Invalid status code for %s: %d", binaryName, resp.StatusCode())
}
f, err := os.Create(filepath.Join("/usr/local/bin", binaryName))
if err != nil {
return fmt.Errorf("Unable to create %s: %w", binaryName, err)
}
if err := f.Close(); err != nil {
return fmt.Errorf("Unable to close %s file: %w", binaryName, err)
}
err = common.WriteSliceToFile(common.WriteSliceToFileInput{
Filename: f.Name(),
GroupName: "root",
Lines: strings.Split(resp.String(), "\n"),
Mode: os.FileMode(0755),
Username: "root",
})
if err != nil {
return fmt.Errorf("Unable to write %s to file: %w", binaryName, err)
}
fi, err := os.Stat(f.Name())
if err != nil {
return fmt.Errorf("Unable to get %s file size: %w", binaryName, err)
}
if fi.Size() == 0 {
return fmt.Errorf("Invalid %s filesize", binaryName)
}
}
return nil
}
func isK3sInstalled() error {
if !common.FileExists("/usr/local/bin/k3s") {
return fmt.Errorf("k3s binary is not available")
@@ -797,6 +854,17 @@ func kubernetesNodeToNode(node v1.Node) Node {
}
}
func uninstallHelperCommands(ctx context.Context) error {
errs, _ := errgroup.WithContext(ctx)
errs.Go(func() error {
return os.RemoveAll("/usr/local/bin/kubectx")
})
errs.Go(func() error {
return os.RemoveAll("/usr/local/bin/kubens")
})
return errs.Wait()
}
func waitForPodBySelectorRunning(ctx context.Context, input WaitForPodBySelectorRunningInput) error {
pods, err := waitForPodToExist(ctx, WaitForPodToExistInput{
Clientset: input.Clientset,

View File

@@ -84,6 +84,7 @@ func CommandInitialize(serverIP string, taintScheduling bool) error {
common.LogInfo2Quiet("Downloading k3s installer")
client := resty.New()
resp, err := client.R().
SetContext(ctx).
Get("https://get.k3s.io")
if err != nil {
return fmt.Errorf("Unable to download k3s installer: %w", err)
@@ -247,6 +248,12 @@ func CommandInitialize(serverIP string, taintScheduling bool) error {
return fmt.Errorf("Unable to install helm charts: %w", err)
}
common.LogInfo2Quiet("Installing helper commands")
err = installHelperCommands(ctx)
if err != nil {
return fmt.Errorf("Unable to install helper commands: %w", err)
}
common.LogVerboseQuiet("Done")
return nil
@@ -709,5 +716,6 @@ func CommandUninstall() error {
return fmt.Errorf("Invalid exit code from k3s uninstaller command: %d", uninstallerCmd.ExitCode)
}
return nil
common.LogInfo2Quiet("Removing k3s dependencies")
return uninstallHelperCommands(context.Background())
}