The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6515
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 5c5df500b40acfcea087041b3387586aa0c1f4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:02:58 -0500 Subject: [PATCH 1/7] lxd/images: Fix image pruning with projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/db/images.go | 24 ++++++++++++++++++++++++ lxd/images.go | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lxd/db/images.go b/lxd/db/images.go index 2db6855437..a3043e2677 100644 --- a/lxd/db/images.go +++ b/lxd/db/images.go @@ -22,6 +22,30 @@ var ImageSourceProtocol = map[int]string{ 2: "simplestreams", } +// ImagesGetLocal returns the names of all local images. +func (c *Cluster) ImagesGetLocal() ([]string, error) { + q := ` +SELECT images.fingerprint + FROM images_nodes + JOIN images ON images.id = images_nodes.image_id + WHERE node_id = ? +` + var fp string + inargs := []interface{}{c.nodeID} + outfmt := []interface{}{fp} + dbResults, err := queryScan(c.db, q, inargs, outfmt) + if err != nil { + return []string{}, err + } + + results := []string{} + for _, r := range dbResults { + results = append(results, r[0].(string)) + } + + return results, nil +} + // ImagesGet returns the names of all images (optionally only the public ones). func (c *Cluster) ImagesGet(project string, public bool) ([]string, error) { err := c.Transaction(func(tx *ClusterTx) error { diff --git a/lxd/images.go b/lxd/images.go index cf989c4011..d848430086 100644 --- a/lxd/images.go +++ b/lxd/images.go @@ -1244,7 +1244,7 @@ func pruneExpiredImagesTask(d *Daemon) (task.Func, task.Schedule) { func pruneLeftoverImages(d *Daemon) { opRun := func(op *operations.Operation) error { // Get all images - images, err := d.cluster.ImagesGet("default", false) + images, err := d.cluster.ImagesGetLocal() if err != nil { return errors.Wrap(err, "Unable to retrieve the list of images") } From f7570e32d492bb716994c87fc291c77befecffd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:34:01 -0500 Subject: [PATCH 2/7] lxd/images: Fix VM image export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/images.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lxd/images.go b/lxd/images.go index d848430086..ce41f0975e 100644 --- a/lxd/images.go +++ b/lxd/images.go @@ -1953,7 +1953,11 @@ func imageExport(d *Daemon, r *http.Request) response.Response { } filename = fmt.Sprintf("%s%s", imgInfo.Fingerprint, ext) - files[1].Identifier = "rootfs" + if imgInfo.Type == "virtual-machine" { + files[1].Identifier = "rootfs.img" + } else { + files[1].Identifier = "rootfs" + } files[1].Path = rootfsPath files[1].Filename = filename From 8109ecbcde60714ec0348500953cad0bdd027195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:34:10 -0500 Subject: [PATCH 3/7] client: Fix VM image export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- client/lxd_images.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/lxd_images.go b/client/lxd_images.go index 519bd9f428..71cf9e8f63 100644 --- a/client/lxd_images.go +++ b/client/lxd_images.go @@ -226,7 +226,7 @@ func lxdDownloadImage(fingerprint string, uri string, userAgent string, client * return nil, err } - if part.FormName() != "rootfs" { + if !shared.StringInSlice(part.FormName(), []string{"rootfs", "rootfs.img"}) { return nil, fmt.Errorf("Invalid multipart image") } From 464514e8b5f3a15809b38d85f5ec7fcdb60b48ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:36:21 -0500 Subject: [PATCH 4/7] shared: Un-restrict archive.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- shared/{archive_linux.go => archive.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename shared/{archive_linux.go => archive.go} (100%) diff --git a/shared/archive_linux.go b/shared/archive.go similarity index 100% rename from shared/archive_linux.go rename to shared/archive.go From 11b34d5208d528303c2b51c75ec5fea0c5ff80c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:47:43 -0500 Subject: [PATCH 5/7] shared: Add qcow2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- shared/archive.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shared/archive.go b/shared/archive.go index a77a09b70a..08b1652138 100644 --- a/shared/archive.go +++ b/shared/archive.go @@ -50,8 +50,9 @@ func DetectCompressionFile(f io.ReadSeeker) ([]string, string, []string, error) case bytes.Equal(header[257:262], []byte{'u', 's', 't', 'a', 'r'}): return []string{"-xf"}, ".tar", []string{}, nil case bytes.Equal(header[0:4], []byte{'h', 's', 'q', 's'}): - return []string{"-xf"}, ".squashfs", - []string{"sqfs2tar", "--no-skip"}, nil + return []string{"-xf"}, ".squashfs", []string{"sqfs2tar", "--no-skip"}, nil + case bytes.Equal(header[0:3], []byte{'Q', 'F', 'I'}): + return []string{""}, ".qcow2", []string{"qemu-img", "convert", "-O", "raw"}, nil default: return nil, "", nil, fmt.Errorf("Unsupported compression") } From 40aa10b48adc5bd72e5c02ec2c2eb2d98fab195b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:50:03 -0500 Subject: [PATCH 6/7] client: Fix VM image import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- client/interfaces.go | 3 +++ client/lxd_images.go | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/interfaces.go b/client/interfaces.go index fb954734f9..b034c1b871 100644 --- a/client/interfaces.go +++ b/client/interfaces.go @@ -336,6 +336,9 @@ type ImageCreateArgs struct { // Progress handler (called with upload progress) ProgressHandler func(progress ioprogress.ProgressData) + + // Type of the image (container or virtual-machine) + Type string } // The ImageFileRequest struct is used for an image download request. diff --git a/client/lxd_images.go b/client/lxd_images.go index 71cf9e8f63..b46213f0cc 100644 --- a/client/lxd_images.go +++ b/client/lxd_images.go @@ -387,7 +387,11 @@ func (r *ProtocolLXD) CreateImage(image api.ImagesPost, args *ImageCreateArgs) ( } // Rootfs file - fw, err = w.CreateFormFile("rootfs", args.RootfsName) + if args.Type == "virtual-machine" { + fw, err = w.CreateFormFile("rootfs.img", args.RootfsName) + } else { + fw, err = w.CreateFormFile("rootfs", args.RootfsName) + } if err != nil { return nil, err } From dc67b895d9a7ffc22b280c04d1c41926d192b2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 26 Nov 2019 12:50:12 -0500 Subject: [PATCH 7/7] lxc/image: Detect type on import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxc/image.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lxc/image.go b/lxc/image.go index 47db1ae9ed..7195093d46 100644 --- a/lxc/image.go +++ b/lxc/image.go @@ -726,6 +726,7 @@ func (c *cmdImageImport) Run(cmd *cobra.Command, args []string) error { Quiet: c.global.flagQuiet, } + imageType := "container" if strings.HasPrefix(imageFile, "https://") { image.Source = &api.ImagesPostSource{} image.Source.Type = "url" @@ -734,8 +735,8 @@ func (c *cmdImageImport) Run(cmd *cobra.Command, args []string) error { image.Source.URL = imageFile createArgs = nil } else { - var meta io.ReadCloser - var rootfs io.ReadCloser + var meta *os.File + var rootfs *os.File // Open meta if shared.IsDir(imageFile) { @@ -760,6 +761,16 @@ func (c *cmdImageImport) Run(cmd *cobra.Command, args []string) error { return err } defer rootfs.Close() + + _, ext, _, err := shared.DetectCompressionFile(rootfs) + if err != nil { + return err + } + rootfs.Seek(0, 0) + + if ext == ".qcow2" { + imageType = "virtual-machine" + } } createArgs = &lxd.ImageCreateArgs{ @@ -768,6 +779,7 @@ func (c *cmdImageImport) Run(cmd *cobra.Command, args []string) error { RootfsFile: rootfs, RootfsName: filepath.Base(rootfsFile), ProgressHandler: progress.UpdateProgress, + Type: imageType, } image.Filename = createArgs.MetaName }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel