func deleteFolder(client *govmomi.Client, f *folder) error { dc, err := getDatacenter(client, f.datacenter) if err != nil { return err } var folder *object.Folder currentPath := f.path finder := find.NewFinder(client.Client, true) finder = finder.SetDatacenter(dc) si := object.NewSearchIndex(client.Client) folderRef, err := si.FindByInventoryPath( context.TODO(), fmt.Sprintf("%v/vm/%v", f.datacenter, f.path)) if err != nil { return fmt.Errorf("[ERROR] Could not locate folder %s: %v", f.path, err) } else { folder = folderRef.(*object.Folder) } log.Printf("[INFO] Deleting empty sub-folders of existing path: %s", f.existingPath) for currentPath != f.existingPath { log.Printf("[INFO] Deleting folder: %s", currentPath) children, err := folder.Children(context.TODO()) if err != nil { return err } if len(children) > 0 { return fmt.Errorf("Folder %s is non-empty and will not be deleted", currentPath) } else { log.Printf("[DEBUG] current folder: %#v", folder) currentPath = path.Dir(currentPath) if currentPath == "." { currentPath = "" } log.Printf("[INFO] parent path of %s is calculated as %s", f.path, currentPath) task, err := folder.Destroy(context.TODO()) if err != nil { return err } err = task.Wait(context.TODO()) if err != nil { return err } folderRef, err = si.FindByInventoryPath( context.TODO(), fmt.Sprintf("%v/vm/%v", f.datacenter, currentPath)) if err != nil { return err } else if folderRef != nil { folder = folderRef.(*object.Folder) } } } return nil }