Make backup / restore of Che installation work with devworkspace mode (#1247)
Signed-off-by: Mykola Morhun <mmorhun@redhat.com>pull/1251/head
parent
488054eb45
commit
e960ba2e56
|
|
@ -162,7 +162,9 @@ func backupDatabases(bctx *BackupContext, destDir string) (bool, error) {
|
|||
|
||||
databasesToBackup := []string{
|
||||
bctx.cheCR.Spec.Database.ChePostgresDb,
|
||||
"keycloak",
|
||||
}
|
||||
if !bctx.cheCR.Spec.DevWorkspace.Enable {
|
||||
databasesToBackup = append(databasesToBackup, "keycloak")
|
||||
}
|
||||
|
||||
k8sClient := util.GetK8Client()
|
||||
|
|
|
|||
|
|
@ -38,13 +38,27 @@ import (
|
|||
)
|
||||
|
||||
func RestoreChe(rctx *RestoreContext, dataDir string) (bool, error) {
|
||||
// Delete existing Che resources if any
|
||||
if !rctx.state.oldCheCleaned {
|
||||
// Request deletion of existing Che resources if any
|
||||
if !rctx.state.oldCheDeletionRequested {
|
||||
done, err := cleanPreviousInstallation(rctx, dataDir)
|
||||
if err != nil || !done {
|
||||
return done, err
|
||||
}
|
||||
|
||||
rctx.state.oldCheDeletionRequested = true
|
||||
if err := rctx.UpdateRestoreStatus(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
// Waiting for finalizers of existing Che if any
|
||||
if !rctx.state.oldCheCleaned {
|
||||
done, err := waitPreviousInstallationDeleted(rctx)
|
||||
if err != nil || !done {
|
||||
logrus.Info("Restore: Waiting for existing Che to be deleted")
|
||||
return done, err
|
||||
}
|
||||
|
||||
rctx.state.oldCheCleaned = true
|
||||
if err := rctx.UpdateRestoreStatus(); err != nil {
|
||||
return false, err
|
||||
|
|
@ -97,10 +111,12 @@ func RestoreChe(rctx *RestoreContext, dataDir string) (bool, error) {
|
|||
return done, err
|
||||
}
|
||||
|
||||
// After Keycloak's database restoring, it is required to restart Keycloak to invalidate its cache.
|
||||
done, err = deleteKeycloakPod(rctx)
|
||||
if err != nil || !done {
|
||||
return done, err
|
||||
if !rctx.cheCR.Spec.DevWorkspace.Enable {
|
||||
// After Keycloak's database restoring, it is required to restart Keycloak to invalidate its cache.
|
||||
done, err = deleteKeycloakPod(rctx)
|
||||
if err != nil || !done {
|
||||
return done, err
|
||||
}
|
||||
}
|
||||
|
||||
rctx.state.cheDatabaseRestored = true
|
||||
|
|
@ -209,6 +225,19 @@ func cleanPreviousInstallation(rctx *RestoreContext, dataDir string) (bool, erro
|
|||
return true, nil
|
||||
}
|
||||
|
||||
func waitPreviousInstallationDeleted(rctx *RestoreContext) (bool, error) {
|
||||
_, cheCRCount, err := util.FindCheClusterCRInNamespace(rctx.r.cachingClient, rctx.namespace)
|
||||
if cheCRCount == -1 {
|
||||
// An error occurred while retreiving CheCluster CR
|
||||
return false, err
|
||||
} else if cheCRCount > 0 {
|
||||
// Wait more for finalizers
|
||||
return false, nil
|
||||
}
|
||||
// Che CR is deleted
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func deleteKeycloakPod(rctx *RestoreContext) (bool, error) {
|
||||
k8sClient := util.GetK8Client()
|
||||
keycloakPodName, err := k8sClient.GetDeploymentPod(deploy.IdentityProviderName, rctx.namespace)
|
||||
|
|
|
|||
|
|
@ -75,25 +75,27 @@ func (rctx *RestoreContext) UpdateRestoreStatus() error {
|
|||
}
|
||||
|
||||
type RestoreState struct {
|
||||
backupDownloaded bool
|
||||
oldCheCleaned bool
|
||||
cheResourcesRestored bool
|
||||
cheCRRestored bool
|
||||
cheAvailable bool
|
||||
cheDatabaseRestored bool
|
||||
cheRestored bool
|
||||
backupDownloaded bool
|
||||
oldCheDeletionRequested bool
|
||||
oldCheCleaned bool
|
||||
cheResourcesRestored bool
|
||||
cheCRRestored bool
|
||||
cheAvailable bool
|
||||
cheDatabaseRestored bool
|
||||
cheRestored bool
|
||||
}
|
||||
|
||||
// RestoreState phase messages
|
||||
// Each message represents state in progress, not done
|
||||
const (
|
||||
restoreStateIn_backupDownloaded = "Downloading backup from backup server"
|
||||
restoreStateIn_oldCheCleaned = "Cleaning up existing Che"
|
||||
restoreStateIn_cheResourcesRestored = "Restoring Che related cluster objects"
|
||||
restoreStateIn_cheCRRestored = "Restoring Che Custom Resource"
|
||||
restoreStateIn_cheAvailable = "Waiting until clean Che is ready"
|
||||
restoreStateIn_cheDatabaseRestored = "Restoring Che database"
|
||||
restoreStateIn_cheRestored = "Waiting until Che is ready"
|
||||
restoreStateIn_backupDownloaded = "Downloading backup from backup server"
|
||||
restoreStateIn_oldCheDeletionRequested = "Requesting deletion of existing Che"
|
||||
restoreStateIn_oldCheCleaned = "Cleaning up existing Che"
|
||||
restoreStateIn_cheResourcesRestored = "Restoring Che related cluster objects"
|
||||
restoreStateIn_cheCRRestored = "Restoring Che Custom Resource"
|
||||
restoreStateIn_cheAvailable = "Waiting until clean Che is ready"
|
||||
restoreStateIn_cheDatabaseRestored = "Restoring Che database"
|
||||
restoreStateIn_cheRestored = "Waiting until Che is ready"
|
||||
)
|
||||
|
||||
func (s *RestoreState) GetPhaseMessage() string {
|
||||
|
|
@ -101,6 +103,9 @@ func (s *RestoreState) GetPhaseMessage() string {
|
|||
if !s.backupDownloaded {
|
||||
return restoreStateIn_backupDownloaded
|
||||
}
|
||||
if !s.oldCheDeletionRequested {
|
||||
return restoreStateIn_oldCheDeletionRequested
|
||||
}
|
||||
if !s.oldCheCleaned {
|
||||
return restoreStateIn_oldCheCleaned
|
||||
}
|
||||
|
|
@ -150,6 +155,9 @@ func NewRestoreState(restoreCR *chev1.CheClusterRestore) (*RestoreState, error)
|
|||
rs.oldCheCleaned = true
|
||||
fallthrough
|
||||
case restoreStateIn_oldCheCleaned:
|
||||
rs.oldCheDeletionRequested = true
|
||||
fallthrough
|
||||
case restoreStateIn_oldCheDeletionRequested:
|
||||
rs.backupDownloaded = true
|
||||
fallthrough
|
||||
case restoreStateIn_backupDownloaded:
|
||||
|
|
|
|||
Loading…
Reference in New Issue