diff --git a/cmd/upload.go b/cmd/upload.go index ddc1a6a..cbd112e 100644 --- a/cmd/upload.go +++ b/cmd/upload.go @@ -121,10 +121,10 @@ func init() { uploadCmd.MarkFlagsMutuallyExclusive(uploadFlagImageURL, uploadFlagImagePath) uploadCmd.MarkFlagsOneRequired(uploadFlagImageURL, uploadFlagImagePath) - uploadCmd.Flags().String(uploadFlagCompression, "", "Type of compression that was used on the disk image [choices: bz2, xz]") + uploadCmd.Flags().String(uploadFlagCompression, "", "Type of compression that was used on the disk image [choices: bz2, xz, zstd]") _ = uploadCmd.RegisterFlagCompletionFunc( uploadFlagCompression, - cobra.FixedCompletions([]string{string(hcloudimages.CompressionBZ2), string(hcloudimages.CompressionXZ)}, cobra.ShellCompDirectiveNoFileComp), + cobra.FixedCompletions([]string{string(hcloudimages.CompressionBZ2), string(hcloudimages.CompressionXZ), string(hcloudimages.CompressionZSTD)}, cobra.ShellCompDirectiveNoFileComp), ) uploadCmd.Flags().String(uploadFlagFormat, "", "Format of the image. [choices: qcow2]") diff --git a/docs/reference/cli/hcloud-upload-image_upload.md b/docs/reference/cli/hcloud-upload-image_upload.md index 35ec884..20bd8b2 100644 --- a/docs/reference/cli/hcloud-upload-image_upload.md +++ b/docs/reference/cli/hcloud-upload-image_upload.md @@ -34,7 +34,7 @@ hcloud-upload-image upload (--image-path= | --image-url=) --arc ``` --architecture string CPU architecture of the disk image [choices: x86, arm] - --compression string Type of compression that was used on the disk image [choices: bz2, xz] + --compression string Type of compression that was used on the disk image [choices: bz2, xz, zstd] --description string Description for the resulting image --format string Format of the image. [choices: qcow2] -h, --help help for upload diff --git a/hcloudimages/client.go b/hcloudimages/client.go index 9652854..2869cf3 100644 --- a/hcloudimages/client.go +++ b/hcloudimages/client.go @@ -104,9 +104,10 @@ const ( CompressionNone Compression = "" CompressionBZ2 Compression = "bz2" CompressionXZ Compression = "xz" + CompressionZSTD Compression = "zstd" // Possible future additions: - // zip,zstd + // zip ) type Format string @@ -524,6 +525,8 @@ func assembleCommand(options UploadOptions) (string, error) { cmd += "bzip2 -cd | " case CompressionXZ: cmd += "xz -cd | " + case CompressionZSTD: + cmd += "zstd -cd | " default: return "", fmt.Errorf("unknown compression: %q", options.ImageCompression) } diff --git a/hcloudimages/client_test.go b/hcloudimages/client_test.go index 86f8961..d1d1d33 100644 --- a/hcloudimages/client_test.go +++ b/hcloudimages/client_test.go @@ -48,6 +48,21 @@ func TestAssembleCommand(t *testing.T) { }, want: "bash -c 'set -euo pipefail && wget --no-verbose -O - \"https://example.com/image.xz\" | xz -cd | dd of=/dev/sda bs=4M && sync'", }, + { + name: "local zstd", + options: UploadOptions{ + ImageCompression: CompressionZSTD, + }, + want: "bash -c 'set -euo pipefail && zstd -cd | dd of=/dev/sda bs=4M && sync'", + }, + { + name: "remote zstd", + options: UploadOptions{ + ImageURL: mustParseURL("https://example.com/image.zst"), + ImageCompression: CompressionZSTD, + }, + want: "bash -c 'set -euo pipefail && wget --no-verbose -O - \"https://example.com/image.zst\" | zstd -cd | dd of=/dev/sda bs=4M && sync'", + }, { name: "local bz2", options: UploadOptions{ @@ -59,9 +74,9 @@ func TestAssembleCommand(t *testing.T) { name: "remote bz2", options: UploadOptions{ ImageURL: mustParseURL("https://example.com/image.bz2"), - ImageCompression: CompressionXZ, + ImageCompression: CompressionBZ2, }, - want: "bash -c 'set -euo pipefail && wget --no-verbose -O - \"https://example.com/image.bz2\" | xz -cd | dd of=/dev/sda bs=4M && sync'", + want: "bash -c 'set -euo pipefail && wget --no-verbose -O - \"https://example.com/image.bz2\" | bzip2 -cd | dd of=/dev/sda bs=4M && sync'", }, { name: "local qcow2",