123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /*
- Copyright (c) 2015 VMware, Inc. All Rights Reserved.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package object
- import (
- "context"
- "errors"
- "fmt"
- "path"
- "github.com/vmware/govmomi/property"
- "github.com/vmware/govmomi/vim25"
- "github.com/vmware/govmomi/vim25/methods"
- "github.com/vmware/govmomi/vim25/mo"
- "github.com/vmware/govmomi/vim25/types"
- )
- var (
- ErrNotSupported = errors.New("product/version specific feature not supported by target")
- )
- // Common contains the fields and functions common to all objects.
- type Common struct {
- InventoryPath string
- c *vim25.Client
- r types.ManagedObjectReference
- }
- func (c Common) String() string {
- ref := fmt.Sprintf("%v", c.Reference())
- if c.InventoryPath == "" {
- return ref
- }
- return fmt.Sprintf("%s @ %s", ref, c.InventoryPath)
- }
- func NewCommon(c *vim25.Client, r types.ManagedObjectReference) Common {
- return Common{c: c, r: r}
- }
- func (c Common) Reference() types.ManagedObjectReference {
- return c.r
- }
- func (c Common) Client() *vim25.Client {
- return c.c
- }
- // Name returns the base name of the InventoryPath field
- func (c Common) Name() string {
- if c.InventoryPath == "" {
- return ""
- }
- return path.Base(c.InventoryPath)
- }
- func (c *Common) SetInventoryPath(p string) {
- c.InventoryPath = p
- }
- // ObjectName returns the base name of the InventoryPath field if set,
- // otherwise fetches the mo.ManagedEntity.Name field via the property collector.
- func (c Common) ObjectName(ctx context.Context) (string, error) {
- var o mo.ManagedEntity
- err := c.Properties(ctx, c.Reference(), []string{"name"}, &o)
- if err != nil {
- return "", err
- }
- if o.Name != "" {
- return o.Name, nil
- }
- // Network has its own "name" field...
- var n mo.Network
- err = c.Properties(ctx, c.Reference(), []string{"name"}, &n)
- if err != nil {
- return "", err
- }
- return n.Name, nil
- }
- // Properties is a wrapper for property.DefaultCollector().RetrieveOne()
- func (c Common) Properties(ctx context.Context, r types.ManagedObjectReference, ps []string, dst interface{}) error {
- return property.DefaultCollector(c.c).RetrieveOne(ctx, r, ps, dst)
- }
- func (c Common) Destroy(ctx context.Context) (*Task, error) {
- req := types.Destroy_Task{
- This: c.Reference(),
- }
- res, err := methods.Destroy_Task(ctx, c.c, &req)
- if err != nil {
- return nil, err
- }
- return NewTask(c.c, res.Returnval), nil
- }
- func (c Common) Rename(ctx context.Context, name string) (*Task, error) {
- req := types.Rename_Task{
- This: c.Reference(),
- NewName: name,
- }
- res, err := methods.Rename_Task(ctx, c.c, &req)
- if err != nil {
- return nil, err
- }
- return NewTask(c.c, res.Returnval), nil
- }
- func (c Common) SetCustomValue(ctx context.Context, key string, value string) error {
- req := types.SetCustomValue{
- This: c.Reference(),
- Key: key,
- Value: value,
- }
- _, err := methods.SetCustomValue(ctx, c.c, &req)
- return err
- }
|