From 4ff6344ed677fc1cb5698bb45e64cf5ea138e1b5 Mon Sep 17 00:00:00 2001 From: Houston Putman Date: Fri, 19 May 2023 12:22:50 -0400 Subject: [PATCH] Catch errors when starting a backup --- controllers/solrbackup_controller.go | 9 ++++----- controllers/util/backup_util.go | 22 +++++++++++++++------- controllers/util/solr_api/api.go | 18 ++++++++++++++++-- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/controllers/solrbackup_controller.go b/controllers/solrbackup_controller.go index eafd6b24..69f59238 100644 --- a/controllers/solrbackup_controller.go +++ b/controllers/solrbackup_controller.go @@ -265,13 +265,12 @@ func reconcileSolrCollectionBackup(ctx context.Context, backup *solrv1beta1.Solr return true, nil } else if !collectionBackupStatus.InProgress { // Start the backup by calling solr - var started bool - started, err = util.StartBackupForCollection(ctx, solrCloud, backupRepository, backup, collection, logger) + err = util.StartBackupForCollection(ctx, solrCloud, backupRepository, backup, collection, logger) if err != nil { - return true, err + return false, err } - collectionBackupStatus.InProgress = started - if started && collectionBackupStatus.StartTime == nil { + collectionBackupStatus.InProgress = true + if collectionBackupStatus.StartTime == nil { collectionBackupStatus.StartTime = &now } collectionBackupStatus.BackupName = util.FullCollectionBackupName(collection, backup.Name) diff --git a/controllers/util/backup_util.go b/controllers/util/backup_util.go index 882884b0..f9ebc2bd 100644 --- a/controllers/util/backup_util.go +++ b/controllers/util/backup_util.go @@ -26,6 +26,8 @@ import ( "github.com/go-logr/logr" "github.com/robfig/cron/v3" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -91,22 +93,28 @@ func GenerateQueryParamsForBackup(backupRepository *solr.SolrBackupRepository, b return queryParams } -func StartBackupForCollection(ctx context.Context, cloud *solr.SolrCloud, backupRepository *solr.SolrBackupRepository, backup *solr.SolrBackup, collection string, logger logr.Logger) (success bool, err error) { +func StartBackupForCollection(ctx context.Context, cloud *solr.SolrCloud, backupRepository *solr.SolrBackupRepository, backup *solr.SolrBackup, collection string, logger logr.Logger) (err error) { queryParams := GenerateQueryParamsForBackup(backupRepository, backup, collection) resp := &solr_api.SolrAsyncResponse{} logger.Info("Calling to start collection backup", "solrCloud", cloud.Name, "collection", collection) err = solr_api.CallCollectionsApi(ctx, cloud, queryParams, resp) - if err == nil { - if resp.ResponseHeader.Status == 0 { - success = true - } - } else { + if err == nil && resp.ResponseHeader.Status != 0 { + err = &errors.StatusError{ErrStatus: metav1.Status{ + Status: metav1.StatusFailure, + Code: int32(resp.Error.Code), + Details: &metav1.StatusDetails{ + Causes: []metav1.StatusCause{{Message: resp.Error.Message}}, + }, + Message: "Error occurred while trying to start backup", + }} + } + if err != nil { logger.Error(err, "Error starting collection backup", "solrCloud", cloud.Name, "collection", collection) } - return success, err + return err } func CheckBackupForCollection(ctx context.Context, cloud *solr.SolrCloud, collection string, backupName string, logger logr.Logger) (finished bool, success bool, asyncStatus string, err error) { diff --git a/controllers/util/solr_api/api.go b/controllers/util/solr_api/api.go index e64d8633..0364c5ac 100644 --- a/controllers/util/solr_api/api.go +++ b/controllers/util/solr_api/api.go @@ -23,7 +23,7 @@ import ( "encoding/json" "fmt" solr "github.com/apache/solr-operator/api/v1beta1" - "io/ioutil" + "io" "k8s.io/apimachinery/pkg/api/errors" "net/http" "net/url" @@ -55,6 +55,9 @@ type SolrAsyncResponse struct { // +optional Status SolrAsyncStatus `json:"status,omitempty"` + + // +optional + Error SolrAsyncError `json:"error,omitempty"` } type SolrResponseHeader struct { @@ -72,6 +75,17 @@ type SolrAsyncStatus struct { Message string `json:"msg,omitempty"` } +type SolrAsyncError struct { + // +optional + Metadata []string `json:"metadata,omitempty"` + + // +optional + Message string `json:"msg,omitempty"` + + // +optional + Code int `json:"code,omitempty"` +} + type SolrAsyncStatusResponse struct { ResponseHeader SolrResponseHeader `json:"responseHeader"` @@ -154,7 +168,7 @@ func CallCollectionsApi(ctx context.Context, cloud *solr.SolrCloud, urlParams ur defer resp.Body.Close() if err == nil && resp.StatusCode != 200 { - b, _ := ioutil.ReadAll(resp.Body) + b, _ := io.ReadAll(resp.Body) err = errors.NewServiceUnavailable(fmt.Sprintf("Recieved bad response code of %d from solr with response: %s", resp.StatusCode, string(b))) }