This repository has been archived by the owner on Sep 16, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Christian Kotzbauer <christian.kotzbauer@gmail.com>
- Loading branch information
1 parent
c493fe5
commit 744ccf3
Showing
7 changed files
with
268 additions
and
0 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,2 @@ | ||
api-repo/ | ||
bin/ |
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,4 @@ | ||
|
||
.PHONY: build | ||
build: | ||
go build -o bin/api-lifecycle-gen |
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,3 @@ | ||
module github.com/ckotzbauer/chekr/tools/api-lifecycle-gen | ||
|
||
go 1.16 |
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,65 @@ | ||
package internal | ||
|
||
import ( | ||
"io/fs" | ||
"io/ioutil" | ||
"os" | ||
"path/filepath" | ||
"strings" | ||
) | ||
|
||
var excludeDirs []string | ||
|
||
func ListFiles(dir string) ([]FileGroup, error) { | ||
excludeDirs = []string{"testdata/"} | ||
var groups []FileGroup | ||
var files []string | ||
|
||
err := filepath.WalkDir(dir, func(path string, info os.DirEntry, err error) error { | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if contains(path) { | ||
return nil | ||
} | ||
|
||
if strings.Contains(path, "types.go") || strings.Contains(path, "register.go") { | ||
files = append(files, strings.TrimPrefix(path, dir+"/")) | ||
} | ||
|
||
return nil | ||
}) | ||
|
||
for i := 0; i < len(files); i++ { | ||
if i%2 == 0 { | ||
groups = append(groups, FileGroup{registerFile: dir + "/" + files[i], typesFile: dir + "/" + files[i+1]}) | ||
} | ||
} | ||
|
||
return groups, err | ||
} | ||
|
||
func ReadFile(path string) (string, error) { | ||
buf, err := ioutil.ReadFile(path) | ||
|
||
if err != nil { | ||
return "", err | ||
} | ||
|
||
return string(buf), nil | ||
} | ||
|
||
func WriteFile(path, content string) error { | ||
return ioutil.WriteFile(path, []byte(content), fs.ModeAppend) | ||
} | ||
|
||
func contains(path string) bool { | ||
for _, v := range excludeDirs { | ||
if strings.Contains(path, v) { | ||
return true | ||
} | ||
} | ||
|
||
return false | ||
} |
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,125 @@ | ||
package internal | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
"strings" | ||
) | ||
|
||
var ( | ||
introducedStr = "// +k8s:prerelease-lifecycle-gen:introduced=" | ||
deprecatedStr = "// +k8s:prerelease-lifecycle-gen:deprecated=" | ||
removedStr = "// +k8s:prerelease-lifecycle-gen:removed=" | ||
replacementStr = "// +k8s:prerelease-lifecycle-gen:replacement=" | ||
structRegex = `type ([A-Za-z]*) struct \{` | ||
) | ||
|
||
func ParseGroups(groups []FileGroup) ([]GroupVersion, error) { | ||
var groupVersions []GroupVersion | ||
|
||
for _, g := range groups { | ||
group, version, err := parseRegister(g.registerFile) | ||
|
||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
groupVersion, err := parseTypes(g.typesFile, group, version) | ||
|
||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
if groupVersion.Resources != nil { | ||
groupVersions = append(groupVersions, groupVersion) | ||
} | ||
} | ||
|
||
return groupVersions, nil | ||
} | ||
|
||
func parseRegister(file string) (string, string, error) { | ||
content, err := ReadFile(file) | ||
|
||
if err != nil { | ||
return "", "", err | ||
} | ||
|
||
groupRegex := regexp.MustCompile(`const GroupName = "([a-z0-9\.]*)"`) | ||
versionRegex := regexp.MustCompile(`Version: "([a-z0-9]*)"}`) | ||
|
||
groupResult := groupRegex.FindStringSubmatch(content) | ||
versionResult := versionRegex.FindStringSubmatch(content) | ||
|
||
if len(versionResult) != 2 { | ||
return "", "", fmt.Errorf("wrong match count") | ||
} | ||
|
||
if groupResult[1] == "" { | ||
return "", versionResult[1], nil | ||
} else { | ||
return groupResult[1], versionResult[1], nil | ||
} | ||
} | ||
|
||
func parseTypes(file, group, version string) (GroupVersion, error) { | ||
content, err := ReadFile(file) | ||
|
||
if err != nil { | ||
return GroupVersion{}, err | ||
} | ||
|
||
lines := strings.Split(content, "\n") | ||
typeRegex := regexp.MustCompile(structRegex) | ||
var foundResources []Resource | ||
|
||
lastIntroduced := "" | ||
lastDeprecated := "" | ||
lastRemoved := "" | ||
lastReplacement := "" | ||
|
||
for _, line := range lines { | ||
if strings.Contains(line, introducedStr) { | ||
lastIntroduced = strings.TrimSpace(strings.Replace(line, introducedStr, "", 1)) | ||
} | ||
|
||
if strings.Contains(line, deprecatedStr) { | ||
lastDeprecated = strings.TrimSpace(strings.Replace(line, deprecatedStr, "", 1)) | ||
} | ||
|
||
if strings.Contains(line, removedStr) { | ||
lastRemoved = strings.TrimSpace(strings.Replace(line, removedStr, "", 1)) | ||
} | ||
|
||
if strings.Contains(line, replacementStr) { | ||
lastReplacement = strings.TrimSpace(strings.Replace(line, replacementStr, "", 1)) | ||
} | ||
|
||
matches := typeRegex.FindStringSubmatch(line) | ||
if len(matches) > 1 { | ||
if lastIntroduced != "" && lastDeprecated != "" { | ||
replacement := GroupVersionKind{Group: "", Version: "", Name: ""} | ||
|
||
if lastReplacement != "" { | ||
parts := strings.Split(lastReplacement, ",") | ||
replacement = GroupVersionKind{Group: parts[0], Version: parts[1], Name: parts[2]} | ||
} | ||
|
||
foundResources = append(foundResources, Resource{ | ||
Name: matches[1], | ||
Introduced: lastIntroduced, | ||
Deprecated: lastDeprecated, | ||
Removed: lastRemoved, | ||
Replacement: replacement, | ||
}) | ||
} | ||
|
||
lastIntroduced = "" | ||
lastDeprecated = "" | ||
lastRemoved = "" | ||
lastReplacement = "" | ||
} | ||
} | ||
|
||
return GroupVersion{Group: group, Version: version, Resources: foundResources}, nil | ||
} |
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,26 @@ | ||
package internal | ||
|
||
type FileGroup struct { | ||
registerFile string | ||
typesFile string | ||
} | ||
|
||
type GroupVersion struct { | ||
Group string `json:"group"` | ||
Version string `json:"version"` | ||
Resources []Resource `json:"resources"` | ||
} | ||
|
||
type GroupVersionKind struct { | ||
Group string `json:"group"` | ||
Version string `json:"version"` | ||
Name string `json:"name"` | ||
} | ||
|
||
type Resource struct { | ||
Name string `json:"name"` | ||
Introduced string `json:"introduced"` | ||
Deprecated string `json:"deprecated"` | ||
Removed string `json:"removed"` | ||
Replacement GroupVersionKind `json:"replacement"` | ||
} |
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,43 @@ | ||
package main | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
"os" | ||
|
||
"github.com/ckotzbauer/chekr/tools/api-lifecycle-gen/internal" | ||
) | ||
|
||
func main() { | ||
argsWithoutProg := os.Args[1:] | ||
|
||
if len(argsWithoutProg) != 2 { | ||
panic("Pass single folder where k8s.io/api is located and the resulting json file-location") | ||
} | ||
|
||
groups, err := internal.ListFiles(argsWithoutProg[0]) | ||
|
||
if err != nil { | ||
panic(err) | ||
} | ||
|
||
deprecatedTypes, err := internal.ParseGroups(groups) | ||
|
||
if err != nil { | ||
panic(err) | ||
} | ||
|
||
buf, err := json.MarshalIndent(deprecatedTypes, "", " ") | ||
|
||
if err != nil { | ||
panic(err) | ||
} | ||
|
||
err = internal.WriteFile(argsWithoutProg[1], string(buf)) | ||
|
||
if err != nil { | ||
panic(err) | ||
} | ||
|
||
fmt.Println("Successfully parsed") | ||
} |