Olares/cli/pkg/terminus/velero.go
eball daacba2fa4
cli,bfl,app-service: new namespace structure (#1443)
* refactor: os-system namespace in yaml

* refactor: new namespace structure

* Update system-frontend.yaml

* Update lldap-deployment.yaml

* refactor: bump system server version

* fix: bfl and gpu scheduler

* fix: kubesphere,studio-server image

* tapr: bump components version

* chore(ks_server): os-system namespace split

* backup-server: bump components version

* fix: remove nats-box

* fix: restore backup svc name

* files: bump components version

* fix: replace backup deployment name

* fix: change lldap and sys-event namespace

* refactor(gpu): update hami to use gpu-scheduler in os-gpu

* fix: sign cert for otel

* fix: template bug

* fix: template bug

* fix: missing namespace

* fix: namespace label and network policy bug

* fix: service namespace

---------

Co-authored-by: Peng Peng <billpengpeng@gmail.com>
Co-authored-by: hys <hysyeah@gmail.com>
Co-authored-by: yyh <24493052+yongheng2016@users.noreply.github.com>
Co-authored-by: aby913 <aby913@163.com>
Co-authored-by: dkeven <dkvvven@gmail.com>
2025-06-16 23:12:57 +08:00

224 lines
6.7 KiB
Go

package terminus
import (
"fmt"
"io/fs"
"path"
"path/filepath"
"strings"
"github.com/beclab/Olares/cli/pkg/common"
cc "github.com/beclab/Olares/cli/pkg/core/common"
"github.com/beclab/Olares/cli/pkg/core/connector"
"github.com/beclab/Olares/cli/pkg/core/logger"
"github.com/beclab/Olares/cli/pkg/core/task"
"github.com/beclab/Olares/cli/pkg/core/util"
"github.com/beclab/Olares/cli/pkg/manifest"
"github.com/beclab/Olares/cli/pkg/utils"
"github.com/pkg/errors"
)
type InstallVeleroBinary struct {
common.KubeAction
manifest.ManifestAction
}
func (t *InstallVeleroBinary) Execute(runtime connector.Runtime) error {
veleroPkg, err := t.Manifest.Get(common.CommandVelero)
if err != nil {
return err
}
systemInfo := runtime.GetSystemInfo()
var baseDir = t.BaseDir
if systemInfo.IsWsl() {
var wslPackageDir = t.KubeConf.Arg.GetWslUserPath()
if wslPackageDir != "" {
baseDir = path.Join(wslPackageDir, cc.DefaultBaseDir)
}
}
path := veleroPkg.FilePath(baseDir)
var cmd = fmt.Sprintf("rm -rf /tmp/velero* && mkdir /tmp/velero && cp %s /tmp/%s && tar xf /tmp/%s -C /tmp/velero ", path, veleroPkg.Filename, veleroPkg.Filename)
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
return err
}
var binPath string
filepath.WalkDir("/tmp/velero", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
if d.Name() == common.CommandVelero {
binPath = path
}
return nil
})
cmd = fmt.Sprintf("install %s /usr/local/bin", binPath)
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
return err
}
return nil
}
type InstallVeleroCRDs struct {
common.KubeAction
}
func (i *InstallVeleroCRDs) Execute(runtime connector.Runtime) error {
velero, err := util.GetCommand(common.CommandVelero)
if err != nil {
return errors.Wrap(errors.WithStack(err), "velero not found")
}
if _, err := runtime.GetRunner().SudoCmd(fmt.Sprintf("%s install --crds-only --retry 10 --delay 5", velero), false, true); err != nil {
return errors.Wrap(errors.WithStack(err), "install velero crds failed")
}
return nil
}
type CreateBackupLocation struct {
common.KubeAction
}
// backup-location
func (c *CreateBackupLocation) Execute(runtime connector.Runtime) error {
velero, err := util.GetCommand(common.CommandVelero)
if err != nil {
return errors.Wrap(errors.WithStack(err), "velero not found")
}
var ns = "os-framework"
var provider = "terminus"
var storage = "terminus-cloud"
var cmd = fmt.Sprintf("%s backup-location get -n %s -l 'name=%s'", velero, ns, storage)
if res, err := runtime.GetRunner().SudoCmd(cmd, false, true); err == nil && res != "" {
return nil
}
cmd = fmt.Sprintf("%s backup-location create %s --provider %s --namespace %s --prefix '' --bucket %s --labels name=%s",
velero, storage, provider, ns, storage, storage)
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
return errors.Wrap(errors.WithStack(err), "create backup-location failed")
}
// TODO test
return nil
}
type InstallVeleroPlugin struct {
common.KubeAction
}
func (i *InstallVeleroPlugin) Execute(runtime connector.Runtime) error {
velero, err := util.GetCommand(common.CommandVelero)
if err != nil {
return errors.Wrap(errors.WithStack(err), "velero not found")
}
var ns = "os-framework"
var cmd = fmt.Sprintf("%s plugin get -n %s |grep 'velero.io/terminus' |wc -l", velero, ns)
pluginCounts, _ := runtime.GetRunner().SudoCmd(cmd, false, true)
if counts := utils.ParseInt(pluginCounts); counts > 0 {
return nil
}
var args string
var veleroVersion = "v1.11.3"
var veleroPluginVersion = "v1.0.2"
if runtime.GetSystemInfo().IsRaspbian() {
args = " --retry 30 --delay 5"
}
cmd = fmt.Sprintf("%s install --no-default-backup-location --namespace %s --image beclab/velero:%s --use-volume-snapshots=false --no-secret --plugins beclab/velero-plugin-for-terminus:%s --velero-pod-cpu-request=10m --velero-pod-cpu-limit=200m --node-agent-pod-cpu-request=10m --node-agent-pod-cpu-limit=200m --wait --wait-minute 30 %s", velero, ns, veleroVersion, veleroPluginVersion, args)
if _, err := runtime.GetRunner().SudoCmd(cmd, false, true); err != nil {
return errors.Wrap(errors.WithStack(err), "velero install plugin error")
}
// cmd = fmt.Sprintf("%s plugin add beclab/velero-plugin-for-terminus:%s -n %s", velero, veleroPluginVersion, ns)
// if stdout, _ := runtime.GetRunner().SudoCmd(cmd, false, true); stdout != "" && !strings.Contains(stdout, "Duplicate") {
// logger.Debug(stdout)
// }
return nil
}
type PatchVelero struct {
common.KubeAction
}
func (v *PatchVelero) Execute(runtime connector.Runtime) error {
kubectl, err := util.GetCommand(common.CommandKubectl)
if err != nil {
return errors.Wrap(errors.WithStack(err), "kubectl not found")
}
var ns = "os-framework"
var patch = `[{"op":"replace","path":"/spec/template/spec/volumes","value": [{"name":"plugins","emptyDir":{}},{"name":"scratch","emptyDir":{}},{"name":"terminus-cloud","hostPath":{"path":"/olares/rootfs/k8s-backup", "type":"DirectoryOrCreate"}}]},{"op": "replace", "path": "/spec/template/spec/containers/0/volumeMounts", "value": [{"name":"plugins","mountPath":"/plugins"},{"name":"scratch","mountPath":"/scratch"},{"mountPath":"/data","name":"terminus-cloud"}]},{"op": "replace", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true, "runAsNonRoot": false, "runAsUser": 0}}]`
if stdout, _ := runtime.GetRunner().SudoCmd(fmt.Sprintf("%s patch deploy velero -n %s --type='json' -p='%s'", kubectl, ns, patch), false, true); stdout != "" && !strings.Contains(stdout, "patched") {
logger.Errorf("velero plugin patched error %s", stdout)
}
return nil
}
type InstallVeleroModule struct {
common.KubeModule
manifest.ManifestModule
}
func (m *InstallVeleroModule) Init() {
logger.InfoInstallationProgress("Installing backup component ...")
m.Name = "InstallVelero"
installVeleroBinary := &task.LocalTask{
Name: "InstallVeleroBinary",
Action: &InstallVeleroBinary{
ManifestAction: manifest.ManifestAction{
Manifest: m.Manifest,
BaseDir: m.BaseDir,
},
},
Retry: 1,
}
installVeleroCRDs := &task.LocalTask{
Name: "InstallVeleroCRDs",
Action: new(InstallVeleroCRDs),
Retry: 1,
}
createBackupLocation := &task.LocalTask{
Name: "CreateBackupLocation",
Action: new(CreateBackupLocation),
Retry: 1,
}
installVeleroPlugin := &task.LocalTask{
Name: "InstallVeleroPlugin",
Action: new(InstallVeleroPlugin),
Retry: 1,
}
patchVelero := &task.LocalTask{
Name: "PatchVelero",
Action: new(PatchVelero),
Retry: 1,
}
m.Tasks = []task.Interface{
installVeleroBinary,
installVeleroCRDs,
createBackupLocation,
installVeleroPlugin,
patchVelero,
}
}