func (l Lister) ListDatacenter(ctx context.Context) ([]Element, error) { ospec := types.ObjectSpec{ Obj: l.Reference, Skip: types.NewBool(true), } // Include every datastore folder in the select set fields := []string{ "vmFolder", "hostFolder", "datastoreFolder", "networkFolder", } for _, f := range fields { tspec := types.TraversalSpec{ Path: f, Skip: types.NewBool(false), Type: "Datacenter", } ospec.SelectSet = append(ospec.SelectSet, &tspec) } pspec := types.PropertySpec{ Type: "Folder", } if l.All { pspec.All = types.NewBool(true) } else { pspec.PathSet = []string{"name"} } req := types.RetrieveProperties{ SpecSet: []types.PropertyFilterSpec{ { ObjectSet: []types.ObjectSpec{ospec}, PropSet: []types.PropertySpec{pspec}, }, }, } var dst []interface{} err := l.retrieveProperties(ctx, req, &dst) if err != nil { return nil, err } es := []Element{} for _, v := range dst { es = append(es, ToElement(v.(mo.Reference), l.Prefix)) } return es, nil }
// Retrieve loads properties for a slice of managed objects. The dst argument // must be a pointer to a []interface{}, which is populated with the instances // of the specified managed objects, with the relevant properties filled in. If // the properties slice is nil, all properties are loaded. func (p *Collector) Retrieve(ctx context.Context, objs []types.ManagedObjectReference, ps []string, dst interface{}) error { var propSpec *types.PropertySpec var objectSet []types.ObjectSpec for _, obj := range objs { // Ensure that all object reference types are the same if propSpec == nil { propSpec = &types.PropertySpec{ Type: obj.Type, } if ps == nil { propSpec.All = types.NewBool(true) } else { propSpec.PathSet = ps } } else { if obj.Type != propSpec.Type { return errors.New("object references must have the same type") } } objectSpec := types.ObjectSpec{ Obj: obj, Skip: types.NewBool(false), } objectSet = append(objectSet, objectSpec) } req := types.RetrieveProperties{ SpecSet: []types.PropertyFilterSpec{ { ObjectSet: objectSet, PropSet: []types.PropertySpec{*propSpec}, }, }, } res, err := p.RetrieveProperties(ctx, req) if err != nil { return err } return mo.LoadRetrievePropertiesResponse(res, dst) }
func (l Lister) ListVirtualApp(ctx context.Context) ([]Element, error) { ospec := types.ObjectSpec{ Obj: l.Reference, Skip: types.NewBool(true), } fields := []string{ "resourcePool", "vm", } for _, f := range fields { tspec := types.TraversalSpec{ Path: f, Skip: types.NewBool(false), Type: "VirtualApp", } ospec.SelectSet = append(ospec.SelectSet, &tspec) } childTypes := []string{ "ResourcePool", "VirtualMachine", } var pspecs []types.PropertySpec for _, t := range childTypes { pspec := types.PropertySpec{ Type: t, } if l.All { pspec.All = types.NewBool(true) } else { pspec.PathSet = []string{"name"} } pspecs = append(pspecs, pspec) } req := types.RetrieveProperties{ SpecSet: []types.PropertyFilterSpec{ { ObjectSet: []types.ObjectSpec{ospec}, PropSet: pspecs, }, }, } var dst []interface{} err := l.retrieveProperties(ctx, req, &dst) if err != nil { return nil, err } es := []Element{} for _, v := range dst { es = append(es, ToElement(v.(mo.Reference), l.Prefix)) } return es, nil }
func (l Lister) ListFolder(ctx context.Context) ([]Element, error) { spec := types.PropertyFilterSpec{ ObjectSet: []types.ObjectSpec{ { Obj: l.Reference, SelectSet: []types.BaseSelectionSpec{ &types.TraversalSpec{ Path: "childEntity", Skip: types.NewBool(false), Type: "Folder", }, }, Skip: types.NewBool(true), }, }, } // Retrieve all objects that we can deal with childTypes := []string{ "Folder", "Datacenter", "VirtualApp", "VirtualMachine", "Network", "ComputeResource", "ClusterComputeResource", "Datastore", "DistributedVirtualSwitch", } for _, t := range childTypes { pspec := types.PropertySpec{ Type: t, } if l.All { pspec.All = types.NewBool(true) } else { pspec.PathSet = []string{"name"} // Additional basic properties. switch t { case "ComputeResource", "ClusterComputeResource": // The ComputeResource and ClusterComputeResource are dereferenced in // the ResourcePoolFlag. Make sure they always have their resourcePool // field populated. pspec.PathSet = append(pspec.PathSet, "resourcePool") } } spec.PropSet = append(spec.PropSet, pspec) } req := types.RetrieveProperties{ SpecSet: []types.PropertyFilterSpec{spec}, } var dst []interface{} err := l.retrieveProperties(ctx, req, &dst) if err != nil { return nil, err } es := []Element{} for _, v := range dst { es = append(es, ToElement(v.(mo.Reference), l.Prefix)) } return es, nil }