Compare commits

...

7 Commits

7 changed files with 41 additions and 15 deletions

View File

@@ -170,7 +170,7 @@ spec:
priorityClassName: "system-cluster-critical"
containers:
- name: app-service
image: beclab/app-service:0.4.70
image: beclab/app-service:0.4.72
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 0

View File

@@ -146,7 +146,7 @@ func LoadStatefulApp(ctx context.Context, appmgr *ApplicationManagerController,
case appv1alpha1.ApplyingEnvCanceling:
return appstate.NewApplyingEnvCancelingApp(appmgr, &am)
case appv1alpha1.Uninstalling:
return appstate.NewUninstallingApp(appmgr, &am, 15*time.Minute)
return appstate.NewUninstallingApp(appmgr, &am, 30*time.Minute)
case appv1alpha1.StopFailed:
return appstate.NewSuspendFailedApp(appmgr, &am)
case appv1alpha1.UninstallFailed:

View File

@@ -2,7 +2,6 @@ package appinstaller
import (
"encoding/json"
"fmt"
"time"
appv1alpha1 "github.com/beclab/Olares/framework/app-service/api/app.bytetrade.io/v1alpha1"
@@ -12,7 +11,6 @@ import (
"github.com/beclab/Olares/framework/app-service/pkg/helm"
"github.com/beclab/Olares/framework/app-service/pkg/users/userspace"
apputils "github.com/beclab/Olares/framework/app-service/pkg/utils/app"
helmrelease "helm.sh/helm/v3/pkg/release"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
@@ -23,15 +21,7 @@ import (
// Upgrade do a upgrade operation for release.
func (h *HelmOps) Upgrade() error {
status, err := h.status()
if err != nil {
klog.Errorf("get release status failed %v", err)
return err
}
if status.Info.Status == helmrelease.StatusDeployed {
return h.upgrade()
}
return fmt.Errorf("cannot upgrade release %s/%s, current state is %s", h.app.Namespace, h.app.AppName, status.Info.Status)
return h.upgrade()
}
func (h *HelmOps) upgrade() error {

View File

@@ -20,6 +20,7 @@ import (
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
utilwait "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/rest"
"k8s.io/klog/v2"
ctrl "sigs.k8s.io/controller-runtime"
@@ -138,6 +139,13 @@ func (p *baseStatefulApp) forceDeleteApp(ctx context.Context) error {
return err
}
}
// Wait for namespace to be fully deleted before updating status
if err = p.waitForNamespaceDeleted(ctx); err != nil {
klog.Errorf("wait for namespace %s deleted failed %v", p.manager.Spec.AppNamespace, err)
return err
}
err = p.updateStatus(ctx, p.manager, appsv1.Uninstalled, nil, appsv1.Uninstalled.String(), "")
if err != nil {
klog.Errorf("update app manager %s to state %s failed", p.manager.Name, appsv1.Uninstalled)
@@ -146,6 +154,32 @@ func (p *baseStatefulApp) forceDeleteApp(ctx context.Context) error {
return nil
}
// waitForNamespaceDeleted waits for the namespace to be completely deleted
func (p *baseStatefulApp) waitForNamespaceDeleted(ctx context.Context) error {
namespace := p.manager.Spec.AppNamespace
if apputils.IsProtectedNamespace(namespace) {
return nil
}
klog.Infof("waiting for namespace %s to be fully deleted", namespace)
err := utilwait.PollImmediate(time.Second, 30*time.Minute, func() (done bool, err error) {
var ns corev1.Namespace
err = p.client.Get(ctx, types.NamespacedName{Name: namespace}, &ns)
if err != nil && !apierrors.IsNotFound(err) {
klog.Errorf("failed to get namespace %s: %v", namespace, err)
return false, err
}
if apierrors.IsNotFound(err) {
klog.Infof("namespace %s has been fully deleted", namespace)
return true, nil
}
klog.Infof("namespace %s still exists, waiting...", namespace)
return false, nil
})
return err
}
type OperationApp interface {
StatefulApp
IsTimeout() bool

View File

@@ -100,7 +100,7 @@ func (p *UninstallingApp) waitForDeleteNamespace(ctx context.Context) error {
if apputils.IsProtectedNamespace(p.manager.Spec.AppNamespace) {
return nil
}
err := utilwait.PollImmediate(time.Second, 15*time.Minute, func() (done bool, err error) {
err := utilwait.PollImmediate(time.Second, 30*time.Minute, func() (done bool, err error) {
klog.Infof("waiting for namespace %s to be deleted", p.manager.Spec.AppNamespace)
nsName := p.manager.Spec.AppNamespace
var ns corev1.Namespace

View File

@@ -176,6 +176,7 @@ func (p *UpgradingApp) exec(ctx context.Context) error {
return err
}
appConfig.Ports = cfg.Ports
appConfig.TailScale = cfg.TailScale
} else {
_, err = apputils.GetIndexAndDownloadChart(ctx, &apputils.ConfigOptions{

View File

@@ -87,7 +87,8 @@ func UpgradeCharts(ctx context.Context, actionConfig *action.Configuration, sett
client.Namespace = namespace
client.Timeout = 300 * time.Second
client.Recreate = false
client.Atomic = true
// Do not use Atomic, this could cause helm wait all resource ready.
//client.Atomic = true
if reuseValue {
client.ReuseValues = true
}