Skip to content

Commit

Permalink
fix: add the same behaviour return 404 in case if backup is not found…
Browse files Browse the repository at this point in the history
… for Delete endpoint, restore, track restore.
  • Loading branch information
fibu0125 committed Feb 4, 2025
1 parent bb473a2 commit 6f4c085
Showing 1 changed file with 93 additions and 26 deletions.
119 changes: 93 additions & 26 deletions backup/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,17 +201,29 @@ func (bp BackupProvider) DeleteBackupHandler() func(w http.ResponseWriter, r *ht
vars := mux.Vars(r)
backupID := vars["backupID"]

response := bp.DeleteBackup(backupID, ctx)
if response.StatusCode < 500 {
_, _ = w.Write([]byte{})
} else {
w.WriteHeader(500)
body, err := io.ReadAll(response.Body)
if err != nil {
logger.ErrorContext(ctx, fmt.Sprintf("Failed to process response body %v", body), slog.Any("error", err))
}
response, err := bp.DeleteBackup(backupID, ctx)
if err != nil {
logger.ErrorContext(ctx, "failed to delete backup", slog.String("error", err.Error()))
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(err.Error()))
return
}

body, err := io.ReadAll(response.Body)
if err != nil {
logger.ErrorContext(ctx, "failed to read from http response", slog.String("error", err.Error()))
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(err.Error()))
}

if response.StatusCode > 200 {
w.WriteHeader(response.StatusCode)
_, _ = w.Write(body)
return
}

w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte{})
}
}

Expand Down Expand Up @@ -264,12 +276,28 @@ func (bp BackupProvider) RestoreBackupHandler(repo string, basePath string) func
regenerateNames := r.URL.Query().Get("regenerateNames") == "true"
changedNameDb, err := bp.RestoreBackup(backupID, databases, repo, regenerateNames, ctx)
if err != nil {
logger.ErrorContext(ctx, "Failed to restore backup", slog.Any("error", err))
w.WriteHeader(http.StatusInternalServerError)
logMsg := "failed to restore backup, internal server error occur"
statusCode := http.StatusInternalServerError
if errors.Is(err, ErrBackupNotFound) {
logMsg = "failed to restore backup, the backup is not found"
statusCode = http.StatusNotFound
}
logger.ErrorContext(ctx, logMsg, slog.String("error", err.Error()))
w.WriteHeader(statusCode)
_, _ = w.Write([]byte(err.Error()))
return
}
response := bp.TrackRestore(backupID, ctx, changedNameDb)

response, err := bp.TrackRestore(backupID, ctx, changedNameDb)
if err != nil {
logger.ErrorContext(ctx, "restore backup is failed", slog.String("error", err.Error()))
w.WriteHeader(http.StatusInternalServerError)
_, err = w.Write([]byte(err.Error()))
if err != nil {
logger.ErrorContext(ctx, "failed to write bytes to the http body response")
}
}

if regenerateNames {
indices, err := bp.getActualIndices(backupID, repo, changedNameDb, ctx)
if err != nil {
Expand Down Expand Up @@ -321,11 +349,30 @@ func (bp BackupProvider) RestorationBackupHandler(repo string, basePath string)
}

changedNameDb, err, trackId := bp.ProcessRestorationRequest(backupID, req, ctx)
response := bp.TrackRestore(trackId, ctx, changedNameDb)
if err != nil {
logger.ErrorContext(ctx, "Failed to restore backup", slog.Any("error", err))
logger.ErrorContext(ctx, "failed to process restoration", slog.String("error", err.Error()))
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(err.Error()))
_, err = w.Write([]byte(err.Error()))
if err != nil {
logger.ErrorContext(ctx, "failed to write bytes into http response body", slog.String("error", err.Error()))
}
return
}

