cmds

package
v1.0.0-alpha1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2021 License: GPL-3.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// GOARCH os architecture
	GOARCH = runtime.GOARCH
	// GOOS os type
	GOOS = runtime.GOOS
)

Variables

View Source
var (
	UserHome string
	KcvmPath string
)
View Source
var Commands = []*cli.Command{
	&InitCmd,
	&InstallCmd,
	&ListCmd,
	&UseCmd,
}

Commands declare each command

View Source
var InitCmd = cli.Command{
	Name:  "init",
	Usage: "Initialize kcvm",
	Action: func(c *cli.Context) error {
		_, err := os.Stat(path.Join(KcvmPath, "bin"))
		if os.IsNotExist(err) {
			err = os.MkdirAll(path.Join(KcvmPath, "bin"), 0755)
			if err != nil {
				return err
			}

			log.Info("Path " + KcvmPath + " Created")

			return nil
		}

		log.Info("Path " + KcvmPath + " Exists")

		return nil
	},
}

InitCmd creates kcvm main directory under ~/.kcvm

View Source
var InstallCmd = cli.Command{
	Name:  "install",
	Usage: "Install kubectl version",
	Action: func(c *cli.Context) error {
		if c.NArg() == 0 {
			return errors.New("You must provide a version from kcvm list")
		}

		kubectlVersion := c.Args().Get(0)
		kubectlBinPath := path.Join(path.Join(KcvmPath, "bin"), fmt.Sprintf("kubectl-%s", kubectlVersion))
		kubectlTempPath := path.Join(path.Join(os.TempDir(), "kcvm"), fmt.Sprintf("kubectl-%s", kubectlVersion))
		kubectlSymPath := path.Join(KcvmPath, "kubectl")

		client := resty.New()

		resp, err := client.R().
			SetOutput(kubectlTempPath).
			Get(fmt.Sprintf("https://storage.googleapis.com/kubernetes-release/release/%s/bin/%s/%s/kubectl", kubectlVersion, GOOS, GOARCH))

		if err != nil {
			return err
		}

		if resp.RawResponse.StatusCode != 200 {
			return errors.New("This kubectl version does not exist")
		}

		err = os.Chmod(kubectlTempPath, 0775)
		if err != nil {
			return err
		}

		err = os.Rename(kubectlTempPath, kubectlBinPath)
		if err != nil {
			return err
		}

		_, err = os.Stat(kubectlSymPath)
		if !os.IsNotExist(err) {
			err = os.Remove(kubectlSymPath)
			if err != nil {
				return err
			}
		}

		err = os.Symlink(kubectlBinPath, kubectlSymPath)
		if err != nil {
			return err
		}

		return nil
	},
}

InstallCmd declares install command

View Source
var ListCmd = cli.Command{
	Name:  "list",
	Usage: "List kubectl version",
	Subcommands: []*cli.Command{
		{
			Name:  "remote",
			Usage: "List upstream kubectl versions",
			Action: func(c *cli.Context) error {
				client := resty.New()
				var githubPages = []int{1, 2, 3}

				var respTags GithubTags

				for _, i := range githubPages {
					resp, err := client.R().
						SetHeader("Accept", "application/json").
						SetResult(GithubTags{}).
						Get(fmt.Sprintf("https://api.github.com/repos/kubernetes/kubernetes/tags?per_page=100&page=%d", i))

					if err != nil {
						return err
					}

					tags := resp.Result().(*GithubTags)

					for _, tag := range *tags {
						respTags = append(respTags, tag)
					}
				}

				for i := range respTags {
					switch {
					case strings.Contains(respTags[i].Name, "beta"):
						fallthrough
					case strings.Contains(respTags[i].Name, "alpha"):
						fallthrough
					case strings.Contains(respTags[i].Name, "rc"):
					default:
						fmt.Println(respTags[i].Name)
					}
				}

				return nil
			},
		},
		{
			Name:  "local",
			Usage: "List locally installed kubectl version",
			Action: func(c *cli.Context) error {
				files, err := ioutil.ReadDir(path.Join(KcvmPath, "bin"))
				if err != nil {
					return err
				}

				sort.SliceStable(files, func(i, j int) bool {
					vi, _ := version.NewVersion(strings.TrimPrefix(files[i].Name(), "kubectl-"))
					vj, _ := version.NewVersion(strings.TrimPrefix(files[j].Name(), "kubectl-"))
					return vi.GreaterThan(vj)
				})

				for _, file := range files {
					switch file.Name() {
					case "kubectl":
						break
					default:
						fmt.Println(strings.TrimPrefix(file.Name(), "kubectl-"))
					}
				}

				return nil
			},
		},
	},
}

ListCmd lists remote or locally installed kubectl versions

View Source
var UseCmd = cli.Command{
	Name:  "use",
	Usage: "Specify kubectl version to use",
	Action: func(c *cli.Context) error {
		if c.NArg() == 0 {
			return errors.New("You must provide a version from kcvm list local")
		}

		kubectlVersion := c.Args().Get(0)
		kubectlBinPath := path.Join(path.Join(KcvmPath, "bin"), fmt.Sprintf("kubectl-%s", kubectlVersion))
		kubectlSymPath := path.Join(KcvmPath, "kubectl")

		_, err := os.Stat(kubectlBinPath)
		if os.IsNotExist(err) {
			if err != nil {
				return errors.New("This kubectl version does not exist")
			}
		}

		_, err = os.Stat(kubectlSymPath)
		if !os.IsNotExist(err) {
			err = os.Remove(kubectlSymPath)
			if err != nil {
				return err
			}
		}

		err = os.Symlink(kubectlBinPath, kubectlSymPath)
		if err != nil {
			return err
		}

		return nil
	},
}

UseCmd declares list command

Functions

func InitCLI

func InitCLI() *cli.App

Types

type GithubTag

type GithubTag struct {
	Name       string `json:"name"`
	ZipballURL string `json:"zipball_url"`
	TarballURL string `json:"tarball_url"`
	Commit     struct {
		Sha string `json:"sha"`
		URL string `json:"url"`
	} `json:"commit"`
	NodeID string `json:"node_id"`
}

type GithubTags

type GithubTags []*GithubTag

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL