Fix for Support selection of datastore for dynamic provisioning in vSphere
This commit is contained in:

committed by
Ritesh H Shukla

parent
b201ac2f8f
commit
12f75f0b86
72
vendor/github.com/vmware/govmomi/find/finder.go
generated
vendored
72
vendor/github.com/vmware/govmomi/find/finder.go
generated
vendored
@@ -17,6 +17,7 @@ limitations under the License.
|
||||
package find
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"path"
|
||||
|
||||
@@ -26,7 +27,6 @@ import (
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
type Finder struct {
|
||||
@@ -110,6 +110,35 @@ func (f *Finder) datacenter() (*object.Datacenter, error) {
|
||||
return f.dc, nil
|
||||
}
|
||||
|
||||
// datacenterPath returns the absolute path to the Datacenter containing the given ref
|
||||
func (f *Finder) datacenterPath(ctx context.Context, ref types.ManagedObjectReference) (string, error) {
|
||||
mes, err := mo.Ancestors(ctx, f.client, f.client.ServiceContent.PropertyCollector, ref)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Chop leaves under the Datacenter
|
||||
for i := len(mes) - 1; i > 0; i-- {
|
||||
if mes[i].Self.Type == "Datacenter" {
|
||||
break
|
||||
}
|
||||
mes = mes[:i]
|
||||
}
|
||||
|
||||
var p string
|
||||
|
||||
for _, me := range mes {
|
||||
// Skip root entity in building inventory path.
|
||||
if me.Parent == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
p = p + "/" + me.Name
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (f *Finder) dcFolders(ctx context.Context) (*object.DatacenterFolders, error) {
|
||||
if f.folders != nil {
|
||||
return f.folders, nil
|
||||
@@ -232,6 +261,12 @@ func (f *Finder) ObjectReference(ctx context.Context, ref types.ManagedObjectRef
|
||||
|
||||
r.(common).SetInventoryPath(e.Path)
|
||||
|
||||
if f.dc != nil {
|
||||
if ds, ok := r.(*object.Datastore); ok {
|
||||
ds.DatacenterPath = f.dc.InventoryPath
|
||||
}
|
||||
}
|
||||
|
||||
return r, nil
|
||||
}
|
||||
|
||||
@@ -313,6 +348,16 @@ func (f *Finder) DatastoreList(ctx context.Context, path string) ([]*object.Data
|
||||
ds := object.NewDatastore(f.client, ref)
|
||||
ds.InventoryPath = e.Path
|
||||
|
||||
if f.dc == nil {
|
||||
// In this case SetDatacenter was not called and path is absolute
|
||||
ds.DatacenterPath, err = f.datacenterPath(ctx, ref)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
ds.DatacenterPath = f.dc.InventoryPath
|
||||
}
|
||||
|
||||
dss = append(dss, ds)
|
||||
}
|
||||
}
|
||||
@@ -599,7 +644,7 @@ func (f *Finder) NetworkList(ctx context.Context, path string) ([]object.Network
|
||||
for _, e := range es {
|
||||
ref := e.Object.Reference()
|
||||
switch ref.Type {
|
||||
case "Network":
|
||||
case "Network", "OpaqueNetwork":
|
||||
r := object.NewNetwork(f.client, ref)
|
||||
r.InventoryPath = e.Path
|
||||
ns = append(ns, r)
|
||||
@@ -714,6 +759,29 @@ func (f *Finder) ResourcePoolOrDefault(ctx context.Context, path string) (*objec
|
||||
return f.DefaultResourcePool(ctx)
|
||||
}
|
||||
|
||||
// ResourcePoolListAll combines ResourcePoolList and VirtualAppList
|
||||
// VirtualAppList is only called if ResourcePoolList does not find any pools with the given path.
|
||||
func (f *Finder) ResourcePoolListAll(ctx context.Context, path string) ([]*object.ResourcePool, error) {
|
||||
pools, err := f.ResourcePoolList(ctx, path)
|
||||
if err != nil {
|
||||
if _, ok := err.(*NotFoundError); !ok {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
vapps, _ := f.VirtualAppList(ctx, path)
|
||||
|
||||
if len(vapps) == 0 {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, vapp := range vapps {
|
||||
pools = append(pools, vapp.ResourcePool)
|
||||
}
|
||||
}
|
||||
|
||||
return pools, nil
|
||||
}
|
||||
|
||||
func (f *Finder) DefaultFolder(ctx context.Context) (*object.Folder, error) {
|
||||
ref, err := f.vmFolder(ctx)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user