Im would like to retrieve all VMDK files from VMWare. I
m using Golang and govmomi library. I know about Download method which attached to vim25.Client, but I should URL`s of vmdk files to download it. How do I get this URL or maybe u know another method to download it automatically?
I can work with vSphere API, cat get all vms and vmdk names, can make snapshots, but I can`t download it. Help me, please!
func main() {
// Set up connection parameters
host := os.Getenv("HOST")
username := os.Getenv("USERNAME")
password := os.Getenv("PASSWORD")
u, err := url.Parse(host)
if err != nil {
fmt.Printf("Parse: %v\n", err)
os.Exit(1)
}
u.User = url.UserPassword(username, password)
ctx := context.Background()
// Create client
c, err := govmomi.NewClient(ctx, u, true)
if err != nil {
fmt.Printf("govmomi.NewClient: %v\n", err)
os.Exit(2)
}
defer c.Logout(ctx)
// find all vms
f := find.NewFinder(c.Client, true)
dc, err := f.DefaultDatacenter(ctx)
if err != nil {
fmt.Printf("Datacenter: %v", err)
os.Exit(432)
}
f.SetDatacenter(dc)
d, err := f.DefaultDatastore(ctx)
if err != nil {
fmt.Printf("Datastore: %v\n", err)
os.Exit(1)
}
fmt.Printf("Datastore format: %s\n", d.String())
datastores, err := f.DatastoreList(ctx, "*")
if err != nil {
fmt.Printf("DatastoreList: %v\n", err)
os.Exit(4)
}
for _, ds := range datastores {
hostDatastoseBrowser, err := ds.Browser(ctx)
if err != nil {
fmt.Printf("Browser: %v\n", err)
continue
}
// pattern to searching vmdk images
searchSpec := types.HostDatastoreBrowserSearchSpec {
Query: nil,
MatchPattern: []string{"*.vmdk"},
}
// search files in datastore
task, err := hostDatastoseBrowser.SearchDatastoreSubFolders(ctx, ds.Path("[datastore1]"), &searchSpec)
if err != nil {
fmt.Printf("SearchDatastore ::: Failed to list VMDK files on datastore %s: %v\n", ds.Name(), err)
continue
}
info, err := task.WaitForResult(ctx, nil)
if err != nil {
fmt.Printf("WaitForResult: %v\n", err)
continue
}
results := info.Result.(types.ArrayOfHostDatastoreBrowserSearchResults)
fmt.Printf("Results: %v\n\n", results)
for _, file := range results.HostDatastoreBrowserSearchResults {
for _, f := range file.File {
fmt.Printf("VMDK file: %s\n\n", f.GetFileInfo().Path)
c.DownloadFile(ctx, f.GetFileInfo().Path, /*URL*/, &soap.DefaultDownload)
}
}
}