From 9ac6cf42c179db7ead2dae6836cad5dca31579f0 Mon Sep 17 00:00:00 2001 From: Yujun Zhang Date: Tue, 22 Oct 2024 22:00:04 +0800 Subject: [PATCH] Add app to e2e * [ ] generate BUILD.bazel for packages in cue.mod * [ ] update deps in cue_instance rules --- MODULE.bazel | 7 +- WORKSPACE.bazel | 13 +- e2e/BUILD.bazel | 15 ++ e2e/README.md | 2 + e2e/WORKSPACE.bazel | 15 +- e2e/app/BUILD.bazel | 15 ++ e2e/app/app.cue | 12 + e2e/cluster/minikube/BUILD.bazel | 21 ++ .../gen/k8s.io/api/admission/v1/BUILD.bazel | 12 + .../api/admissionregistration/v1/BUILD.bazel | 12 + .../gen/k8s.io/api/core/v1/BUILD.bazel | 12 + .../apimachinery/pkg/apis/meta/v1/BUILD.bazel | 9 + v0 | 1 + v0/BUILD.bazel | 14 -- v0/kue.cue | 208 ------------------ 15 files changed, 124 insertions(+), 244 deletions(-) create mode 100644 e2e/BUILD.bazel create mode 100644 e2e/app/BUILD.bazel create mode 100644 e2e/app/app.cue create mode 100644 e2e/cluster/minikube/BUILD.bazel create mode 100644 e2e/cue.mod/gen/k8s.io/api/admission/v1/BUILD.bazel create mode 100644 e2e/cue.mod/gen/k8s.io/api/admissionregistration/v1/BUILD.bazel create mode 100644 e2e/cue.mod/gen/k8s.io/api/core/v1/BUILD.bazel create mode 100644 e2e/cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD.bazel create mode 120000 v0 delete mode 100644 v0/BUILD.bazel delete mode 100644 v0/kue.cue diff --git a/MODULE.bazel b/MODULE.bazel index f6d816b..bdf217f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,12 +10,7 @@ module( version = "0.0.0", ) -bazel_dep(name = "rules_cue", version = "0.7.0") -git_override( - module_name = "rules_cue", - commit = "e36857b348fe02fbedda41cbd3dcd3c4146dba86", - remote = "https://github.com/abcue/seh_rules_cue.git", -) +bazel_dep(name = "rules_cue", version = "0.10.0") cue = use_extension("@rules_cue//cue:extensions.bzl", "cue") use_repo( diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 3286ad7..bf158a2 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,11 +1,13 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +RULES_ABCUE_COMMIT = "c59b98b95c0920deb7cbaf57ee436484c5b2acd8" + http_archive( name = "rules_abcue", - sha256 = "670c5dd8ae9d5c06bacd3b074341e40ac330ed64c77e1a1ab689714c5a705720", - strip_prefix = "rules_abcue-main", + sha256 = "df41b741938edb5acf128ae44caec3dd6f825635b506958580c6390ca606b755", + strip_prefix = "rules_abcue-%s" % RULES_ABCUE_COMMIT, urls = [ - "https://github.com/abcue/rules_abcue/archive/refs/heads/main.zip", + "https://github.com/abcue/rules_abcue/archive/%s.zip" % RULES_ABCUE_COMMIT, ], ) @@ -13,10 +15,7 @@ load("@rules_abcue//cue:repositories.bzl", "cue_register_toolchains", "rules_abc rules_abcue_dependencies() -cue_register_toolchains( - name = "cue", - cue_version = "0.11.1", -) +cue_register_toolchains() http_archive( name = "io_bazel_rules_go", diff --git a/e2e/BUILD.bazel b/e2e/BUILD.bazel new file mode 100644 index 0000000..dd7bc95 --- /dev/null +++ b/e2e/BUILD.bazel @@ -0,0 +1,15 @@ +load("@rules_abcue//cue:defs.bzl", "cue_def", "cue_instance") + +cue_instance( + name = "e2e", + package_name = "e2e", + srcs = ["e2e.cue"], + ancestor = "//cue.mod", + deps = ["//cluster/minikube:cluster"], +) + +cue_def( + name = "e2e_def", + instance = ":e2e", + package = "e2e", +) diff --git a/e2e/README.md b/e2e/README.md index 6db04bb..465d88a 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -1,5 +1,7 @@ # End to End Tests +Initialization + ```sh go mod init github.com/abcue/kue/e2e go get k8s.io/api/... diff --git a/e2e/WORKSPACE.bazel b/e2e/WORKSPACE.bazel index 585114b..53e717f 100644 --- a/e2e/WORKSPACE.bazel +++ b/e2e/WORKSPACE.bazel @@ -1,11 +1,13 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +RULES_ABCUE_COMMIT = "c59b98b95c0920deb7cbaf57ee436484c5b2acd8" + http_archive( name = "rules_abcue", - sha256 = "54f3d777440f1b40d2f6bf8c08af7f50672b3fea614751d3f4a9767e2aaf381d", - strip_prefix = "rules_abcue-main", + sha256 = "df41b741938edb5acf128ae44caec3dd6f825635b506958580c6390ca606b755", + strip_prefix = "rules_abcue-%s" % RULES_ABCUE_COMMIT, urls = [ - "https://github.com/abcue/rules_abcue/archive/refs/heads/main.zip", + "https://github.com/abcue/rules_abcue/archive/%s.zip" % RULES_ABCUE_COMMIT, ], ) @@ -13,12 +15,7 @@ load("@rules_abcue//cue:repositories.bzl", "cue_register_toolchains", "rules_abc rules_abcue_dependencies() -cue_register_toolchains( - name = "cue", - cue_version = "0.8.2", -) - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +cue_register_toolchains() http_archive( name = "io_bazel_rules_go", diff --git a/e2e/app/BUILD.bazel b/e2e/app/BUILD.bazel new file mode 100644 index 0000000..0c5f07a --- /dev/null +++ b/e2e/app/BUILD.bazel @@ -0,0 +1,15 @@ +load("@rules_abcue//cue:defs.bzl", "cue_def", "cue_instance") + +cue_instance( + name = "app", + package_name = "app", + srcs = ["app.cue"], + ancestor = "//cue.mod", + deps = ["//cluster/minikube:cluster"], +) + +cue_def( + name = "app_def", + instance = ":app", + package = "app", +) diff --git a/e2e/app/app.cue b/e2e/app/app.cue new file mode 100644 index 0000000..c233929 --- /dev/null +++ b/e2e/app/app.cue @@ -0,0 +1,12 @@ +package app + +import minikube "github.com/abcue/kue/e2e/cluster/minikube:cluster" + +app: { + name: "abc" + kubernetes: minikube.#KUE & { + #var: resources: { + deployments: (name): _ + } + } +} diff --git a/e2e/cluster/minikube/BUILD.bazel b/e2e/cluster/minikube/BUILD.bazel new file mode 100644 index 0000000..0be941e --- /dev/null +++ b/e2e/cluster/minikube/BUILD.bazel @@ -0,0 +1,21 @@ +load("@rules_abcue//cue:defs.bzl", "cue_def", "cue_instance") + +cue_instance( + name = "cluster", + package_name = "cluster", + srcs = glob(["*.cue"]), + ancestor = "//cue.mod", + visibility = ["//:__subpackages__"], + deps = [ + "//cue.mod/gen/k8s.io/api/admission/v1", + "//cue.mod/gen/k8s.io/api/admissionregistration/v1", + "//cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1", + "//cue.mod/pkg/github.com/abcue/kue/v0:kue", + ], +) + +cue_def( + name = "cluster_def", + instance = ":cluster", + package = "cluster", +) diff --git a/e2e/cue.mod/gen/k8s.io/api/admission/v1/BUILD.bazel b/e2e/cue.mod/gen/k8s.io/api/admission/v1/BUILD.bazel new file mode 100644 index 0000000..67c2bf8 --- /dev/null +++ b/e2e/cue.mod/gen/k8s.io/api/admission/v1/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_abcue//cue:defs.bzl", "cue_instance") + +cue_instance( + name = "v1", + package_name = "v1", + srcs = glob(["*.cue"]), + ancestor = "//cue.mod", + visibility = ["//:__subpackages__"], + deps = [ + "//cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1", + ], +) diff --git a/e2e/cue.mod/gen/k8s.io/api/admissionregistration/v1/BUILD.bazel b/e2e/cue.mod/gen/k8s.io/api/admissionregistration/v1/BUILD.bazel new file mode 100644 index 0000000..67c2bf8 --- /dev/null +++ b/e2e/cue.mod/gen/k8s.io/api/admissionregistration/v1/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_abcue//cue:defs.bzl", "cue_instance") + +cue_instance( + name = "v1", + package_name = "v1", + srcs = glob(["*.cue"]), + ancestor = "//cue.mod", + visibility = ["//:__subpackages__"], + deps = [ + "//cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1", + ], +) diff --git a/e2e/cue.mod/gen/k8s.io/api/core/v1/BUILD.bazel b/e2e/cue.mod/gen/k8s.io/api/core/v1/BUILD.bazel new file mode 100644 index 0000000..67c2bf8 --- /dev/null +++ b/e2e/cue.mod/gen/k8s.io/api/core/v1/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_abcue//cue:defs.bzl", "cue_instance") + +cue_instance( + name = "v1", + package_name = "v1", + srcs = glob(["*.cue"]), + ancestor = "//cue.mod", + visibility = ["//:__subpackages__"], + deps = [ + "//cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1", + ], +) diff --git a/e2e/cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD.bazel b/e2e/cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD.bazel new file mode 100644 index 0000000..d4eeaa1 --- /dev/null +++ b/e2e/cue.mod/gen/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD.bazel @@ -0,0 +1,9 @@ +load("@rules_abcue//cue:defs.bzl", "cue_instance") + +cue_instance( + name = "v1", + package_name = "v1", + srcs = glob(["*.cue"]), + ancestor = "//cue.mod", + visibility = ["//:__subpackages__"], +) diff --git a/v0 b/v0 new file mode 120000 index 0000000..924e50b --- /dev/null +++ b/v0 @@ -0,0 +1 @@ +e2e/cue.mod/pkg/github.com/abcue/kue/v0 \ No newline at end of file diff --git a/v0/BUILD.bazel b/v0/BUILD.bazel deleted file mode 100644 index fd91eee..0000000 --- a/v0/BUILD.bazel +++ /dev/null @@ -1,14 +0,0 @@ -load("@rules_abcue//cue:defs.bzl", "cue_def", "cue_export", "cue_instance") - -cue_instance( - name = "kue", - package_name = "kue", - srcs = glob(["*.cue"]), - ancestor = "//cue.mod", -) - -cue_def( - name = "kue_def", - instance = ":kue", - package = "kue", -) diff --git a/v0/kue.cue b/v0/kue.cue deleted file mode 100644 index 7ae22d4..0000000 --- a/v0/kue.cue +++ /dev/null @@ -1,208 +0,0 @@ -package kue - -import ( - "encoding/json" - "encoding/yaml" - "path" - "regexp" - "strings" - "tool/cli" - "tool/exec" - "tool/file" -) - -#KUE: { - #var: { - apiResources: {...} - // resources tree indexed by "RESOURCE NAME": "SPECIFIC NAME": _ - // Resource names are case-insensitive, shortname supported. - // e.g. `#var: resources: deploy: dp: _` - resources: [R=_]: [N=_]: _local.apiRs[strings.ToLower(R)] & {metadata: name: N} - } - _local: apiRs: { - for v, vv in #var.apiResources for k, kv in vv { - R=(kv.name): { - kind: k - // k._ar.events.apiVersion: conflicting values "events.k8s.io/v1" and "v1": - apiVersion: *v | _ - ... - } - (strings.ToLower(k)): R - if (kv.shortnames != _|_) { - for sn in kv.shortnames {(sn): R} - } - } - } - // desired manifests as `kubectl get -o yaml` in yaml stream form - manifests: yaml.MarshalStream([for _, k in #var.resources for _, n in k {n}]) -} - -#Command: { - #var: { - apiResources: _ - package: *"kue" | _ - path: *["kubernetes", "apiResources"] | _ - // TODO: detect modDir and relPath from command dir - modDir: _ - relPath: _ - } - _local: { - dir: ".kue" - pathArgs: strings.Join([for p in #var.path {#"--path "\#(p)""#}], " ") - expression: strings.Join(#var.path, ".") - pkgId: {for p in [for v, vv in #var.apiResources for k, kv in vv {kv.package}] { - (p): regexp.ReplaceAll("[/.-]", strings.TrimPrefix(p, "k8s.io/api/"), "_") - }} - } - #output: { - // vendor crds from cluster - "kue-crds": { - mkdir: file.Mkdir & { - path: _local.dir - } - get: exec.Run & { - cmd: "kubectl get crds --output=yaml" - stdout: string - } - save: file.Create & { - $after: mkdir - filename: path.Join([mkdir.path, "crds.yaml"]) - contents: get.stdout - } - vendor: exec.Run & { - let F = path.Join([#var.relPath, save.filename]) - $after: save - dir: #var.modDir - cmd: "timoni mod vendor crds --file \(F)" - } - } - // generate cluster definitions - "kue-cluster": { - api: exec.Run & { - cmd: "cue cmd kue-api-resources" - } - import: exec.Run & { - after: api - cmd: "cue import --force --package \(#var.package) \(_local.pathArgs) \(AR.json.filename) --outfile kue_api_resources_gen.cue" - } - defs: exec.Run & { - after: import - cmd: "cue cmd kue-defs" - } - } - // generate resource definitions - "kue-defs": { - let FN = "kue_defs_gen.cue" - create: file.Create & { - let IMP = strings.Join([for p, i in _local.pkgId let P = regexp.ReplaceAll("\\.[^/]*(/[^/]+)$", p, "$1") { - #"\#t\#(i) "\#(P)""# - }], "\n") - let RS = strings.Join([for v, vv in #var.apiResources for k, kv in vv { - "\t\(kv.name)?: [_]: \(_local.pkgId[kv.package]).#\(k)" - }], "\n") - filename: FN - contents: """ - package \(#var.package) - - import ( - \(IMP) - - "github.com/abcue/kue/v0:kue" - ) - #KUE: kue.#KUE & { - #var: { - apiResources: \(_local.expression) - resources: { - \(RS) - } - } - } - """ - } - fmt: exec.Run & { - $after: create - cmd: "cue fmt \(FN)" - } - print: cli.Print & { - text: "Generating \(FN)" - } - } - // vendor api resources - AR="kue-api-resources": { - run: exec.Run & { - cmd: "kubectl api-resources" - stdout: string - } - mkdir: file.Mkdir & { - path: _local.dir - } - txt: file.Create & { - filename: path.Join([mkdir.path, "api-resources.txt"]) - contents: run.stdout - } - "json": file.Create & { - _locals: { - lines: strings.Split(run.stdout, "\n") - headers: strings.Fields(lines[0]) - records: [for ln in lines[1:] if ln != "" { - let FLDS = strings.Fields(ln) - if len(FLDS) < len(headers) { - let HDRS = [for h in headers if h != "SHORTNAMES" {h}] - for i, _ in FLDS {(HDRS[i]): FLDS[i]} - } - if len(FLDS) == len(headers) { - for i, _ in FLDS {(headers[i]): FLDS[i]} - } - }] - exclude: { - customresourcedefinitions: _ - apiservices: _ - } - isK8sApi: { - [A=_]: regexp.Match(".*\\.k8s\\.io(/[^/]+)", A) || !strings.Contains(A, ".") - for r in _locals.records {(r.APIVERSION): _} - } - gvk: { - for r in _locals.records if r.NAME != "customresourcedefinitions" && r.NAME != "apiservices" { - (r.APIVERSION): (r.KIND): { - name: r.NAME - namespaced: r.NAMESPACED - if r.SHORTNAMES != _|_ { - shortnames: strings.Split(r.SHORTNAMES, ",") - } - - _local: version: regexp.ReplaceAll("(.*/)?", r.APIVERSION, "") - if isK8sApi[r.APIVERSION] { - _local: { - if !strings.Contains(r.APIVERSION, "/") { - pv: "core/v1" - } - pv: *regexp.ReplaceAll("\\.[^/]*", r.APIVERSION, "") | _ - } - package: strings.Join(["k8s.io", "api", _local.pv], "/") - } - if !isK8sApi[r.APIVERSION] { - _local: { - group: strings.Split(r.APIVERSION, "/")[0] - package: strings.ToLower(r.KIND) - } - package: strings.Join([_local.group, _local.package, _local.version], "/") - } - } - } - } - } - filename: path.Join([mkdir.path, "api-resources.json"]) - contents: json.Indent(json.Marshal(_locals.gvk), "", " ") - } - print: cli.Print & { - text: "Converting \(AR.txt.filename) to \(AR.json.filename)" - } - } - // generate e2e test cases - "kue-e2e": cli.Print & { - _exclude: events: _ - text: strings.Join([for v, vv in #var.apiResources for k, kv in vv if _exclude[kv.name] == _|_ {"\(kv.name): e2e: _"}], "\n") - } - } -}