From 8a8607cdf635869f24ad5d76f8ab0429f4bb6e16 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Mon, 8 May 2023 16:06:35 +0200 Subject: [PATCH] internal/vmware: add support for the GOVC_FOLDER option When importing the ova it also creates a VM, and users don't always have permission to register in the default folder. --- cmd/osbuild-worker/jobimpl-osbuild.go | 1 + internal/target/vmware_target.go | 1 + internal/upload/vmware/vmware.go | 32 +++++++++++++++++---------- internal/weldr/upload.go | 2 ++ 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go index ca9ab9cec..44fc06416 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild.go +++ b/cmd/osbuild-worker/jobimpl-osbuild.go @@ -437,6 +437,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { Cluster: targetOptions.Cluster, Datacenter: targetOptions.Datacenter, Datastore: targetOptions.Datastore, + Folder: targetOptions.Folder, } tempDirectory, err := os.MkdirTemp(impl.Output, job.Id().String()+"-vmware-*") diff --git a/internal/target/vmware_target.go b/internal/target/vmware_target.go index 72f8be877..594ab1cf0 100644 --- a/internal/target/vmware_target.go +++ b/internal/target/vmware_target.go @@ -9,6 +9,7 @@ type VMWareTargetOptions struct { Datacenter string `json:"datacenter"` Cluster string `json:"cluster"` Datastore string `json:"datastore"` + Folder string `json:"folder"` } func (VMWareTargetOptions) isTargetOptions() {} diff --git a/internal/upload/vmware/vmware.go b/internal/upload/vmware/vmware.go index b3823e15c..d2a9b52ac 100644 --- a/internal/upload/vmware/vmware.go +++ b/internal/upload/vmware/vmware.go @@ -14,6 +14,22 @@ type Credentials struct { Datacenter string Cluster string Datastore string + Folder string +} + +func commonOptions(creds Credentials) []string { + args := []string{ + fmt.Sprintf("-u=%s:%s@%s", creds.Username, creds.Password, creds.Host), + "-k=true", + fmt.Sprintf("-pool=%s/Resources", creds.Cluster), + fmt.Sprintf("-dc=%s", creds.Datacenter), + fmt.Sprintf("-ds=%s", creds.Datastore), + } + if creds.Folder != "" { + args = append(args, fmt.Sprintf("-folder=%s", creds.Folder)) + } + + return args } // ImportVmdk is a function that uploads a stream optimized vmdk image to vSphere @@ -21,13 +37,9 @@ type Credentials struct { func ImportVmdk(creds Credentials, imagePath string) error { args := []string{ "import.vmdk", - fmt.Sprintf("-u=%s:%s@%s", creds.Username, creds.Password, creds.Host), - "-k=true", - fmt.Sprintf("-pool=%s/Resources", creds.Cluster), - fmt.Sprintf("-dc=%s", creds.Datacenter), - fmt.Sprintf("-ds=%s", creds.Datastore), - imagePath, } + args = append(args, commonOptions(creds)...) + args = append(args, imagePath) retcode := cli.Run(args) if retcode != 0 { @@ -39,14 +51,10 @@ func ImportVmdk(creds Credentials, imagePath string) error { func ImportOva(creds Credentials, imagePath, targetName string) error { args := []string{ "import.ova", - fmt.Sprintf("-u=%s:%s@%s", creds.Username, creds.Password, creds.Host), - "-k=true", - fmt.Sprintf("-pool=%s/Resources", creds.Cluster), - fmt.Sprintf("-dc=%s", creds.Datacenter), - fmt.Sprintf("-ds=%s", creds.Datastore), fmt.Sprintf("-name=%s", targetName), - imagePath, } + args = append(args, commonOptions(creds)...) + args = append(args, imagePath) retcode := cli.Run(args) if retcode != 0 { diff --git a/internal/weldr/upload.go b/internal/weldr/upload.go index 233a7c9c0..01ad9422a 100644 --- a/internal/weldr/upload.go +++ b/internal/weldr/upload.go @@ -81,6 +81,7 @@ type vmwareUploadSettings struct { Datacenter string `json:"datacenter"` Cluster string `json:"cluster"` Datastore string `json:"datastore"` + Folder string `json:"folder"` } func (vmwareUploadSettings) isUploadSettings() {} @@ -340,6 +341,7 @@ func uploadRequestToTarget(u uploadRequest, imageType distro.ImageType) *target. Cluster: options.Cluster, Datacenter: options.Datacenter, Datastore: options.Datastore, + Folder: options.Folder, } case *ociUploadSettings: t.Name = target.TargetNameOCI