0

Im would like to retrieve all VMDK files from VMWare. Im 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)
            }
        }
    }
CupaState
  • 65
  • 3

0 Answers0