From d497bc3b839ba586ea7790b8157ad584a9ba2aa4 Mon Sep 17 00:00:00 2001 From: Jozef Mikovic Date: Mon, 25 Jan 2021 16:25:06 +0100 Subject: [PATCH] osbuild-worker: ensure that uploaded vmdk image has the user specified name VMDK image has default name 'disk.vmdk' and there is no option to change the name when uploading to vSphere, so I'm using symlink so that uploaded image has the name user specified instead of the default one. --- cmd/osbuild-worker/jobimpl-osbuild.go | 36 +++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go index b52d67acb..6ec1f558b 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild.go +++ b/cmd/osbuild-worker/jobimpl-osbuild.go @@ -88,6 +88,8 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { end_time := time.Now() + var streamOptimizedPath string = "" + if osbuildOutput.Success && args.ImageName != "" { var f *os.File imagePath := path.Join(outputDirectory, args.ImageName) @@ -96,6 +98,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { if err != nil { return err } + streamOptimizedPath = f.Name() } else { f, err = os.Open(imagePath) if err != nil { @@ -141,16 +144,6 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { if !osbuildOutput.Success { continue } - var f *os.File - imagePath := path.Join(outputDirectory, options.Filename) - f, err = vmware.OpenAsStreamOptimizedVmdk(imagePath) - if err != nil { - r = append(r, err) - continue - } - // we don't need the file descriptor to be opened b/c import.vmdk operates on the file path - f.Close() - imagePath = f.Name() credentials := vmware.Credentials{ Username: options.Username, @@ -160,6 +153,29 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { Datacenter: options.Datacenter, Datastore: options.Datastore, } + + tempDirectory, err := ioutil.TempDir("/var/tmp", "osbuild-worker-vmware-*") + if err != nil { + r = append(r, err) + continue + } + + defer func() { + err := os.RemoveAll(tempDirectory) + if err != nil { + log.Printf("Error removing temporary directory for vmware symlink(%s): %v", tempDirectory, err) + } + }() + + // create a symlink so that uploaded image has the name specified by user + imageName := t.ImageName + ".vmdk" + imagePath := path.Join(tempDirectory, imageName) + err = os.Symlink(streamOptimizedPath, imagePath) + if err != nil { + r = append(r, err) + continue + } + err = vmware.UploadImage(credentials, imagePath, t.ImageName) if err != nil { r = append(r, err)