Blame vendor/github.com/vmware/govmomi/property/collector.go

Packit Service 4d2de5
/*
Packit Service 4d2de5
Copyright (c) 2015 VMware, Inc. All Rights Reserved.
Packit Service 4d2de5
Packit Service 4d2de5
Licensed under the Apache License, Version 2.0 (the "License");
Packit Service 4d2de5
you may not use this file except in compliance with the License.
Packit Service 4d2de5
You may obtain a copy of the License at
Packit Service 4d2de5
Packit Service 4d2de5
    http://www.apache.org/licenses/LICENSE-2.0
Packit Service 4d2de5
Packit Service 4d2de5
Unless required by applicable law or agreed to in writing, software
Packit Service 4d2de5
distributed under the License is distributed on an "AS IS" BASIS,
Packit Service 4d2de5
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service 4d2de5
See the License for the specific language governing permissions and
Packit Service 4d2de5
limitations under the License.
Packit Service 4d2de5
*/
Packit Service 4d2de5
Packit Service 4d2de5
package property
Packit Service 4d2de5
Packit Service 4d2de5
import (
Packit Service 4d2de5
	"context"
Packit Service 4d2de5
	"errors"
Packit Service 4d2de5
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/methods"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/mo"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/soap"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/types"
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
// Collector models the PropertyCollector managed object.
Packit Service 4d2de5
//
Packit Service 4d2de5
// For more information, see:
Packit Service 4d2de5
// http://pubs.vmware.com/vsphere-60/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc%2Fvmodl.query.PropertyCollector.html
Packit Service 4d2de5
//
Packit Service 4d2de5
type Collector struct {
Packit Service 4d2de5
	roundTripper soap.RoundTripper
Packit Service 4d2de5
	reference    types.ManagedObjectReference
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// DefaultCollector returns the session's default property collector.
Packit Service 4d2de5
func DefaultCollector(c *vim25.Client) *Collector {
Packit Service 4d2de5
	p := Collector{
Packit Service 4d2de5
		roundTripper: c,
Packit Service 4d2de5
		reference:    c.ServiceContent.PropertyCollector,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return &p
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (p Collector) Reference() types.ManagedObjectReference {
Packit Service 4d2de5
	return p.reference
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Create creates a new session-specific Collector that can be used to
Packit Service 4d2de5
// retrieve property updates independent of any other Collector.
Packit Service 4d2de5
func (p *Collector) Create(ctx context.Context) (*Collector, error) {
Packit Service 4d2de5
	req := types.CreatePropertyCollector{
Packit Service 4d2de5
		This: p.Reference(),
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	res, err := methods.CreatePropertyCollector(ctx, p.roundTripper, &req)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	newp := Collector{
Packit Service 4d2de5
		roundTripper: p.roundTripper,
Packit Service 4d2de5
		reference:    res.Returnval,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return &newp, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Destroy destroys this Collector.
Packit Service 4d2de5
func (p *Collector) Destroy(ctx context.Context) error {
Packit Service 4d2de5
	req := types.DestroyPropertyCollector{
Packit Service 4d2de5
		This: p.Reference(),
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	_, err := methods.DestroyPropertyCollector(ctx, p.roundTripper, &req)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	p.reference = types.ManagedObjectReference{}
Packit Service 4d2de5
	return nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (p *Collector) CreateFilter(ctx context.Context, req types.CreateFilter) error {
Packit Service 4d2de5
	req.This = p.Reference()
Packit Service 4d2de5
Packit Service 4d2de5
	_, err := methods.CreateFilter(ctx, p.roundTripper, &req)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (p *Collector) WaitForUpdates(ctx context.Context, v string) (*types.UpdateSet, error) {
Packit Service 4d2de5
	req := types.WaitForUpdatesEx{
Packit Service 4d2de5
		This:    p.Reference(),
Packit Service 4d2de5
		Version: v,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	res, err := methods.WaitForUpdatesEx(ctx, p.roundTripper, &req)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return res.Returnval, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (p *Collector) CancelWaitForUpdates(ctx context.Context) error {
Packit Service 4d2de5
	req := &types.CancelWaitForUpdates{This: p.Reference()}
Packit Service 4d2de5
	_, err := methods.CancelWaitForUpdates(ctx, p.roundTripper, req)
Packit Service 4d2de5
	return err
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (p *Collector) RetrieveProperties(ctx context.Context, req types.RetrieveProperties) (*types.RetrievePropertiesResponse, error) {
Packit Service 4d2de5
	req.This = p.Reference()
Packit Service 4d2de5
	return methods.RetrieveProperties(ctx, p.roundTripper, &req)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Retrieve loads properties for a slice of managed objects. The dst argument
Packit Service 4d2de5
// must be a pointer to a []interface{}, which is populated with the instances
Packit Service 4d2de5
// of the specified managed objects, with the relevant properties filled in. If
Packit Service 4d2de5
// the properties slice is nil, all properties are loaded.
Packit Service 4d2de5
// Note that pointer types are optional fields that may be left as a nil value.
Packit Service 4d2de5
// The caller should check such fields for a nil value before dereferencing.
Packit Service 4d2de5
func (p *Collector) Retrieve(ctx context.Context, objs []types.ManagedObjectReference, ps []string, dst interface{}) error {
Packit Service 4d2de5
	if len(objs) == 0 {
Packit Service 4d2de5
		return errors.New("object references is empty")
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	kinds := make(map[string]bool)
Packit Service 4d2de5
Packit Service 4d2de5
	var propSet []types.PropertySpec
Packit Service 4d2de5
	var objectSet []types.ObjectSpec
Packit Service 4d2de5
Packit Service 4d2de5
	for _, obj := range objs {
Packit Service 4d2de5
		if _, ok := kinds[obj.Type]; !ok {
Packit Service 4d2de5
			spec := types.PropertySpec{
Packit Service 4d2de5
				Type: obj.Type,
Packit Service 4d2de5
			}
Packit Service 4d2de5
			if len(ps) == 0 {
Packit Service 4d2de5
				spec.All = types.NewBool(true)
Packit Service 4d2de5
			} else {
Packit Service 4d2de5
				spec.PathSet = ps
Packit Service 4d2de5
			}
Packit Service 4d2de5
			propSet = append(propSet, spec)
Packit Service 4d2de5
			kinds[obj.Type] = true
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		objectSpec := types.ObjectSpec{
Packit Service 4d2de5
			Obj:  obj,
Packit Service 4d2de5
			Skip: types.NewBool(false),
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		objectSet = append(objectSet, objectSpec)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	req := types.RetrieveProperties{
Packit Service 4d2de5
		SpecSet: []types.PropertyFilterSpec{
Packit Service 4d2de5
			{
Packit Service 4d2de5
				ObjectSet: objectSet,
Packit Service 4d2de5
				PropSet:   propSet,
Packit Service 4d2de5
			},
Packit Service 4d2de5
		},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	res, err := p.RetrieveProperties(ctx, req)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if d, ok := dst.(*[]types.ObjectContent); ok {
Packit Service 4d2de5
		*d = res.Returnval
Packit Service 4d2de5
		return nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return mo.LoadObjectContent(res.Returnval, dst)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// RetrieveWithFilter populates dst as Retrieve does, but only for entities matching the given filter.
Packit Service 4d2de5
func (p *Collector) RetrieveWithFilter(ctx context.Context, objs []types.ManagedObjectReference, ps []string, dst interface{}, filter Filter) error {
Packit Service 4d2de5
	if len(filter) == 0 {
Packit Service 4d2de5
		return p.Retrieve(ctx, objs, ps, dst)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var content []types.ObjectContent
Packit Service 4d2de5
Packit Service 4d2de5
	err := p.Retrieve(ctx, objs, filter.Keys(), &content)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	objs = filter.MatchObjectContent(content)
Packit Service 4d2de5
Packit Service 4d2de5
	if len(objs) == 0 {
Packit Service 4d2de5
		return nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return p.Retrieve(ctx, objs, ps, dst)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// RetrieveOne calls Retrieve with a single managed object reference via Collector.Retrieve().
Packit Service 4d2de5
func (p *Collector) RetrieveOne(ctx context.Context, obj types.ManagedObjectReference, ps []string, dst interface{}) error {
Packit Service 4d2de5
	var objs = []types.ManagedObjectReference{obj}
Packit Service 4d2de5
	return p.Retrieve(ctx, objs, ps, dst)
Packit Service 4d2de5
}