response, err := bp.TrackRestore(trackId, ctx, changedNameDb)
if err != nil {
errStatusCode := http.StatusInternalServerError
logMsg := "an internal server error occurred while attempting to retrieve the recovery"
if errors.Is(err, ErrBackupNotFound) {
logMsg = "track restore not found"
errStatusCode = http.StatusNotFound
}
logger.ErrorContext(ctx, logMsg, slog.String("error", err.Error()))
w.WriteHeader(errStatusCode)
_, err = w.Write([]byte(err.Error()))
if err != nil {
logger.ErrorContext(ctx, "failed to write bytes into the http response", slog.String("error", err.Error()))
}
return
}
responseBody, err := json.Marshal(response)
Expand All @@ -345,10 +392,21 @@ func (bp BackupProvider) TrackRestoreFromTrackIdHandler(fromRepo string) func(w
logger.InfoContext(ctx, fmt.Sprintf("Request to track restore in '%s' in '%s' repository is received", r.URL.Path, fromRepo))
vars := mux.Vars(r)
backupID := vars["backupID"]
response := bp.TrackRestore(backupID, ctx, nil)
responseBody, err := json.Marshal(response)
response, err := bp.TrackRestore(backupID, ctx, nil)
if err != nil {
logger.ErrorContext(ctx, "Failed to marshal response to JSON", slog.Any("error", err))
errStatusCode := http.StatusInternalServerError
logMsg := "an internal server error occurred while attempting to retrieve the recovery"
if errors.Is(err, ErrBackupNotFound) {
logMsg = "track restore not found"
errStatusCode = http.StatusNotFound
}
logger.ErrorContext(ctx, logMsg, slog.String("error", err.Error()))
w.WriteHeader(errStatusCode)
}
var responseBody []byte
responseBody, err = json.Marshal(response)
if err != nil {
logger.ErrorContext(ctx, "Failed to marshal response to JSON", slog.String("error", err.Error()))
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(err.Error()))
return
Expand Down Expand Up @@ -425,7 +483,7 @@ func (bp BackupProvider) TrackBackup(backupID string, ctx context.Context) (Acti
return backupTrack(backupID, jobStatus), nil
}

func (bp BackupProvider) DeleteBackup(backupID string, ctx context.Context) *http.Response {
func (bp BackupProvider) DeleteBackup(backupID string, ctx context.Context) (*http.Response, error) {
url := fmt.Sprintf("%s/%s/%s", bp.Curator.url, "evict", backupID)
request, err := http.NewRequest(http.MethodPost, url, nil)
if err != nil {
Expand All @@ -435,11 +493,12 @@ func (bp BackupProvider) DeleteBackup(backupID string, ctx context.Context) *htt
request.Header.Set(common.RequestIdKey, ctx.Value(common.RequestIdKey).(string))
request.SetBasicAuth(bp.Curator.username, bp.Curator.password)
response, err := bp.Curator.client.Do(request)

if err != nil {
logger.ErrorContext(ctx, "Failed to delete snapshot", slog.Any("error", err))
logger.ErrorContext(ctx, "Failed to delete snapshot", slog.String("error", err.Error()))
return nil, err
}
return response

return response, nil
}

func (bp BackupProvider) RestoreBackup(backupId string, dbs []string, fromRepo string, regenerateNames bool, ctx context.Context) (map[string]string, error) {
Expand Down Expand Up @@ -580,16 +639,17 @@ func (bp BackupProvider) ProcessRestorationRequest(backupId string, restorationR
return changedDbNames, err, trackId
}

func (bp BackupProvider) TrackRestore(trackId string, ctx context.Context, changedNameDb map[string]string) ActionTrack {
func (bp BackupProvider) TrackRestore(trackId string, ctx context.Context, changedNameDb map[string]string) (ActionTrack, error) {
logger.InfoContext(ctx, fmt.Sprintf("Request to track '%s' restoration is received", trackId))
jobStatus, err := bp.getJobStatus(trackId, ctx)
if err != nil {
logger.ErrorContext(ctx, "Failed to find snapshot", slog.Any("error", err))
return backupTrack(trackId, "FAIL")
logger.ErrorContext(ctx, "Failed to find snapshot", slog.String("error", err.Error()))
return backupTrack(trackId, "FAIL"), err
}
logger.DebugContext(ctx, fmt.Sprintf("'%s' backup status is %s", trackId, jobStatus))
return restoreTrack(trackId, jobStatus, changedNameDb)
return restoreTrack(trackId, jobStatus, changedNameDb), nil
}

func (bp BackupProvider) checkPrefixUniqueness(prefix string, ctx context.Context) (bool, error) {
logger.InfoContext(ctx, "Checking user prefix uniqueness during restoration with renaming")
getUsersRequest := api.GetUsersRequest{}
Expand Down Expand Up @@ -673,6 +733,13 @@ func (bp BackupProvider) requestRestore(ctx context.Context, dbs []string, backu
if err != nil {
return err
}
if response.StatusCode == 404 {
return ErrBackupNotFound
}

if response.StatusCode >= 500 {
return ErrCuratorUnavailable
}
logger.InfoContext(ctx, fmt.Sprintf("'%s' snapshot restoration is started: %s", backupId, response.Body))
return nil
}
Expand Down

0 comments on commit 6f4c085

Please sign in to comment.