Olares/cli/pkg/upgrade/1_12_2_20251013.go
dkeven 3dac3c2a13
refactor: unify various SystemEnvs; migrate BFL to new env framework (#1915)
* refactor: unify various system envs into one

* refactor(bfl): watch unified systemenv resource as API address
2025-10-13 23:48:58 +08:00

96 lines
2.8 KiB
Go

package upgrade
import (
"context"
"fmt"
"time"
v1alpha1 "bytetrade.io/web3os/app-service/api/sys.bytetrade.io/v1alpha1"
"github.com/Masterminds/semver/v3"
"github.com/beclab/Olares/cli/pkg/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"
apixclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kruntime "k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
)
type upgrader_1_12_2_20251013 struct {
breakingUpgraderBase
}
func (u upgrader_1_12_2_20251013) Version() *semver.Version {
return semver.MustParse("1.12.2-20251013")
}
func (u upgrader_1_12_2_20251013) UpgradeSystemComponents() []task.Interface {
pre := []task.Interface{
&task.LocalTask{
Name: "DeleteOldSystemEnvsIfExists",
Action: new(deleteSystemEnvsIfExists),
Retry: 3,
Delay: 5 * time.Second,
},
}
return append(pre, u.upgraderBase.UpgradeSystemComponents()...)
}
func init() {
registerDailyUpgrader(upgrader_1_12_2_20251013{})
}
type deleteSystemEnvsIfExists struct {
common.KubeAction
}
func (d *deleteSystemEnvsIfExists) Execute(runtime connector.Runtime) error {
config, err := ctrl.GetConfig()
if err != nil {
return fmt.Errorf("failed to get rest config: %s", err)
}
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute)
defer cancel()
apix, err := apixclientset.NewForConfig(config)
if err != nil {
return fmt.Errorf("failed to create crd client: %v", err)
}
_, err = apix.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, "systemenvs.sys.bytetrade.io", metav1.GetOptions{})
if err != nil {
if apierrors.IsNotFound(err) {
logger.Debugf("SystemEnv CRD not found, skipping deletion of SystemEnvs")
return nil
}
return fmt.Errorf("failed to get SystemEnv CRD: %v", err)
}
scheme := kruntime.NewScheme()
if err := v1alpha1.AddToScheme(scheme); err != nil {
return fmt.Errorf("failed to add systemenv scheme: %v", err)
}
c, err := ctrlclient.New(config, ctrlclient.Options{Scheme: scheme})
if err != nil {
return fmt.Errorf("failed to create client: %v", err)
}
var seList v1alpha1.SystemEnvList
if err := c.List(ctx, &seList); err != nil {
return fmt.Errorf("failed to list SystemEnvs: %v", err)
}
if len(seList.Items) == 0 {
logger.Debugf("no SystemEnvs found to delete")
return nil
}
for i := range seList.Items {
se := &seList.Items[i]
if err := c.Delete(ctx, se); err != nil && !apierrors.IsNotFound(err) {
return fmt.Errorf("failed to delete SystemEnv %s: %v", se.Name, err)
}
logger.Debugf("deleted SystemEnv %s", se.Name)
}
return nil
}