diff --git a/pkg/backup.go b/pkg/backup.go index 6433280..71b57fb 100644 --- a/pkg/backup.go +++ b/pkg/backup.go @@ -17,6 +17,11 @@ import ( "time" "github.com/google/uuid" + "github.com/klauspost/compress/zlib" + "github.com/machinebox/progress" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups" "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes" @@ -26,10 +31,6 @@ import ( "github.com/gophercloud/gophercloud/v2/openstack/objectstorage/v1/objects" backups_utils "github.com/gophercloud/utils/v2/openstack/blockstorage/v3/backups" images_utils "github.com/gophercloud/utils/v2/openstack/image/v2/images" - "github.com/klauspost/compress/zlib" - "github.com/machinebox/progress" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var ( @@ -97,11 +98,11 @@ func waitForBackup(ctx context.Context, client *gophercloud.ServiceClient, id st return backup, err } -// calculate sha256 hashes in parallel +// calculate sha256 hashes in parallel. func calcSha256Hash(myChunk []byte, sha256meta *sha256file, i int, done chan struct{}) { - var lenght int = len(myChunk) + var length int = len(myChunk) var hashes int - if n, mod := lenght/sha256chunk, lenght%sha256chunk; mod > 0 { + if n, mod := length/sha256chunk, length%sha256chunk; mod > 0 { hashes = n + 1 } else { hashes = n @@ -112,8 +113,8 @@ func calcSha256Hash(myChunk []byte, sha256meta *sha256file, i int, done chan str defer wg.Done() start := j * sha256chunk end := start + sha256chunk - if end > lenght { - end = lenght + if end > length { + end = length } h[j] = sha256.Sum256(myChunk[start:end]) } @@ -133,7 +134,7 @@ func calcSha256Hash(myChunk []byte, sha256meta *sha256file, i int, done chan str close(done) } -// calculate md5 hashes +// calculate md5 hashes. func calcMd5Hash(myChunk []byte, meta *metadata, i int, done chan struct{}, chunkPath string) { hash := md5.Sum(myChunk) object := backupChunkEntry{ @@ -235,6 +236,7 @@ func (c *chunk) process(ctx context.Context) { <-md5done <-sha256done + //nolint:ineffassign myChunk = nil } @@ -387,6 +389,7 @@ func uploadBackup(ctx context.Context, srcImgClient, srcObjClient, dstObjClient, return nil, fmt.Errorf("failed to upload %s/%s data: %s", containerName, p, err) } // free up the heap + //nolint:ineffassign buf = nil runtime.GC() @@ -406,6 +409,7 @@ func uploadBackup(ctx context.Context, srcImgClient, srcObjClient, dstObjClient, return nil, fmt.Errorf("failed to upload %s/%s data: %s", containerName, p, err) } // free up the heap + //nolint:ineffassign buf = nil runtime.GC() @@ -544,7 +548,7 @@ func getSourceData(ctx context.Context, srcImgClient, srcObjClient *gophercloud. }, nil } -// BackupCmd represents the backup command +// BackupCmd represents the backup command. var BackupCmd = &cobra.Command{ Use: "backup", } diff --git a/pkg/backup_clone.go b/pkg/backup_clone.go index fd98dda..ae710b5 100644 --- a/pkg/backup_clone.go +++ b/pkg/backup_clone.go @@ -12,9 +12,6 @@ import ( "syscall" "github.com/google/uuid" - "github.com/gophercloud/gophercloud/v2" - "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups" - backups_utils "github.com/gophercloud/utils/v2/openstack/blockstorage/v3/backups" "github.com/majewsky/schwift/v2/gopherschwift" "github.com/sapcc/go-bits/logg" "github.com/sapcc/go-bits/secrets" @@ -22,6 +19,10 @@ import ( "github.com/sapcc/swift-http-import/pkg/objects" "github.com/spf13/cobra" "github.com/spf13/viper" + + "github.com/gophercloud/gophercloud/v2" + "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups" + backups_utils "github.com/gophercloud/utils/v2/openstack/blockstorage/v3/backups" ) func prepareSwiftConfig(ctx context.Context, srcObjectClient, dstObjectClient *gophercloud.ServiceClient, srcContainerName, dstContainerName, prefix string, threads uint) (*objects.Configuration, error) { @@ -225,7 +226,7 @@ func cloneBackup(ctx context.Context, srcVolumeClient, srcObjectClient, dstVolum return waitForBackup(ctx, dstVolumeClient, importResponse.ID, waitForBackupSec) } -// BackupCmd represents the volume command +// BackupCloneCmd represents the backup clone command. var BackupCloneCmd = &cobra.Command{ Use: "clone ", Args: cobra.ExactArgs(1), diff --git a/pkg/backup_types.go b/pkg/backup_types.go index 6e0bf55..2b4de2a 100644 --- a/pkg/backup_types.go +++ b/pkg/backup_types.go @@ -105,7 +105,7 @@ func (r *metadata) MarshalJSON() ([]byte, error) { } sort.Ints(keys) - var obj []backupChunkEntry + obj := make([]backupChunkEntry, 0, len(keys)) for _, k := range keys { obj = append(obj, r.Objects[k]) r.Objects[k] = nil diff --git a/pkg/image.go b/pkg/image.go index 352ac16..b9194c0 100644 --- a/pkg/image.go +++ b/pkg/image.go @@ -8,6 +8,10 @@ import ( "net/http" "time" + "github.com/machinebox/progress" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/image/v2/imagedata" "github.com/gophercloud/gophercloud/v2/openstack/image/v2/imageimport" @@ -17,9 +21,6 @@ import ( "github.com/gophercloud/gophercloud/v2/openstack/objectstorage/v1/objects" "github.com/gophercloud/gophercloud/v2/pagination" images_utils "github.com/gophercloud/utils/v2/openstack/image/v2/images" - "github.com/machinebox/progress" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var ( @@ -147,7 +148,7 @@ func waitForImageTask(ctx context.Context, client, swiftClient *gophercloud.Serv return img, err } -// this function may show confused size results due to Swift eventual consistency +// this function may show confused size results due to Swift eventual consistency. func getContainerSize(ctx context.Context, client *gophercloud.ServiceClient, id string, srcSizeBytes int64) string { if client != nil { container, err := containers.Get(ctx, client, "glance_"+id, nil).Extract() @@ -226,7 +227,7 @@ func expandImageProperties(v map[string]interface{}) map[string]string { return properties } -func generateTmpUrlKey(n int) string { +func generateTmpURLKey(n int) string { var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") r := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -244,20 +245,20 @@ func migrateImage(ctx context.Context, srcImageClient, dstImageClient, srcObject objectName := srcImg.ID if imageWebDownload { - tempUrlKey := containers.UpdateOpts{ - TempURLKey: generateTmpUrlKey(20), + tempURLKey := containers.UpdateOpts{ + TempURLKey: generateTmpURLKey(20), } - _, err := containers.Update(ctx, srcObjectClient, containerName, tempUrlKey).Extract() + _, err := containers.Update(ctx, srcObjectClient, containerName, tempURLKey).Extract() if err != nil { return nil, fmt.Errorf("unable to set container temporary url key: %s", err) } - tmpUrlOptions := objects.CreateTempURLOpts{ + tmpURLOptions := objects.CreateTempURLOpts{ Method: "GET", TTL: swiftTempURLTTL, } - url, err = objects.CreateTempURL(ctx, srcObjectClient, containerName, objectName, tmpUrlOptions) + url, err = objects.CreateTempURL(ctx, srcObjectClient, containerName, objectName, tmpURLOptions) if err != nil { return nil, fmt.Errorf("unable to generate a temporary url for the %q container: %s", containerName, err) } @@ -315,7 +316,6 @@ func migrateImage(ctx context.Context, srcImageClient, dstImageClient, srcObject err = imageimport.Create(ctx, dstImageClient, dstImg.ID, importOpts).ExtractErr() if err != nil { return nil, fmt.Errorf("error while importing url %q: %s", url, err) - } dstImg, err = waitForImageTask(ctx, dstImageClient, dstObjectClient, dstImg.ID, srcImg.SizeBytes, waitForImageSec) @@ -374,7 +374,7 @@ func migrateImage(ctx context.Context, srcImageClient, dstImageClient, srcObject return dstImg, nil } -// ImageCmd represents the image command +// ImageCmd represents the image command. var ImageCmd = &cobra.Command{ Use: "image ", Args: cobra.ExactArgs(1), diff --git a/pkg/main.go b/pkg/main.go index c87edb6..331b3b8 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -35,16 +35,16 @@ type Location struct { } var ( - // RootCmd represents the base command when called without any subcommands + // RootCmd represents the base command when called without any subcommands. RootCmd = &cobra.Command{ Use: "cyclone", Short: "Clone OpenStack entities easily", SilenceUsage: true, } cleanupFuncs []func(*sync.WaitGroup) - // unattended mode, assume yes to all questions + // unattended mode, assume yes to all questions. yes bool - // unattended mode, assume no to all questions + // unattended mode, assume no to all questions. no bool ) @@ -108,29 +108,99 @@ func initRootCmdFlags() { RootCmd.PersistentFlags().StringP("timeout-secret", "", "24h", "timeout to wait for a secret status") RootCmd.PersistentFlags().StringP("timeout-security-group", "", "24h", "timeout to wait for a security group status") RootCmd.PersistentFlags().BoolP("image-web-download", "", false, "use Glance web-download image import method") - viper.BindPFlag("debug", RootCmd.PersistentFlags().Lookup("debug")) - viper.BindPFlag("yes", RootCmd.PersistentFlags().Lookup("yes")) - viper.BindPFlag("no", RootCmd.PersistentFlags().Lookup("no")) - viper.BindPFlag("to-auth-url", RootCmd.PersistentFlags().Lookup("to-auth-url")) - viper.BindPFlag("to-region", RootCmd.PersistentFlags().Lookup("to-region")) - viper.BindPFlag("to-domain", RootCmd.PersistentFlags().Lookup("to-domain")) - viper.BindPFlag("to-project", RootCmd.PersistentFlags().Lookup("to-project")) - viper.BindPFlag("to-username", RootCmd.PersistentFlags().Lookup("to-username")) - viper.BindPFlag("to-password", RootCmd.PersistentFlags().Lookup("to-password")) - viper.BindPFlag("to-application-credential-name", RootCmd.PersistentFlags().Lookup("to-application-credential-name")) - viper.BindPFlag("to-application-credential-id", RootCmd.PersistentFlags().Lookup("to-application-credential-id")) - viper.BindPFlag("to-application-credential-secret", RootCmd.PersistentFlags().Lookup("to-application-credential-secret")) - viper.BindPFlag("timeout-image", RootCmd.PersistentFlags().Lookup("timeout-image")) - viper.BindPFlag("timeout-volume", RootCmd.PersistentFlags().Lookup("timeout-volume")) - viper.BindPFlag("timeout-server", RootCmd.PersistentFlags().Lookup("timeout-server")) - viper.BindPFlag("timeout-snapshot", RootCmd.PersistentFlags().Lookup("timeout-snapshot")) - viper.BindPFlag("timeout-backup", RootCmd.PersistentFlags().Lookup("timeout-backup")) - viper.BindPFlag("timeout-share", RootCmd.PersistentFlags().Lookup("timeout-share")) - viper.BindPFlag("timeout-share-snapshot", RootCmd.PersistentFlags().Lookup("timeout-share-snapshot")) - viper.BindPFlag("timeout-share-replica", RootCmd.PersistentFlags().Lookup("timeout-share-replica")) - viper.BindPFlag("timeout-secret", RootCmd.PersistentFlags().Lookup("timeout-secret")) - viper.BindPFlag("timeout-security-group", RootCmd.PersistentFlags().Lookup("timeout-security-group")) - viper.BindPFlag("image-web-download", RootCmd.PersistentFlags().Lookup("image-web-download")) + + err := viper.BindPFlag("debug", RootCmd.PersistentFlags().Lookup("debug")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("yes", RootCmd.PersistentFlags().Lookup("yes")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("no", RootCmd.PersistentFlags().Lookup("no")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-auth-url", RootCmd.PersistentFlags().Lookup("to-auth-url")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-region", RootCmd.PersistentFlags().Lookup("to-region")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-domain", RootCmd.PersistentFlags().Lookup("to-domain")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-project", RootCmd.PersistentFlags().Lookup("to-project")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-username", RootCmd.PersistentFlags().Lookup("to-username")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-password", RootCmd.PersistentFlags().Lookup("to-password")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-application-credential-name", RootCmd.PersistentFlags().Lookup("to-application-credential-name")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-application-credential-id", RootCmd.PersistentFlags().Lookup("to-application-credential-id")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("to-application-credential-secret", RootCmd.PersistentFlags().Lookup("to-application-credential-secret")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-image", RootCmd.PersistentFlags().Lookup("timeout-image")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-volume", RootCmd.PersistentFlags().Lookup("timeout-volume")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-server", RootCmd.PersistentFlags().Lookup("timeout-server")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-snapshot", RootCmd.PersistentFlags().Lookup("timeout-snapshot")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-backup", RootCmd.PersistentFlags().Lookup("timeout-backup")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-share", RootCmd.PersistentFlags().Lookup("timeout-share")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-share-snapshot", RootCmd.PersistentFlags().Lookup("timeout-share-snapshot")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-share-replica", RootCmd.PersistentFlags().Lookup("timeout-share-replica")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-secret", RootCmd.PersistentFlags().Lookup("timeout-secret")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("timeout-security-group", RootCmd.PersistentFlags().Lookup("timeout-security-group")) + if err != nil { + panic(err) + } + err = viper.BindPFlag("image-web-download", RootCmd.PersistentFlags().Lookup("image-web-download")) + if err != nil { + panic(err) + } } func parseTimeoutArg(arg string, dst *float64, errors *[]error) { diff --git a/pkg/secrets.go b/pkg/secrets.go index 35918b0..80fd6ba 100644 --- a/pkg/secrets.go +++ b/pkg/secrets.go @@ -7,12 +7,13 @@ import ( "strings" "time" - "github.com/gophercloud/gophercloud/v2" - "github.com/gophercloud/gophercloud/v2/openstack/keymanager/v1/acls" - "github.com/gophercloud/gophercloud/v2/openstack/keymanager/v1/secrets" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/xhit/go-str2duration/v2" + + "github.com/gophercloud/gophercloud/v2" + "github.com/gophercloud/gophercloud/v2/openstack/keymanager/v1/acls" + "github.com/gophercloud/gophercloud/v2/openstack/keymanager/v1/secrets" ) var ( @@ -66,7 +67,7 @@ func waitForSecret(ctx context.Context, client *gophercloud.ServiceClient, id st return true, nil } - if !isSliceContainsStr(secretWaitStatuses, string(secret.Status)) { + if !isSliceContainsStr(secretWaitStatuses, secret.Status) { return false, fmt.Errorf("secret status is %q", secret.Status) } @@ -228,7 +229,7 @@ func uuidFromSecretRef(ref string) string { return ref[strings.LastIndex(ref, "/")+1:] } -// SecretCmd represents the secret command +// SecretCmd represents the secret command. var SecretCmd = &cobra.Command{ Use: "secret ", Args: cobra.ExactArgs(1), diff --git a/pkg/security_group.go b/pkg/security_group.go index d92229b..74e3b8c 100644 --- a/pkg/security_group.go +++ b/pkg/security_group.go @@ -5,11 +5,12 @@ import ( "fmt" "net/http" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/groups" "github.com/gophercloud/gophercloud/v2/openstack/networking/v2/extensions/security/rules" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var ( @@ -60,7 +61,7 @@ func retryRulesCreate(ctx context.Context, client *gophercloud.ServiceClient, op return rule, err } -// SecurityGroupCmd represents the security group command +// SecurityGroupCmd represents the security group command. var SecurityGroupCmd = &cobra.Command{ Use: "security-group ", Args: cobra.ExactArgs(1), diff --git a/pkg/server.go b/pkg/server.go index dde388a..dc2d6ba 100644 --- a/pkg/server.go +++ b/pkg/server.go @@ -8,6 +8,9 @@ import ( "sort" "strings" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes" "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/attachinterfaces" @@ -24,8 +27,6 @@ import ( servers_utils "github.com/gophercloud/utils/v2/openstack/compute/v2/servers" networks_utils "github.com/gophercloud/utils/v2/openstack/networking/v2/networks" subnets_utils "github.com/gophercloud/utils/v2/openstack/networking/v2/subnets" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var ( @@ -395,6 +396,7 @@ func createServerOpts(srcServer *servers.Server, toServerName, flavorID, keyName // TODO: scheduler hints } + //nolint:prealloc // not necessary for one alloc var blockDeviceOpts []servers.BlockDevice if dstImage != nil { if len(dstVolumes) > 0 { @@ -666,7 +668,7 @@ func bootableToLocal(ctx context.Context, srcVolumeClient, srcImageClient, srcOb return dstImage, nil } -// ServerCmd represents the server command +// ServerCmd represents the server command. var ServerCmd = &cobra.Command{ Use: "server ", Args: cobra.ExactArgs(1), diff --git a/pkg/share.go b/pkg/share.go index b73f443..9e94775 100644 --- a/pkg/share.go +++ b/pkg/share.go @@ -7,13 +7,14 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/sharedfilesystems/v2/replicas" "github.com/gophercloud/gophercloud/v2/openstack/sharedfilesystems/v2/shares" "github.com/gophercloud/gophercloud/v2/openstack/sharedfilesystems/v2/snapshots" shares_utils "github.com/gophercloud/utils/v2/openstack/sharedfilesystems/v2/shares" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var ( @@ -146,7 +147,7 @@ func createShareSpeed(share *shares.Share) { log.Printf("Speed of the share creation: %.2f Mb/sec", size/t.Seconds()) } -// findOrCreateShareReplica returns the new or existing inactive replica as the first return value and old active replica as the second one +// findOrCreateShareReplica returns the new or existing inactive replica as the first return value and old active replica as the second one. func findOrCreateShareReplica(ctx context.Context, srcShareClient *gophercloud.ServiceClient, srcShare *shares.Share, netID, az string) (*replicas.Replica, *replicas.Replica, error) { curReplica, allReplicas, err := findShareActiveReplica(ctx, srcShareClient, srcShare.ID) if err != nil { @@ -335,7 +336,7 @@ func moveShare(ctx context.Context, srcShareClient *gophercloud.ServiceClient, s return newShare, nil } -// ShareCmd represents the share command +// ShareCmd represents the share command. var ShareCmd = &cobra.Command{ Use: "share ", Args: cobra.ExactArgs(1), @@ -408,7 +409,7 @@ var ShareCmd = &cobra.Command{ }, } -// ShareMoveCmd represents the share move command +// ShareMoveCmd represents the share move command. var ShareMoveCmd = &cobra.Command{ Use: "move ", Args: cobra.ExactArgs(1), diff --git a/pkg/utils.go b/pkg/utils.go index ea7f428..be9f77b 100644 --- a/pkg/utils.go +++ b/pkg/utils.go @@ -9,6 +9,8 @@ import ( "sync" "time" + "golang.org/x/term" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack" "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/availabilityzones" @@ -17,7 +19,6 @@ import ( shareAZ "github.com/gophercloud/gophercloud/v2/openstack/sharedfilesystems/v2/availabilityzones" "github.com/gophercloud/utils/v2/client" "github.com/gophercloud/utils/v2/openstack/clientconfig" - "golang.org/x/term" ) var ( @@ -300,7 +301,7 @@ func checkShareAvailabilityZone(ctx context.Context, client *gophercloud.Service return fmt.Errorf("error extracting availability zones from response: %s", err) } - var zonesNames []string + zonesNames := make([]string, 0, len(zones)) var found bool for _, z := range zones { zonesNames = append(zonesNames, z.Name) @@ -378,7 +379,7 @@ func getAuthProjectID(client *gophercloud.ProviderClient) (string, error) { } } -// isSliceContainsStr returns true if the string exists in given slice +// isSliceContainsStr returns true if the string exists in given slice. func isSliceContainsStr(sl []string, str string) bool { for _, s := range sl { if s == str { @@ -452,7 +453,7 @@ func (eb *Backoff) WaitFor(predicate func() (bool, error)) error { } } -// joinSkipEmpty helper joins only non empty strings +// joinSkipEmpty helper joins only non empty strings. func joinSkipEmpty(sep string, args ...string) string { var a []string for _, s := range args { diff --git a/pkg/volume.go b/pkg/volume.go index 3012ad2..49c0a74 100644 --- a/pkg/volume.go +++ b/pkg/volume.go @@ -8,6 +8,9 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups" "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/snapshots" @@ -15,8 +18,6 @@ import ( "github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes" "github.com/gophercloud/gophercloud/v2/openstack/image/v2/images" volumes_utils "github.com/gophercloud/utils/v2/openstack/blockstorage/v3/volumes" - "github.com/spf13/cobra" - "github.com/spf13/viper" ) var skipVolumeAttributes = []string{ @@ -54,8 +55,8 @@ func expandVolumeProperties(srcVolume *volumes.Volume) images.UpdateOpts { images.ReplaceImageMinDisk{NewMinDisk: srcVolume.Size}, } if s, ok := srcVolume.VolumeImageMetadata["min_ram"]; ok { - if minRam, err := strconv.Atoi(s); err == nil { - imgAttrUpdateOpts = append(imgAttrUpdateOpts, images.ReplaceImageMinRam{NewMinRam: minRam}) + if minRAM, err := strconv.Atoi(s); err == nil { + imgAttrUpdateOpts = append(imgAttrUpdateOpts, images.ReplaceImageMinRam{NewMinRam: minRAM}) } else { log.Printf("Cannot convert %q to integer: %s", s, err) } @@ -491,7 +492,7 @@ func transferVolume(ctx context.Context, srcVolumeClient, dstVolumeClient *gophe return srcVolume, nil } -// VolumeCmd represents the volume command +// VolumeCmd represents the volume command. var VolumeCmd = &cobra.Command{ Use: "volume ", Args: cobra.ExactArgs(1), @@ -592,7 +593,7 @@ var VolumeCmd = &cobra.Command{ }, } -// VolumeToImageCmd represents the volume command +// VolumeToImageCmd represents the volume command. var VolumeToImageCmd = &cobra.Command{ Use: "to-image ", Args: cobra.ExactArgs(1),