package vmware import ( "errors" "fmt" "os" "os/exec" "strings" "github.com/vmware/govmomi/govc/cli" _ "github.com/vmware/govmomi/govc/importx" ) type Credentials struct { Host string Username string Password string Datacenter string Cluster string Datastore string } func OpenAsStreamOptimizedVmdk(imagePath string) (*os.File, error) { newPath := strings.TrimSuffix(imagePath, ".vmdk") + "-stream.vmdk" cmd := exec.Command( "/usr/bin/qemu-img", "convert", "-O", "vmdk", "-o", "subformat=streamOptimized", imagePath, newPath) err := cmd.Run() if err != nil { return nil, err } f, err := os.Open(newPath) if err != nil { return nil, err } return f, err } // UploadImage is a function that uploads a stream optimized vmdk image to vSphere // uploaded image will be present in a directory of the same name func UploadImage(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, } retcode := cli.Run(args) if retcode != 0 { return errors.New("importing vmdk failed") } return nil }