Skip to content
This repository has been archived by the owner on Mar 1, 2024. It is now read-only.

Commit

Permalink
Merge pull request #18 from superseb/change_alot
Browse files Browse the repository at this point in the history
Add RKE2/k3s for list/diff k8s and change channels
  • Loading branch information
superseb authored Feb 1, 2022
2 parents 07af40b + dd66b51 commit d5c6ba4
Show file tree
Hide file tree
Showing 4 changed files with 204 additions and 46 deletions.
43 changes: 30 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

Tool to query KDM data for a given Rancher version, think of:

- What k8s version are included in a Rancher release (channel `embedded`), out of band (channel `release`) or in development (channel `dev`)?
- What k8s version are included in a Rancher release?
- What k8s images are in a Rancher Kubernetes version?
- What addons are included in a Rancher Kubernetes version?

And diff commands to automatically get the differences between two version.
And diff commands to automatically get the differences between two versions.

## Docs

Expand All @@ -15,50 +15,67 @@ Under construction!
Parameters:

- `rancher_version`: The version of Rancher that is used for querying KDM data, examples: v2.5.10, v2.6.3, v2.6.0
- `channel`: The source of KDM data used, valid options are: `embedded` (what is in the released version, no out-of-band data), `release` (what is currently released in KDM and active to installs refreshing KDM from online source), `dev` (what is currently in development), `./$FILE` (local data file, must be prefixed with `./` to indicate local data file), `https://URL_TO/data.json` (remote URL data file, must be a valid URL to be used)
- `channel`: The source of KDM data used, valid options are:
- `release` (what is in the released version, no out-of-band data)
- `latest` (what is currently released in KDM and active to installs refreshing KDM from online source, coming from https://releases.rancher.com/kontainer-driver-metadata/(release|dev)-(v2.5|v2.6)/data.json)
- `dev` (what is currently in development)
- `./$FILE` (local data file, must be prefixed with `./` to indicate local data file)
- `https://URL_TO/data.json` (remote URL data file, must be a valid URL to be used)


Flags:

- `verbose`: Print every piece of data used.
- `diff-oneway`: Only diff one way (defaults to two way)
- `show-all`: Show all k8s versions available (only for RKE2/K3S for now)
- `output`: Option to print output as json (`--output=json`)

## Examples

* List k8s versions for a Rancher version

```
kdmq listk8s v2.6.3 release
kdmq listk8s rke v2.6.3 release
kdmq listk8s rke2 v2.6.3 latest
kdmq --show-all listk8s rke2 v2.6.3 latest // only for RKE2/K3S
kdmq listk8s k3s v2.6.3 dev
kdmq --show-all listk8s k3s v2.6.3 dev // only for RKE2/K3S
```

* List k8s versions for a Rancher version using a remote URL data file

```
kdmq listk8s v2.6.3 https://my.domain.com/data.json
kdmq listk8s rke v2.6.3 https://my.domain.com/data.json
```

* Diff k8s versions for Rancher versions

```
kdmq diffk8s v2.6.3 v2.6.3 embedded release
kdmq diffk8s rke2 v2.6.3 v2.6.3 release latest
```

* Diff oneway k8s versions for Rancher versions

```
kdmq --diff-oneway diffk8s v2.6.3 v2.6.3 embedded release
kdmq --diff-oneway diffk8s rke v2.6.3 v2.6.3 release latest
```

* Diff verbose k8s versions for Rancher versions

```
kdmq --verbose diffk8s v2.6.3 v2.6.3 embedded release
kdmq --verbose diffk8s rke v2.6.3 v2.6.3 release latest
```

* List k8s images for a Rancher k8s version

```
kdmq listk8simages v1.22.5-rancher1-1 v2.6.3 release
kdmq listk8simages v1.22.5-rancher1-1 v2.6.3 latest
```

* Diff k8s images for Rancher k8s versions

```
kdmq diffk8simages v1.22.5-rancher1-1 v1.22.4-rancher1-1 v2.6.3 dev release
kdmq diffk8simages v1.22.5-rancher1-1 v1.22.4-rancher1-1 v2.6.3 dev latest
```

* Diff k8s images for Rancher k8s versions with local data
Expand All @@ -70,17 +87,17 @@ kdmq diffk8simages v1.22.5-rancher1-1 v1.22.4-rancher1-1 v2.6.3 dev ./data.json
* Diff oneway all k8s images between Rancher k8s versions between Rancher version

```
kdmq --diff-oneway diffallk8simages v2.6.0 v2.6.3 embedded embedded
kdmq --diff-oneway diffallk8simages v2.6.0 v2.6.3 release release
```

* List k8s addons for Rancher k8s version

```
kdmq listk8saddons v1.22.5-rancher1-1 v2.6.3 release
kdmq listk8saddons v1.22.5-rancher1-1 v2.6.3 latest
```

* Diff k8s addons for Rancher k8s versions

```
kdmq diffk8saddons v1.22.5-rancher1-1 v1.21.7-rancher1-1 v2.6.3 release release
kdmq diffk8saddons v1.22.5-rancher1-1 v1.21.7-rancher1-1 v2.6.3 latest latest
```
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ require (
github.com/blang/semver/v4 v4.0.0
github.com/coreos/go-semver v0.3.0
github.com/hashicorp/go-retryablehttp v0.7.0
github.com/mcuadros/go-version v0.0.0-20180611085657-6d5863ca60fa
github.com/olekukonko/tablewriter v0.0.4
github.com/rancher/rancher v0.0.0-20211218171736-3c1d5fac3248
github.com/rancher/rke v1.3.3
github.com/sirupsen/logrus v1.8.1
github.com/urfave/cli/v2 v2.2.0
)

Expand Down Expand Up @@ -127,7 +129,6 @@ require (
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mcuadros/go-version v0.0.0-20180611085657-6d5863ca60fa // indirect
github.com/minio/md5-simd v1.1.0 // indirect
github.com/minio/minio-go/v7 v7.0.10 // indirect
github.com/minio/sha256-simd v0.1.1 // indirect
Expand Down Expand Up @@ -189,7 +190,6 @@ require (
github.com/segmentio/kafka-go v0.0.0-20190411192201-218fd49cff39 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/spf13/afero v1.6.0 // indirect
github.com/spf13/cast v1.4.1 // indirect
github.com/spf13/cobra v1.2.1 // indirect
Expand Down
150 changes: 121 additions & 29 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"sort"
"strings"

"github.com/olekukonko/tablewriter"
"github.com/rancher/rke/types/kdm"
"github.com/sirupsen/logrus"
"github.com/superseb/kdmq/util"
"github.com/urfave/cli/v2"
)
Expand All @@ -23,33 +26,60 @@ func main() {
{
Name: "listk8s",
Aliases: []string{"lk"},
Usage: "list k8s versions for Rancher version",
Usage: "list products (rke/rke2/k3s) k8s versions for Rancher version",
Action: func(c *cli.Context) error {
commandUsage := fmt.Sprintf("Usage: %s <rancher_version> <channel>", c.Command.FullName())
commandUsage := fmt.Sprintf("Usage: %s <product> <rancher_version> <channel>", c.Command.FullName())

if c.Args().Len() < 2 {
if c.Args().Len() < 3 {
return fmt.Errorf("Not enough parameters\n%s", commandUsage)
}

version := c.Args().Get(0)
channel := c.Args().Get(1)

var data kdm.Data
var err error
product := c.Args().Get(0)
version := c.Args().Get(1)
channel := c.Args().Get(2)

data, err = util.GetDataForChannel(version, channel)
data, err := util.GetDataForChannel(version, channel)
if err != nil {
return fmt.Errorf("Error while trying to get KDM data, error [%v]", err)
}
k8sVersions, err := util.GetK8sVersionsForVersion(data, version)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions, error [%v]", err)
var k8sVersions []string

switch product {
case "rke":
k8sVersions, err = util.GetK8sVersionsForVersion(data, version)
if err != nil {
return fmt.Errorf("Error while trying to get RKE k8s versions, error [%v]", err)
}

case "rke2":
k8sVersions, err = util.GetRKE2K8sVersionsForVersion(data, version)
if err != nil {
return fmt.Errorf("Error while trying to get RKE2 k8s versions, error [%v]", err)
}
if !c.Bool("show-all") {
k8sVersions = util.GetLatestMajorMinorK8sVersions(k8sVersions)
}
case "k3s":
k8sVersions, err = util.GetK3SK8sVersionsForVersion(data, version)
if err != nil {
return fmt.Errorf("Error while trying to get K3S k8s versions, error [%v]", err)
}
if !c.Bool("show-all") {
k8sVersions = util.GetLatestMajorMinorK8sVersions(k8sVersions)
}
default:
return fmt.Errorf("Not a valid product [%s], valid products are %v", product, strings.Join(util.GetValidProducts(), ","))
}

if c.Bool("verbose") {
fmt.Printf("Kubernetes versions found for version [%s] in channel [%s]:\n%s\n", version, channel, strings.Join(k8sVersions, "\n"))
return nil
}
if c.String("output") == "json" {
jsonOutput, _ := json.Marshal(k8sVersions)
fmt.Printf("%s\n", string(jsonOutput))
return nil
}
fmt.Printf("%s\n", strings.Join(k8sVersions, "\n"))
return nil

Expand All @@ -60,17 +90,18 @@ func main() {
Aliases: []string{"dk"},
Usage: "diff 2 k8s version",
Action: func(c *cli.Context) error {
commandUsage := fmt.Sprintf("Usage: %s <rancher_version1> <rancher_version2> <channel1> [channel2]", c.Command.FullName())
commandUsage := fmt.Sprintf("Usage: %s <product> <rancher_version1> <rancher_version2> <channel1> [channel2]", c.Command.FullName())

if c.Args().Len() < 3 {
if c.Args().Len() < 4 {
return fmt.Errorf("Not enough parameters\n:%s", commandUsage)
}
version1 := c.Args().Get(0)
version2 := c.Args().Get(1)
channel1 := c.Args().Get(2)
product := c.Args().Get(0)
version1 := c.Args().Get(1)
version2 := c.Args().Get(2)
channel1 := c.Args().Get(3)
var channel2 string
if c.Args().Len() == 4 {
channel2 = c.Args().Get(3)
if c.Args().Len() == 5 {
channel2 = c.Args().Get(4)
}

validChannel, err := util.IsValidChannel(channel1)
Expand All @@ -93,24 +124,71 @@ func main() {
}

}
var k8sVersionsVersion1 []string
var k8sVersionsVersion2 []string

k8sVersionsVersion1, err := util.GetK8sVersionsForVersion(dataVersion1, version1)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version1, err)
}
switch product {
case "rke":
k8sVersionsVersion1, err = util.GetK8sVersionsForVersion(dataVersion1, version1)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version1, err)
}
if customChannel2 {
k8sVersionsVersion2, err = util.GetK8sVersionsForVersion(dataVersion2, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}
} else {
k8sVersionsVersion2, err = util.GetK8sVersionsForVersion(dataVersion1, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}

if customChannel2 {
k8sVersionsVersion2, err = util.GetK8sVersionsForVersion(dataVersion2, version2)
}
case "rke2":
k8sVersionsVersion1, err = util.GetRKE2K8sVersionsForVersion(dataVersion1, version1)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version1, err)
}
} else {
k8sVersionsVersion2, err = util.GetK8sVersionsForVersion(dataVersion1, version2)
if customChannel2 {
k8sVersionsVersion2, err = util.GetRKE2K8sVersionsForVersion(dataVersion2, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}
} else {
k8sVersionsVersion2, err = util.GetRKE2K8sVersionsForVersion(dataVersion1, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}

}
if !c.Bool("show-all") {
k8sVersionsVersion1 = util.GetLatestMajorMinorK8sVersions(k8sVersionsVersion1)
k8sVersionsVersion2 = util.GetLatestMajorMinorK8sVersions(k8sVersionsVersion2)
}
case "k3s":
k8sVersionsVersion1, err = util.GetK3SK8sVersionsForVersion(dataVersion1, version1)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version1, err)
}
if customChannel2 {
k8sVersionsVersion2, err = util.GetK3SK8sVersionsForVersion(dataVersion2, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}
} else {
k8sVersionsVersion2, err = util.GetK3SK8sVersionsForVersion(dataVersion1, version2)
if err != nil {
return fmt.Errorf("Error while trying to get k8s versions for [%s], error: [%v]", version2, err)
}

}
if !c.Bool("show-all") {
k8sVersionsVersion1 = util.GetLatestMajorMinorK8sVersions(k8sVersionsVersion1)
k8sVersionsVersion2 = util.GetLatestMajorMinorK8sVersions(k8sVersionsVersion2)
}
default:
return fmt.Errorf("Not a valid product [%s], valid products are %v", product, strings.Join(util.GetValidProducts(), ","))
}
var diffK8sVersions []string
if c.Bool("diff-oneway") {
Expand All @@ -131,6 +209,11 @@ func main() {
fmt.Printf(replyMessage)
return nil
}
if c.String("output") == "json" {
jsonOutput, _ := json.Marshal(diffK8sVersions)
fmt.Printf("%s\n", string(jsonOutput))
return nil
}
fmt.Printf("%s\n", strings.Join(diffK8sVersions, "\n"))

return nil
Expand Down Expand Up @@ -472,7 +555,16 @@ func main() {
Name: "diff-oneway",
Usage: "generate diff one-way instead of default two-way",
},
&cli.BoolFlag{
Name: "show-all",
Usage: "show all k8s versions",
},
&cli.StringFlag{
Name: "output",
Usage: "format the output",
},
}
logrus.SetOutput(ioutil.Discard)

err := app.Run(os.Args)
if err != nil {
Expand Down
Loading

0 comments on commit d5c6ba4

Please sign in to comment.