Skip to content

Commit d05e2d0

Browse files
committed
Support uploading to libvirt
Co-authored-by: Michael Vogt <[email protected]> See osbuild/images#1858
1 parent 15de513 commit d05e2d0

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

cmd/image-builder/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,9 @@ operating systems like Fedora, CentOS and RHEL with easy customizations support.
529529
uploadCmd.Flags().String("aws-ami-name", "", "name for the AMI in AWS (only for type=ami)")
530530
uploadCmd.Flags().String("aws-bucket", "", "target S3 bucket name for intermediate storage when creating AMI (only for type=ami)")
531531
uploadCmd.Flags().String("aws-region", "", "target region for AWS uploads (only for type=ami)")
532+
uploadCmd.Flags().String("libvirt-connection", "", "connection URI (only for type=libvirt)")
533+
uploadCmd.Flags().String("libvirt-pool", "", "pool name (only for type=libvirt)")
534+
uploadCmd.Flags().String("libvirt-volume", "", "volume name (only for type=libvirt)")
532535
uploadCmd.Flags().String("arch", "", "upload for the given architecture")
533536
rootCmd.AddCommand(uploadCmd)
534537

cmd/image-builder/upload.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/osbuild/images/pkg/arch"
1717
"github.com/osbuild/images/pkg/cloud"
1818
"github.com/osbuild/images/pkg/cloud/awscloud"
19+
"github.com/osbuild/images/pkg/cloud/libvirt"
1920
"github.com/osbuild/images/pkg/platform"
2021
)
2122

@@ -29,6 +30,7 @@ var ErrUploadConfigNotProvided = errors.New("missing all upload configuration")
2930
var ErrUploadTypeUnsupported = errors.New("unsupported type")
3031

3132
var awscloudNewUploader = awscloud.NewUploader
33+
var libvirtNewUploader = libvirt.NewUploader
3234

3335
func uploadImageWithProgress(uploader cloud.Uploader, imagePath string) error {
3436
f, err := os.Open(imagePath)
@@ -42,14 +44,19 @@ func uploadImageWithProgress(uploader cloud.Uploader, imagePath string) error {
4244
if err != nil {
4345
return fmt.Errorf("cannot stat upload: %v", err)
4446
}
47+
size := uint64(st.Size())
4548
pbar := pb.New64(st.Size())
4649
pbar.Set(pb.Bytes, true)
4750
pbar.SetWriter(osStdout)
4851
r := pbar.NewProxyReader(f)
4952
pbar.Start()
5053
defer pbar.Finish()
5154

52-
return uploader.UploadAndRegister(r, osStderr)
55+
if err := uploader.UploadAndRegister(r, size, osStderr); err != nil {
56+
return err
57+
}
58+
59+
return nil
5360
}
5461

5562
func uploaderCheckWithProgress(pbar progress.ProgressBar, uploader cloud.Uploader) error {
@@ -69,6 +76,8 @@ func uploaderFor(cmd *cobra.Command, typeOrCloud string, targetArch string, boot
6976
switch typeOrCloud {
7077
case "ami", "server-ami", "aws":
7178
return uploaderForCmdAWS(cmd, targetArch, bootMode)
79+
case "libvirt":
80+
return uploaderForLibvirt(cmd, targetArch, bootMode)
7281
default:
7382
return nil, fmt.Errorf("%w: %q", ErrUploadTypeUnsupported, typeOrCloud)
7483
}
@@ -129,6 +138,22 @@ func uploaderForCmdAWS(cmd *cobra.Command, targetArchStr string, bootMode *platf
129138
return awscloudNewUploader(region, bucketName, amiName, opts)
130139
}
131140

141+
func uploaderForLibvirt(cmd *cobra.Command, targetArchStr string, bootMode *platform.BootMode) (cloud.Uploader, error) {
142+
connection, err := cmd.Flags().GetString("libvirt-connection")
143+
if err != nil {
144+
return nil, err
145+
}
146+
pool, err := cmd.Flags().GetString("libvirt-pool")
147+
if err != nil {
148+
return nil, err
149+
}
150+
volume, err := cmd.Flags().GetString("libvirt-volume")
151+
if err != nil {
152+
return nil, err
153+
}
154+
return libvirtNewUploader(connection, pool, volume)
155+
}
156+
132157
func detectArchFromImagePath(imagePath string) string {
133158
// This detection is currently rather naive, we just look for
134159
// the file name and try to infer from that. We could extend

cmd/image-builder/upload_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (fa *fakeAwsUploader) Check(status io.Writer) error {
3636
return nil
3737
}
3838

39-
func (fa *fakeAwsUploader) UploadAndRegister(r io.Reader, status io.Writer) error {
39+
func (fa *fakeAwsUploader) UploadAndRegister(r io.Reader, uploadSize uint64, status io.Writer) error {
4040
fa.uploadAndRegisterCalls++
4141
_, err := io.Copy(&fa.uploadAndRegisterRead, r)
4242
if err != nil {

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
github.com/gobwas/glob v0.2.3
1313
github.com/mattn/go-isatty v0.0.20
1414
github.com/osbuild/blueprint v1.13.0
15-
github.com/osbuild/images v0.195.0
15+
github.com/osbuild/images v0.196.0
1616
github.com/spf13/cobra v1.9.1
1717
github.com/stretchr/testify v1.11.1
1818
golang.org/x/sys v0.35.0
@@ -138,4 +138,5 @@ require (
138138
google.golang.org/grpc v1.74.2 // indirect
139139
google.golang.org/protobuf v1.36.7 // indirect
140140
gopkg.in/ini.v1 v1.67.0 // indirect
141+
libvirt.org/go/libvirt v1.11006.0 // indirect
141142
)

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
233233
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
234234
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
235235
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
236+
github.com/mvo5/images v0.0.0-20250922151141-828ee5cab274 h1:ceDIcTJUOs5nxzhFfkpISpgT0+BcOvnVk7Z5rIbVJeo=
237+
github.com/mvo5/images v0.0.0-20250922151141-828ee5cab274/go.mod h1:xkXfw5CIy0bVNTNdB6GXiewu/IzBgpofkItDJPAzGA4=
236238
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
237239
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
238240
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
@@ -253,6 +255,8 @@ github.com/osbuild/images v0.194.0 h1:hCEvPtBjDpq3iicfGyurKQ15VqTU1gIyE7hdlOG4QC
253255
github.com/osbuild/images v0.194.0/go.mod h1:KPiYBF0VrOXz5NAw6Lv4X170uN8wnOHpWuBzKT4jPrU=
254256
github.com/osbuild/images v0.195.0 h1:dURWARsCjRt2a46aiFuUk/Ke4goEY3OyS7XAuM9PDf4=
255257
github.com/osbuild/images v0.195.0/go.mod h1:KPiYBF0VrOXz5NAw6Lv4X170uN8wnOHpWuBzKT4jPrU=
258+
github.com/osbuild/images v0.196.0 h1:54ZRTAEwX+H4/6KGz7zhewbG/5BYK1qco8LhZ7Jekp8=
259+
github.com/osbuild/images v0.196.0/go.mod h1:xkXfw5CIy0bVNTNdB6GXiewu/IzBgpofkItDJPAzGA4=
256260
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
257261
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
258262
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -507,5 +511,7 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
507511
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
508512
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
509513
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
514+
libvirt.org/go/libvirt v1.11006.0 h1:xzF87ptj/7cp1h4T62w1ZMBVY8m0mQukSCstMgeiVLs=
515+
libvirt.org/go/libvirt v1.11006.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ=
510516
sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
511517
sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=

0 commit comments

Comments
 (0)