-
Notifications
You must be signed in to change notification settings - Fork 431
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added compatibility matrix generation
- Loading branch information
1 parent
467824b
commit 4d48777
Showing
11 changed files
with
348 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
name: Matrix compat | ||
|
||
on: | ||
release: | ||
types: [created] | ||
pull_request: | ||
branches: | ||
- main | ||
paths: | ||
- "**.go" | ||
- "!test/**" # exclude changes in e2e tests | ||
- ".github/workflows/unit-tests.yaml" | ||
- "hack/test.sh" | ||
- "charts/**" | ||
|
||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
name: generates automated matrix | ||
runs-on: ubuntu-22.04 | ||
steps: | ||
- name: Set up Go 1.21 | ||
uses: actions/setup-go@v5 | ||
with: | ||
go-version: "1.21" | ||
cache: false | ||
- name: Check out code into the Go module directory | ||
uses: actions/checkout@v4 | ||
- name: Execute unit tests | ||
run: just validate-compat-matrix |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
name: Matrix compatibility | ||
|
||
on: | ||
push: | ||
branches: | ||
- version-auto-update | ||
|
||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
go-unit-test: | ||
name: Generate the compatibility matrix | ||
runs-on: ubuntu-22.04 | ||
steps: | ||
- name: Set up Go 1.21 | ||
uses: actions/setup-go@v5 | ||
with: | ||
go-version: "1.21" | ||
cache: false | ||
- name: Check out code into the Go module directory | ||
uses: actions/checkout@v4 | ||
- name: run compat | ||
run: go run hack/compat-matrix/main.go docs/pages/deploying-vclusters/compat-matrix.mdx | ||
- name: setup git | ||
run: | | ||
git config user.email "bot@loft.sh" | ||
git config user.name "loft bot" | ||
git diff --quiet && git diff --staged --quiet || git commit -am 'updated compatibility matrix' | ||
git push |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
## Compatibility Matrix for k3s distro | ||
|
||
The following table provides a compatibility matrix of which k8s version are supported aginst which vcluster distro versions: | ||
|
||
| DISTRO VERSION | V1.29.0-K3S1 | V1.28.5-K3S1 | V1.27.9-K3S1 | V1.26.12-K3S1 | | ||
| HOST VERSION | | | | | | ||
|----------------|--------------|--------------|--------------|---------------| | ||
| 1.29 | recommended | + | + | + | | ||
| 1.28 | + | recommended | + | + | | ||
| 1.27 | + | + | recommended | + | | ||
| 1.26 | + | + | + | recommended | | ||
|
||
|
||
Legend: | ||
|
||
! : known issue | ||
|
||
+ : likely compatible | ||
|
||
## Compatibility Matrix for k8s distro | ||
|
||
The following table provides a compatibility matrix of which k8s version are supported aginst which vcluster distro versions: | ||
|
||
| DISTRO VERSION | V1.29.0 | V1.28.4 | V1.27.8 | V1.26.11 | | ||
| HOST VERSION | | | | | | ||
|----------------|-------------|-------------|-------------|-------------| | ||
| 1.29 | recommended | + | + | + | | ||
| 1.28 | + | recommended | + | + | | ||
| 1.27 | + | + | recommended | + | | ||
| 1.26 | + | + | + | recommended | | ||
|
||
|
||
Legend: | ||
|
||
! : known issue | ||
|
||
+ : likely compatible | ||
|
||
## Compatibility Matrix for k0s distro | ||
|
||
The following table provides a compatibility matrix of which k8s version are supported aginst which vcluster distro versions: | ||
|
||
| DISTRO VERSION | V1.29.1-K0S 0 | V1.28.2-K0S 0 | V1.27.6-K0S 0 | V1.26.9-K0S 0 | | ||
| HOST VERSION | | | | | | ||
|----------------|---------------|---------------|---------------|---------------| | ||
| 1.29 | recommended | + | + | + | | ||
| 1.28 | + | recommended | + | + | | ||
| 1.27 | + | + | recommended | + | | ||
| 1.26 | + | + | + | recommended | | ||
|
||
|
||
Legend: | ||
|
||
! : known issue | ||
|
||
+ : likely compatible | ||
|
||
## Compatibility Matrix for eks distro | ||
|
||
The following table provides a compatibility matrix of which k8s version are supported aginst which vcluster distro versions: | ||
|
||
| DISTRO VERSION | V1.28.2-EKS-1-28-6 | V1.27.6-EKS-1-27-13 | V1.26.9-EKS-1-26-19 | V1.25.14-EKS-1-25-23 | | ||
| HOST VERSION | | | | | | ||
|----------------|--------------------|---------------------|---------------------|----------------------| | ||
| 1.28 | recommended | + | + | + | | ||
| 1.27 | + | recommended | + | + | | ||
| 1.26 | + | + | recommended | + | | ||
| 1.25 | + | + | + | recommended | | ||
|
||
|
||
Legend: | ||
|
||
! : known issue | ||
|
||
+ : likely compatible | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
package main | ||
|
||
import ( | ||
"bytes" | ||
_ "embed" | ||
"fmt" | ||
"os" | ||
"slices" | ||
"strings" | ||
|
||
"github.com/olekukonko/tablewriter" | ||
"gopkg.in/yaml.v2" | ||
|
||
"github.com/loft-sh/vcluster-values/values" | ||
"golang.org/x/exp/maps" | ||
) | ||
|
||
//go:embed matrix-template.tmpl | ||
var templateString string | ||
|
||
type issueList map[string]string | ||
|
||
type KnownIssues struct { | ||
K3s map[string]issueList | ||
K0s map[string]issueList | ||
K8s map[string]issueList | ||
Eks map[string]issueList | ||
} | ||
|
||
func main() { | ||
if len(os.Args) != 3 { | ||
fmt.Println("usage: compat-matrix generate/validate outputfile") | ||
os.Exit(1) | ||
} | ||
knowIssuesBytes, err := os.ReadFile("known_issues.yaml") | ||
if err != nil { | ||
fmt.Println(err) | ||
os.Exit(1) | ||
} | ||
issues := KnownIssues{} | ||
err = yaml.UnmarshalStrict(knowIssuesBytes, &issues) | ||
if err != nil { | ||
fmt.Println(err) | ||
os.Exit(1) | ||
} | ||
|
||
renderedBytes := &bytes.Buffer{} | ||
buff := updateTableWithDistro("k3s", values.K3SVersionMap, issues) | ||
renderedBytes.WriteString(fmt.Sprintf(templateString, "k3s", buff.String())) | ||
renderedBytes.WriteString(createKnownIssue(issues.K3s)) | ||
buff.Reset() | ||
buff = updateTableWithDistro("k8s", values.K8SAPIVersionMap, issues) | ||
renderedBytes.WriteString(fmt.Sprintf(templateString, "k8s", buff.String())) | ||
renderedBytes.WriteString(createKnownIssue(issues.K8s)) | ||
buff.Reset() | ||
buff = updateTableWithDistro("k0s", values.K0SVersionMap, issues) | ||
renderedBytes.WriteString(fmt.Sprintf(templateString, "k0s", buff.String())) | ||
renderedBytes.WriteString(createKnownIssue(issues.K0s)) | ||
buff.Reset() | ||
buff = updateTableWithDistro("eks", values.EKSAPIVersionMap, issues) | ||
renderedBytes.WriteString(fmt.Sprintf(templateString, "eks", buff.String())) | ||
renderedBytes.WriteString(createKnownIssue(issues.Eks)) | ||
buff.Reset() | ||
|
||
switch os.Args[1] { | ||
case "generate": | ||
os.WriteFile(os.Args[2], renderedBytes.Bytes(), 0644) | ||
case "validate": | ||
currentFile, err := os.ReadFile(os.Args[2]) | ||
if err != nil { | ||
os.Stderr.WriteString(err.Error()) | ||
os.Exit(1) | ||
} | ||
if !slices.Equal(currentFile, renderedBytes.Bytes()) { | ||
fmt.Println("compatibility matrix is not up to date, please update it by running `just validate-compat-matrix`") | ||
os.Exit(1) | ||
} | ||
} | ||
} | ||
|
||
func updateTableWithDistro(distroName string, versionMap map[string]string, knownIssues KnownIssues) *bytes.Buffer { | ||
hostVersions := maps.Keys(versionMap) | ||
vclusterApis := maps.Values(versionMap) | ||
slices.Sort(hostVersions) | ||
slices.Reverse(hostVersions) | ||
slices.Sort(vclusterApis) | ||
slices.Reverse(vclusterApis) | ||
|
||
buff := &bytes.Buffer{} | ||
table := tablewriter.NewWriter(buff) | ||
for i, v := range vclusterApis { | ||
vclusterApis[i] = removeRegistry(v) | ||
} | ||
table.SetHeader(append([]string{"distro version\nhost version"}, vclusterApis...)) | ||
|
||
var issues map[string]issueList | ||
switch distroName { | ||
case "k3s": | ||
issues = knownIssues.K3s | ||
case "k0s": | ||
issues = knownIssues.K0s | ||
case "k8s": | ||
issues = knownIssues.K8s | ||
case "eks": | ||
issues = knownIssues.Eks | ||
} | ||
|
||
for hostVersion, issueList := range issues { | ||
for vclusterApi, issueDesc := range issueList { | ||
issues[hostVersion][removeRegistry(vclusterApi)] = issueDesc | ||
if removeRegistry(vclusterApi) != vclusterApi { | ||
// avoids removing valid entries | ||
delete(issues[hostVersion], vclusterApi) | ||
} | ||
} | ||
} | ||
|
||
for i, v := range hostVersions { | ||
table.Append(createLine(v, issues[v], vclusterApis, i)) | ||
} | ||
|
||
table.SetAlignment(tablewriter.ALIGN_LEFT) | ||
table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false}) | ||
table.SetCenterSeparator("|") | ||
table.Render() | ||
|
||
return buff | ||
} | ||
|
||
func createKnownIssue(issues map[string]issueList) string { | ||
if len(issues) == 0 { | ||
return "" | ||
} | ||
keys := maps.Keys(issues) | ||
slices.Sort(keys) | ||
buff := &bytes.Buffer{} | ||
table := tablewriter.NewWriter(buff) | ||
table.SetHeader([]string{"vCluster Distro Version", "Host K8s Version", "Known Issues"}) | ||
|
||
for _, hostVersion := range keys { | ||
for vclusterVersion, issue := range issues[hostVersion] { | ||
table.Append([]string{vclusterVersion, hostVersion, issue}) | ||
} | ||
} | ||
table.Render() | ||
if buff.Len() > 0 { | ||
buff.WriteString("\n") | ||
} | ||
return buff.String() | ||
} | ||
|
||
func createLine(version string, list issueList, vclusterApiVersion []string, lineNumber int) []string { | ||
line := make([]string, 1, len(vclusterApiVersion)+1) | ||
line[0] = version | ||
for i, v := range vclusterApiVersion { | ||
char := "" | ||
if list[v] != "" { | ||
char = "!" | ||
} else if i == lineNumber { | ||
char = "recommended" | ||
} else { | ||
char = "+" | ||
} | ||
line = append(line, char) | ||
} | ||
return line | ||
} | ||
|
||
func removeRegistry(vclusterApiVersion string) string { | ||
lastColon := strings.LastIndex(vclusterApiVersion, ":") | ||
if lastColon == -1 { | ||
return vclusterApiVersion | ||
} | ||
return vclusterApiVersion[lastColon+1:] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
## Compatibility Matrix for %s distro | ||
|
||
The following table provides a compatibility matrix of which k8s version are supported aginst which vcluster distro versions: | ||
|
||
%s | ||
|
||
Legend: | ||
|
||
! : known issue | ||
|
||
+ : likely compatible | ||
|
Oops, something went wrong.