diff --git a/client/incus_storage_buckets.go b/client/incus_storage_buckets.go index e6c466612bf..04640a622b4 100644 --- a/client/incus_storage_buckets.go +++ b/client/incus_storage_buckets.go @@ -257,7 +257,7 @@ func (r *ProtocolIncus) CreateStoragePoolBucketBackup(poolName string, bucketNam return op, nil } -// DeleteStorageBucketBackup deletes an existing storage bucket backup. +// DeleteStoragePoolBucketBackup deletes an existing storage bucket backup. func (r *ProtocolIncus) DeleteStoragePoolBucketBackup(pool string, bucketName string, name string) (Operation, error) { err := r.CheckExtension("storage_bucket_backup") if err != nil { @@ -337,6 +337,7 @@ func (r *ProtocolIncus) GetStoragePoolBucketBackupFile(pool string, bucketName s return &resp, nil } +// CreateStoragePoolBucketFromBackup creates a new storage bucket from a backup. func (r *ProtocolIncus) CreateStoragePoolBucketFromBackup(pool string, args StoragePoolBucketBackupArgs) (Operation, error) { if !r.HasExtension("storage_bucket_backup") { return nil, fmt.Errorf(`The server is missing the required "custom_volume_backup" API extension`) diff --git a/cmd/incus/storage_bucket.go b/cmd/incus/storage_bucket.go index dae1e1cb975..a9611e8143b 100644 --- a/cmd/incus/storage_bucket.go +++ b/cmd/incus/storage_bucket.go @@ -1201,6 +1201,7 @@ type cmdStorageBucketExport struct { flagCompressionAlgorithm string } +// Command generates the command definition. func (c *cmdStorageBucketExport) Command() *cobra.Command { cmd := &cobra.Command{} cmd.Use = usage("export", i18n.G("[:] []")) @@ -1219,6 +1220,7 @@ func (c *cmdStorageBucketExport) Command() *cobra.Command { return cmd } +// Run runs the actual command logic. func (c *cmdStorageBucketExport) Run(cmd *cobra.Command, args []string) error { // Quick checks. exit, err := c.global.CheckArgs(cmd, args, 2, 3) @@ -1242,11 +1244,11 @@ func (c *cmdStorageBucketExport) Run(cmd *cobra.Command, args []string) error { return fmt.Errorf(i18n.G("Missing bucket name")) } - client := pool.server + s := pool.server // If a target was specified, use the bucket on the given member. if c.storageBucket.flagTarget != "" { - client = client.UseTarget(c.storageBucket.flagTarget) + s = s.UseTarget(c.storageBucket.flagTarget) } req := api.StorageBucketBackupsPost{ @@ -1255,7 +1257,7 @@ func (c *cmdStorageBucketExport) Run(cmd *cobra.Command, args []string) error { CompressionAlgorithm: c.flagCompressionAlgorithm, } - op, err := client.CreateStoragePoolBucketBackup(pool.name, bucketName, req) + op, err := s.CreateStoragePoolBucketBackup(pool.name, bucketName, req) if err != nil { return fmt.Errorf(i18n.G("Failed to create backup: %v"), err) } @@ -1300,7 +1302,7 @@ func (c *cmdStorageBucketExport) Run(cmd *cobra.Command, args []string) error { defer func() { // Delete backup after we're done - op, err := client.DeleteStoragePoolBucketBackup(pool.name, bucketName, backupName) + op, err := s.DeleteStoragePoolBucketBackup(pool.name, bucketName, backupName) if err == nil { _ = op.Wait() } @@ -1332,7 +1334,7 @@ func (c *cmdStorageBucketExport) Run(cmd *cobra.Command, args []string) error { } // Export tarball - _, err = client.GetStoragePoolBucketBackupFile(pool.name, bucketName, backupName, &backupFileRequest) + _, err = s.GetStoragePoolBucketBackupFile(pool.name, bucketName, backupName, &backupFileRequest) if err != nil { _ = os.Remove(targetName) progress.Done("") @@ -1350,6 +1352,7 @@ type cmdStorageBucketImport struct { storageBucket *cmdStorageBucket } +// Command generates the command definition. func (c *cmdStorageBucketImport) Command() *cobra.Command { cmd := &cobra.Command{} cmd.Use = usage("import", i18n.G("[:] []")) @@ -1365,6 +1368,7 @@ func (c *cmdStorageBucketImport) Command() *cobra.Command { return cmd } +// Run runs the actual command logic. func (c *cmdStorageBucketImport) Run(cmd *cobra.Command, args []string) error { conf := c.global.conf diff --git a/cmd/incusd/backup.go b/cmd/incusd/backup.go index 4c465404742..382ab2fdb6f 100644 --- a/cmd/incusd/backup.go +++ b/cmd/incusd/backup.go @@ -646,8 +646,8 @@ func bucketBackupCreate(s *state.State, args db.StoragePoolBucketBackup, project l.Debug("Bucket backup started") defer l.Debug("Bucket backup finished") - revert := revert.New() - defer revert.Fail() + reverter := revert.New() + defer reverter.Fail() pool, err := storagePools.LoadByName(s, poolName) if err != nil { @@ -666,7 +666,7 @@ func bucketBackupCreate(s *state.State, args db.StoragePoolBucketBackup, project return fmt.Errorf("Failed creating backup record: %w", err) } - revert.Add(func() { + reverter.Add(func() { _ = s.DB.Cluster.Transaction(context.Background(), func(ctx context.Context, tx *db.ClusterTx) error { return tx.DeleteStoragePoolBucketBackup(ctx, args.Name) }) @@ -700,7 +700,7 @@ func bucketBackupCreate(s *state.State, args db.StoragePoolBucketBackup, project return err } - revert.Add(func() { _ = os.Remove(backupsPath) }) + reverter.Add(func() { _ = os.Remove(backupsPath) }) } target := internalUtil.VarPath("backups", "buckets", pool.Name(), project.StorageBucket(projectName, backupRow.Name)) @@ -713,7 +713,7 @@ func bucketBackupCreate(s *state.State, args db.StoragePoolBucketBackup, project } defer func() { _ = tarFileWriter.Close() }() - revert.Add(func() { _ = os.Remove(target) }) + reverter.Add(func() { _ = os.Remove(target) }) // Create the tarball. tarPipeReader, tarPipeWriter := io.Pipe() @@ -782,7 +782,7 @@ func bucketBackupCreate(s *state.State, args db.StoragePoolBucketBackup, project return fmt.Errorf("Error closing tar file: %w", err) } - revert.Success() + reverter.Success() return nil } diff --git a/cmd/incusd/storage_buckets.go b/cmd/incusd/storage_buckets.go index a1d6048d0a5..51d528d912d 100644 --- a/cmd/incusd/storage_buckets.go +++ b/cmd/incusd/storage_buckets.go @@ -1174,8 +1174,8 @@ func storagePoolBucketKeyPut(d *Daemon, r *http.Request) response.Response { } func createStoragePoolBucketFromBackup(s *state.State, r *http.Request, requestProjectName string, projectName string, data io.Reader, pool string, bucketName string) response.Response { - revert := revert.New() - defer revert.Fail() + reverter := revert.New() + defer reverter.Fail() // Create temporary file to store uploaded backup data. backupFile, err := os.CreateTemp(internalUtil.VarPath("backups"), fmt.Sprintf("%s_", backup.WorkingDirPrefix)) @@ -1184,7 +1184,7 @@ func createStoragePoolBucketFromBackup(s *state.State, r *http.Request, requestP } defer func() { _ = os.Remove(backupFile.Name()) }() - revert.Add(func() { _ = backupFile.Close() }) + reverter.Add(func() { _ = backupFile.Close() }) // Stream uploaded backup data into temporary file. _, err = io.Copy(backupFile, data) @@ -1224,7 +1224,7 @@ func createStoragePoolBucketFromBackup(s *state.State, r *http.Request, requestP "pool": bInfo.Pool, }) - runRevert := revert.Clone() + runRevert := reverter.Clone() run := func(op *operations.Operation) error { defer func() { _ = backupFile.Close() }() @@ -1252,6 +1252,6 @@ func createStoragePoolBucketFromBackup(s *state.State, r *http.Request, requestP return response.InternalError(err) } - revert.Success() + reverter.Success() return operations.OperationResponse(op) } diff --git a/cmd/incusd/storage_buckets_backup.go b/cmd/incusd/storage_buckets_backup.go index a208de4fdac..0c4f190b71c 100644 --- a/cmd/incusd/storage_buckets_backup.go +++ b/cmd/incusd/storage_buckets_backup.go @@ -333,13 +333,13 @@ func storagePoolBucketBackupsPost(d *Daemon, r *http.Request) response.Response length := len(base) max := 0 - for _, backup := range backups { + for _, entry := range backups { // Ignore backups not containing base. - if !strings.HasPrefix(backup, base) { + if !strings.HasPrefix(entry, base) { continue } - substr := backup[length:] + substr := entry[length:] var num int count, err := fmt.Sscanf(substr, "%d", &num) if err != nil || count != 1 { @@ -361,7 +361,7 @@ func storagePoolBucketBackupsPost(d *Daemon, r *http.Request) response.Response fullName := bucketName + internalInstance.SnapshotDelimiter + req.Name - backup := func(op *operations.Operation) error { + do := func(op *operations.Operation) error { args := db.StoragePoolBucketBackup{ Name: fullName, BucketID: bucket.ID, @@ -383,7 +383,7 @@ func storagePoolBucketBackupsPost(d *Daemon, r *http.Request) response.Response resources["storage_buckets"] = []api.URL{*api.NewURL().Path(version.APIVersion, "storage-pools", poolName, "buckets", bucketName)} resources["backups"] = []api.URL{*api.NewURL().Path(version.APIVersion, "storage-pools", poolName, "buckets", bucketName, "backups", req.Name)} - op, err := operations.OperationCreate(s, request.ProjectParam(r), operations.OperationClassTask, operationtype.BucketBackupCreate, resources, nil, backup, nil, nil, r) + op, err := operations.OperationCreate(s, request.ProjectParam(r), operations.OperationClassTask, operationtype.BucketBackupCreate, resources, nil, do, nil, nil, r) if err != nil { return response.InternalError(err) } @@ -475,12 +475,12 @@ func storagePoolBucketBackupGet(d *Daemon, r *http.Request) response.Response { fullName := bucketName + internalInstance.SnapshotDelimiter + backupName - backup, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, fullName) + entry, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, fullName) if err != nil { return response.SmartError(err) } - return response.SyncResponse(true, backup.Render()) + return response.SyncResponse(true, entry.Render()) } // swagger:operation POST /1.0/storage-pools/{poolName}/buckets/{bucketName}/backups/{backupName} storage storage_pool_buckets_backup_post @@ -570,7 +570,7 @@ func storagePoolBucketBackupPost(d *Daemon, r *http.Request) response.Response { oldName := bucketName + internalInstance.SnapshotDelimiter + backupName - backup, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, oldName) + entry, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, oldName) if err != nil { return response.SmartError(err) } @@ -578,7 +578,7 @@ func storagePoolBucketBackupPost(d *Daemon, r *http.Request) response.Response { newName := bucketName + internalInstance.SnapshotDelimiter + req.Name rename := func(op *operations.Operation) error { - err := backup.Rename(newName) + err := entry.Rename(newName) if err != nil { return err } @@ -670,13 +670,13 @@ func storagePoolBucketBackupDelete(d *Daemon, r *http.Request) response.Response fullName := bucketName + internalInstance.SnapshotDelimiter + backupName - backup, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, fullName) + entry, err := storagePoolBucketBackupLoadByName(s, projectName, poolName, fullName) if err != nil { return response.SmartError(err) } remove := func(op *operations.Operation) error { - err := backup.Delete() + err := entry.Delete() if err != nil { return err } @@ -799,7 +799,7 @@ func storagePoolBucketBackupLoadByName(s *state.State, projectName, poolName, ba } bucketName := strings.Split(backupName, "/")[0] - backup := backup.NewBucketBackup(s, projectName, poolName, bucketName, b.ID, b.Name, b.CreationDate, b.ExpiryDate) + entry := backup.NewBucketBackup(s, projectName, poolName, bucketName, b.ID, b.Name, b.CreationDate, b.ExpiryDate) - return backup, nil + return entry, nil } diff --git a/internal/server/backup/backup_bucket.go b/internal/server/backup/backup_bucket.go index ed17cd215dc..5d6f968f37b 100644 --- a/internal/server/backup/backup_bucket.go +++ b/internal/server/backup/backup_bucket.go @@ -84,8 +84,8 @@ func (b *BucketBackup) Rename(newName string) error { newParentName, _, _ := api.GetParentAndSnapshotName(newName) newParentBackupsPath := internalUtil.VarPath("backups", "buckets", b.poolName, project.StorageBucket(b.projectName, newParentName)) - revert := revert.New() - defer revert.Fail() + reverter := revert.New() + defer reverter.Fail() // Create the new backup path if doesn't exist. if !util.PathExists(newParentBackupsPath) { @@ -101,7 +101,7 @@ func (b *BucketBackup) Rename(newName string) error { return err } - revert.Add(func() { _ = os.Rename(newBackupPath, oldBackupPath) }) + reverter.Add(func() { _ = os.Rename(newBackupPath, oldBackupPath) }) // Check if we can remove the old parent directory. empty, _ := internalUtil.PathIsEmpty(oldParentBackupsPath) @@ -120,7 +120,7 @@ func (b *BucketBackup) Rename(newName string) error { return err } - revert.Success() + reverter.Success() return nil } diff --git a/internal/server/db/backups.go b/internal/server/db/backups.go index 534d644ecf7..634e71112a6 100644 --- a/internal/server/db/backups.go +++ b/internal/server/db/backups.go @@ -708,8 +708,7 @@ FROM storage_buckets_backups` return backups, nil } -// RenameVolumeBackup renames a volume backup from the given current name -// to the new one. +// RenameBucketBackup renames a bucket backup from the given current name to the new one. func (c *ClusterTx) RenameBucketBackup(ctx context.Context, oldName, newName string) error { str := "UPDATE storage_buckets_backups SET name = ? WHERE name = ?" stmt, err := c.tx.Prepare(str) diff --git a/internal/server/storage/backend.go b/internal/server/storage/backend.go index 3767e4bf544..656f0b8c2a5 100644 --- a/internal/server/storage/backend.go +++ b/internal/server/storage/backend.go @@ -7203,8 +7203,8 @@ func (b *backend) CreateBucketFromBackup(srcBackup backup.Info, srcData io.ReadS return fmt.Errorf("Storage pool does not support buckets") } - revert := revert.New() - defer revert.Fail() + reverter := revert.New() + defer reverter.Fail() bucketRequest := api.StorageBucketsPost{ Name: srcBackup.Name, @@ -7217,7 +7217,7 @@ func (b *backend) CreateBucketFromBackup(srcBackup backup.Info, srcData io.ReadS return err } - revert.Add(func() { _ = b.DeleteBucket(srcBackup.Project, bucketRequest.Name, op) }) + reverter.Add(func() { _ = b.DeleteBucket(srcBackup.Project, bucketRequest.Name, op) }) // Upload all keys from the backup. for _, bucketKey := range srcBackup.Config.BucketKeys { @@ -7245,7 +7245,7 @@ func (b *backend) CreateBucketFromBackup(srcBackup backup.Info, srcData io.ReadS return err } - revert.Success() + reverter.Success() return nil } diff --git a/internal/server/storage/backend_mock.go b/internal/server/storage/backend_mock.go index e074b66b1e5..0b030e1a45a 100644 --- a/internal/server/storage/backend_mock.go +++ b/internal/server/storage/backend_mock.go @@ -356,14 +356,17 @@ func (b *mockBackend) CreateCustomVolumeFromISO(projectName string, volName stri return nil } +// GenerateBucketBackupConfig returns the backup config entry for this bucket. func (b *mockBackend) GenerateBucketBackupConfig(projectName string, bucketName string, op *operations.Operation) (*backupConfig.Config, error) { return nil, nil } +// BackupBucket backups up a bucket to a tarball. func (b *mockBackend) BackupBucket(projectName string, bucketName string, tarWriter *instancewriter.InstanceTarWriter, op *operations.Operation) error { return nil } +// CreateBucketFromBackup creates a bucket from a tarball. func (b *mockBackend) CreateBucketFromBackup(srcBackup backup.Info, srcData io.ReadSeeker, op *operations.Operation) error { return nil } diff --git a/internal/server/storage/s3/transfer_manager.go b/internal/server/storage/s3/transfer_manager.go index 70c4fe16068..e8e6639d9ac 100644 --- a/internal/server/storage/s3/transfer_manager.go +++ b/internal/server/storage/s3/transfer_manager.go @@ -95,6 +95,7 @@ func (t TransferManager) DownloadAllFiles(bucketName string, tarWriter *instance return nil } +// UploadAllFiles uploads all the provided files to the bucket. func (t TransferManager) UploadAllFiles(bucketName string, srcData io.ReadSeeker) error { logger.Debugf("Uploading all files to bucket %s", bucketName) logger.Debugf("Endpoint: %s", t.getEndpoint()) @@ -114,7 +115,7 @@ func (t TransferManager) UploadAllFiles(bucketName string, srcData io.ReadSeeker } defer func() { _ = os.RemoveAll(mountPath) }() - logger.Debugf("Created temp mounth path %s", mountPath) + logger.Debugf("Created temp mount path %s", mountPath) tr, cancelFunc, err := backup.TarReader(srcData, nil, mountPath) if err != nil { @@ -148,12 +149,12 @@ func (t TransferManager) UploadAllFiles(bucketName string, srcData io.ReadSeeker func (t TransferManager) getMinioClient() (*minio.Client, error) { bucketLookup := minio.BucketLookupPath - credentials := credentials.NewStaticV4(t.accessKey, t.secretKey, "") + creds := credentials.NewStaticV4(t.accessKey, t.secretKey, "") if t.isSecureEndpoint() { return minio.New(t.getEndpoint(), &minio.Options{ BucketLookup: bucketLookup, - Creds: credentials, + Creds: creds, Secure: true, Transport: getTransport(), }) @@ -161,7 +162,7 @@ func (t TransferManager) getMinioClient() (*minio.Client, error) { return minio.New(t.getEndpoint(), &minio.Options{ BucketLookup: bucketLookup, - Creds: credentials, + Creds: creds, Secure: false, }) }