From 21a3dab946d4b76806f7a9a6a74b07bc6265d509 Mon Sep 17 00:00:00 2001 From: Michael Riley Date: Mon, 9 May 2022 13:06:45 -0400 Subject: [PATCH] Add support for VKE version upgrades (#263) * WIP: add upgrade commands and printer to kubernetes * Move upgrade commands to sub-command and add docs * Inline error handling * Change upgrade command to be less redundant --- cmd/kubernetes.go | 88 +++++++++++++++++++++++++++++++++++++-- cmd/printer/kubernetes.go | 9 ++++ 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/cmd/kubernetes.go b/cmd/kubernetes.go index 0fc01817..bf03919d 100644 --- a/cmd/kubernetes.go +++ b/cmd/kubernetes.go @@ -94,7 +94,7 @@ var ( vultr-cli kubernetes config ffd31f18-5f77-454c-9065-212f942c3c35 # Shortened with alias commands - vultr-cli k config ffd31f18-5f77-454c-9065-212f942c3c35' + vultr-cli k config ffd31f18-5f77-454c-9065-212f942c3c35 ` getVersionsLong = `Returns a list of supported kubernetes versions you can deploy` @@ -103,7 +103,34 @@ var ( vultr-cli kubernetes versions # Shortened with alias commands - vultr-cli k v' + vultr-cli k v + ` + + upgradesLong = `Display available kubernetes upgrade commands` + upgradesExample = ` + # Full example + vultr-cli kubernetes upgrades + + # Shortened example with aliases + vultr-cli k e + ` + + getUpgradesLong = `Returns a list of available kubernetes version the cluster can be upgraded to` + getUpgradesExample = ` + # Full example + vultr-cli kubernetes upgrades list d4908765-b82a-4e7d-83d9-c0bc4c6a36d0 + + # Shortened with alias commands + vultr-cli k e l d4908765-b82a-4e7d-83d9-c0bc4c6a36d0 + ` + + upgradeLong = `Initiate an upgrade of the kubernetes version on a given cluster` + upgradeExample = ` + # Full example + vultr-cli kubernetes upgrades start d4908765-b82a-4e7d-83d9-c0bc4c6a36d0 --version="v1.23.5+3" + + # Shortened with alias commands + vultr-cli k e s d4908765-b82a-4e7d-83d9-c0bc4c6a36d0 -v="v1.23.5+3" ` nodepoolLong = `Get all available commands for Kubernetes node pools` @@ -217,6 +244,20 @@ func Kubernetes() *cobra.Command { k8Update.Flags().StringP("label", "l", "", "label for your kubernetes cluster") k8Update.MarkFlagRequired("label") + // Sub command for upgrade functions + k8UpgradeCmd := &cobra.Command{ + Use: "upgrades", + Aliases: []string{"upgrade", "e"}, + Short: `upgrade commands for kubernetes version upgrades`, + Long: upgradesLong, + Example: upgradesExample, + } + + k8UpgradeCmd.AddCommand(k8Upgrade, k8GetUpgrades) + k8Upgrade.Flags().StringP("version", "v", "", "the version to upgrade the cluster to") + k8Upgrade.MarkFlagRequired("version") + kubernetesCmd.AddCommand(k8UpgradeCmd) + // Node Pools SubCommands nodepoolsCmd := &cobra.Command{ Use: "node-pool", @@ -455,6 +496,47 @@ var k8GetVersions = &cobra.Command{ }, } +var k8GetUpgrades = &cobra.Command{ + Use: "list ", + Short: "gets available upgrades for a cluster", + Long: getUpgradesLong, + Example: getUpgradesExample, + Aliases: []string{"l"}, + Run: func(cmd *cobra.Command, args []string) { + id := args[0] + upgrades, err := client.Kubernetes.GetUpgrades(context.Background(), id) + if err != nil { + fmt.Printf("error retrieving available upgrades : %v\n", err) + os.Exit(1) + } + + printer.K8Upgrades(upgrades) + }, +} + +var k8Upgrade = &cobra.Command{ + Use: "start ", + Short: "perform upgrade on a cluster", + Long: upgradeLong, + Example: upgradeExample, + Aliases: []string{"s"}, + Run: func(cmd *cobra.Command, args []string) { + id := args[0] + version, _ := cmd.Flags().GetString("version") + + options := &govultr.ClusterUpgradeReq{ + UpgradeVersion: version, + } + + if err := client.Kubernetes.Upgrade(context.Background(), id, options); err != nil { + fmt.Printf("error performing cluster upgrade : %v\n", err) + os.Exit(1) + } + + fmt.Println("kubernetes cluster upgrade has been initiated") + }, +} + var npCreate = &cobra.Command{ Use: "create ", Short: "creates a node pool in a kubernetes cluster", @@ -722,7 +804,7 @@ func formatNodePools(nodePools []string) ([]govultr.NodePoolReq, error) { case field == "max-nodes": v, err := strconv.Atoi(val) if err != nil { - return nil, fmt.Errorf("invalid value for node pool max-nodes: %v", err) + return nil, fmt.Errorf("invalid value for max-nodes: %v", err) } np.MaxNodes = v } diff --git a/cmd/printer/kubernetes.go b/cmd/printer/kubernetes.go index 42ad317d..8a571afe 100644 --- a/cmd/printer/kubernetes.go +++ b/cmd/printer/kubernetes.go @@ -150,3 +150,12 @@ func K8Versions(versions *govultr.Versions) { flush() } + +func K8Upgrades(upgrades []string) { + display(columns{"UPGRADES"}) + for _, v := range upgrades { + display(columns{v}) + } + + flush() +}