in controllers/solrbackup_controller.go [169:247]
func (r *SolrBackupReconciler) reconcileSolrCloudBackup(ctx context.Context, backup *solrv1beta1.SolrBackup, currentBackupStatus *solrv1beta1.IndividualSolrBackupStatus, logger logr.Logger) (solrCloud *solrv1beta1.SolrCloud, actionTaken bool, err error) {
// Get the solrCloud that this backup is for.
solrCloud = &solrv1beta1.SolrCloud{}
err = r.Get(ctx, types.NamespacedName{Namespace: backup.Namespace, Name: backup.Spec.SolrCloud}, solrCloud)
if err != nil && errors.IsNotFound(err) {
logger.Error(err, "Could not find cloud to backup", "solrCloud", backup.Spec.SolrCloud)
return nil, actionTaken, err
} else if err != nil {
return nil, actionTaken, err
}
// Add any additional values needed to Authn to Solr to the Context used when invoking the API
if solrCloud.Spec.SolrSecurity != nil {
ctx, err = util.AddAuthToContext(ctx, &r.Client, solrCloud)
if err != nil {
return nil, actionTaken, err
}
}
// First check if the collection backups have been completed
collectionBackupsFinished := util.UpdateStatusOfCollectionBackups(currentBackupStatus)
// If the collectionBackups are complete, then nothing else has to be done here
if collectionBackupsFinished {
return solrCloud, actionTaken, nil
}
actionTaken = true
backupRepository := util.GetBackupRepositoryByName(solrCloud.Spec.BackupRepositories, backup.Spec.RepositoryName)
if backupRepository == nil {
err = fmt.Errorf("Unable to find backup repository to use for backup [%s] (which specified the repository"+
" [%s]). solrcloud must define a repository matching that name (or have only 1 repository defined).",
backup.Name, backup.Spec.RepositoryName)
return solrCloud, actionTaken, err
}
// This should only occur before the backup processes have been started
if currentBackupStatus.StartTime.IsZero() {
// Prep the backup directory in the persistentVolume
err = util.EnsureDirectoryForBackup(solrCloud, backupRepository, backup, r.Config)
if err != nil {
return solrCloud, actionTaken, err
}
// Make sure that all solr living Solr pods have the backupRepo configured
if !solrCloud.Status.BackupRepositoriesAvailable[backupRepository.Name] {
logger.Info("Cloud not ready for backup", "solrCloud", solrCloud.Name, "repository", backupRepository.Name)
return solrCloud, actionTaken, errors.NewServiceUnavailable(fmt.Sprintf("Cloud is not ready for backups in the %s repository", backupRepository.Name))
}
// Only set the solr version at the start of the backup. This shouldn't change throughout the backup.
currentBackupStatus.SolrVersion = solrCloud.Status.Version
currentBackupStatus.StartTime = metav1.Now()
}
collectionsToBackup := backup.Spec.Collections
// If there are no collections specified, we need to list through collections available in Solr
if len(collectionsToBackup) == 0 {
collectionsToBackup, err = util.ListAllSolrCollections(ctx, solrCloud, logger)
if err != nil {
logger.Error(err, "Error listing collections", "solrCloud", solrCloud.Name)
}
}
// Go through each collection specified and reconcile the backup.
for _, collection := range collectionsToBackup {
// This will in-place update the CollectionBackupStatus in the backup object
if _, err = reconcileSolrCollectionBackup(ctx, backup, currentBackupStatus, solrCloud, backupRepository, collection, logger); err != nil {
break
}
}
// First check if the collection backups have been completed
util.UpdateStatusOfCollectionBackups(currentBackupStatus)
return solrCloud, actionTaken, err
}