From e811001d6ea1e36ac123c228fa5fbd4668fb87f4 Mon Sep 17 00:00:00 2001 From: Nianyu Shen Date: Fri, 27 Sep 2024 03:00:22 -0700 Subject: [PATCH] support cluster reset event Signed-off-by: Nianyu Shen --- Earthfile | 4 ++-- go.mod | 9 ++++---- go.sum | 10 ++++---- main.go | 6 ++++- pkg/provider/mount.tmpl | 12 ---------- pkg/provider/provider.go | 49 +--------------------------------------- pkg/provider/reset.go | 44 ++++++++++++++++++++++++++++++++++++ 7 files changed, 60 insertions(+), 74 deletions(-) delete mode 100644 pkg/provider/mount.tmpl create mode 100644 pkg/provider/reset.go diff --git a/Earthfile b/Earthfile index 404234d..ce943d8 100644 --- a/Earthfile +++ b/Earthfile @@ -5,8 +5,8 @@ ARG BASE_IMAGE=quay.io/kairos/core-opensuse-leap:v2.4.3 ARG IMAGE_REPOSITORY=quay.io/kairos ARG LUET_VERSION=0.35.1 -ARG GOLINT_VERSION=v1.56.2 -ARG GOLANG_VERSION=1.22 +ARG GOLINT_VERSION=v1.61.0 +ARG GOLANG_VERSION=1.23 ARG RKE2_VERSION=latest ARG BASE_IMAGE_NAME=$(echo $BASE_IMAGE | grep -o [^/]*: | rev | cut -c2- | rev) diff --git a/go.mod b/go.mod index aa0eb0c..e4c6fb7 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,11 @@ module github.com/c3os-io/c3os/provider-rke2 -go 1.22.5 +go 1.23.1 require ( - github.com/kairos-io/kairos-sdk v0.4.2 - github.com/mudler/yip v1.9.4 + github.com/kairos-io/kairos-sdk v0.5.0 + github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5 + github.com/mudler/yip v1.10.0 github.com/sirupsen/logrus v1.9.3 gopkg.in/yaml.v3 v3.0.1 sigs.k8s.io/yaml v1.4.0 @@ -19,7 +20,6 @@ require ( github.com/itchyny/gojq v0.12.16 // indirect github.com/itchyny/timefmt-go v0.1.6 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect @@ -27,6 +27,5 @@ require ( github.com/twpayne/go-vfs/v4 v4.3.0 // indirect golang.org/x/sys v0.24.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 29a7537..24eb7d2 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g= github.com/itchyny/gojq v0.12.16/go.mod h1:6abHbdC2uB9ogMS38XsErnfqJ94UlngIJGlRAIj4jTM= github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q= github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg= -github.com/kairos-io/kairos-sdk v0.4.2 h1:tq0a6R9qSotatFt20q/+oIHJSN+XTQWji4XgHk5Vvlw= -github.com/kairos-io/kairos-sdk v0.4.2/go.mod h1:1x8VaVt1ppXxQUlNyDRksoDglR423hxfEtjx6qWDO7w= +github.com/kairos-io/kairos-sdk v0.5.0 h1:CtYz2WXe5huKkjPSro2J1kiLVjDr6T9909uckK17Bqw= +github.com/kairos-io/kairos-sdk v0.5.0/go.mod h1:RO5ad3gCd2O2zJE5mEnPHLUy/+fRKKQL4fe7xV6FtyA= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -51,8 +51,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5 h1:FaZD86+A9mVt7lh9glAryzQblMsbJYU2VnrdZ8yHlTs= github.com/mudler/go-pluggable v0.0.0-20230126220627-7710299a0ae5/go.mod h1:WmKcT8ONmhDQIqQ+HxU+tkGWjzBEyY/KFO8LTGCu4AI= -github.com/mudler/yip v1.9.4 h1:yaiPKWG5kt/DTNCf7ZGfyWdb1j5c06zYqWF3F+SVKsE= -github.com/mudler/yip v1.9.4/go.mod h1:nqf8JFCq7a7rIkm7cSs+SOc8QbiyvVJ/xLbUw4GgzFs= +github.com/mudler/yip v1.10.0 h1:MwEIySEfSRRwTUz2BmQQpRn6+M7jqVGf/OldsepBvz0= +github.com/mudler/yip v1.10.0/go.mod h1:gwH7iGcr1Jimox2xKtN2AprEO00GzY7smvuycqCL7+Y= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -127,8 +127,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/main.go b/main.go index d0b3bde..e09a990 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "github.com/c3os-io/c3os/provider-rke2/pkg/provider" "github.com/kairos-io/kairos-sdk/clusterplugin" + "github.com/mudler/go-pluggable" "github.com/sirupsen/logrus" ) @@ -11,7 +12,10 @@ func main() { Provider: provider.ClusterProvider, } - if err := plugin.Run(); err != nil { + if err := plugin.Run(pluggable.FactoryPlugin{ + EventType: clusterplugin.EventClusterReset, + PluginHandler: provider.HandleClusterReset, + }); err != nil { logrus.Fatal(err) } } diff --git a/pkg/provider/mount.tmpl b/pkg/provider/mount.tmpl deleted file mode 100644 index 6ab0084..0000000 --- a/pkg/provider/mount.tmpl +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description={{.Name}} mount unit -Before=local-fs.target k3s.service k3s-agent.service - -[Mount] -What={{.Source}} -Where={{.Target}} -Type=none -Options=bind - -[Install] -WantedBy=local-fs.target \ No newline at end of file diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index ba12c17..4bb0fe9 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -7,9 +7,9 @@ import ( "net" "path/filepath" "strings" - "text/template" _ "embed" + "github.com/c3os-io/c3os/provider-rke2/pkg/constants" "github.com/c3os-io/c3os/provider-rke2/pkg/types" "github.com/kairos-io/kairos-sdk/clusterplugin" @@ -18,15 +18,9 @@ import ( kyaml "sigs.k8s.io/yaml" ) -//go:embed mount.tmpl -var mountTemplate string - func ClusterProvider(cluster clusterplugin.Cluster) yip.YipConfig { var stages []yip.Stage clusterRootPath := getClusterRootPath(cluster) - if len(clusterRootPath) > 0 && clusterRootPath != "/" { - stages = append(stages, rootPathMountStage(clusterRootPath)) - } rke2Config := types.RKE2Config{ Token: cluster.ClusterToken, @@ -210,44 +204,3 @@ func getNodeCIDR() string { func getClusterRootPath(cluster clusterplugin.Cluster) string { return cluster.ProviderOptions[constants.ClusterRootPath] } - -func rootPathMountStage(rootPath string) yip.Stage { - mps := []types.MountPoint{ - { - Name: "etc-rancher", - Source: filepath.Join(rootPath, "etc/rancher"), - Target: "/etc/rancher", - }, - { - Name: "var-lib-rancher", - Source: filepath.Join(rootPath, "var/lib/rancher"), - Target: "/var/lib/rancher", - }, - } - - stage := yip.Stage{ - Name: "Mount K3s data, conf directories", - } - for _, mp := range mps { - stage.Files = append(stage.Files, yip.File{ - Path: filepath.Join(constants.RunSystemdSystemDir, fmt.Sprintf("%s.mount", mp.Name)), - Permissions: 0644, - Content: parseMountUnitFile(mp), - }) - - stage.Commands = append(stage.Commands, - fmt.Sprintf("mkdir -p %s", mp.Source), - fmt.Sprintf("mkdir -p %s", mp.Target), - fmt.Sprintf("systemctl enable --now %s.mount", mp.Name), - ) - } - - return stage -} - -func parseMountUnitFile(mp types.MountPoint) string { - mount, _ := template.New("mount").Parse(mountTemplate) - var buf bytes.Buffer - _ = mount.Execute(&buf, mp) - return buf.String() -} diff --git a/pkg/provider/reset.go b/pkg/provider/reset.go new file mode 100644 index 0000000..f1a7b25 --- /dev/null +++ b/pkg/provider/reset.go @@ -0,0 +1,44 @@ +package provider + +import ( + "encoding/json" + "fmt" + "os/exec" + "path/filepath" + + "github.com/kairos-io/kairos-sdk/bus" + "github.com/kairos-io/kairos-sdk/clusterplugin" + "github.com/mudler/go-pluggable" + "gopkg.in/yaml.v3" +) + +func HandleClusterReset(event *pluggable.Event) pluggable.EventResponse { + var payload bus.EventPayload + var config clusterplugin.Config + var response pluggable.EventResponse + + // parse the boot payload + if err := json.Unmarshal([]byte(event.Data), &payload); err != nil { + response.Error = fmt.Sprintf("failed to parse boot event: %s", err.Error()) + return response + } + + // parse config from boot payload + if err := yaml.Unmarshal([]byte(payload.Config), &config); err != nil { + response.Error = fmt.Sprintf("failed to parse config from boot event: %s", err.Error()) + return response + } + + if config.Cluster == nil { + return response + } + + clusterRootPath := getClusterRootPath(*config.Cluster) + cmd := exec.Command("/bin/sh", "-c", filepath.Join(clusterRootPath, "/opt/rke2/scripts", "rke2-uninstall.sh")) + output, err := cmd.CombinedOutput() + if err != nil { + response.Error = fmt.Sprintf("failed to reset cluster: %s", string(output)) + } + + return response +}