tests: upload & test in vCenter. Closes #338
This commit is contained in:
parent
02346faff8
commit
9cce43d384
255 changed files with 127290 additions and 3 deletions
174
vendor/github.com/vmware/govmomi/object/authorization_manager.go
generated
vendored
Normal file
174
vendor/github.com/vmware/govmomi/object/authorization_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type AuthorizationManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewAuthorizationManager(c *vim25.Client) *AuthorizationManager {
|
||||
m := AuthorizationManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.AuthorizationManager),
|
||||
}
|
||||
|
||||
return &m
|
||||
}
|
||||
|
||||
type AuthorizationRoleList []types.AuthorizationRole
|
||||
|
||||
func (l AuthorizationRoleList) ById(id int32) *types.AuthorizationRole {
|
||||
for _, role := range l {
|
||||
if role.RoleId == id {
|
||||
return &role
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l AuthorizationRoleList) ByName(name string) *types.AuthorizationRole {
|
||||
for _, role := range l {
|
||||
if role.Name == name {
|
||||
return &role
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RoleList(ctx context.Context) (AuthorizationRoleList, error) {
|
||||
var am mo.AuthorizationManager
|
||||
|
||||
err := m.Properties(ctx, m.Reference(), []string{"roleList"}, &am)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return AuthorizationRoleList(am.RoleList), nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RetrieveEntityPermissions(ctx context.Context, entity types.ManagedObjectReference, inherited bool) ([]types.Permission, error) {
|
||||
req := types.RetrieveEntityPermissions{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
Inherited: inherited,
|
||||
}
|
||||
|
||||
res, err := methods.RetrieveEntityPermissions(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RemoveEntityPermission(ctx context.Context, entity types.ManagedObjectReference, user string, isGroup bool) error {
|
||||
req := types.RemoveEntityPermission{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
User: user,
|
||||
IsGroup: isGroup,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveEntityPermission(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) SetEntityPermissions(ctx context.Context, entity types.ManagedObjectReference, permission []types.Permission) error {
|
||||
req := types.SetEntityPermissions{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
Permission: permission,
|
||||
}
|
||||
|
||||
_, err := methods.SetEntityPermissions(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RetrieveRolePermissions(ctx context.Context, id int32) ([]types.Permission, error) {
|
||||
req := types.RetrieveRolePermissions{
|
||||
This: m.Reference(),
|
||||
RoleId: id,
|
||||
}
|
||||
|
||||
res, err := methods.RetrieveRolePermissions(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RetrieveAllPermissions(ctx context.Context) ([]types.Permission, error) {
|
||||
req := types.RetrieveAllPermissions{
|
||||
This: m.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.RetrieveAllPermissions(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) AddRole(ctx context.Context, name string, ids []string) (int32, error) {
|
||||
req := types.AddAuthorizationRole{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
PrivIds: ids,
|
||||
}
|
||||
|
||||
res, err := methods.AddAuthorizationRole(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) RemoveRole(ctx context.Context, id int32, failIfUsed bool) error {
|
||||
req := types.RemoveAuthorizationRole{
|
||||
This: m.Reference(),
|
||||
RoleId: id,
|
||||
FailIfUsed: failIfUsed,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveAuthorizationRole(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m AuthorizationManager) UpdateRole(ctx context.Context, id int32, name string, ids []string) error {
|
||||
req := types.UpdateAuthorizationRole{
|
||||
This: m.Reference(),
|
||||
RoleId: id,
|
||||
NewName: name,
|
||||
PrivIds: ids,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateAuthorizationRole(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
86
vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go
generated
vendored
Normal file
86
vendor/github.com/vmware/govmomi/object/authorization_manager_internal.go
generated
vendored
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
Copyright (c) 2017 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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DisabledMethodRequest struct {
|
||||
Method string `xml:"method"`
|
||||
Reason string `xml:"reasonId"`
|
||||
}
|
||||
|
||||
type disableMethodsRequest struct {
|
||||
This types.ManagedObjectReference `xml:"_this"`
|
||||
Entity []types.ManagedObjectReference `xml:"entity"`
|
||||
Method []DisabledMethodRequest `xml:"method"`
|
||||
Source string `xml:"sourceId"`
|
||||
Scope bool `xml:"sessionScope,omitempty"`
|
||||
}
|
||||
|
||||
type disableMethodsBody struct {
|
||||
Req *disableMethodsRequest `xml:"urn:internalvim25 DisableMethods,omitempty"`
|
||||
Res interface{} `xml:"urn:vim25 DisableMethodsResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *disableMethodsBody) Fault() *soap.Fault { return b.Err }
|
||||
|
||||
func (m AuthorizationManager) DisableMethods(ctx context.Context, entity []types.ManagedObjectReference, method []DisabledMethodRequest, source string) error {
|
||||
var reqBody, resBody disableMethodsBody
|
||||
|
||||
reqBody.Req = &disableMethodsRequest{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
Method: method,
|
||||
Source: source,
|
||||
}
|
||||
|
||||
return m.Client().RoundTrip(ctx, &reqBody, &resBody)
|
||||
}
|
||||
|
||||
type enableMethodsRequest struct {
|
||||
This types.ManagedObjectReference `xml:"_this"`
|
||||
Entity []types.ManagedObjectReference `xml:"entity"`
|
||||
Method []string `xml:"method"`
|
||||
Source string `xml:"sourceId"`
|
||||
}
|
||||
|
||||
type enableMethodsBody struct {
|
||||
Req *enableMethodsRequest `xml:"urn:internalvim25 EnableMethods,omitempty"`
|
||||
Res interface{} `xml:"urn:vim25 EnableMethodsResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *enableMethodsBody) Fault() *soap.Fault { return b.Err }
|
||||
|
||||
func (m AuthorizationManager) EnableMethods(ctx context.Context, entity []types.ManagedObjectReference, method []string, source string) error {
|
||||
var reqBody, resBody enableMethodsBody
|
||||
|
||||
reqBody.Req = &enableMethodsRequest{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
Method: method,
|
||||
Source: source,
|
||||
}
|
||||
|
||||
return m.Client().RoundTrip(ctx, &reqBody, &resBody)
|
||||
}
|
||||
103
vendor/github.com/vmware/govmomi/object/cluster_compute_resource.go
generated
vendored
Normal file
103
vendor/github.com/vmware/govmomi/object/cluster_compute_resource.go
generated
vendored
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type ClusterComputeResource struct {
|
||||
ComputeResource
|
||||
}
|
||||
|
||||
func NewClusterComputeResource(c *vim25.Client, ref types.ManagedObjectReference) *ClusterComputeResource {
|
||||
return &ClusterComputeResource{
|
||||
ComputeResource: *NewComputeResource(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (c ClusterComputeResource) Configuration(ctx context.Context) (*types.ClusterConfigInfoEx, error) {
|
||||
var obj mo.ClusterComputeResource
|
||||
|
||||
err := c.Properties(ctx, c.Reference(), []string{"configurationEx"}, &obj)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return obj.ConfigurationEx.(*types.ClusterConfigInfoEx), nil
|
||||
}
|
||||
|
||||
func (c ClusterComputeResource) AddHost(ctx context.Context, spec types.HostConnectSpec, asConnected bool, license *string, resourcePool *types.ManagedObjectReference) (*Task, error) {
|
||||
req := types.AddHost_Task{
|
||||
This: c.Reference(),
|
||||
Spec: spec,
|
||||
AsConnected: asConnected,
|
||||
}
|
||||
|
||||
if license != nil {
|
||||
req.License = *license
|
||||
}
|
||||
|
||||
if resourcePool != nil {
|
||||
req.ResourcePool = resourcePool
|
||||
}
|
||||
|
||||
res, err := methods.AddHost_Task(ctx, c.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(c.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (c ClusterComputeResource) MoveInto(ctx context.Context, hosts ...*HostSystem) (*Task, error) {
|
||||
req := types.MoveInto_Task{
|
||||
This: c.Reference(),
|
||||
}
|
||||
|
||||
hostReferences := make([]types.ManagedObjectReference, len(hosts))
|
||||
for i, host := range hosts {
|
||||
hostReferences[i] = host.Reference()
|
||||
}
|
||||
req.Host = hostReferences
|
||||
|
||||
res, err := methods.MoveInto_Task(ctx, c.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(c.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (c ClusterComputeResource) PlaceVm(ctx context.Context, spec types.PlacementSpec) (*types.PlacementResult, error) {
|
||||
req := types.PlaceVm{
|
||||
This: c.Reference(),
|
||||
PlacementSpec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.PlaceVm(ctx, c.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
136
vendor/github.com/vmware/govmomi/object/common.go
generated
vendored
Normal file
136
vendor/github.com/vmware/govmomi/object/common.go
generated
vendored
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
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/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 fetches the mo.ManagedEntity.Name field via the property collector.
|
||||
func (c Common) ObjectName(ctx context.Context) (string, error) {
|
||||
var content []types.ObjectContent
|
||||
|
||||
err := c.Properties(ctx, c.Reference(), []string{"name"}, &content)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
for i := range content {
|
||||
for _, prop := range content[i].PropSet {
|
||||
return prop.Val.(string), nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", 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
|
||||
}
|
||||
111
vendor/github.com/vmware/govmomi/object/compute_resource.go
generated
vendored
Normal file
111
vendor/github.com/vmware/govmomi/object/compute_resource.go
generated
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
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"
|
||||
"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"
|
||||
)
|
||||
|
||||
type ComputeResource struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewComputeResource(c *vim25.Client, ref types.ManagedObjectReference) *ComputeResource {
|
||||
return &ComputeResource{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (c ComputeResource) Hosts(ctx context.Context) ([]*HostSystem, error) {
|
||||
var cr mo.ComputeResource
|
||||
|
||||
err := c.Properties(ctx, c.Reference(), []string{"host"}, &cr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(cr.Host) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var hs []mo.HostSystem
|
||||
pc := property.DefaultCollector(c.Client())
|
||||
err = pc.Retrieve(ctx, cr.Host, []string{"name"}, &hs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var hosts []*HostSystem
|
||||
|
||||
for _, h := range hs {
|
||||
host := NewHostSystem(c.Client(), h.Reference())
|
||||
host.InventoryPath = path.Join(c.InventoryPath, h.Name)
|
||||
hosts = append(hosts, host)
|
||||
}
|
||||
|
||||
return hosts, nil
|
||||
}
|
||||
|
||||
func (c ComputeResource) Datastores(ctx context.Context) ([]*Datastore, error) {
|
||||
var cr mo.ComputeResource
|
||||
|
||||
err := c.Properties(ctx, c.Reference(), []string{"datastore"}, &cr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var dss []*Datastore
|
||||
for _, ref := range cr.Datastore {
|
||||
ds := NewDatastore(c.c, ref)
|
||||
dss = append(dss, ds)
|
||||
}
|
||||
|
||||
return dss, nil
|
||||
}
|
||||
|
||||
func (c ComputeResource) ResourcePool(ctx context.Context) (*ResourcePool, error) {
|
||||
var cr mo.ComputeResource
|
||||
|
||||
err := c.Properties(ctx, c.Reference(), []string{"resourcePool"}, &cr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewResourcePool(c.c, *cr.ResourcePool), nil
|
||||
}
|
||||
|
||||
func (c ComputeResource) Reconfigure(ctx context.Context, spec types.BaseComputeResourceConfigSpec, modify bool) (*Task, error) {
|
||||
req := types.ReconfigureComputeResource_Task{
|
||||
This: c.Reference(),
|
||||
Spec: spec,
|
||||
Modify: modify,
|
||||
}
|
||||
|
||||
res, err := methods.ReconfigureComputeResource_Task(ctx, c.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(c.c, res.Returnval), nil
|
||||
}
|
||||
146
vendor/github.com/vmware/govmomi/object/custom_fields_manager.go
generated
vendored
Normal file
146
vendor/github.com/vmware/govmomi/object/custom_fields_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
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"
|
||||
"strconv"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrKeyNameNotFound = errors.New("key name not found")
|
||||
)
|
||||
|
||||
type CustomFieldsManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
// GetCustomFieldsManager wraps NewCustomFieldsManager, returning ErrNotSupported
|
||||
// when the client is not connected to a vCenter instance.
|
||||
func GetCustomFieldsManager(c *vim25.Client) (*CustomFieldsManager, error) {
|
||||
if c.ServiceContent.CustomFieldsManager == nil {
|
||||
return nil, ErrNotSupported
|
||||
}
|
||||
return NewCustomFieldsManager(c), nil
|
||||
}
|
||||
|
||||
func NewCustomFieldsManager(c *vim25.Client) *CustomFieldsManager {
|
||||
m := CustomFieldsManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.CustomFieldsManager),
|
||||
}
|
||||
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m CustomFieldsManager) Add(ctx context.Context, name string, moType string, fieldDefPolicy *types.PrivilegePolicyDef, fieldPolicy *types.PrivilegePolicyDef) (*types.CustomFieldDef, error) {
|
||||
req := types.AddCustomFieldDef{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
MoType: moType,
|
||||
FieldDefPolicy: fieldDefPolicy,
|
||||
FieldPolicy: fieldPolicy,
|
||||
}
|
||||
|
||||
res, err := methods.AddCustomFieldDef(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m CustomFieldsManager) Remove(ctx context.Context, key int32) error {
|
||||
req := types.RemoveCustomFieldDef{
|
||||
This: m.Reference(),
|
||||
Key: key,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveCustomFieldDef(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m CustomFieldsManager) Rename(ctx context.Context, key int32, name string) error {
|
||||
req := types.RenameCustomFieldDef{
|
||||
This: m.Reference(),
|
||||
Key: key,
|
||||
Name: name,
|
||||
}
|
||||
|
||||
_, err := methods.RenameCustomFieldDef(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m CustomFieldsManager) Set(ctx context.Context, entity types.ManagedObjectReference, key int32, value string) error {
|
||||
req := types.SetField{
|
||||
This: m.Reference(),
|
||||
Entity: entity,
|
||||
Key: key,
|
||||
Value: value,
|
||||
}
|
||||
|
||||
_, err := methods.SetField(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
type CustomFieldDefList []types.CustomFieldDef
|
||||
|
||||
func (m CustomFieldsManager) Field(ctx context.Context) (CustomFieldDefList, error) {
|
||||
var fm mo.CustomFieldsManager
|
||||
|
||||
err := m.Properties(ctx, m.Reference(), []string{"field"}, &fm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return fm.Field, nil
|
||||
}
|
||||
|
||||
func (m CustomFieldsManager) FindKey(ctx context.Context, name string) (int32, error) {
|
||||
field, err := m.Field(ctx)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
for _, def := range field {
|
||||
if def.Name == name {
|
||||
return def.Key, nil
|
||||
}
|
||||
}
|
||||
|
||||
k, err := strconv.Atoi(name)
|
||||
if err == nil {
|
||||
// assume literal int key
|
||||
return int32(k), nil
|
||||
}
|
||||
|
||||
return -1, ErrKeyNameNotFound
|
||||
}
|
||||
|
||||
func (l CustomFieldDefList) ByKey(key int32) *types.CustomFieldDef {
|
||||
for _, def := range l {
|
||||
if def.Key == key {
|
||||
return &def
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
173
vendor/github.com/vmware/govmomi/object/customization_spec_manager.go
generated
vendored
Normal file
173
vendor/github.com/vmware/govmomi/object/customization_spec_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type CustomizationSpecManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewCustomizationSpecManager(c *vim25.Client) *CustomizationSpecManager {
|
||||
cs := CustomizationSpecManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.CustomizationSpecManager),
|
||||
}
|
||||
|
||||
return &cs
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) Info(ctx context.Context) ([]types.CustomizationSpecInfo, error) {
|
||||
var m mo.CustomizationSpecManager
|
||||
err := cs.Properties(ctx, cs.Reference(), []string{"info"}, &m)
|
||||
return m.Info, err
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) DoesCustomizationSpecExist(ctx context.Context, name string) (bool, error) {
|
||||
req := types.DoesCustomizationSpecExist{
|
||||
This: cs.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.DoesCustomizationSpecExist(ctx, cs.c, &req)
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) GetCustomizationSpec(ctx context.Context, name string) (*types.CustomizationSpecItem, error) {
|
||||
req := types.GetCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.GetCustomizationSpec(ctx, cs.c, &req)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) CreateCustomizationSpec(ctx context.Context, item types.CustomizationSpecItem) error {
|
||||
req := types.CreateCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Item: item,
|
||||
}
|
||||
|
||||
_, err := methods.CreateCustomizationSpec(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) OverwriteCustomizationSpec(ctx context.Context, item types.CustomizationSpecItem) error {
|
||||
req := types.OverwriteCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Item: item,
|
||||
}
|
||||
|
||||
_, err := methods.OverwriteCustomizationSpec(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) DeleteCustomizationSpec(ctx context.Context, name string) error {
|
||||
req := types.DeleteCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
_, err := methods.DeleteCustomizationSpec(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) DuplicateCustomizationSpec(ctx context.Context, name string, newName string) error {
|
||||
req := types.DuplicateCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Name: name,
|
||||
NewName: newName,
|
||||
}
|
||||
|
||||
_, err := methods.DuplicateCustomizationSpec(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) RenameCustomizationSpec(ctx context.Context, name string, newName string) error {
|
||||
req := types.RenameCustomizationSpec{
|
||||
This: cs.Reference(),
|
||||
Name: name,
|
||||
NewName: newName,
|
||||
}
|
||||
|
||||
_, err := methods.RenameCustomizationSpec(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) CustomizationSpecItemToXml(ctx context.Context, item types.CustomizationSpecItem) (string, error) {
|
||||
req := types.CustomizationSpecItemToXml{
|
||||
This: cs.Reference(),
|
||||
Item: item,
|
||||
}
|
||||
|
||||
res, err := methods.CustomizationSpecItemToXml(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (cs CustomizationSpecManager) XmlToCustomizationSpecItem(ctx context.Context, xml string) (*types.CustomizationSpecItem, error) {
|
||||
req := types.XmlToCustomizationSpecItem{
|
||||
This: cs.Reference(),
|
||||
SpecItemXml: xml,
|
||||
}
|
||||
|
||||
res, err := methods.XmlToCustomizationSpecItem(ctx, cs.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
129
vendor/github.com/vmware/govmomi/object/datacenter.go
generated
vendored
Normal file
129
vendor/github.com/vmware/govmomi/object/datacenter.go
generated
vendored
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DatacenterFolders struct {
|
||||
VmFolder *Folder
|
||||
HostFolder *Folder
|
||||
DatastoreFolder *Folder
|
||||
NetworkFolder *Folder
|
||||
}
|
||||
|
||||
type Datacenter struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewDatacenter(c *vim25.Client, ref types.ManagedObjectReference) *Datacenter {
|
||||
return &Datacenter{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Datacenter) Folders(ctx context.Context) (*DatacenterFolders, error) {
|
||||
var md mo.Datacenter
|
||||
|
||||
ps := []string{"name", "vmFolder", "hostFolder", "datastoreFolder", "networkFolder"}
|
||||
err := d.Properties(ctx, d.Reference(), ps, &md)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
df := &DatacenterFolders{
|
||||
VmFolder: NewFolder(d.c, md.VmFolder),
|
||||
HostFolder: NewFolder(d.c, md.HostFolder),
|
||||
DatastoreFolder: NewFolder(d.c, md.DatastoreFolder),
|
||||
NetworkFolder: NewFolder(d.c, md.NetworkFolder),
|
||||
}
|
||||
|
||||
paths := []struct {
|
||||
name string
|
||||
path *string
|
||||
}{
|
||||
{"vm", &df.VmFolder.InventoryPath},
|
||||
{"host", &df.HostFolder.InventoryPath},
|
||||
{"datastore", &df.DatastoreFolder.InventoryPath},
|
||||
{"network", &df.NetworkFolder.InventoryPath},
|
||||
}
|
||||
|
||||
for _, p := range paths {
|
||||
*p.path = fmt.Sprintf("/%s/%s", md.Name, p.name)
|
||||
}
|
||||
|
||||
return df, nil
|
||||
}
|
||||
|
||||
func (d Datacenter) Destroy(ctx context.Context) (*Task, error) {
|
||||
req := types.Destroy_Task{
|
||||
This: d.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.Destroy_Task(ctx, d.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(d.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// PowerOnVM powers on multiple virtual machines with a single vCenter call.
|
||||
// If called against ESX, serially powers on the list of VMs and the returned *Task will always be nil.
|
||||
func (d Datacenter) PowerOnVM(ctx context.Context, vm []types.ManagedObjectReference, option ...types.BaseOptionValue) (*Task, error) {
|
||||
if d.Client().IsVC() {
|
||||
req := types.PowerOnMultiVM_Task{
|
||||
This: d.Reference(),
|
||||
Vm: vm,
|
||||
Option: option,
|
||||
}
|
||||
|
||||
res, err := methods.PowerOnMultiVM_Task(ctx, d.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(d.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
for _, ref := range vm {
|
||||
obj := NewVirtualMachine(d.Client(), ref)
|
||||
task, err := obj.PowerOn(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = task.Wait(ctx)
|
||||
if err != nil {
|
||||
// Ignore any InvalidPowerState fault, as it indicates the VM is already powered on
|
||||
if f, ok := err.(types.HasFault); ok {
|
||||
if _, ok = f.Fault().(*types.InvalidPowerState); !ok {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
439
vendor/github.com/vmware/govmomi/object/datastore.go
generated
vendored
Normal file
439
vendor/github.com/vmware/govmomi/object/datastore.go
generated
vendored
Normal file
|
|
@ -0,0 +1,439 @@
|
|||
/*
|
||||
Copyright (c) 2015-2016 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"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/property"
|
||||
"github.com/vmware/govmomi/session"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// DatastoreNoSuchDirectoryError is returned when a directory could not be found.
|
||||
type DatastoreNoSuchDirectoryError struct {
|
||||
verb string
|
||||
subject string
|
||||
}
|
||||
|
||||
func (e DatastoreNoSuchDirectoryError) Error() string {
|
||||
return fmt.Sprintf("cannot %s '%s': No such directory", e.verb, e.subject)
|
||||
}
|
||||
|
||||
// DatastoreNoSuchFileError is returned when a file could not be found.
|
||||
type DatastoreNoSuchFileError struct {
|
||||
verb string
|
||||
subject string
|
||||
}
|
||||
|
||||
func (e DatastoreNoSuchFileError) Error() string {
|
||||
return fmt.Sprintf("cannot %s '%s': No such file", e.verb, e.subject)
|
||||
}
|
||||
|
||||
type Datastore struct {
|
||||
Common
|
||||
|
||||
DatacenterPath string
|
||||
}
|
||||
|
||||
func NewDatastore(c *vim25.Client, ref types.ManagedObjectReference) *Datastore {
|
||||
return &Datastore{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (d Datastore) Path(path string) string {
|
||||
var p DatastorePath
|
||||
if p.FromString(path) {
|
||||
return p.String() // already in "[datastore] path" format
|
||||
}
|
||||
|
||||
return (&DatastorePath{
|
||||
Datastore: d.Name(),
|
||||
Path: path,
|
||||
}).String()
|
||||
}
|
||||
|
||||
// NewURL constructs a url.URL with the given file path for datastore access over HTTP.
|
||||
func (d Datastore) NewURL(path string) *url.URL {
|
||||
u := d.c.URL()
|
||||
|
||||
return &url.URL{
|
||||
Scheme: u.Scheme,
|
||||
Host: u.Host,
|
||||
Path: fmt.Sprintf("/folder/%s", path),
|
||||
RawQuery: url.Values{
|
||||
"dcPath": []string{d.DatacenterPath},
|
||||
"dsName": []string{d.Name()},
|
||||
}.Encode(),
|
||||
}
|
||||
}
|
||||
|
||||
// URL is deprecated, use NewURL instead.
|
||||
func (d Datastore) URL(ctx context.Context, dc *Datacenter, path string) (*url.URL, error) {
|
||||
return d.NewURL(path), nil
|
||||
}
|
||||
|
||||
func (d Datastore) Browser(ctx context.Context) (*HostDatastoreBrowser, error) {
|
||||
var do mo.Datastore
|
||||
|
||||
err := d.Properties(ctx, d.Reference(), []string{"browser"}, &do)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewHostDatastoreBrowser(d.c, do.Browser), nil
|
||||
}
|
||||
|
||||
func (d Datastore) useServiceTicket() bool {
|
||||
// If connected to workstation, service ticketing not supported
|
||||
// If connected to ESX, service ticketing not needed
|
||||
if !d.c.IsVC() {
|
||||
return false
|
||||
}
|
||||
|
||||
key := "GOVMOMI_USE_SERVICE_TICKET"
|
||||
|
||||
val := d.c.URL().Query().Get(key)
|
||||
if val == "" {
|
||||
val = os.Getenv(key)
|
||||
}
|
||||
|
||||
if val == "1" || val == "true" {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (d Datastore) useServiceTicketHostName(name string) bool {
|
||||
// No need if talking directly to ESX.
|
||||
if !d.c.IsVC() {
|
||||
return false
|
||||
}
|
||||
|
||||
// If version happens to be < 5.1
|
||||
if name == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the HostSystem is using DHCP on a network without dynamic DNS,
|
||||
// HostSystem.Config.Network.DnsConfig.HostName is set to "localhost" by default.
|
||||
// This resolves to "localhost.localdomain" by default via /etc/hosts on ESX.
|
||||
// In that case, we will stick with the HostSystem.Name which is the IP address that
|
||||
// was used to connect the host to VC.
|
||||
if name == "localhost.localdomain" {
|
||||
return false
|
||||
}
|
||||
|
||||
// Still possible to have HostName that don't resolve via DNS,
|
||||
// so we default to false.
|
||||
key := "GOVMOMI_USE_SERVICE_TICKET_HOSTNAME"
|
||||
|
||||
val := d.c.URL().Query().Get(key)
|
||||
if val == "" {
|
||||
val = os.Getenv(key)
|
||||
}
|
||||
|
||||
if val == "1" || val == "true" {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
type datastoreServiceTicketHostKey struct{}
|
||||
|
||||
// HostContext returns a Context where the given host will be used for datastore HTTP access
|
||||
// via the ServiceTicket method.
|
||||
func (d Datastore) HostContext(ctx context.Context, host *HostSystem) context.Context {
|
||||
return context.WithValue(ctx, datastoreServiceTicketHostKey{}, host)
|
||||
}
|
||||
|
||||
// ServiceTicket obtains a ticket via AcquireGenericServiceTicket and returns it an http.Cookie with the url.URL
|
||||
// that can be used along with the ticket cookie to access the given path. An host is chosen at random unless the
|
||||
// the given Context was created with a specific host via the HostContext method.
|
||||
func (d Datastore) ServiceTicket(ctx context.Context, path string, method string) (*url.URL, *http.Cookie, error) {
|
||||
u := d.NewURL(path)
|
||||
|
||||
host, ok := ctx.Value(datastoreServiceTicketHostKey{}).(*HostSystem)
|
||||
|
||||
if !ok {
|
||||
if !d.useServiceTicket() {
|
||||
return u, nil, nil
|
||||
}
|
||||
|
||||
hosts, err := d.AttachedHosts(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if len(hosts) == 0 {
|
||||
// Fallback to letting vCenter choose a host
|
||||
return u, nil, nil
|
||||
}
|
||||
|
||||
// Pick a random attached host
|
||||
host = hosts[rand.Intn(len(hosts))]
|
||||
}
|
||||
|
||||
ips, err := host.ManagementIPs(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if len(ips) > 0 {
|
||||
// prefer a ManagementIP
|
||||
u.Host = ips[0].String()
|
||||
} else {
|
||||
// fallback to inventory name
|
||||
u.Host, err = host.ObjectName(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// VC datacenter path will not be valid against ESX
|
||||
q := u.Query()
|
||||
delete(q, "dcPath")
|
||||
u.RawQuery = q.Encode()
|
||||
|
||||
spec := types.SessionManagerHttpServiceRequestSpec{
|
||||
Url: u.String(),
|
||||
// See SessionManagerHttpServiceRequestSpecMethod enum
|
||||
Method: fmt.Sprintf("http%s%s", method[0:1], strings.ToLower(method[1:])),
|
||||
}
|
||||
|
||||
sm := session.NewManager(d.Client())
|
||||
|
||||
ticket, err := sm.AcquireGenericServiceTicket(ctx, &spec)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
cookie := &http.Cookie{
|
||||
Name: "vmware_cgi_ticket",
|
||||
Value: ticket.Id,
|
||||
}
|
||||
|
||||
if d.useServiceTicketHostName(ticket.HostName) {
|
||||
u.Host = ticket.HostName
|
||||
}
|
||||
|
||||
d.Client().SetThumbprint(u.Host, ticket.SslThumbprint)
|
||||
|
||||
return u, cookie, nil
|
||||
}
|
||||
|
||||
func (d Datastore) uploadTicket(ctx context.Context, path string, param *soap.Upload) (*url.URL, *soap.Upload, error) {
|
||||
p := soap.DefaultUpload
|
||||
if param != nil {
|
||||
p = *param // copy
|
||||
}
|
||||
|
||||
u, ticket, err := d.ServiceTicket(ctx, path, p.Method)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
p.Ticket = ticket
|
||||
|
||||
return u, &p, nil
|
||||
}
|
||||
|
||||
func (d Datastore) downloadTicket(ctx context.Context, path string, param *soap.Download) (*url.URL, *soap.Download, error) {
|
||||
p := soap.DefaultDownload
|
||||
if param != nil {
|
||||
p = *param // copy
|
||||
}
|
||||
|
||||
u, ticket, err := d.ServiceTicket(ctx, path, p.Method)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
p.Ticket = ticket
|
||||
|
||||
return u, &p, nil
|
||||
}
|
||||
|
||||
// Upload via soap.Upload with an http service ticket
|
||||
func (d Datastore) Upload(ctx context.Context, f io.Reader, path string, param *soap.Upload) error {
|
||||
u, p, err := d.uploadTicket(ctx, path, param)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return d.Client().Upload(ctx, f, u, p)
|
||||
}
|
||||
|
||||
// UploadFile via soap.Upload with an http service ticket
|
||||
func (d Datastore) UploadFile(ctx context.Context, file string, path string, param *soap.Upload) error {
|
||||
u, p, err := d.uploadTicket(ctx, path, param)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return d.Client().UploadFile(ctx, file, u, p)
|
||||
}
|
||||
|
||||
// Download via soap.Download with an http service ticket
|
||||
func (d Datastore) Download(ctx context.Context, path string, param *soap.Download) (io.ReadCloser, int64, error) {
|
||||
u, p, err := d.downloadTicket(ctx, path, param)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return d.Client().Download(ctx, u, p)
|
||||
}
|
||||
|
||||
// DownloadFile via soap.Download with an http service ticket
|
||||
func (d Datastore) DownloadFile(ctx context.Context, path string, file string, param *soap.Download) error {
|
||||
u, p, err := d.downloadTicket(ctx, path, param)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return d.Client().DownloadFile(ctx, file, u, p)
|
||||
}
|
||||
|
||||
// AttachedHosts returns hosts that have this Datastore attached, accessible and writable.
|
||||
func (d Datastore) AttachedHosts(ctx context.Context) ([]*HostSystem, error) {
|
||||
var ds mo.Datastore
|
||||
var hosts []*HostSystem
|
||||
|
||||
pc := property.DefaultCollector(d.Client())
|
||||
err := pc.RetrieveOne(ctx, d.Reference(), []string{"host"}, &ds)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mounts := make(map[types.ManagedObjectReference]types.DatastoreHostMount)
|
||||
var refs []types.ManagedObjectReference
|
||||
for _, host := range ds.Host {
|
||||
refs = append(refs, host.Key)
|
||||
mounts[host.Key] = host
|
||||
}
|
||||
|
||||
var hs []mo.HostSystem
|
||||
err = pc.Retrieve(ctx, refs, []string{"runtime.connectionState", "runtime.powerState"}, &hs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, host := range hs {
|
||||
if host.Runtime.ConnectionState == types.HostSystemConnectionStateConnected &&
|
||||
host.Runtime.PowerState == types.HostSystemPowerStatePoweredOn {
|
||||
|
||||
mount := mounts[host.Reference()]
|
||||
info := mount.MountInfo
|
||||
|
||||
if *info.Mounted && *info.Accessible && info.AccessMode == string(types.HostMountModeReadWrite) {
|
||||
hosts = append(hosts, NewHostSystem(d.Client(), mount.Key))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hosts, nil
|
||||
}
|
||||
|
||||
// AttachedClusterHosts returns hosts that have this Datastore attached, accessible and writable and are members of the given cluster.
|
||||
func (d Datastore) AttachedClusterHosts(ctx context.Context, cluster *ComputeResource) ([]*HostSystem, error) {
|
||||
var hosts []*HostSystem
|
||||
|
||||
clusterHosts, err := cluster.Hosts(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
attachedHosts, err := d.AttachedHosts(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refs := make(map[types.ManagedObjectReference]bool)
|
||||
for _, host := range attachedHosts {
|
||||
refs[host.Reference()] = true
|
||||
}
|
||||
|
||||
for _, host := range clusterHosts {
|
||||
if refs[host.Reference()] {
|
||||
hosts = append(hosts, host)
|
||||
}
|
||||
}
|
||||
|
||||
return hosts, nil
|
||||
}
|
||||
|
||||
func (d Datastore) Stat(ctx context.Context, file string) (types.BaseFileInfo, error) {
|
||||
b, err := d.Browser(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
spec := types.HostDatastoreBrowserSearchSpec{
|
||||
Details: &types.FileQueryFlags{
|
||||
FileType: true,
|
||||
FileSize: true,
|
||||
Modification: true,
|
||||
FileOwner: types.NewBool(true),
|
||||
},
|
||||
MatchPattern: []string{path.Base(file)},
|
||||
}
|
||||
|
||||
dsPath := d.Path(path.Dir(file))
|
||||
task, err := b.SearchDatastore(ctx, dsPath, &spec)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info, err := task.WaitForResult(ctx, nil)
|
||||
if err != nil {
|
||||
if types.IsFileNotFound(err) {
|
||||
// FileNotFound means the base path doesn't exist.
|
||||
return nil, DatastoreNoSuchDirectoryError{"stat", dsPath}
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res := info.Result.(types.HostDatastoreBrowserSearchResults)
|
||||
if len(res.File) == 0 {
|
||||
// File doesn't exist
|
||||
return nil, DatastoreNoSuchFileError{"stat", d.Path(file)}
|
||||
}
|
||||
|
||||
return res.File[0], nil
|
||||
|
||||
}
|
||||
|
||||
// Type returns the type of file system volume.
|
||||
func (d Datastore) Type(ctx context.Context) (types.HostFileSystemVolumeFileSystemType, error) {
|
||||
var mds mo.Datastore
|
||||
|
||||
if err := d.Properties(ctx, d.Reference(), []string{"summary.type"}, &mds); err != nil {
|
||||
return types.HostFileSystemVolumeFileSystemType(""), err
|
||||
}
|
||||
return types.HostFileSystemVolumeFileSystemType(mds.Summary.Type), nil
|
||||
}
|
||||
412
vendor/github.com/vmware/govmomi/object/datastore_file.go
generated
vendored
Normal file
412
vendor/github.com/vmware/govmomi/object/datastore_file.go
generated
vendored
Normal file
|
|
@ -0,0 +1,412 @@
|
|||
/*
|
||||
Copyright (c) 2016-2017 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 (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
)
|
||||
|
||||
// DatastoreFile implements io.Reader, io.Seeker and io.Closer interfaces for datastore file access.
|
||||
type DatastoreFile struct {
|
||||
d Datastore
|
||||
ctx context.Context
|
||||
name string
|
||||
|
||||
buf io.Reader
|
||||
body io.ReadCloser
|
||||
length int64
|
||||
offset struct {
|
||||
read, seek int64
|
||||
}
|
||||
}
|
||||
|
||||
// Open opens the named file relative to the Datastore.
|
||||
func (d Datastore) Open(ctx context.Context, name string) (*DatastoreFile, error) {
|
||||
return &DatastoreFile{
|
||||
d: d,
|
||||
name: name,
|
||||
length: -1,
|
||||
ctx: ctx,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Read reads up to len(b) bytes from the DatastoreFile.
|
||||
func (f *DatastoreFile) Read(b []byte) (int, error) {
|
||||
if f.offset.read != f.offset.seek {
|
||||
// A Seek() call changed the offset, we need to issue a new GET
|
||||
_ = f.Close()
|
||||
|
||||
f.offset.read = f.offset.seek
|
||||
} else if f.buf != nil {
|
||||
// f.buf + f behaves like an io.MultiReader
|
||||
n, err := f.buf.Read(b)
|
||||
if err == io.EOF {
|
||||
f.buf = nil // buffer has been drained
|
||||
}
|
||||
if n > 0 {
|
||||
return n, nil
|
||||
}
|
||||
}
|
||||
|
||||
body, err := f.get()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
n, err := body.Read(b)
|
||||
|
||||
f.offset.read += int64(n)
|
||||
f.offset.seek += int64(n)
|
||||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// Close closes the DatastoreFile.
|
||||
func (f *DatastoreFile) Close() error {
|
||||
var err error
|
||||
|
||||
if f.body != nil {
|
||||
err = f.body.Close()
|
||||
f.body = nil
|
||||
}
|
||||
|
||||
f.buf = nil
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Seek sets the offset for the next Read on the DatastoreFile.
|
||||
func (f *DatastoreFile) Seek(offset int64, whence int) (int64, error) {
|
||||
switch whence {
|
||||
case io.SeekStart:
|
||||
case io.SeekCurrent:
|
||||
offset += f.offset.seek
|
||||
case io.SeekEnd:
|
||||
if f.length < 0 {
|
||||
_, err := f.Stat()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
offset += f.length
|
||||
default:
|
||||
return 0, errors.New("Seek: invalid whence")
|
||||
}
|
||||
|
||||
// allow negative SeekStart for initial Range request
|
||||
if offset < 0 {
|
||||
return 0, errors.New("Seek: invalid offset")
|
||||
}
|
||||
|
||||
f.offset.seek = offset
|
||||
|
||||
return offset, nil
|
||||
}
|
||||
|
||||
type fileStat struct {
|
||||
file *DatastoreFile
|
||||
header http.Header
|
||||
}
|
||||
|
||||
func (s *fileStat) Name() string {
|
||||
return path.Base(s.file.name)
|
||||
}
|
||||
|
||||
func (s *fileStat) Size() int64 {
|
||||
return s.file.length
|
||||
}
|
||||
|
||||
func (s *fileStat) Mode() os.FileMode {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (s *fileStat) ModTime() time.Time {
|
||||
return time.Now() // no Last-Modified
|
||||
}
|
||||
|
||||
func (s *fileStat) IsDir() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *fileStat) Sys() interface{} {
|
||||
return s.header
|
||||
}
|
||||
|
||||
func statusError(res *http.Response) error {
|
||||
if res.StatusCode == http.StatusNotFound {
|
||||
return os.ErrNotExist
|
||||
}
|
||||
return errors.New(res.Status)
|
||||
}
|
||||
|
||||
// Stat returns the os.FileInfo interface describing file.
|
||||
func (f *DatastoreFile) Stat() (os.FileInfo, error) {
|
||||
// TODO: consider using Datastore.Stat() instead
|
||||
u, p, err := f.d.downloadTicket(f.ctx, f.name, &soap.Download{Method: "HEAD"})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, err := f.d.Client().DownloadRequest(f.ctx, u, p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return nil, statusError(res)
|
||||
}
|
||||
|
||||
f.length = res.ContentLength
|
||||
|
||||
return &fileStat{f, res.Header}, nil
|
||||
}
|
||||
|
||||
func (f *DatastoreFile) get() (io.Reader, error) {
|
||||
if f.body != nil {
|
||||
return f.body, nil
|
||||
}
|
||||
|
||||
u, p, err := f.d.downloadTicket(f.ctx, f.name, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if f.offset.read != 0 {
|
||||
p.Headers = map[string]string{
|
||||
"Range": fmt.Sprintf("bytes=%d-", f.offset.read),
|
||||
}
|
||||
}
|
||||
|
||||
res, err := f.d.Client().DownloadRequest(f.ctx, u, p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch res.StatusCode {
|
||||
case http.StatusOK:
|
||||
f.length = res.ContentLength
|
||||
case http.StatusPartialContent:
|
||||
var start, end int
|
||||
cr := res.Header.Get("Content-Range")
|
||||
_, err = fmt.Sscanf(cr, "bytes %d-%d/%d", &start, &end, &f.length)
|
||||
if err != nil {
|
||||
f.length = -1
|
||||
}
|
||||
case http.StatusRequestedRangeNotSatisfiable:
|
||||
// ok: Read() will return io.EOF
|
||||
default:
|
||||
return nil, statusError(res)
|
||||
}
|
||||
|
||||
if f.length < 0 {
|
||||
_ = res.Body.Close()
|
||||
return nil, errors.New("unable to determine file size")
|
||||
}
|
||||
|
||||
f.body = res.Body
|
||||
|
||||
return f.body, nil
|
||||
}
|
||||
|
||||
func lastIndexLines(s []byte, line *int, include func(l int, m string) bool) (int64, bool) {
|
||||
i := len(s) - 1
|
||||
done := false
|
||||
|
||||
for i > 0 {
|
||||
o := bytes.LastIndexByte(s[:i], '\n')
|
||||
if o < 0 {
|
||||
break
|
||||
}
|
||||
|
||||
msg := string(s[o+1 : i+1])
|
||||
if !include(*line, msg) {
|
||||
done = true
|
||||
break
|
||||
} else {
|
||||
i = o
|
||||
*line++
|
||||
}
|
||||
}
|
||||
|
||||
return int64(i), done
|
||||
}
|
||||
|
||||
// Tail seeks to the position of the last N lines of the file.
|
||||
func (f *DatastoreFile) Tail(n int) error {
|
||||
return f.TailFunc(n, func(line int, _ string) bool { return n > line })
|
||||
}
|
||||
|
||||
// TailFunc will seek backwards in the datastore file until it hits a line that does
|
||||
// not satisfy the supplied `include` function.
|
||||
func (f *DatastoreFile) TailFunc(lines int, include func(line int, message string) bool) error {
|
||||
// Read the file in reverse using bsize chunks
|
||||
const bsize = int64(1024 * 16)
|
||||
|
||||
fsize, err := f.Seek(0, io.SeekEnd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if lines == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
chunk := int64(-1)
|
||||
|
||||
buf := bytes.NewBuffer(make([]byte, 0, bsize))
|
||||
line := 0
|
||||
|
||||
for {
|
||||
var eof bool
|
||||
var pos int64
|
||||
|
||||
nread := bsize
|
||||
|
||||
offset := chunk * bsize
|
||||
remain := fsize + offset
|
||||
|
||||
if remain < 0 {
|
||||
if pos, err = f.Seek(0, io.SeekStart); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
nread = bsize + remain
|
||||
eof = true
|
||||
} else if pos, err = f.Seek(offset, io.SeekEnd); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = io.CopyN(buf, f, nread); err != nil {
|
||||
if err != io.EOF {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
b := buf.Bytes()
|
||||
idx, done := lastIndexLines(b, &line, include)
|
||||
|
||||
if done {
|
||||
if chunk == -1 {
|
||||
// We found all N lines in the last chunk of the file.
|
||||
// The seek offset is also now at the current end of file.
|
||||
// Save this buffer to avoid another GET request when Read() is called.
|
||||
buf.Next(int(idx + 1))
|
||||
f.buf = buf
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err = f.Seek(pos+idx+1, io.SeekStart); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
if eof {
|
||||
if remain < 0 {
|
||||
// We found < N lines in the entire file, so seek to the start.
|
||||
_, _ = f.Seek(0, io.SeekStart)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
chunk--
|
||||
buf.Reset()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type followDatastoreFile struct {
|
||||
r *DatastoreFile
|
||||
c chan struct{}
|
||||
i time.Duration
|
||||
o sync.Once
|
||||
}
|
||||
|
||||
// Read reads up to len(b) bytes from the DatastoreFile being followed.
|
||||
// This method will block until data is read, an error other than io.EOF is returned or Close() is called.
|
||||
func (f *followDatastoreFile) Read(p []byte) (int, error) {
|
||||
offset := f.r.offset.seek
|
||||
stop := false
|
||||
|
||||
for {
|
||||
n, err := f.r.Read(p)
|
||||
if err != nil && err == io.EOF {
|
||||
_ = f.r.Close() // GET request body has been drained.
|
||||
if stop {
|
||||
return n, err
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
|
||||
if n > 0 {
|
||||
return n, err
|
||||
}
|
||||
|
||||
select {
|
||||
case <-f.c:
|
||||
// Wake up and stop polling once the body has been drained
|
||||
stop = true
|
||||
case <-time.After(f.i):
|
||||
}
|
||||
|
||||
info, serr := f.r.Stat()
|
||||
if serr != nil {
|
||||
// Return EOF rather than 404 if the file goes away
|
||||
if serr == os.ErrNotExist {
|
||||
_ = f.r.Close()
|
||||
return 0, io.EOF
|
||||
}
|
||||
return 0, serr
|
||||
}
|
||||
|
||||
if info.Size() < offset {
|
||||
// assume file has be truncated
|
||||
offset, err = f.r.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Close will stop Follow polling and close the underlying DatastoreFile.
|
||||
func (f *followDatastoreFile) Close() error {
|
||||
f.o.Do(func() { close(f.c) })
|
||||
return nil
|
||||
}
|
||||
|
||||
// Follow returns an io.ReadCloser to stream the file contents as data is appended.
|
||||
func (f *DatastoreFile) Follow(interval time.Duration) io.ReadCloser {
|
||||
return &followDatastoreFile{
|
||||
r: f,
|
||||
c: make(chan struct{}),
|
||||
i: interval,
|
||||
}
|
||||
}
|
||||
228
vendor/github.com/vmware/govmomi/object/datastore_file_manager.go
generated
vendored
Normal file
228
vendor/github.com/vmware/govmomi/object/datastore_file_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,228 @@
|
|||
/*
|
||||
Copyright (c) 2017-2018 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 (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/progress"
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
)
|
||||
|
||||
// DatastoreFileManager combines FileManager and VirtualDiskManager to manage files on a Datastore
|
||||
type DatastoreFileManager struct {
|
||||
Datacenter *Datacenter
|
||||
Datastore *Datastore
|
||||
FileManager *FileManager
|
||||
VirtualDiskManager *VirtualDiskManager
|
||||
|
||||
Force bool
|
||||
DatacenterTarget *Datacenter
|
||||
}
|
||||
|
||||
// NewFileManager creates a new instance of DatastoreFileManager
|
||||
func (d Datastore) NewFileManager(dc *Datacenter, force bool) *DatastoreFileManager {
|
||||
c := d.Client()
|
||||
|
||||
m := &DatastoreFileManager{
|
||||
Datacenter: dc,
|
||||
Datastore: &d,
|
||||
FileManager: NewFileManager(c),
|
||||
VirtualDiskManager: NewVirtualDiskManager(c),
|
||||
Force: force,
|
||||
DatacenterTarget: dc,
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *DatastoreFileManager) WithProgress(ctx context.Context, s progress.Sinker) context.Context {
|
||||
return context.WithValue(ctx, m, s)
|
||||
}
|
||||
|
||||
func (m *DatastoreFileManager) wait(ctx context.Context, task *Task) error {
|
||||
var logger progress.Sinker
|
||||
if s, ok := ctx.Value(m).(progress.Sinker); ok {
|
||||
logger = s
|
||||
}
|
||||
_, err := task.WaitForResult(ctx, logger)
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete dispatches to the appropriate Delete method based on file name extension
|
||||
func (m *DatastoreFileManager) Delete(ctx context.Context, name string) error {
|
||||
switch path.Ext(name) {
|
||||
case ".vmdk":
|
||||
return m.DeleteVirtualDisk(ctx, name)
|
||||
default:
|
||||
return m.DeleteFile(ctx, name)
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteFile calls FileManager.DeleteDatastoreFile
|
||||
func (m *DatastoreFileManager) DeleteFile(ctx context.Context, name string) error {
|
||||
p := m.Path(name)
|
||||
|
||||
task, err := m.FileManager.DeleteDatastoreFile(ctx, p.String(), m.Datacenter)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// DeleteVirtualDisk calls VirtualDiskManager.DeleteVirtualDisk
|
||||
// Regardless of the Datastore type, DeleteVirtualDisk will fail if 'ddb.deletable=false',
|
||||
// so if Force=true this method attempts to set 'ddb.deletable=true' before starting the delete task.
|
||||
func (m *DatastoreFileManager) DeleteVirtualDisk(ctx context.Context, name string) error {
|
||||
p := m.Path(name)
|
||||
|
||||
var merr error
|
||||
|
||||
if m.Force {
|
||||
merr = m.markDiskAsDeletable(ctx, p)
|
||||
}
|
||||
|
||||
task, err := m.VirtualDiskManager.DeleteVirtualDisk(ctx, p.String(), m.Datacenter)
|
||||
if err != nil {
|
||||
log.Printf("markDiskAsDeletable(%s): %s", p, merr)
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// CopyFile calls FileManager.CopyDatastoreFile
|
||||
func (m *DatastoreFileManager) CopyFile(ctx context.Context, src string, dst string) error {
|
||||
srcp := m.Path(src)
|
||||
dstp := m.Path(dst)
|
||||
|
||||
task, err := m.FileManager.CopyDatastoreFile(ctx, srcp.String(), m.Datacenter, dstp.String(), m.DatacenterTarget, m.Force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// Copy dispatches to the appropriate FileManager or VirtualDiskManager Copy method based on file name extension
|
||||
func (m *DatastoreFileManager) Copy(ctx context.Context, src string, dst string) error {
|
||||
srcp := m.Path(src)
|
||||
dstp := m.Path(dst)
|
||||
|
||||
f := m.FileManager.CopyDatastoreFile
|
||||
|
||||
if srcp.IsVMDK() {
|
||||
// types.VirtualDiskSpec=nil as it is not implemented by vCenter
|
||||
f = func(ctx context.Context, src string, srcDC *Datacenter, dst string, dstDC *Datacenter, force bool) (*Task, error) {
|
||||
return m.VirtualDiskManager.CopyVirtualDisk(ctx, src, srcDC, dst, dstDC, nil, force)
|
||||
}
|
||||
}
|
||||
|
||||
task, err := f(ctx, srcp.String(), m.Datacenter, dstp.String(), m.DatacenterTarget, m.Force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// MoveFile calls FileManager.MoveDatastoreFile
|
||||
func (m *DatastoreFileManager) MoveFile(ctx context.Context, src string, dst string) error {
|
||||
srcp := m.Path(src)
|
||||
dstp := m.Path(dst)
|
||||
|
||||
task, err := m.FileManager.MoveDatastoreFile(ctx, srcp.String(), m.Datacenter, dstp.String(), m.DatacenterTarget, m.Force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// Move dispatches to the appropriate FileManager or VirtualDiskManager Move method based on file name extension
|
||||
func (m *DatastoreFileManager) Move(ctx context.Context, src string, dst string) error {
|
||||
srcp := m.Path(src)
|
||||
dstp := m.Path(dst)
|
||||
|
||||
f := m.FileManager.MoveDatastoreFile
|
||||
|
||||
if srcp.IsVMDK() {
|
||||
f = m.VirtualDiskManager.MoveVirtualDisk
|
||||
}
|
||||
|
||||
task, err := f(ctx, srcp.String(), m.Datacenter, dstp.String(), m.DatacenterTarget, m.Force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.wait(ctx, task)
|
||||
}
|
||||
|
||||
// Path converts path name to a DatastorePath
|
||||
func (m *DatastoreFileManager) Path(name string) *DatastorePath {
|
||||
var p DatastorePath
|
||||
|
||||
if !p.FromString(name) {
|
||||
p.Path = name
|
||||
p.Datastore = m.Datastore.Name()
|
||||
}
|
||||
|
||||
return &p
|
||||
}
|
||||
|
||||
func (m *DatastoreFileManager) markDiskAsDeletable(ctx context.Context, path *DatastorePath) error {
|
||||
r, _, err := m.Datastore.Download(ctx, path.Path, &soap.DefaultDownload)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer r.Close()
|
||||
|
||||
hasFlag := false
|
||||
buf := new(bytes.Buffer)
|
||||
|
||||
s := bufio.NewScanner(&io.LimitedReader{R: r, N: 2048}) // should be only a few hundred bytes, limit to be sure
|
||||
|
||||
for s.Scan() {
|
||||
line := s.Text()
|
||||
if strings.HasPrefix(line, "ddb.deletable") {
|
||||
hasFlag = true
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Fprintln(buf, line)
|
||||
}
|
||||
|
||||
if err := s.Err(); err != nil {
|
||||
return err // any error other than EOF
|
||||
}
|
||||
|
||||
if !hasFlag {
|
||||
return nil // already deletable, so leave as-is
|
||||
}
|
||||
|
||||
// rewrite the .vmdk with ddb.deletable flag removed (the default is true)
|
||||
return m.Datastore.Upload(ctx, buf, path.Path, &soap.DefaultUpload)
|
||||
}
|
||||
71
vendor/github.com/vmware/govmomi/object/datastore_path.go
generated
vendored
Normal file
71
vendor/github.com/vmware/govmomi/object/datastore_path.go
generated
vendored
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
Copyright (c) 2016 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 (
|
||||
"fmt"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// DatastorePath contains the components of a datastore path.
|
||||
type DatastorePath struct {
|
||||
Datastore string
|
||||
Path string
|
||||
}
|
||||
|
||||
// FromString parses a datastore path.
|
||||
// Returns true if the path could be parsed, false otherwise.
|
||||
func (p *DatastorePath) FromString(s string) bool {
|
||||
if s == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
s = strings.TrimSpace(s)
|
||||
|
||||
if !strings.HasPrefix(s, "[") {
|
||||
return false
|
||||
}
|
||||
|
||||
s = s[1:]
|
||||
|
||||
ix := strings.Index(s, "]")
|
||||
if ix < 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
p.Datastore = s[:ix]
|
||||
p.Path = strings.TrimSpace(s[ix+1:])
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// String formats a datastore path.
|
||||
func (p *DatastorePath) String() string {
|
||||
s := fmt.Sprintf("[%s]", p.Datastore)
|
||||
|
||||
if p.Path == "" {
|
||||
return s
|
||||
}
|
||||
|
||||
return strings.Join([]string{s, p.Path}, " ")
|
||||
}
|
||||
|
||||
// IsVMDK returns true if Path has a ".vmdk" extension
|
||||
func (p *DatastorePath) IsVMDK() bool {
|
||||
return path.Ext(p.Path) == ".vmdk"
|
||||
}
|
||||
76
vendor/github.com/vmware/govmomi/object/diagnostic_log.go
generated
vendored
Normal file
76
vendor/github.com/vmware/govmomi/object/diagnostic_log.go
generated
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
)
|
||||
|
||||
// DiagnosticLog wraps DiagnosticManager.BrowseLog
|
||||
type DiagnosticLog struct {
|
||||
m DiagnosticManager
|
||||
|
||||
Key string
|
||||
Host *HostSystem
|
||||
|
||||
Start int32
|
||||
}
|
||||
|
||||
// Seek to log position starting at the last nlines of the log
|
||||
func (l *DiagnosticLog) Seek(ctx context.Context, nlines int32) error {
|
||||
h, err := l.m.BrowseLog(ctx, l.Host, l.Key, math.MaxInt32, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
l.Start = h.LineEnd - nlines
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Copy log starting from l.Start to the given io.Writer
|
||||
// Returns on error or when end of log is reached.
|
||||
func (l *DiagnosticLog) Copy(ctx context.Context, w io.Writer) (int, error) {
|
||||
const max = 500 // VC max == 500, ESX max == 1000
|
||||
written := 0
|
||||
|
||||
for {
|
||||
h, err := l.m.BrowseLog(ctx, l.Host, l.Key, l.Start, max)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
for _, line := range h.LineText {
|
||||
n, err := fmt.Fprintln(w, line)
|
||||
written += n
|
||||
if err != nil {
|
||||
return written, err
|
||||
}
|
||||
}
|
||||
|
||||
l.Start += int32(len(h.LineText))
|
||||
|
||||
if l.Start >= h.LineEnd {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return written, nil
|
||||
}
|
||||
102
vendor/github.com/vmware/govmomi/object/diagnostic_manager.go
generated
vendored
Normal file
102
vendor/github.com/vmware/govmomi/object/diagnostic_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DiagnosticManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewDiagnosticManager(c *vim25.Client) *DiagnosticManager {
|
||||
m := DiagnosticManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.DiagnosticManager),
|
||||
}
|
||||
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m DiagnosticManager) Log(ctx context.Context, host *HostSystem, key string) *DiagnosticLog {
|
||||
return &DiagnosticLog{
|
||||
m: m,
|
||||
Key: key,
|
||||
Host: host,
|
||||
}
|
||||
}
|
||||
|
||||
func (m DiagnosticManager) BrowseLog(ctx context.Context, host *HostSystem, key string, start, lines int32) (*types.DiagnosticManagerLogHeader, error) {
|
||||
req := types.BrowseDiagnosticLog{
|
||||
This: m.Reference(),
|
||||
Key: key,
|
||||
Start: start,
|
||||
Lines: lines,
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.BrowseDiagnosticLog(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m DiagnosticManager) GenerateLogBundles(ctx context.Context, includeDefault bool, host []*HostSystem) (*Task, error) {
|
||||
req := types.GenerateLogBundles_Task{
|
||||
This: m.Reference(),
|
||||
IncludeDefault: includeDefault,
|
||||
}
|
||||
|
||||
for _, h := range host {
|
||||
req.Host = append(req.Host, h.Reference())
|
||||
}
|
||||
|
||||
res, err := methods.GenerateLogBundles_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (m DiagnosticManager) QueryDescriptions(ctx context.Context, host *HostSystem) ([]types.DiagnosticManagerLogDescriptor, error) {
|
||||
req := types.QueryDescriptions{
|
||||
This: m.Reference(),
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.QueryDescriptions(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
90
vendor/github.com/vmware/govmomi/object/distributed_virtual_portgroup.go
generated
vendored
Normal file
90
vendor/github.com/vmware/govmomi/object/distributed_virtual_portgroup.go
generated
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DistributedVirtualPortgroup struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewDistributedVirtualPortgroup(c *vim25.Client, ref types.ManagedObjectReference) *DistributedVirtualPortgroup {
|
||||
return &DistributedVirtualPortgroup{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (p DistributedVirtualPortgroup) GetInventoryPath() string {
|
||||
return p.InventoryPath
|
||||
}
|
||||
|
||||
// EthernetCardBackingInfo returns the VirtualDeviceBackingInfo for this DistributedVirtualPortgroup
|
||||
func (p DistributedVirtualPortgroup) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) {
|
||||
var dvp mo.DistributedVirtualPortgroup
|
||||
var dvs mo.DistributedVirtualSwitch
|
||||
prop := "config.distributedVirtualSwitch"
|
||||
|
||||
if err := p.Properties(ctx, p.Reference(), []string{"key", prop}, &dvp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// From the docs at https://code.vmware.com/apis/196/vsphere/doc/vim.dvs.DistributedVirtualPortgroup.ConfigInfo.html:
|
||||
// "This property should always be set unless the user's setting does not have System.Read privilege on the object referred to by this property."
|
||||
// Note that "the object" refers to the Switch, not the PortGroup.
|
||||
if dvp.Config.DistributedVirtualSwitch == nil {
|
||||
name := p.InventoryPath
|
||||
if name == "" {
|
||||
name = p.Reference().String()
|
||||
}
|
||||
return nil, fmt.Errorf("failed to create EthernetCardBackingInfo for %s: System.Read privilege required for %s", name, prop)
|
||||
}
|
||||
|
||||
if err := p.Properties(ctx, *dvp.Config.DistributedVirtualSwitch, []string{"uuid"}, &dvs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
backing := &types.VirtualEthernetCardDistributedVirtualPortBackingInfo{
|
||||
Port: types.DistributedVirtualSwitchPortConnection{
|
||||
PortgroupKey: dvp.Key,
|
||||
SwitchUuid: dvs.Uuid,
|
||||
},
|
||||
}
|
||||
|
||||
return backing, nil
|
||||
}
|
||||
|
||||
func (p DistributedVirtualPortgroup) Reconfigure(ctx context.Context, spec types.DVPortgroupConfigSpec) (*Task, error) {
|
||||
req := types.ReconfigureDVPortgroup_Task{
|
||||
This: p.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.ReconfigureDVPortgroup_Task(ctx, p.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.Client(), res.Returnval), nil
|
||||
}
|
||||
104
vendor/github.com/vmware/govmomi/object/distributed_virtual_switch.go
generated
vendored
Normal file
104
vendor/github.com/vmware/govmomi/object/distributed_virtual_switch.go
generated
vendored
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DistributedVirtualSwitch struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewDistributedVirtualSwitch(c *vim25.Client, ref types.ManagedObjectReference) *DistributedVirtualSwitch {
|
||||
return &DistributedVirtualSwitch{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) GetInventoryPath() string {
|
||||
return s.InventoryPath
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) {
|
||||
ref := s.Reference()
|
||||
name := s.InventoryPath
|
||||
if name == "" {
|
||||
name = ref.String()
|
||||
}
|
||||
return nil, fmt.Errorf("type %s (%s) cannot be used for EthernetCardBackingInfo", ref.Type, name)
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) Reconfigure(ctx context.Context, spec types.BaseDVSConfigSpec) (*Task, error) {
|
||||
req := types.ReconfigureDvs_Task{
|
||||
This: s.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.ReconfigureDvs_Task(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) AddPortgroup(ctx context.Context, spec []types.DVPortgroupConfigSpec) (*Task, error) {
|
||||
req := types.AddDVPortgroup_Task{
|
||||
This: s.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.AddDVPortgroup_Task(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) FetchDVPorts(ctx context.Context, criteria *types.DistributedVirtualSwitchPortCriteria) ([]types.DistributedVirtualPort, error) {
|
||||
req := &types.FetchDVPorts{
|
||||
This: s.Reference(),
|
||||
Criteria: criteria,
|
||||
}
|
||||
|
||||
res, err := methods.FetchDVPorts(ctx, s.Client(), req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (s DistributedVirtualSwitch) ReconfigureDVPort(ctx context.Context, spec []types.DVPortConfigSpec) (*Task, error) {
|
||||
req := types.ReconfigureDVPort_Task{
|
||||
This: s.Reference(),
|
||||
Port: spec,
|
||||
}
|
||||
|
||||
res, err := methods.ReconfigureDVPort_Task(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.Client(), res.Returnval), nil
|
||||
}
|
||||
113
vendor/github.com/vmware/govmomi/object/extension_manager.go
generated
vendored
Normal file
113
vendor/github.com/vmware/govmomi/object/extension_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type ExtensionManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
// GetExtensionManager wraps NewExtensionManager, returning ErrNotSupported
|
||||
// when the client is not connected to a vCenter instance.
|
||||
func GetExtensionManager(c *vim25.Client) (*ExtensionManager, error) {
|
||||
if c.ServiceContent.ExtensionManager == nil {
|
||||
return nil, ErrNotSupported
|
||||
}
|
||||
return NewExtensionManager(c), nil
|
||||
}
|
||||
|
||||
func NewExtensionManager(c *vim25.Client) *ExtensionManager {
|
||||
o := ExtensionManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.ExtensionManager),
|
||||
}
|
||||
|
||||
return &o
|
||||
}
|
||||
|
||||
func (m ExtensionManager) List(ctx context.Context) ([]types.Extension, error) {
|
||||
var em mo.ExtensionManager
|
||||
|
||||
err := m.Properties(ctx, m.Reference(), []string{"extensionList"}, &em)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return em.ExtensionList, nil
|
||||
}
|
||||
|
||||
func (m ExtensionManager) Find(ctx context.Context, key string) (*types.Extension, error) {
|
||||
req := types.FindExtension{
|
||||
This: m.Reference(),
|
||||
ExtensionKey: key,
|
||||
}
|
||||
|
||||
res, err := methods.FindExtension(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m ExtensionManager) Register(ctx context.Context, extension types.Extension) error {
|
||||
req := types.RegisterExtension{
|
||||
This: m.Reference(),
|
||||
Extension: extension,
|
||||
}
|
||||
|
||||
_, err := methods.RegisterExtension(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m ExtensionManager) SetCertificate(ctx context.Context, key string, certificatePem string) error {
|
||||
req := types.SetExtensionCertificate{
|
||||
This: m.Reference(),
|
||||
ExtensionKey: key,
|
||||
CertificatePem: certificatePem,
|
||||
}
|
||||
|
||||
_, err := methods.SetExtensionCertificate(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m ExtensionManager) Unregister(ctx context.Context, key string) error {
|
||||
req := types.UnregisterExtension{
|
||||
This: m.Reference(),
|
||||
ExtensionKey: key,
|
||||
}
|
||||
|
||||
_, err := methods.UnregisterExtension(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m ExtensionManager) Update(ctx context.Context, extension types.Extension) error {
|
||||
req := types.UpdateExtension{
|
||||
This: m.Reference(),
|
||||
Extension: extension,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateExtension(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
126
vendor/github.com/vmware/govmomi/object/file_manager.go
generated
vendored
Normal file
126
vendor/github.com/vmware/govmomi/object/file_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type FileManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewFileManager(c *vim25.Client) *FileManager {
|
||||
f := FileManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.FileManager),
|
||||
}
|
||||
|
||||
return &f
|
||||
}
|
||||
|
||||
func (f FileManager) CopyDatastoreFile(ctx context.Context, sourceName string, sourceDatacenter *Datacenter, destinationName string, destinationDatacenter *Datacenter, force bool) (*Task, error) {
|
||||
req := types.CopyDatastoreFile_Task{
|
||||
This: f.Reference(),
|
||||
SourceName: sourceName,
|
||||
DestinationName: destinationName,
|
||||
Force: types.NewBool(force),
|
||||
}
|
||||
|
||||
if sourceDatacenter != nil {
|
||||
ref := sourceDatacenter.Reference()
|
||||
req.SourceDatacenter = &ref
|
||||
}
|
||||
|
||||
if destinationDatacenter != nil {
|
||||
ref := destinationDatacenter.Reference()
|
||||
req.DestinationDatacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CopyDatastoreFile_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// DeleteDatastoreFile deletes the specified file or folder from the datastore.
|
||||
func (f FileManager) DeleteDatastoreFile(ctx context.Context, name string, dc *Datacenter) (*Task, error) {
|
||||
req := types.DeleteDatastoreFile_Task{
|
||||
This: f.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.DeleteDatastoreFile_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// MakeDirectory creates a folder using the specified name.
|
||||
func (f FileManager) MakeDirectory(ctx context.Context, name string, dc *Datacenter, createParentDirectories bool) error {
|
||||
req := types.MakeDirectory{
|
||||
This: f.Reference(),
|
||||
Name: name,
|
||||
CreateParentDirectories: types.NewBool(createParentDirectories),
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
_, err := methods.MakeDirectory(ctx, f.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (f FileManager) MoveDatastoreFile(ctx context.Context, sourceName string, sourceDatacenter *Datacenter, destinationName string, destinationDatacenter *Datacenter, force bool) (*Task, error) {
|
||||
req := types.MoveDatastoreFile_Task{
|
||||
This: f.Reference(),
|
||||
SourceName: sourceName,
|
||||
DestinationName: destinationName,
|
||||
Force: types.NewBool(force),
|
||||
}
|
||||
|
||||
if sourceDatacenter != nil {
|
||||
ref := sourceDatacenter.Reference()
|
||||
req.SourceDatacenter = &ref
|
||||
}
|
||||
|
||||
if destinationDatacenter != nil {
|
||||
ref := destinationDatacenter.Reference()
|
||||
req.DestinationDatacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.MoveDatastoreFile_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
227
vendor/github.com/vmware/govmomi/object/folder.go
generated
vendored
Normal file
227
vendor/github.com/vmware/govmomi/object/folder.go
generated
vendored
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type Folder struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewFolder(c *vim25.Client, ref types.ManagedObjectReference) *Folder {
|
||||
return &Folder{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func NewRootFolder(c *vim25.Client) *Folder {
|
||||
f := NewFolder(c, c.ServiceContent.RootFolder)
|
||||
f.InventoryPath = "/"
|
||||
return f
|
||||
}
|
||||
|
||||
func (f Folder) Children(ctx context.Context) ([]Reference, error) {
|
||||
var mf mo.Folder
|
||||
|
||||
err := f.Properties(ctx, f.Reference(), []string{"childEntity"}, &mf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var rs []Reference
|
||||
for _, e := range mf.ChildEntity {
|
||||
if r := NewReference(f.c, e); r != nil {
|
||||
rs = append(rs, r)
|
||||
}
|
||||
}
|
||||
|
||||
return rs, nil
|
||||
}
|
||||
|
||||
func (f Folder) CreateDatacenter(ctx context.Context, datacenter string) (*Datacenter, error) {
|
||||
req := types.CreateDatacenter{
|
||||
This: f.Reference(),
|
||||
Name: datacenter,
|
||||
}
|
||||
|
||||
res, err := methods.CreateDatacenter(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Response will be nil if this is an ESX host that does not belong to a vCenter
|
||||
if res == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return NewDatacenter(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) CreateCluster(ctx context.Context, cluster string, spec types.ClusterConfigSpecEx) (*ClusterComputeResource, error) {
|
||||
req := types.CreateClusterEx{
|
||||
This: f.Reference(),
|
||||
Name: cluster,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CreateClusterEx(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Response will be nil if this is an ESX host that does not belong to a vCenter
|
||||
if res == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return NewClusterComputeResource(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) CreateFolder(ctx context.Context, name string) (*Folder, error) {
|
||||
req := types.CreateFolder{
|
||||
This: f.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.CreateFolder(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewFolder(f.c, res.Returnval), err
|
||||
}
|
||||
|
||||
func (f Folder) CreateStoragePod(ctx context.Context, name string) (*StoragePod, error) {
|
||||
req := types.CreateStoragePod{
|
||||
This: f.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.CreateStoragePod(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewStoragePod(f.c, res.Returnval), err
|
||||
}
|
||||
|
||||
func (f Folder) AddStandaloneHost(ctx context.Context, spec types.HostConnectSpec, addConnected bool, license *string, compResSpec *types.BaseComputeResourceConfigSpec) (*Task, error) {
|
||||
req := types.AddStandaloneHost_Task{
|
||||
This: f.Reference(),
|
||||
Spec: spec,
|
||||
AddConnected: addConnected,
|
||||
}
|
||||
|
||||
if license != nil {
|
||||
req.License = *license
|
||||
}
|
||||
|
||||
if compResSpec != nil {
|
||||
req.CompResSpec = *compResSpec
|
||||
}
|
||||
|
||||
res, err := methods.AddStandaloneHost_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) CreateVM(ctx context.Context, config types.VirtualMachineConfigSpec, pool *ResourcePool, host *HostSystem) (*Task, error) {
|
||||
req := types.CreateVM_Task{
|
||||
This: f.Reference(),
|
||||
Config: config,
|
||||
Pool: pool.Reference(),
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CreateVM_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) RegisterVM(ctx context.Context, path string, name string, asTemplate bool, pool *ResourcePool, host *HostSystem) (*Task, error) {
|
||||
req := types.RegisterVM_Task{
|
||||
This: f.Reference(),
|
||||
Path: path,
|
||||
AsTemplate: asTemplate,
|
||||
}
|
||||
|
||||
if name != "" {
|
||||
req.Name = name
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
if pool != nil {
|
||||
ref := pool.Reference()
|
||||
req.Pool = &ref
|
||||
}
|
||||
|
||||
res, err := methods.RegisterVM_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) CreateDVS(ctx context.Context, spec types.DVSCreateSpec) (*Task, error) {
|
||||
req := types.CreateDVS_Task{
|
||||
This: f.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CreateDVS_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (f Folder) MoveInto(ctx context.Context, list []types.ManagedObjectReference) (*Task, error) {
|
||||
req := types.MoveIntoFolder_Task{
|
||||
This: f.Reference(),
|
||||
List: list,
|
||||
}
|
||||
|
||||
res, err := methods.MoveIntoFolder_Task(ctx, f.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(f.c, res.Returnval), nil
|
||||
}
|
||||
72
vendor/github.com/vmware/govmomi/object/history_collector.go
generated
vendored
Normal file
72
vendor/github.com/vmware/govmomi/object/history_collector.go
generated
vendored
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HistoryCollector struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHistoryCollector(c *vim25.Client, ref types.ManagedObjectReference) *HistoryCollector {
|
||||
return &HistoryCollector{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (h HistoryCollector) Destroy(ctx context.Context) error {
|
||||
req := types.DestroyCollector{
|
||||
This: h.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.DestroyCollector(ctx, h.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (h HistoryCollector) Reset(ctx context.Context) error {
|
||||
req := types.ResetCollector{
|
||||
This: h.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.ResetCollector(ctx, h.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (h HistoryCollector) Rewind(ctx context.Context) error {
|
||||
req := types.RewindCollector{
|
||||
This: h.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RewindCollector(ctx, h.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (h HistoryCollector) SetPageSize(ctx context.Context, maxCount int32) error {
|
||||
req := types.SetCollectorPageSize{
|
||||
This: h.Reference(),
|
||||
MaxCount: maxCount,
|
||||
}
|
||||
|
||||
_, err := methods.SetCollectorPageSize(ctx, h.c, &req)
|
||||
return err
|
||||
}
|
||||
65
vendor/github.com/vmware/govmomi/object/host_account_manager.go
generated
vendored
Normal file
65
vendor/github.com/vmware/govmomi/object/host_account_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
Copyright (c) 2016 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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostAccountManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostAccountManager(c *vim25.Client, ref types.ManagedObjectReference) *HostAccountManager {
|
||||
return &HostAccountManager{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (m HostAccountManager) Create(ctx context.Context, user *types.HostAccountSpec) error {
|
||||
req := types.CreateUser{
|
||||
This: m.Reference(),
|
||||
User: user,
|
||||
}
|
||||
|
||||
_, err := methods.CreateUser(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m HostAccountManager) Update(ctx context.Context, user *types.HostAccountSpec) error {
|
||||
req := types.UpdateUser{
|
||||
This: m.Reference(),
|
||||
User: user,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateUser(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m HostAccountManager) Remove(ctx context.Context, userName string) error {
|
||||
req := types.RemoveUser{
|
||||
This: m.Reference(),
|
||||
UserName: userName,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveUser(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
250
vendor/github.com/vmware/govmomi/object/host_certificate_info.go
generated
vendored
Normal file
250
vendor/github.com/vmware/govmomi/object/host_certificate_info.go
generated
vendored
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
/*
|
||||
Copyright (c) 2016 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 (
|
||||
"crypto/sha256"
|
||||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"crypto/x509/pkix"
|
||||
"encoding/asn1"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/url"
|
||||
"strings"
|
||||
"text/tabwriter"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// HostCertificateInfo provides helpers for types.HostCertificateManagerCertificateInfo
|
||||
type HostCertificateInfo struct {
|
||||
types.HostCertificateManagerCertificateInfo
|
||||
|
||||
ThumbprintSHA1 string
|
||||
ThumbprintSHA256 string
|
||||
|
||||
Err error
|
||||
Certificate *x509.Certificate `json:"-"`
|
||||
|
||||
subjectName *pkix.Name
|
||||
issuerName *pkix.Name
|
||||
}
|
||||
|
||||
// FromCertificate converts x509.Certificate to HostCertificateInfo
|
||||
func (info *HostCertificateInfo) FromCertificate(cert *x509.Certificate) *HostCertificateInfo {
|
||||
info.Certificate = cert
|
||||
info.subjectName = &cert.Subject
|
||||
info.issuerName = &cert.Issuer
|
||||
|
||||
info.Issuer = info.fromName(info.issuerName)
|
||||
info.NotBefore = &cert.NotBefore
|
||||
info.NotAfter = &cert.NotAfter
|
||||
info.Subject = info.fromName(info.subjectName)
|
||||
|
||||
info.ThumbprintSHA1 = soap.ThumbprintSHA1(cert)
|
||||
|
||||
// SHA-256 for info purposes only, API fields all use SHA-1
|
||||
sum := sha256.Sum256(cert.Raw)
|
||||
hex := make([]string, len(sum))
|
||||
for i, b := range sum {
|
||||
hex[i] = fmt.Sprintf("%02X", b)
|
||||
}
|
||||
info.ThumbprintSHA256 = strings.Join(hex, ":")
|
||||
|
||||
if info.Status == "" {
|
||||
info.Status = string(types.HostCertificateManagerCertificateInfoCertificateStatusUnknown)
|
||||
}
|
||||
|
||||
return info
|
||||
}
|
||||
|
||||
// FromURL connects to the given URL.Host via tls.Dial with the given tls.Config and populates the HostCertificateInfo
|
||||
// via tls.ConnectionState. If the certificate was verified with the given tls.Config, the Err field will be nil.
|
||||
// Otherwise, Err will be set to the x509.UnknownAuthorityError or x509.HostnameError.
|
||||
// If tls.Dial returns an error of any other type, that error is returned.
|
||||
func (info *HostCertificateInfo) FromURL(u *url.URL, config *tls.Config) error {
|
||||
addr := u.Host
|
||||
if !(strings.LastIndex(addr, ":") > strings.LastIndex(addr, "]")) {
|
||||
addr += ":443"
|
||||
}
|
||||
|
||||
conn, err := tls.Dial("tcp", addr, config)
|
||||
if err != nil {
|
||||
switch err.(type) {
|
||||
case x509.UnknownAuthorityError:
|
||||
case x509.HostnameError:
|
||||
default:
|
||||
return err
|
||||
}
|
||||
|
||||
info.Err = err
|
||||
|
||||
conn, err = tls.Dial("tcp", addr, &tls.Config{InsecureSkipVerify: true})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
info.Status = string(types.HostCertificateManagerCertificateInfoCertificateStatusGood)
|
||||
}
|
||||
|
||||
state := conn.ConnectionState()
|
||||
_ = conn.Close()
|
||||
info.FromCertificate(state.PeerCertificates[0])
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var emailAddressOID = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}
|
||||
|
||||
func (info *HostCertificateInfo) fromName(name *pkix.Name) string {
|
||||
var attrs []string
|
||||
|
||||
oids := map[string]string{
|
||||
emailAddressOID.String(): "emailAddress",
|
||||
}
|
||||
|
||||
for _, attr := range name.Names {
|
||||
if key, ok := oids[attr.Type.String()]; ok {
|
||||
attrs = append(attrs, fmt.Sprintf("%s=%s", key, attr.Value))
|
||||
}
|
||||
}
|
||||
|
||||
attrs = append(attrs, fmt.Sprintf("CN=%s", name.CommonName))
|
||||
|
||||
add := func(key string, vals []string) {
|
||||
for _, val := range vals {
|
||||
attrs = append(attrs, fmt.Sprintf("%s=%s", key, val))
|
||||
}
|
||||
}
|
||||
|
||||
elts := []struct {
|
||||
key string
|
||||
val []string
|
||||
}{
|
||||
{"OU", name.OrganizationalUnit},
|
||||
{"O", name.Organization},
|
||||
{"L", name.Locality},
|
||||
{"ST", name.Province},
|
||||
{"C", name.Country},
|
||||
}
|
||||
|
||||
for _, elt := range elts {
|
||||
add(elt.key, elt.val)
|
||||
}
|
||||
|
||||
return strings.Join(attrs, ",")
|
||||
}
|
||||
|
||||
func (info *HostCertificateInfo) toName(s string) *pkix.Name {
|
||||
var name pkix.Name
|
||||
|
||||
for _, pair := range strings.Split(s, ",") {
|
||||
attr := strings.SplitN(pair, "=", 2)
|
||||
if len(attr) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
v := attr[1]
|
||||
|
||||
switch strings.ToLower(attr[0]) {
|
||||
case "cn":
|
||||
name.CommonName = v
|
||||
case "ou":
|
||||
name.OrganizationalUnit = append(name.OrganizationalUnit, v)
|
||||
case "o":
|
||||
name.Organization = append(name.Organization, v)
|
||||
case "l":
|
||||
name.Locality = append(name.Locality, v)
|
||||
case "st":
|
||||
name.Province = append(name.Province, v)
|
||||
case "c":
|
||||
name.Country = append(name.Country, v)
|
||||
case "emailaddress":
|
||||
name.Names = append(name.Names, pkix.AttributeTypeAndValue{Type: emailAddressOID, Value: v})
|
||||
}
|
||||
}
|
||||
|
||||
return &name
|
||||
}
|
||||
|
||||
// SubjectName parses Subject into a pkix.Name
|
||||
func (info *HostCertificateInfo) SubjectName() *pkix.Name {
|
||||
if info.subjectName != nil {
|
||||
return info.subjectName
|
||||
}
|
||||
|
||||
return info.toName(info.Subject)
|
||||
}
|
||||
|
||||
// IssuerName parses Issuer into a pkix.Name
|
||||
func (info *HostCertificateInfo) IssuerName() *pkix.Name {
|
||||
if info.issuerName != nil {
|
||||
return info.issuerName
|
||||
}
|
||||
|
||||
return info.toName(info.Issuer)
|
||||
}
|
||||
|
||||
// Write outputs info similar to the Chrome Certificate Viewer.
|
||||
func (info *HostCertificateInfo) Write(w io.Writer) error {
|
||||
tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0)
|
||||
|
||||
s := func(val string) string {
|
||||
if val != "" {
|
||||
return val
|
||||
}
|
||||
return "<Not Part Of Certificate>"
|
||||
}
|
||||
|
||||
ss := func(val []string) string {
|
||||
return s(strings.Join(val, ","))
|
||||
}
|
||||
|
||||
name := func(n *pkix.Name) {
|
||||
fmt.Fprintf(tw, " Common Name (CN):\t%s\n", s(n.CommonName))
|
||||
fmt.Fprintf(tw, " Organization (O):\t%s\n", ss(n.Organization))
|
||||
fmt.Fprintf(tw, " Organizational Unit (OU):\t%s\n", ss(n.OrganizationalUnit))
|
||||
}
|
||||
|
||||
status := info.Status
|
||||
if info.Err != nil {
|
||||
status = fmt.Sprintf("ERROR %s", info.Err)
|
||||
}
|
||||
fmt.Fprintf(tw, "Certificate Status:\t%s\n", status)
|
||||
|
||||
fmt.Fprintln(tw, "Issued To:\t")
|
||||
name(info.SubjectName())
|
||||
|
||||
fmt.Fprintln(tw, "Issued By:\t")
|
||||
name(info.IssuerName())
|
||||
|
||||
fmt.Fprintln(tw, "Validity Period:\t")
|
||||
fmt.Fprintf(tw, " Issued On:\t%s\n", info.NotBefore)
|
||||
fmt.Fprintf(tw, " Expires On:\t%s\n", info.NotAfter)
|
||||
|
||||
if info.ThumbprintSHA1 != "" {
|
||||
fmt.Fprintln(tw, "Thumbprints:\t")
|
||||
if info.ThumbprintSHA256 != "" {
|
||||
fmt.Fprintf(tw, " SHA-256 Thumbprint:\t%s\n", info.ThumbprintSHA256)
|
||||
}
|
||||
fmt.Fprintf(tw, " SHA-1 Thumbprint:\t%s\n", info.ThumbprintSHA1)
|
||||
}
|
||||
|
||||
return tw.Flush()
|
||||
}
|
||||
162
vendor/github.com/vmware/govmomi/object/host_certificate_manager.go
generated
vendored
Normal file
162
vendor/github.com/vmware/govmomi/object/host_certificate_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
Copyright (c) 2016 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"
|
||||
|
||||
"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"
|
||||
)
|
||||
|
||||
// HostCertificateManager provides helper methods around the HostSystem.ConfigManager.CertificateManager
|
||||
type HostCertificateManager struct {
|
||||
Common
|
||||
Host *HostSystem
|
||||
}
|
||||
|
||||
// NewHostCertificateManager creates a new HostCertificateManager helper
|
||||
func NewHostCertificateManager(c *vim25.Client, ref types.ManagedObjectReference, host types.ManagedObjectReference) *HostCertificateManager {
|
||||
return &HostCertificateManager{
|
||||
Common: NewCommon(c, ref),
|
||||
Host: NewHostSystem(c, host),
|
||||
}
|
||||
}
|
||||
|
||||
// CertificateInfo wraps the host CertificateManager certificateInfo property with the HostCertificateInfo helper.
|
||||
// The ThumbprintSHA1 field is set to HostSystem.Summary.Config.SslThumbprint if the host system is managed by a vCenter.
|
||||
func (m HostCertificateManager) CertificateInfo(ctx context.Context) (*HostCertificateInfo, error) {
|
||||
var hs mo.HostSystem
|
||||
var cm mo.HostCertificateManager
|
||||
|
||||
pc := property.DefaultCollector(m.Client())
|
||||
|
||||
err := pc.RetrieveOne(ctx, m.Reference(), []string{"certificateInfo"}, &cm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_ = pc.RetrieveOne(ctx, m.Host.Reference(), []string{"summary.config.sslThumbprint"}, &hs)
|
||||
|
||||
return &HostCertificateInfo{
|
||||
HostCertificateManagerCertificateInfo: cm.CertificateInfo,
|
||||
ThumbprintSHA1: hs.Summary.Config.SslThumbprint,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// GenerateCertificateSigningRequest requests the host system to generate a certificate-signing request (CSR) for itself.
|
||||
// The CSR is then typically provided to a Certificate Authority to sign and issue the SSL certificate for the host system.
|
||||
// Use InstallServerCertificate to import this certificate.
|
||||
func (m HostCertificateManager) GenerateCertificateSigningRequest(ctx context.Context, useIPAddressAsCommonName bool) (string, error) {
|
||||
req := types.GenerateCertificateSigningRequest{
|
||||
This: m.Reference(),
|
||||
UseIpAddressAsCommonName: useIPAddressAsCommonName,
|
||||
}
|
||||
|
||||
res, err := methods.GenerateCertificateSigningRequest(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// GenerateCertificateSigningRequestByDn requests the host system to generate a certificate-signing request (CSR) for itself.
|
||||
// Alternative version similar to GenerateCertificateSigningRequest but takes a Distinguished Name (DN) as a parameter.
|
||||
func (m HostCertificateManager) GenerateCertificateSigningRequestByDn(ctx context.Context, distinguishedName string) (string, error) {
|
||||
req := types.GenerateCertificateSigningRequestByDn{
|
||||
This: m.Reference(),
|
||||
DistinguishedName: distinguishedName,
|
||||
}
|
||||
|
||||
res, err := methods.GenerateCertificateSigningRequestByDn(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// InstallServerCertificate imports the given SSL certificate to the host system.
|
||||
func (m HostCertificateManager) InstallServerCertificate(ctx context.Context, cert string) error {
|
||||
req := types.InstallServerCertificate{
|
||||
This: m.Reference(),
|
||||
Cert: cert,
|
||||
}
|
||||
|
||||
_, err := methods.InstallServerCertificate(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// NotifyAffectedService is internal, not exposing as we don't have a use case other than with InstallServerCertificate
|
||||
// Without this call, hostd needs to be restarted to use the updated certificate
|
||||
// Note: using Refresh as it has the same struct/signature, we just need to use different xml name tags
|
||||
body := struct {
|
||||
Req *types.Refresh `xml:"urn:vim25 NotifyAffectedServices,omitempty"`
|
||||
Res *types.RefreshResponse `xml:"urn:vim25 NotifyAffectedServicesResponse,omitempty"`
|
||||
methods.RefreshBody
|
||||
}{
|
||||
Req: &types.Refresh{This: m.Reference()},
|
||||
}
|
||||
|
||||
return m.Client().RoundTrip(ctx, &body, &body)
|
||||
}
|
||||
|
||||
// ListCACertificateRevocationLists returns the SSL CRLs of Certificate Authorities that are trusted by the host system.
|
||||
func (m HostCertificateManager) ListCACertificateRevocationLists(ctx context.Context) ([]string, error) {
|
||||
req := types.ListCACertificateRevocationLists{
|
||||
This: m.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.ListCACertificateRevocationLists(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// ListCACertificates returns the SSL certificates of Certificate Authorities that are trusted by the host system.
|
||||
func (m HostCertificateManager) ListCACertificates(ctx context.Context) ([]string, error) {
|
||||
req := types.ListCACertificates{
|
||||
This: m.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.ListCACertificates(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// ReplaceCACertificatesAndCRLs replaces the trusted CA certificates and CRL used by the host system.
|
||||
// These determine whether the server can verify the identity of an external entity.
|
||||
func (m HostCertificateManager) ReplaceCACertificatesAndCRLs(ctx context.Context, caCert []string, caCrl []string) error {
|
||||
req := types.ReplaceCACertificatesAndCRLs{
|
||||
This: m.Reference(),
|
||||
CaCert: caCert,
|
||||
CaCrl: caCrl,
|
||||
}
|
||||
|
||||
_, err := methods.ReplaceCACertificatesAndCRLs(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
171
vendor/github.com/vmware/govmomi/object/host_config_manager.go
generated
vendored
Normal file
171
vendor/github.com/vmware/govmomi/object/host_config_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostConfigManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostConfigManager(c *vim25.Client, ref types.ManagedObjectReference) *HostConfigManager {
|
||||
return &HostConfigManager{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
// reference returns the ManagedObjectReference for the given HostConfigManager property name.
|
||||
// An error is returned if the field is nil, of type ErrNotSupported if versioned is true.
|
||||
func (m HostConfigManager) reference(ctx context.Context, name string, versioned ...bool) (types.ManagedObjectReference, error) {
|
||||
prop := "configManager." + name
|
||||
var content []types.ObjectContent
|
||||
|
||||
err := m.Properties(ctx, m.Reference(), []string{prop}, &content)
|
||||
if err != nil {
|
||||
return types.ManagedObjectReference{}, err
|
||||
}
|
||||
|
||||
for _, c := range content {
|
||||
for _, p := range c.PropSet {
|
||||
if p.Name != prop {
|
||||
continue
|
||||
}
|
||||
if ref, ok := p.Val.(types.ManagedObjectReference); ok {
|
||||
return ref, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err = fmt.Errorf("%s %s is nil", m.Reference(), prop)
|
||||
if len(versioned) == 1 && versioned[0] {
|
||||
err = ErrNotSupported
|
||||
}
|
||||
return types.ManagedObjectReference{}, err
|
||||
}
|
||||
|
||||
func (m HostConfigManager) DatastoreSystem(ctx context.Context) (*HostDatastoreSystem, error) {
|
||||
ref, err := m.reference(ctx, "datastoreSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostDatastoreSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) NetworkSystem(ctx context.Context) (*HostNetworkSystem, error) {
|
||||
ref, err := m.reference(ctx, "networkSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostNetworkSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) FirewallSystem(ctx context.Context) (*HostFirewallSystem, error) {
|
||||
ref, err := m.reference(ctx, "firewallSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewHostFirewallSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) StorageSystem(ctx context.Context) (*HostStorageSystem, error) {
|
||||
ref, err := m.reference(ctx, "storageSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostStorageSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) VirtualNicManager(ctx context.Context) (*HostVirtualNicManager, error) {
|
||||
ref, err := m.reference(ctx, "virtualNicManager")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostVirtualNicManager(m.c, ref, m.Reference()), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) VsanSystem(ctx context.Context) (*HostVsanSystem, error) {
|
||||
ref, err := m.reference(ctx, "vsanSystem", true) // Added in 5.5
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostVsanSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) VsanInternalSystem(ctx context.Context) (*HostVsanInternalSystem, error) {
|
||||
ref, err := m.reference(ctx, "vsanInternalSystem", true) // Added in 5.5
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostVsanInternalSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) AccountManager(ctx context.Context) (*HostAccountManager, error) {
|
||||
ref, err := m.reference(ctx, "accountManager", true) // Added in 5.5
|
||||
if err != nil {
|
||||
if err == ErrNotSupported {
|
||||
// Versions < 5.5 can use the ServiceContent ref,
|
||||
// but only when connected directly to ESX.
|
||||
if m.c.ServiceContent.AccountManager == nil {
|
||||
return nil, err
|
||||
}
|
||||
ref = *m.c.ServiceContent.AccountManager
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return NewHostAccountManager(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) OptionManager(ctx context.Context) (*OptionManager, error) {
|
||||
ref, err := m.reference(ctx, "advancedOption")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewOptionManager(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) ServiceSystem(ctx context.Context) (*HostServiceSystem, error) {
|
||||
ref, err := m.reference(ctx, "serviceSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostServiceSystem(m.c, ref), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) CertificateManager(ctx context.Context) (*HostCertificateManager, error) {
|
||||
ref, err := m.reference(ctx, "certificateManager", true) // Added in 6.0
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostCertificateManager(m.c, ref, m.Reference()), nil
|
||||
}
|
||||
|
||||
func (m HostConfigManager) DateTimeSystem(ctx context.Context) (*HostDateTimeSystem, error) {
|
||||
ref, err := m.reference(ctx, "dateTimeSystem")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewHostDateTimeSystem(m.c, ref), nil
|
||||
}
|
||||
65
vendor/github.com/vmware/govmomi/object/host_datastore_browser.go
generated
vendored
Normal file
65
vendor/github.com/vmware/govmomi/object/host_datastore_browser.go
generated
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostDatastoreBrowser struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostDatastoreBrowser(c *vim25.Client, ref types.ManagedObjectReference) *HostDatastoreBrowser {
|
||||
return &HostDatastoreBrowser{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (b HostDatastoreBrowser) SearchDatastore(ctx context.Context, datastorePath string, searchSpec *types.HostDatastoreBrowserSearchSpec) (*Task, error) {
|
||||
req := types.SearchDatastore_Task{
|
||||
This: b.Reference(),
|
||||
DatastorePath: datastorePath,
|
||||
SearchSpec: searchSpec,
|
||||
}
|
||||
|
||||
res, err := methods.SearchDatastore_Task(ctx, b.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(b.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (b HostDatastoreBrowser) SearchDatastoreSubFolders(ctx context.Context, datastorePath string, searchSpec *types.HostDatastoreBrowserSearchSpec) (*Task, error) {
|
||||
req := types.SearchDatastoreSubFolders_Task{
|
||||
This: b.Reference(),
|
||||
DatastorePath: datastorePath,
|
||||
SearchSpec: searchSpec,
|
||||
}
|
||||
|
||||
res, err := methods.SearchDatastoreSubFolders_Task(ctx, b.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(b.c, res.Returnval), nil
|
||||
}
|
||||
135
vendor/github.com/vmware/govmomi/object/host_datastore_system.go
generated
vendored
Normal file
135
vendor/github.com/vmware/govmomi/object/host_datastore_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostDatastoreSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostDatastoreSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostDatastoreSystem {
|
||||
return &HostDatastoreSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) CreateLocalDatastore(ctx context.Context, name string, path string) (*Datastore, error) {
|
||||
req := types.CreateLocalDatastore{
|
||||
This: s.Reference(),
|
||||
Name: name,
|
||||
Path: path,
|
||||
}
|
||||
|
||||
res, err := methods.CreateLocalDatastore(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewDatastore(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) CreateNasDatastore(ctx context.Context, spec types.HostNasVolumeSpec) (*Datastore, error) {
|
||||
req := types.CreateNasDatastore{
|
||||
This: s.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CreateNasDatastore(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewDatastore(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) CreateVmfsDatastore(ctx context.Context, spec types.VmfsDatastoreCreateSpec) (*Datastore, error) {
|
||||
req := types.CreateVmfsDatastore{
|
||||
This: s.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CreateVmfsDatastore(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewDatastore(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) Remove(ctx context.Context, ds *Datastore) error {
|
||||
req := types.RemoveDatastore{
|
||||
This: s.Reference(),
|
||||
Datastore: ds.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RemoveDatastore(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) QueryAvailableDisksForVmfs(ctx context.Context) ([]types.HostScsiDisk, error) {
|
||||
req := types.QueryAvailableDisksForVmfs{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.QueryAvailableDisksForVmfs(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) QueryVmfsDatastoreCreateOptions(ctx context.Context, devicePath string) ([]types.VmfsDatastoreOption, error) {
|
||||
req := types.QueryVmfsDatastoreCreateOptions{
|
||||
This: s.Reference(),
|
||||
DevicePath: devicePath,
|
||||
}
|
||||
|
||||
res, err := methods.QueryVmfsDatastoreCreateOptions(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (s HostDatastoreSystem) ResignatureUnresolvedVmfsVolumes(ctx context.Context, devicePaths []string) (*Task, error) {
|
||||
req := &types.ResignatureUnresolvedVmfsVolume_Task{
|
||||
This: s.Reference(),
|
||||
ResolutionSpec: types.HostUnresolvedVmfsResignatureSpec{
|
||||
ExtentDevicePath: devicePaths,
|
||||
},
|
||||
}
|
||||
|
||||
res, err := methods.ResignatureUnresolvedVmfsVolume_Task(ctx, s.Client(), req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.c, res.Returnval), nil
|
||||
}
|
||||
69
vendor/github.com/vmware/govmomi/object/host_date_time_system.go
generated
vendored
Normal file
69
vendor/github.com/vmware/govmomi/object/host_date_time_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
Copyright (c) 2016 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"
|
||||
"time"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostDateTimeSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostDateTimeSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostDateTimeSystem {
|
||||
return &HostDateTimeSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostDateTimeSystem) UpdateConfig(ctx context.Context, config types.HostDateTimeConfig) error {
|
||||
req := types.UpdateDateTimeConfig{
|
||||
This: s.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateDateTimeConfig(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostDateTimeSystem) Update(ctx context.Context, date time.Time) error {
|
||||
req := types.UpdateDateTime{
|
||||
This: s.Reference(),
|
||||
DateTime: date,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateDateTime(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostDateTimeSystem) Query(ctx context.Context) (*time.Time, error) {
|
||||
req := types.QueryDateTime{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.QueryDateTime(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
181
vendor/github.com/vmware/govmomi/object/host_firewall_system.go
generated
vendored
Normal file
181
vendor/github.com/vmware/govmomi/object/host_firewall_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
/*
|
||||
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"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostFirewallSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostFirewallSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostFirewallSystem {
|
||||
return &HostFirewallSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostFirewallSystem) DisableRuleset(ctx context.Context, id string) error {
|
||||
req := types.DisableRuleset{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
}
|
||||
|
||||
_, err := methods.DisableRuleset(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostFirewallSystem) EnableRuleset(ctx context.Context, id string) error {
|
||||
req := types.EnableRuleset{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
}
|
||||
|
||||
_, err := methods.EnableRuleset(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostFirewallSystem) Refresh(ctx context.Context) error {
|
||||
req := types.RefreshFirewall{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RefreshFirewall(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostFirewallSystem) Info(ctx context.Context) (*types.HostFirewallInfo, error) {
|
||||
var fs mo.HostFirewallSystem
|
||||
|
||||
err := s.Properties(ctx, s.Reference(), []string{"firewallInfo"}, &fs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return fs.FirewallInfo, nil
|
||||
}
|
||||
|
||||
// HostFirewallRulesetList provides helpers for a slice of types.HostFirewallRuleset
|
||||
type HostFirewallRulesetList []types.HostFirewallRuleset
|
||||
|
||||
// ByRule returns a HostFirewallRulesetList where Direction, PortType and Protocol are equal and Port is within range
|
||||
func (l HostFirewallRulesetList) ByRule(rule types.HostFirewallRule) HostFirewallRulesetList {
|
||||
var matches HostFirewallRulesetList
|
||||
|
||||
for _, rs := range l {
|
||||
for _, r := range rs.Rule {
|
||||
if r.PortType != rule.PortType ||
|
||||
r.Protocol != rule.Protocol ||
|
||||
r.Direction != rule.Direction {
|
||||
continue
|
||||
}
|
||||
|
||||
if r.EndPort == 0 && rule.Port == r.Port ||
|
||||
rule.Port >= r.Port && rule.Port <= r.EndPort {
|
||||
matches = append(matches, rs)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return matches
|
||||
}
|
||||
|
||||
// EnabledByRule returns a HostFirewallRulesetList with Match(rule) applied and filtered via Enabled()
|
||||
// if enabled param is true, otherwise filtered via Disabled().
|
||||
// An error is returned if the resulting list is empty.
|
||||
func (l HostFirewallRulesetList) EnabledByRule(rule types.HostFirewallRule, enabled bool) (HostFirewallRulesetList, error) {
|
||||
var matched, skipped HostFirewallRulesetList
|
||||
var matchedKind, skippedKind string
|
||||
|
||||
l = l.ByRule(rule)
|
||||
|
||||
if enabled {
|
||||
matched = l.Enabled()
|
||||
matchedKind = "enabled"
|
||||
|
||||
skipped = l.Disabled()
|
||||
skippedKind = "disabled"
|
||||
} else {
|
||||
matched = l.Disabled()
|
||||
matchedKind = "disabled"
|
||||
|
||||
skipped = l.Enabled()
|
||||
skippedKind = "enabled"
|
||||
}
|
||||
|
||||
if len(matched) == 0 {
|
||||
msg := fmt.Sprintf("%d %s firewall rulesets match %s %s %s %d, %d %s rulesets match",
|
||||
len(matched), matchedKind,
|
||||
rule.Direction, rule.Protocol, rule.PortType, rule.Port,
|
||||
len(skipped), skippedKind)
|
||||
|
||||
if len(skipped) != 0 {
|
||||
msg += fmt.Sprintf(": %s", strings.Join(skipped.Keys(), ", "))
|
||||
}
|
||||
|
||||
return nil, errors.New(msg)
|
||||
}
|
||||
|
||||
return matched, nil
|
||||
}
|
||||
|
||||
// Enabled returns a HostFirewallRulesetList with enabled rules
|
||||
func (l HostFirewallRulesetList) Enabled() HostFirewallRulesetList {
|
||||
var matches HostFirewallRulesetList
|
||||
|
||||
for _, rs := range l {
|
||||
if rs.Enabled {
|
||||
matches = append(matches, rs)
|
||||
}
|
||||
}
|
||||
|
||||
return matches
|
||||
}
|
||||
|
||||
// Disabled returns a HostFirewallRulesetList with disabled rules
|
||||
func (l HostFirewallRulesetList) Disabled() HostFirewallRulesetList {
|
||||
var matches HostFirewallRulesetList
|
||||
|
||||
for _, rs := range l {
|
||||
if !rs.Enabled {
|
||||
matches = append(matches, rs)
|
||||
}
|
||||
}
|
||||
|
||||
return matches
|
||||
}
|
||||
|
||||
// Keys returns the HostFirewallRuleset.Key for each ruleset in the list
|
||||
func (l HostFirewallRulesetList) Keys() []string {
|
||||
var keys []string
|
||||
|
||||
for _, rs := range l {
|
||||
keys = append(keys, rs.Key)
|
||||
}
|
||||
|
||||
return keys
|
||||
}
|
||||
358
vendor/github.com/vmware/govmomi/object/host_network_system.go
generated
vendored
Normal file
358
vendor/github.com/vmware/govmomi/object/host_network_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,358 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostNetworkSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostNetworkSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostNetworkSystem {
|
||||
return &HostNetworkSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
// AddPortGroup wraps methods.AddPortGroup
|
||||
func (o HostNetworkSystem) AddPortGroup(ctx context.Context, portgrp types.HostPortGroupSpec) error {
|
||||
req := types.AddPortGroup{
|
||||
This: o.Reference(),
|
||||
Portgrp: portgrp,
|
||||
}
|
||||
|
||||
_, err := methods.AddPortGroup(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddServiceConsoleVirtualNic wraps methods.AddServiceConsoleVirtualNic
|
||||
func (o HostNetworkSystem) AddServiceConsoleVirtualNic(ctx context.Context, portgroup string, nic types.HostVirtualNicSpec) (string, error) {
|
||||
req := types.AddServiceConsoleVirtualNic{
|
||||
This: o.Reference(),
|
||||
Portgroup: portgroup,
|
||||
Nic: nic,
|
||||
}
|
||||
|
||||
res, err := methods.AddServiceConsoleVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// AddVirtualNic wraps methods.AddVirtualNic
|
||||
func (o HostNetworkSystem) AddVirtualNic(ctx context.Context, portgroup string, nic types.HostVirtualNicSpec) (string, error) {
|
||||
req := types.AddVirtualNic{
|
||||
This: o.Reference(),
|
||||
Portgroup: portgroup,
|
||||
Nic: nic,
|
||||
}
|
||||
|
||||
res, err := methods.AddVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
// AddVirtualSwitch wraps methods.AddVirtualSwitch
|
||||
func (o HostNetworkSystem) AddVirtualSwitch(ctx context.Context, vswitchName string, spec *types.HostVirtualSwitchSpec) error {
|
||||
req := types.AddVirtualSwitch{
|
||||
This: o.Reference(),
|
||||
VswitchName: vswitchName,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
_, err := methods.AddVirtualSwitch(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// QueryNetworkHint wraps methods.QueryNetworkHint
|
||||
func (o HostNetworkSystem) QueryNetworkHint(ctx context.Context, device []string) ([]types.PhysicalNicHintInfo, error) {
|
||||
req := types.QueryNetworkHint{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
}
|
||||
|
||||
res, err := methods.QueryNetworkHint(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, err
|
||||
}
|
||||
|
||||
// RefreshNetworkSystem wraps methods.RefreshNetworkSystem
|
||||
func (o HostNetworkSystem) RefreshNetworkSystem(ctx context.Context) error {
|
||||
req := types.RefreshNetworkSystem{
|
||||
This: o.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RefreshNetworkSystem(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemovePortGroup wraps methods.RemovePortGroup
|
||||
func (o HostNetworkSystem) RemovePortGroup(ctx context.Context, pgName string) error {
|
||||
req := types.RemovePortGroup{
|
||||
This: o.Reference(),
|
||||
PgName: pgName,
|
||||
}
|
||||
|
||||
_, err := methods.RemovePortGroup(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveServiceConsoleVirtualNic wraps methods.RemoveServiceConsoleVirtualNic
|
||||
func (o HostNetworkSystem) RemoveServiceConsoleVirtualNic(ctx context.Context, device string) error {
|
||||
req := types.RemoveServiceConsoleVirtualNic{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveServiceConsoleVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveVirtualNic wraps methods.RemoveVirtualNic
|
||||
func (o HostNetworkSystem) RemoveVirtualNic(ctx context.Context, device string) error {
|
||||
req := types.RemoveVirtualNic{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveVirtualSwitch wraps methods.RemoveVirtualSwitch
|
||||
func (o HostNetworkSystem) RemoveVirtualSwitch(ctx context.Context, vswitchName string) error {
|
||||
req := types.RemoveVirtualSwitch{
|
||||
This: o.Reference(),
|
||||
VswitchName: vswitchName,
|
||||
}
|
||||
|
||||
_, err := methods.RemoveVirtualSwitch(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RestartServiceConsoleVirtualNic wraps methods.RestartServiceConsoleVirtualNic
|
||||
func (o HostNetworkSystem) RestartServiceConsoleVirtualNic(ctx context.Context, device string) error {
|
||||
req := types.RestartServiceConsoleVirtualNic{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
}
|
||||
|
||||
_, err := methods.RestartServiceConsoleVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateConsoleIpRouteConfig wraps methods.UpdateConsoleIpRouteConfig
|
||||
func (o HostNetworkSystem) UpdateConsoleIpRouteConfig(ctx context.Context, config types.BaseHostIpRouteConfig) error {
|
||||
req := types.UpdateConsoleIpRouteConfig{
|
||||
This: o.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateConsoleIpRouteConfig(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateDnsConfig wraps methods.UpdateDnsConfig
|
||||
func (o HostNetworkSystem) UpdateDnsConfig(ctx context.Context, config types.BaseHostDnsConfig) error {
|
||||
req := types.UpdateDnsConfig{
|
||||
This: o.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateDnsConfig(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateIpRouteConfig wraps methods.UpdateIpRouteConfig
|
||||
func (o HostNetworkSystem) UpdateIpRouteConfig(ctx context.Context, config types.BaseHostIpRouteConfig) error {
|
||||
req := types.UpdateIpRouteConfig{
|
||||
This: o.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateIpRouteConfig(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateIpRouteTableConfig wraps methods.UpdateIpRouteTableConfig
|
||||
func (o HostNetworkSystem) UpdateIpRouteTableConfig(ctx context.Context, config types.HostIpRouteTableConfig) error {
|
||||
req := types.UpdateIpRouteTableConfig{
|
||||
This: o.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateIpRouteTableConfig(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateNetworkConfig wraps methods.UpdateNetworkConfig
|
||||
func (o HostNetworkSystem) UpdateNetworkConfig(ctx context.Context, config types.HostNetworkConfig, changeMode string) (*types.HostNetworkConfigResult, error) {
|
||||
req := types.UpdateNetworkConfig{
|
||||
This: o.Reference(),
|
||||
Config: config,
|
||||
ChangeMode: changeMode,
|
||||
}
|
||||
|
||||
res, err := methods.UpdateNetworkConfig(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
// UpdatePhysicalNicLinkSpeed wraps methods.UpdatePhysicalNicLinkSpeed
|
||||
func (o HostNetworkSystem) UpdatePhysicalNicLinkSpeed(ctx context.Context, device string, linkSpeed *types.PhysicalNicLinkInfo) error {
|
||||
req := types.UpdatePhysicalNicLinkSpeed{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
LinkSpeed: linkSpeed,
|
||||
}
|
||||
|
||||
_, err := methods.UpdatePhysicalNicLinkSpeed(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdatePortGroup wraps methods.UpdatePortGroup
|
||||
func (o HostNetworkSystem) UpdatePortGroup(ctx context.Context, pgName string, portgrp types.HostPortGroupSpec) error {
|
||||
req := types.UpdatePortGroup{
|
||||
This: o.Reference(),
|
||||
PgName: pgName,
|
||||
Portgrp: portgrp,
|
||||
}
|
||||
|
||||
_, err := methods.UpdatePortGroup(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateServiceConsoleVirtualNic wraps methods.UpdateServiceConsoleVirtualNic
|
||||
func (o HostNetworkSystem) UpdateServiceConsoleVirtualNic(ctx context.Context, device string, nic types.HostVirtualNicSpec) error {
|
||||
req := types.UpdateServiceConsoleVirtualNic{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
Nic: nic,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateServiceConsoleVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateVirtualNic wraps methods.UpdateVirtualNic
|
||||
func (o HostNetworkSystem) UpdateVirtualNic(ctx context.Context, device string, nic types.HostVirtualNicSpec) error {
|
||||
req := types.UpdateVirtualNic{
|
||||
This: o.Reference(),
|
||||
Device: device,
|
||||
Nic: nic,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateVirtualNic(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateVirtualSwitch wraps methods.UpdateVirtualSwitch
|
||||
func (o HostNetworkSystem) UpdateVirtualSwitch(ctx context.Context, vswitchName string, spec types.HostVirtualSwitchSpec) error {
|
||||
req := types.UpdateVirtualSwitch{
|
||||
This: o.Reference(),
|
||||
VswitchName: vswitchName,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateVirtualSwitch(ctx, o.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
88
vendor/github.com/vmware/govmomi/object/host_service_system.go
generated
vendored
Normal file
88
vendor/github.com/vmware/govmomi/object/host_service_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
Copyright (c) 2016 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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostServiceSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostServiceSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostServiceSystem {
|
||||
return &HostServiceSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostServiceSystem) Service(ctx context.Context) ([]types.HostService, error) {
|
||||
var ss mo.HostServiceSystem
|
||||
|
||||
err := s.Properties(ctx, s.Reference(), []string{"serviceInfo.service"}, &ss)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ss.ServiceInfo.Service, nil
|
||||
}
|
||||
|
||||
func (s HostServiceSystem) Start(ctx context.Context, id string) error {
|
||||
req := types.StartService{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
}
|
||||
|
||||
_, err := methods.StartService(ctx, s.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostServiceSystem) Stop(ctx context.Context, id string) error {
|
||||
req := types.StopService{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
}
|
||||
|
||||
_, err := methods.StopService(ctx, s.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostServiceSystem) Restart(ctx context.Context, id string) error {
|
||||
req := types.RestartService{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
}
|
||||
|
||||
_, err := methods.RestartService(ctx, s.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostServiceSystem) UpdatePolicy(ctx context.Context, id string, policy string) error {
|
||||
req := types.UpdateServicePolicy{
|
||||
This: s.Reference(),
|
||||
Id: id,
|
||||
Policy: policy,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateServicePolicy(ctx, s.Client(), &req)
|
||||
return err
|
||||
}
|
||||
200
vendor/github.com/vmware/govmomi/object/host_storage_system.go
generated
vendored
Normal file
200
vendor/github.com/vmware/govmomi/object/host_storage_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostStorageSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostStorageSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostStorageSystem {
|
||||
return &HostStorageSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) RetrieveDiskPartitionInfo(ctx context.Context, devicePath string) (*types.HostDiskPartitionInfo, error) {
|
||||
req := types.RetrieveDiskPartitionInfo{
|
||||
This: s.Reference(),
|
||||
DevicePath: []string{devicePath},
|
||||
}
|
||||
|
||||
res, err := methods.RetrieveDiskPartitionInfo(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil || len(res.Returnval) == 0 {
|
||||
return nil, errors.New("no partition info")
|
||||
}
|
||||
|
||||
return &res.Returnval[0], nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) ComputeDiskPartitionInfo(ctx context.Context, devicePath string, layout types.HostDiskPartitionLayout) (*types.HostDiskPartitionInfo, error) {
|
||||
req := types.ComputeDiskPartitionInfo{
|
||||
This: s.Reference(),
|
||||
DevicePath: devicePath,
|
||||
Layout: layout,
|
||||
}
|
||||
|
||||
res, err := methods.ComputeDiskPartitionInfo(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) UpdateDiskPartitionInfo(ctx context.Context, devicePath string, spec types.HostDiskPartitionSpec) error {
|
||||
req := types.UpdateDiskPartitions{
|
||||
This: s.Reference(),
|
||||
DevicePath: devicePath,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateDiskPartitions(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) RescanAllHba(ctx context.Context) error {
|
||||
req := types.RescanAllHba{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RescanAllHba(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) Refresh(ctx context.Context) error {
|
||||
req := types.RefreshStorageSystem{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RefreshStorageSystem(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) RescanVmfs(ctx context.Context) error {
|
||||
req := types.RescanVmfs{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RescanVmfs(ctx, s.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) MarkAsSsd(ctx context.Context, uuid string) (*Task, error) {
|
||||
req := types.MarkAsSsd_Task{
|
||||
This: s.Reference(),
|
||||
ScsiDiskUuid: uuid,
|
||||
}
|
||||
|
||||
res, err := methods.MarkAsSsd_Task(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) MarkAsNonSsd(ctx context.Context, uuid string) (*Task, error) {
|
||||
req := types.MarkAsNonSsd_Task{
|
||||
This: s.Reference(),
|
||||
ScsiDiskUuid: uuid,
|
||||
}
|
||||
|
||||
res, err := methods.MarkAsNonSsd_Task(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) MarkAsLocal(ctx context.Context, uuid string) (*Task, error) {
|
||||
req := types.MarkAsLocal_Task{
|
||||
This: s.Reference(),
|
||||
ScsiDiskUuid: uuid,
|
||||
}
|
||||
|
||||
res, err := methods.MarkAsLocal_Task(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) MarkAsNonLocal(ctx context.Context, uuid string) (*Task, error) {
|
||||
req := types.MarkAsNonLocal_Task{
|
||||
This: s.Reference(),
|
||||
ScsiDiskUuid: uuid,
|
||||
}
|
||||
|
||||
res, err := methods.MarkAsNonLocal_Task(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) AttachScsiLun(ctx context.Context, uuid string) error {
|
||||
req := types.AttachScsiLun{
|
||||
This: s.Reference(),
|
||||
LunUuid: uuid,
|
||||
}
|
||||
|
||||
_, err := methods.AttachScsiLun(ctx, s.c, &req)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) QueryUnresolvedVmfsVolumes(ctx context.Context) ([]types.HostUnresolvedVmfsVolume, error) {
|
||||
req := &types.QueryUnresolvedVmfsVolume{
|
||||
This: s.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.QueryUnresolvedVmfsVolume(ctx, s.Client(), req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (s HostStorageSystem) UnmountVmfsVolume(ctx context.Context, vmfsUuid string) error {
|
||||
req := &types.UnmountVmfsVolume{
|
||||
This: s.Reference(),
|
||||
VmfsUuid: vmfsUuid,
|
||||
}
|
||||
|
||||
_, err := methods.UnmountVmfsVolume(ctx, s.Client(), req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
160
vendor/github.com/vmware/govmomi/object/host_system.go
generated
vendored
Normal file
160
vendor/github.com/vmware/govmomi/object/host_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
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"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostSystem {
|
||||
return &HostSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (h HostSystem) ConfigManager() *HostConfigManager {
|
||||
return NewHostConfigManager(h.c, h.Reference())
|
||||
}
|
||||
|
||||
func (h HostSystem) ResourcePool(ctx context.Context) (*ResourcePool, error) {
|
||||
var mh mo.HostSystem
|
||||
|
||||
err := h.Properties(ctx, h.Reference(), []string{"parent"}, &mh)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var mcr *mo.ComputeResource
|
||||
var parent interface{}
|
||||
|
||||
switch mh.Parent.Type {
|
||||
case "ComputeResource":
|
||||
mcr = new(mo.ComputeResource)
|
||||
parent = mcr
|
||||
case "ClusterComputeResource":
|
||||
mcc := new(mo.ClusterComputeResource)
|
||||
mcr = &mcc.ComputeResource
|
||||
parent = mcc
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown host parent type: %s", mh.Parent.Type)
|
||||
}
|
||||
|
||||
err = h.Properties(ctx, *mh.Parent, []string{"resourcePool"}, parent)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pool := NewResourcePool(h.c, *mcr.ResourcePool)
|
||||
return pool, nil
|
||||
}
|
||||
|
||||
func (h HostSystem) ManagementIPs(ctx context.Context) ([]net.IP, error) {
|
||||
var mh mo.HostSystem
|
||||
|
||||
err := h.Properties(ctx, h.Reference(), []string{"config.virtualNicManagerInfo.netConfig"}, &mh)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var ips []net.IP
|
||||
for _, nc := range mh.Config.VirtualNicManagerInfo.NetConfig {
|
||||
if nc.NicType != string(types.HostVirtualNicManagerNicTypeManagement) {
|
||||
continue
|
||||
}
|
||||
for ix := range nc.CandidateVnic {
|
||||
for _, selectedVnicKey := range nc.SelectedVnic {
|
||||
if nc.CandidateVnic[ix].Key != selectedVnicKey {
|
||||
continue
|
||||
}
|
||||
ip := net.ParseIP(nc.CandidateVnic[ix].Spec.Ip.IpAddress)
|
||||
if ip != nil {
|
||||
ips = append(ips, ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ips, nil
|
||||
}
|
||||
|
||||
func (h HostSystem) Disconnect(ctx context.Context) (*Task, error) {
|
||||
req := types.DisconnectHost_Task{
|
||||
This: h.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.DisconnectHost_Task(ctx, h.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(h.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (h HostSystem) Reconnect(ctx context.Context, cnxSpec *types.HostConnectSpec, reconnectSpec *types.HostSystemReconnectSpec) (*Task, error) {
|
||||
req := types.ReconnectHost_Task{
|
||||
This: h.Reference(),
|
||||
CnxSpec: cnxSpec,
|
||||
ReconnectSpec: reconnectSpec,
|
||||
}
|
||||
|
||||
res, err := methods.ReconnectHost_Task(ctx, h.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(h.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (h HostSystem) EnterMaintenanceMode(ctx context.Context, timeout int32, evacuate bool, spec *types.HostMaintenanceSpec) (*Task, error) {
|
||||
req := types.EnterMaintenanceMode_Task{
|
||||
This: h.Reference(),
|
||||
Timeout: timeout,
|
||||
EvacuatePoweredOffVms: types.NewBool(evacuate),
|
||||
MaintenanceSpec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.EnterMaintenanceMode_Task(ctx, h.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(h.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (h HostSystem) ExitMaintenanceMode(ctx context.Context, timeout int32) (*Task, error) {
|
||||
req := types.ExitMaintenanceMode_Task{
|
||||
This: h.Reference(),
|
||||
Timeout: timeout,
|
||||
}
|
||||
|
||||
res, err := methods.ExitMaintenanceMode_Task(ctx, h.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(h.c, res.Returnval), nil
|
||||
}
|
||||
93
vendor/github.com/vmware/govmomi/object/host_virtual_nic_manager.go
generated
vendored
Normal file
93
vendor/github.com/vmware/govmomi/object/host_virtual_nic_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostVirtualNicManager struct {
|
||||
Common
|
||||
Host *HostSystem
|
||||
}
|
||||
|
||||
func NewHostVirtualNicManager(c *vim25.Client, ref types.ManagedObjectReference, host types.ManagedObjectReference) *HostVirtualNicManager {
|
||||
return &HostVirtualNicManager{
|
||||
Common: NewCommon(c, ref),
|
||||
Host: NewHostSystem(c, host),
|
||||
}
|
||||
}
|
||||
|
||||
func (m HostVirtualNicManager) Info(ctx context.Context) (*types.HostVirtualNicManagerInfo, error) {
|
||||
var vnm mo.HostVirtualNicManager
|
||||
|
||||
err := m.Properties(ctx, m.Reference(), []string{"info"}, &vnm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &vnm.Info, nil
|
||||
}
|
||||
|
||||
func (m HostVirtualNicManager) DeselectVnic(ctx context.Context, nicType string, device string) error {
|
||||
if nicType == string(types.HostVirtualNicManagerNicTypeVsan) {
|
||||
// Avoid fault.NotSupported:
|
||||
// "Error deselecting device '$device': VSAN interfaces must be deselected using vim.host.VsanSystem"
|
||||
s, err := m.Host.ConfigManager().VsanSystem(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.updateVnic(ctx, device, false)
|
||||
}
|
||||
|
||||
req := types.DeselectVnicForNicType{
|
||||
This: m.Reference(),
|
||||
NicType: nicType,
|
||||
Device: device,
|
||||
}
|
||||
|
||||
_, err := methods.DeselectVnicForNicType(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (m HostVirtualNicManager) SelectVnic(ctx context.Context, nicType string, device string) error {
|
||||
if nicType == string(types.HostVirtualNicManagerNicTypeVsan) {
|
||||
// Avoid fault.NotSupported:
|
||||
// "Error selecting device '$device': VSAN interfaces must be selected using vim.host.VsanSystem"
|
||||
s, err := m.Host.ConfigManager().VsanSystem(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.updateVnic(ctx, device, true)
|
||||
}
|
||||
|
||||
req := types.SelectVnicForNicType{
|
||||
This: m.Reference(),
|
||||
NicType: nicType,
|
||||
Device: device,
|
||||
}
|
||||
|
||||
_, err := methods.SelectVnicForNicType(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
117
vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go
generated
vendored
Normal file
117
vendor/github.com/vmware/govmomi/object/host_vsan_internal_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
Copyright (c) 2017 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"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostVsanInternalSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostVsanInternalSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostVsanInternalSystem {
|
||||
m := HostVsanInternalSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
|
||||
return &m
|
||||
}
|
||||
|
||||
// QueryVsanObjectUuidsByFilter returns vSAN DOM object uuids by filter.
|
||||
func (m HostVsanInternalSystem) QueryVsanObjectUuidsByFilter(ctx context.Context, uuids []string, limit int32, version int32) ([]string, error) {
|
||||
req := types.QueryVsanObjectUuidsByFilter{
|
||||
This: m.Reference(),
|
||||
Uuids: uuids,
|
||||
Limit: &limit,
|
||||
Version: version,
|
||||
}
|
||||
|
||||
res, err := methods.QueryVsanObjectUuidsByFilter(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
type VsanObjExtAttrs struct {
|
||||
Type string `json:"Object type"`
|
||||
Class string `json:"Object class"`
|
||||
Size string `json:"Object size"`
|
||||
Path string `json:"Object path"`
|
||||
Name string `json:"User friendly name"`
|
||||
}
|
||||
|
||||
func (a *VsanObjExtAttrs) DatastorePath(dir string) string {
|
||||
l := len(dir)
|
||||
path := a.Path
|
||||
|
||||
if len(path) >= l {
|
||||
path = a.Path[l:]
|
||||
}
|
||||
|
||||
if path != "" {
|
||||
return path
|
||||
}
|
||||
|
||||
return a.Name // vmnamespace
|
||||
}
|
||||
|
||||
// GetVsanObjExtAttrs is internal and intended for troubleshooting/debugging situations in the field.
|
||||
// WARNING: This API can be slow because we do IOs (reads) to all the objects.
|
||||
func (m HostVsanInternalSystem) GetVsanObjExtAttrs(ctx context.Context, uuids []string) (map[string]VsanObjExtAttrs, error) {
|
||||
req := types.GetVsanObjExtAttrs{
|
||||
This: m.Reference(),
|
||||
Uuids: uuids,
|
||||
}
|
||||
|
||||
res, err := methods.GetVsanObjExtAttrs(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var attrs map[string]VsanObjExtAttrs
|
||||
|
||||
err = json.Unmarshal([]byte(res.Returnval), &attrs)
|
||||
|
||||
return attrs, err
|
||||
}
|
||||
|
||||
// DeleteVsanObjects is internal and intended for troubleshooting/debugging only.
|
||||
// WARNING: This API can be slow because we do IOs to all the objects.
|
||||
// DOM won't allow access to objects which have lost quorum. Such objects can be deleted with the optional "force" flag.
|
||||
// These objects may however re-appear with quorum if the absent components come back (network partition gets resolved, etc.)
|
||||
func (m HostVsanInternalSystem) DeleteVsanObjects(ctx context.Context, uuids []string, force *bool) ([]types.HostVsanInternalSystemDeleteVsanObjectsResult, error) {
|
||||
req := types.DeleteVsanObjects{
|
||||
This: m.Reference(),
|
||||
Uuids: uuids,
|
||||
Force: force,
|
||||
}
|
||||
|
||||
res, err := methods.DeleteVsanObjects(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
88
vendor/github.com/vmware/govmomi/object/host_vsan_system.go
generated
vendored
Normal file
88
vendor/github.com/vmware/govmomi/object/host_vsan_system.go
generated
vendored
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type HostVsanSystem struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewHostVsanSystem(c *vim25.Client, ref types.ManagedObjectReference) *HostVsanSystem {
|
||||
return &HostVsanSystem{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (s HostVsanSystem) Update(ctx context.Context, config types.VsanHostConfigInfo) (*Task, error) {
|
||||
req := types.UpdateVsan_Task{
|
||||
This: s.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
res, err := methods.UpdateVsan_Task(ctx, s.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(s.Client(), res.Returnval), nil
|
||||
}
|
||||
|
||||
// updateVnic in support of the HostVirtualNicManager.{SelectVnic,DeselectVnic} methods
|
||||
func (s HostVsanSystem) updateVnic(ctx context.Context, device string, enable bool) error {
|
||||
var vsan mo.HostVsanSystem
|
||||
|
||||
err := s.Properties(ctx, s.Reference(), []string{"config.networkInfo.port"}, &vsan)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info := vsan.Config
|
||||
|
||||
var port []types.VsanHostConfigInfoNetworkInfoPortConfig
|
||||
|
||||
for _, p := range info.NetworkInfo.Port {
|
||||
if p.Device == device {
|
||||
continue
|
||||
}
|
||||
|
||||
port = append(port, p)
|
||||
}
|
||||
|
||||
if enable {
|
||||
port = append(port, types.VsanHostConfigInfoNetworkInfoPortConfig{
|
||||
Device: device,
|
||||
})
|
||||
}
|
||||
|
||||
info.NetworkInfo.Port = port
|
||||
|
||||
task, err := s.Update(ctx, info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = task.WaitForResult(ctx, nil)
|
||||
return err
|
||||
}
|
||||
76
vendor/github.com/vmware/govmomi/object/namespace_manager.go
generated
vendored
Normal file
76
vendor/github.com/vmware/govmomi/object/namespace_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type DatastoreNamespaceManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewDatastoreNamespaceManager(c *vim25.Client) *DatastoreNamespaceManager {
|
||||
n := DatastoreNamespaceManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.DatastoreNamespaceManager),
|
||||
}
|
||||
|
||||
return &n
|
||||
}
|
||||
|
||||
// CreateDirectory creates a top-level directory on the given vsan datastore, using
|
||||
// the given user display name hint and opaque storage policy.
|
||||
func (nm DatastoreNamespaceManager) CreateDirectory(ctx context.Context, ds *Datastore, displayName string, policy string) (string, error) {
|
||||
|
||||
req := &types.CreateDirectory{
|
||||
This: nm.Reference(),
|
||||
Datastore: ds.Reference(),
|
||||
DisplayName: displayName,
|
||||
Policy: policy,
|
||||
}
|
||||
|
||||
resp, err := methods.CreateDirectory(ctx, nm.c, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.Returnval, nil
|
||||
}
|
||||
|
||||
// DeleteDirectory deletes the given top-level directory from a vsan datastore.
|
||||
func (nm DatastoreNamespaceManager) DeleteDirectory(ctx context.Context, dc *Datacenter, datastorePath string) error {
|
||||
|
||||
req := &types.DeleteDirectory{
|
||||
This: nm.Reference(),
|
||||
DatastorePath: datastorePath,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
if _, err := methods.DeleteDirectory(ctx, nm.c, req); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
54
vendor/github.com/vmware/govmomi/object/network.go
generated
vendored
Normal file
54
vendor/github.com/vmware/govmomi/object/network.go
generated
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type Network struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewNetwork(c *vim25.Client, ref types.ManagedObjectReference) *Network {
|
||||
return &Network{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (n Network) GetInventoryPath() string {
|
||||
return n.InventoryPath
|
||||
}
|
||||
|
||||
// EthernetCardBackingInfo returns the VirtualDeviceBackingInfo for this Network
|
||||
func (n Network) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) {
|
||||
name, err := n.ObjectName(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
backing := &types.VirtualEthernetCardNetworkBackingInfo{
|
||||
VirtualDeviceDeviceBackingInfo: types.VirtualDeviceDeviceBackingInfo{
|
||||
DeviceName: name,
|
||||
},
|
||||
}
|
||||
|
||||
return backing, nil
|
||||
}
|
||||
31
vendor/github.com/vmware/govmomi/object/network_reference.go
generated
vendored
Normal file
31
vendor/github.com/vmware/govmomi/object/network_reference.go
generated
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// The NetworkReference interface is implemented by managed objects
|
||||
// which can be used as the backing for a VirtualEthernetCard.
|
||||
type NetworkReference interface {
|
||||
Reference
|
||||
GetInventoryPath() string
|
||||
EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error)
|
||||
}
|
||||
72
vendor/github.com/vmware/govmomi/object/opaque_network.go
generated
vendored
Normal file
72
vendor/github.com/vmware/govmomi/object/opaque_network.go
generated
vendored
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
Copyright (c) 2017 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"
|
||||
"fmt"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type OpaqueNetwork struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewOpaqueNetwork(c *vim25.Client, ref types.ManagedObjectReference) *OpaqueNetwork {
|
||||
return &OpaqueNetwork{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (n OpaqueNetwork) GetInventoryPath() string {
|
||||
return n.InventoryPath
|
||||
}
|
||||
|
||||
// EthernetCardBackingInfo returns the VirtualDeviceBackingInfo for this Network
|
||||
func (n OpaqueNetwork) EthernetCardBackingInfo(ctx context.Context) (types.BaseVirtualDeviceBackingInfo, error) {
|
||||
summary, err := n.Summary(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
backing := &types.VirtualEthernetCardOpaqueNetworkBackingInfo{
|
||||
OpaqueNetworkId: summary.OpaqueNetworkId,
|
||||
OpaqueNetworkType: summary.OpaqueNetworkType,
|
||||
}
|
||||
|
||||
return backing, nil
|
||||
}
|
||||
|
||||
// Summary returns the mo.OpaqueNetwork.Summary property
|
||||
func (n OpaqueNetwork) Summary(ctx context.Context) (*types.OpaqueNetworkSummary, error) {
|
||||
var props mo.OpaqueNetwork
|
||||
|
||||
err := n.Properties(ctx, n.Reference(), []string{"summary"}, &props)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
summary, ok := props.Summary.(*types.OpaqueNetworkSummary)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("%s unsupported network summary type: %T", n, props.Summary)
|
||||
}
|
||||
|
||||
return summary, nil
|
||||
}
|
||||
59
vendor/github.com/vmware/govmomi/object/option_manager.go
generated
vendored
Normal file
59
vendor/github.com/vmware/govmomi/object/option_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
Copyright (c) 2016 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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type OptionManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewOptionManager(c *vim25.Client, ref types.ManagedObjectReference) *OptionManager {
|
||||
return &OptionManager{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (m OptionManager) Query(ctx context.Context, name string) ([]types.BaseOptionValue, error) {
|
||||
req := types.QueryOptions{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.QueryOptions(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m OptionManager) Update(ctx context.Context, value []types.BaseOptionValue) error {
|
||||
req := types.UpdateOptions{
|
||||
This: m.Reference(),
|
||||
ChangedValue: value,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateOptions(ctx, m.Client(), &req)
|
||||
return err
|
||||
}
|
||||
151
vendor/github.com/vmware/govmomi/object/resource_pool.go
generated
vendored
Normal file
151
vendor/github.com/vmware/govmomi/object/resource_pool.go
generated
vendored
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/nfc"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/mo"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type ResourcePool struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewResourcePool(c *vim25.Client, ref types.ManagedObjectReference) *ResourcePool {
|
||||
return &ResourcePool{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
// Owner returns the ResourcePool owner as a ClusterComputeResource or ComputeResource.
|
||||
func (p ResourcePool) Owner(ctx context.Context) (Reference, error) {
|
||||
var pool mo.ResourcePool
|
||||
|
||||
err := p.Properties(ctx, p.Reference(), []string{"owner"}, &pool)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewReference(p.Client(), pool.Owner), nil
|
||||
}
|
||||
|
||||
func (p ResourcePool) ImportVApp(ctx context.Context, spec types.BaseImportSpec, folder *Folder, host *HostSystem) (*nfc.Lease, error) {
|
||||
req := types.ImportVApp{
|
||||
This: p.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
if folder != nil {
|
||||
ref := folder.Reference()
|
||||
req.Folder = &ref
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.ImportVApp(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nfc.NewLease(p.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (p ResourcePool) Create(ctx context.Context, name string, spec types.ResourceConfigSpec) (*ResourcePool, error) {
|
||||
req := types.CreateResourcePool{
|
||||
This: p.Reference(),
|
||||
Name: name,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CreateResourcePool(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewResourcePool(p.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (p ResourcePool) CreateVApp(ctx context.Context, name string, resSpec types.ResourceConfigSpec, configSpec types.VAppConfigSpec, folder *Folder) (*VirtualApp, error) {
|
||||
req := types.CreateVApp{
|
||||
This: p.Reference(),
|
||||
Name: name,
|
||||
ResSpec: resSpec,
|
||||
ConfigSpec: configSpec,
|
||||
}
|
||||
|
||||
if folder != nil {
|
||||
ref := folder.Reference()
|
||||
req.VmFolder = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CreateVApp(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewVirtualApp(p.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (p ResourcePool) UpdateConfig(ctx context.Context, name string, config *types.ResourceConfigSpec) error {
|
||||
req := types.UpdateConfig{
|
||||
This: p.Reference(),
|
||||
Name: name,
|
||||
Config: config,
|
||||
}
|
||||
|
||||
if config != nil && config.Entity == nil {
|
||||
ref := p.Reference()
|
||||
|
||||
// Create copy of config so changes won't leak back to the caller
|
||||
newConfig := *config
|
||||
newConfig.Entity = &ref
|
||||
req.Config = &newConfig
|
||||
}
|
||||
|
||||
_, err := methods.UpdateConfig(ctx, p.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p ResourcePool) DestroyChildren(ctx context.Context) error {
|
||||
req := types.DestroyChildren{
|
||||
This: p.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.DestroyChildren(ctx, p.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p ResourcePool) Destroy(ctx context.Context) (*Task, error) {
|
||||
req := types.Destroy_Task{
|
||||
This: p.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.Destroy_Task(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.c, res.Returnval), nil
|
||||
}
|
||||
248
vendor/github.com/vmware/govmomi/object/search_index.go
generated
vendored
Normal file
248
vendor/github.com/vmware/govmomi/object/search_index.go
generated
vendored
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type SearchIndex struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewSearchIndex(c *vim25.Client) *SearchIndex {
|
||||
s := SearchIndex{
|
||||
Common: NewCommon(c, *c.ServiceContent.SearchIndex),
|
||||
}
|
||||
|
||||
return &s
|
||||
}
|
||||
|
||||
// FindByDatastorePath finds a virtual machine by its location on a datastore.
|
||||
func (s SearchIndex) FindByDatastorePath(ctx context.Context, dc *Datacenter, path string) (Reference, error) {
|
||||
req := types.FindByDatastorePath{
|
||||
This: s.Reference(),
|
||||
Datacenter: dc.Reference(),
|
||||
Path: path,
|
||||
}
|
||||
|
||||
res, err := methods.FindByDatastorePath(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindByDnsName finds a virtual machine or host by DNS name.
|
||||
func (s SearchIndex) FindByDnsName(ctx context.Context, dc *Datacenter, dnsName string, vmSearch bool) (Reference, error) {
|
||||
req := types.FindByDnsName{
|
||||
This: s.Reference(),
|
||||
DnsName: dnsName,
|
||||
VmSearch: vmSearch,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindByDnsName(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindByInventoryPath finds a managed entity based on its location in the inventory.
|
||||
func (s SearchIndex) FindByInventoryPath(ctx context.Context, path string) (Reference, error) {
|
||||
req := types.FindByInventoryPath{
|
||||
This: s.Reference(),
|
||||
InventoryPath: path,
|
||||
}
|
||||
|
||||
res, err := methods.FindByInventoryPath(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindByIp finds a virtual machine or host by IP address.
|
||||
func (s SearchIndex) FindByIp(ctx context.Context, dc *Datacenter, ip string, vmSearch bool) (Reference, error) {
|
||||
req := types.FindByIp{
|
||||
This: s.Reference(),
|
||||
Ip: ip,
|
||||
VmSearch: vmSearch,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindByIp(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindByUuid finds a virtual machine or host by UUID.
|
||||
func (s SearchIndex) FindByUuid(ctx context.Context, dc *Datacenter, uuid string, vmSearch bool, instanceUuid *bool) (Reference, error) {
|
||||
req := types.FindByUuid{
|
||||
This: s.Reference(),
|
||||
Uuid: uuid,
|
||||
VmSearch: vmSearch,
|
||||
InstanceUuid: instanceUuid,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindByUuid(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindChild finds a particular child based on a managed entity name.
|
||||
func (s SearchIndex) FindChild(ctx context.Context, entity Reference, name string) (Reference, error) {
|
||||
req := types.FindChild{
|
||||
This: s.Reference(),
|
||||
Entity: entity.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
res, err := methods.FindChild(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if res.Returnval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return NewReference(s.c, *res.Returnval), nil
|
||||
}
|
||||
|
||||
// FindAllByDnsName finds all virtual machines or hosts by DNS name.
|
||||
func (s SearchIndex) FindAllByDnsName(ctx context.Context, dc *Datacenter, dnsName string, vmSearch bool) ([]Reference, error) {
|
||||
req := types.FindAllByDnsName{
|
||||
This: s.Reference(),
|
||||
DnsName: dnsName,
|
||||
VmSearch: vmSearch,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindAllByDnsName(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(res.Returnval) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var references []Reference
|
||||
for _, returnval := range res.Returnval {
|
||||
references = append(references, NewReference(s.c, returnval))
|
||||
}
|
||||
return references, nil
|
||||
}
|
||||
|
||||
// FindAllByIp finds all virtual machines or hosts by IP address.
|
||||
func (s SearchIndex) FindAllByIp(ctx context.Context, dc *Datacenter, ip string, vmSearch bool) ([]Reference, error) {
|
||||
req := types.FindAllByIp{
|
||||
This: s.Reference(),
|
||||
Ip: ip,
|
||||
VmSearch: vmSearch,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindAllByIp(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(res.Returnval) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var references []Reference
|
||||
for _, returnval := range res.Returnval {
|
||||
references = append(references, NewReference(s.c, returnval))
|
||||
}
|
||||
return references, nil
|
||||
}
|
||||
|
||||
// FindAllByUuid finds all virtual machines or hosts by UUID.
|
||||
func (s SearchIndex) FindAllByUuid(ctx context.Context, dc *Datacenter, uuid string, vmSearch bool, instanceUuid *bool) ([]Reference, error) {
|
||||
req := types.FindAllByUuid{
|
||||
This: s.Reference(),
|
||||
Uuid: uuid,
|
||||
VmSearch: vmSearch,
|
||||
InstanceUuid: instanceUuid,
|
||||
}
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.FindAllByUuid(ctx, s.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(res.Returnval) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var references []Reference
|
||||
for _, returnval := range res.Returnval {
|
||||
references = append(references, NewReference(s.c, returnval))
|
||||
}
|
||||
return references, nil
|
||||
}
|
||||
34
vendor/github.com/vmware/govmomi/object/storage_pod.go
generated
vendored
Normal file
34
vendor/github.com/vmware/govmomi/object/storage_pod.go
generated
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
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 (
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type StoragePod struct {
|
||||
*Folder
|
||||
}
|
||||
|
||||
func NewStoragePod(c *vim25.Client, ref types.ManagedObjectReference) *StoragePod {
|
||||
return &StoragePod{
|
||||
Folder: &Folder{
|
||||
Common: NewCommon(c, ref),
|
||||
},
|
||||
}
|
||||
}
|
||||
179
vendor/github.com/vmware/govmomi/object/storage_resource_manager.go
generated
vendored
Normal file
179
vendor/github.com/vmware/govmomi/object/storage_resource_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type StorageResourceManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewStorageResourceManager(c *vim25.Client) *StorageResourceManager {
|
||||
sr := StorageResourceManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.StorageResourceManager),
|
||||
}
|
||||
|
||||
return &sr
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) ApplyStorageDrsRecommendation(ctx context.Context, key []string) (*Task, error) {
|
||||
req := types.ApplyStorageDrsRecommendation_Task{
|
||||
This: sr.Reference(),
|
||||
Key: key,
|
||||
}
|
||||
|
||||
res, err := methods.ApplyStorageDrsRecommendation_Task(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(sr.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) ApplyStorageDrsRecommendationToPod(ctx context.Context, pod *StoragePod, key string) (*Task, error) {
|
||||
req := types.ApplyStorageDrsRecommendationToPod_Task{
|
||||
This: sr.Reference(),
|
||||
Key: key,
|
||||
}
|
||||
|
||||
if pod != nil {
|
||||
req.Pod = pod.Reference()
|
||||
}
|
||||
|
||||
res, err := methods.ApplyStorageDrsRecommendationToPod_Task(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(sr.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) CancelStorageDrsRecommendation(ctx context.Context, key []string) error {
|
||||
req := types.CancelStorageDrsRecommendation{
|
||||
This: sr.Reference(),
|
||||
Key: key,
|
||||
}
|
||||
|
||||
_, err := methods.CancelStorageDrsRecommendation(ctx, sr.c, &req)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) ConfigureDatastoreIORM(ctx context.Context, datastore *Datastore, spec types.StorageIORMConfigSpec, key string) (*Task, error) {
|
||||
req := types.ConfigureDatastoreIORM_Task{
|
||||
This: sr.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
if datastore != nil {
|
||||
req.Datastore = datastore.Reference()
|
||||
}
|
||||
|
||||
res, err := methods.ConfigureDatastoreIORM_Task(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(sr.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) ConfigureStorageDrsForPod(ctx context.Context, pod *StoragePod, spec types.StorageDrsConfigSpec, modify bool) (*Task, error) {
|
||||
req := types.ConfigureStorageDrsForPod_Task{
|
||||
This: sr.Reference(),
|
||||
Spec: spec,
|
||||
Modify: modify,
|
||||
}
|
||||
|
||||
if pod != nil {
|
||||
req.Pod = pod.Reference()
|
||||
}
|
||||
|
||||
res, err := methods.ConfigureStorageDrsForPod_Task(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(sr.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) QueryDatastorePerformanceSummary(ctx context.Context, datastore *Datastore) ([]types.StoragePerformanceSummary, error) {
|
||||
req := types.QueryDatastorePerformanceSummary{
|
||||
This: sr.Reference(),
|
||||
}
|
||||
|
||||
if datastore != nil {
|
||||
req.Datastore = datastore.Reference()
|
||||
}
|
||||
|
||||
res, err := methods.QueryDatastorePerformanceSummary(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) QueryIORMConfigOption(ctx context.Context, host *HostSystem) (*types.StorageIORMConfigOption, error) {
|
||||
req := types.QueryIORMConfigOption{
|
||||
This: sr.Reference(),
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
req.Host = host.Reference()
|
||||
}
|
||||
|
||||
res, err := methods.QueryIORMConfigOption(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) RecommendDatastores(ctx context.Context, storageSpec types.StoragePlacementSpec) (*types.StoragePlacementResult, error) {
|
||||
req := types.RecommendDatastores{
|
||||
This: sr.Reference(),
|
||||
StorageSpec: storageSpec,
|
||||
}
|
||||
|
||||
res, err := methods.RecommendDatastores(ctx, sr.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
func (sr StorageResourceManager) RefreshStorageDrsRecommendation(ctx context.Context, pod *StoragePod) error {
|
||||
req := types.RefreshStorageDrsRecommendation{
|
||||
This: sr.Reference(),
|
||||
}
|
||||
|
||||
if pod != nil {
|
||||
req.Pod = pod.Reference()
|
||||
}
|
||||
|
||||
_, err := methods.RefreshStorageDrsRecommendation(ctx, sr.c, &req)
|
||||
|
||||
return err
|
||||
}
|
||||
100
vendor/github.com/vmware/govmomi/object/task.go
generated
vendored
Normal file
100
vendor/github.com/vmware/govmomi/object/task.go
generated
vendored
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/property"
|
||||
"github.com/vmware/govmomi/task"
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/progress"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// Task is a convenience wrapper around task.Task that keeps a reference to
|
||||
// the client that was used to create it. This allows users to call the Wait()
|
||||
// function with only a context parameter, instead of a context parameter, a
|
||||
// soap.RoundTripper, and reference to the root property collector.
|
||||
type Task struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewTask(c *vim25.Client, ref types.ManagedObjectReference) *Task {
|
||||
t := Task{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
|
||||
return &t
|
||||
}
|
||||
|
||||
func (t *Task) Wait(ctx context.Context) error {
|
||||
_, err := t.WaitForResult(ctx, nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func (t *Task) WaitForResult(ctx context.Context, s ...progress.Sinker) (*types.TaskInfo, error) {
|
||||
var pr progress.Sinker
|
||||
if len(s) == 1 {
|
||||
pr = s[0]
|
||||
}
|
||||
p := property.DefaultCollector(t.c)
|
||||
return task.Wait(ctx, t.Reference(), p, pr)
|
||||
}
|
||||
|
||||
func (t *Task) Cancel(ctx context.Context) error {
|
||||
_, err := methods.CancelTask(ctx, t.Client(), &types.CancelTask{
|
||||
This: t.Reference(),
|
||||
})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// SetState sets task state and optionally sets results or fault, as appropriate for state.
|
||||
func (t *Task) SetState(ctx context.Context, state types.TaskInfoState, result types.AnyType, fault *types.LocalizedMethodFault) error {
|
||||
req := types.SetTaskState{
|
||||
This: t.Reference(),
|
||||
State: state,
|
||||
Result: result,
|
||||
Fault: fault,
|
||||
}
|
||||
_, err := methods.SetTaskState(ctx, t.Common.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
// SetDescription updates task description to describe the current phase of the task.
|
||||
func (t *Task) SetDescription(ctx context.Context, description types.LocalizableMessage) error {
|
||||
req := types.SetTaskDescription{
|
||||
This: t.Reference(),
|
||||
Description: description,
|
||||
}
|
||||
_, err := methods.SetTaskDescription(ctx, t.Common.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdateProgress Sets percentage done for this task and recalculates overall percentage done.
|
||||
// If a percentDone value of less than zero or greater than 100 is specified,
|
||||
// a value of zero or 100 respectively is used.
|
||||
func (t *Task) UpdateProgress(ctx context.Context, percentDone int) error {
|
||||
req := types.UpdateProgress{
|
||||
This: t.Reference(),
|
||||
PercentDone: int32(percentDone),
|
||||
}
|
||||
_, err := methods.UpdateProgress(ctx, t.Common.Client(), &req)
|
||||
return err
|
||||
}
|
||||
67
vendor/github.com/vmware/govmomi/object/types.go
generated
vendored
Normal file
67
vendor/github.com/vmware/govmomi/object/types.go
generated
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
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 (
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type Reference interface {
|
||||
Reference() types.ManagedObjectReference
|
||||
}
|
||||
|
||||
func NewReference(c *vim25.Client, e types.ManagedObjectReference) Reference {
|
||||
switch e.Type {
|
||||
case "Folder":
|
||||
return NewFolder(c, e)
|
||||
case "StoragePod":
|
||||
return &StoragePod{
|
||||
NewFolder(c, e),
|
||||
}
|
||||
case "Datacenter":
|
||||
return NewDatacenter(c, e)
|
||||
case "VirtualMachine":
|
||||
return NewVirtualMachine(c, e)
|
||||
case "VirtualApp":
|
||||
return &VirtualApp{
|
||||
NewResourcePool(c, e),
|
||||
}
|
||||
case "ComputeResource":
|
||||
return NewComputeResource(c, e)
|
||||
case "ClusterComputeResource":
|
||||
return NewClusterComputeResource(c, e)
|
||||
case "HostSystem":
|
||||
return NewHostSystem(c, e)
|
||||
case "Network":
|
||||
return NewNetwork(c, e)
|
||||
case "OpaqueNetwork":
|
||||
return NewOpaqueNetwork(c, e)
|
||||
case "ResourcePool":
|
||||
return NewResourcePool(c, e)
|
||||
case "DistributedVirtualSwitch":
|
||||
return NewDistributedVirtualSwitch(c, e)
|
||||
case "VmwareDistributedVirtualSwitch":
|
||||
return &VmwareDistributedVirtualSwitch{*NewDistributedVirtualSwitch(c, e)}
|
||||
case "DistributedVirtualPortgroup":
|
||||
return NewDistributedVirtualPortgroup(c, e)
|
||||
case "Datastore":
|
||||
return NewDatastore(c, e)
|
||||
default:
|
||||
panic("Unknown managed entity: " + e.Type)
|
||||
}
|
||||
}
|
||||
105
vendor/github.com/vmware/govmomi/object/virtual_app.go
generated
vendored
Normal file
105
vendor/github.com/vmware/govmomi/object/virtual_app.go
generated
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type VirtualApp struct {
|
||||
*ResourcePool
|
||||
}
|
||||
|
||||
func NewVirtualApp(c *vim25.Client, ref types.ManagedObjectReference) *VirtualApp {
|
||||
return &VirtualApp{
|
||||
ResourcePool: NewResourcePool(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (p VirtualApp) CreateChildVM(ctx context.Context, config types.VirtualMachineConfigSpec, host *HostSystem) (*Task, error) {
|
||||
req := types.CreateChildVM_Task{
|
||||
This: p.Reference(),
|
||||
Config: config,
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CreateChildVM_Task(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (p VirtualApp) UpdateConfig(ctx context.Context, spec types.VAppConfigSpec) error {
|
||||
req := types.UpdateVAppConfig{
|
||||
This: p.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
_, err := methods.UpdateVAppConfig(ctx, p.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p VirtualApp) PowerOn(ctx context.Context) (*Task, error) {
|
||||
req := types.PowerOnVApp_Task{
|
||||
This: p.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.PowerOnVApp_Task(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (p VirtualApp) PowerOff(ctx context.Context, force bool) (*Task, error) {
|
||||
req := types.PowerOffVApp_Task{
|
||||
This: p.Reference(),
|
||||
Force: force,
|
||||
}
|
||||
|
||||
res, err := methods.PowerOffVApp_Task(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.c, res.Returnval), nil
|
||||
|
||||
}
|
||||
|
||||
func (p VirtualApp) Suspend(ctx context.Context) (*Task, error) {
|
||||
req := types.SuspendVApp_Task{
|
||||
This: p.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.SuspendVApp_Task(ctx, p.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(p.c, res.Returnval), nil
|
||||
}
|
||||
937
vendor/github.com/vmware/govmomi/object/virtual_device_list.go
generated
vendored
Normal file
937
vendor/github.com/vmware/govmomi/object/virtual_device_list.go
generated
vendored
Normal file
|
|
@ -0,0 +1,937 @@
|
|||
/*
|
||||
Copyright (c) 2015-2017 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 (
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
// Type values for use in BootOrder
|
||||
const (
|
||||
DeviceTypeNone = "-"
|
||||
DeviceTypeCdrom = "cdrom"
|
||||
DeviceTypeDisk = "disk"
|
||||
DeviceTypeEthernet = "ethernet"
|
||||
DeviceTypeFloppy = "floppy"
|
||||
)
|
||||
|
||||
// VirtualDeviceList provides helper methods for working with a list of virtual devices.
|
||||
type VirtualDeviceList []types.BaseVirtualDevice
|
||||
|
||||
// SCSIControllerTypes are used for adding a new SCSI controller to a VM.
|
||||
func SCSIControllerTypes() VirtualDeviceList {
|
||||
// Return a mutable list of SCSI controller types, initialized with defaults.
|
||||
return VirtualDeviceList([]types.BaseVirtualDevice{
|
||||
&types.VirtualLsiLogicController{},
|
||||
&types.VirtualBusLogicController{},
|
||||
&types.ParaVirtualSCSIController{},
|
||||
&types.VirtualLsiLogicSASController{},
|
||||
}).Select(func(device types.BaseVirtualDevice) bool {
|
||||
c := device.(types.BaseVirtualSCSIController).GetVirtualSCSIController()
|
||||
c.SharedBus = types.VirtualSCSISharingNoSharing
|
||||
c.BusNumber = -1
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
// EthernetCardTypes are used for adding a new ethernet card to a VM.
|
||||
func EthernetCardTypes() VirtualDeviceList {
|
||||
return VirtualDeviceList([]types.BaseVirtualDevice{
|
||||
&types.VirtualE1000{},
|
||||
&types.VirtualE1000e{},
|
||||
&types.VirtualVmxnet2{},
|
||||
&types.VirtualVmxnet3{},
|
||||
&types.VirtualPCNet32{},
|
||||
&types.VirtualSriovEthernetCard{},
|
||||
}).Select(func(device types.BaseVirtualDevice) bool {
|
||||
c := device.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
|
||||
c.GetVirtualDevice().Key = -1
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
// Select returns a new list containing all elements of the list for which the given func returns true.
|
||||
func (l VirtualDeviceList) Select(f func(device types.BaseVirtualDevice) bool) VirtualDeviceList {
|
||||
var found VirtualDeviceList
|
||||
|
||||
for _, device := range l {
|
||||
if f(device) {
|
||||
found = append(found, device)
|
||||
}
|
||||
}
|
||||
|
||||
return found
|
||||
}
|
||||
|
||||
// SelectByType returns a new list with devices that are equal to or extend the given type.
|
||||
func (l VirtualDeviceList) SelectByType(deviceType types.BaseVirtualDevice) VirtualDeviceList {
|
||||
dtype := reflect.TypeOf(deviceType)
|
||||
if dtype == nil {
|
||||
return nil
|
||||
}
|
||||
dname := dtype.Elem().Name()
|
||||
|
||||
return l.Select(func(device types.BaseVirtualDevice) bool {
|
||||
t := reflect.TypeOf(device)
|
||||
|
||||
if t == dtype {
|
||||
return true
|
||||
}
|
||||
|
||||
_, ok := t.Elem().FieldByName(dname)
|
||||
|
||||
return ok
|
||||
})
|
||||
}
|
||||
|
||||
// SelectByBackingInfo returns a new list with devices matching the given backing info.
|
||||
// If the value of backing is nil, any device with a backing of the same type will be returned.
|
||||
func (l VirtualDeviceList) SelectByBackingInfo(backing types.BaseVirtualDeviceBackingInfo) VirtualDeviceList {
|
||||
t := reflect.TypeOf(backing)
|
||||
|
||||
return l.Select(func(device types.BaseVirtualDevice) bool {
|
||||
db := device.GetVirtualDevice().Backing
|
||||
if db == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if reflect.TypeOf(db) != t {
|
||||
return false
|
||||
}
|
||||
|
||||
if reflect.ValueOf(backing).IsNil() {
|
||||
// selecting by backing type
|
||||
return true
|
||||
}
|
||||
|
||||
switch a := db.(type) {
|
||||
case *types.VirtualEthernetCardNetworkBackingInfo:
|
||||
b := backing.(*types.VirtualEthernetCardNetworkBackingInfo)
|
||||
return a.DeviceName == b.DeviceName
|
||||
case *types.VirtualEthernetCardDistributedVirtualPortBackingInfo:
|
||||
b := backing.(*types.VirtualEthernetCardDistributedVirtualPortBackingInfo)
|
||||
return a.Port.SwitchUuid == b.Port.SwitchUuid &&
|
||||
a.Port.PortgroupKey == b.Port.PortgroupKey
|
||||
case *types.VirtualDiskFlatVer2BackingInfo:
|
||||
b := backing.(*types.VirtualDiskFlatVer2BackingInfo)
|
||||
if a.Parent != nil && b.Parent != nil {
|
||||
return a.Parent.FileName == b.Parent.FileName
|
||||
}
|
||||
return a.FileName == b.FileName
|
||||
case *types.VirtualSerialPortURIBackingInfo:
|
||||
b := backing.(*types.VirtualSerialPortURIBackingInfo)
|
||||
return a.ServiceURI == b.ServiceURI
|
||||
case types.BaseVirtualDeviceFileBackingInfo:
|
||||
b := backing.(types.BaseVirtualDeviceFileBackingInfo)
|
||||
return a.GetVirtualDeviceFileBackingInfo().FileName == b.GetVirtualDeviceFileBackingInfo().FileName
|
||||
default:
|
||||
return false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Find returns the device matching the given name.
|
||||
func (l VirtualDeviceList) Find(name string) types.BaseVirtualDevice {
|
||||
for _, device := range l {
|
||||
if l.Name(device) == name {
|
||||
return device
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// FindByKey returns the device matching the given key.
|
||||
func (l VirtualDeviceList) FindByKey(key int32) types.BaseVirtualDevice {
|
||||
for _, device := range l {
|
||||
if device.GetVirtualDevice().Key == key {
|
||||
return device
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// FindIDEController will find the named IDE controller if given, otherwise will pick an available controller.
|
||||
// An error is returned if the named controller is not found or not an IDE controller. Or, if name is not
|
||||
// given and no available controller can be found.
|
||||
func (l VirtualDeviceList) FindIDEController(name string) (*types.VirtualIDEController, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(*types.VirtualIDEController); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not an IDE controller", name)
|
||||
}
|
||||
|
||||
c := l.PickController((*types.VirtualIDEController)(nil))
|
||||
if c == nil {
|
||||
return nil, errors.New("no available IDE controller")
|
||||
}
|
||||
|
||||
return c.(*types.VirtualIDEController), nil
|
||||
}
|
||||
|
||||
// CreateIDEController creates a new IDE controller.
|
||||
func (l VirtualDeviceList) CreateIDEController() (types.BaseVirtualDevice, error) {
|
||||
ide := &types.VirtualIDEController{}
|
||||
ide.Key = l.NewKey()
|
||||
return ide, nil
|
||||
}
|
||||
|
||||
// FindSCSIController will find the named SCSI controller if given, otherwise will pick an available controller.
|
||||
// An error is returned if the named controller is not found or not an SCSI controller. Or, if name is not
|
||||
// given and no available controller can be found.
|
||||
func (l VirtualDeviceList) FindSCSIController(name string) (*types.VirtualSCSIController, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(types.BaseVirtualSCSIController); ok {
|
||||
return c.GetVirtualSCSIController(), nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not an SCSI controller", name)
|
||||
}
|
||||
|
||||
c := l.PickController((*types.VirtualSCSIController)(nil))
|
||||
if c == nil {
|
||||
return nil, errors.New("no available SCSI controller")
|
||||
}
|
||||
|
||||
return c.(types.BaseVirtualSCSIController).GetVirtualSCSIController(), nil
|
||||
}
|
||||
|
||||
// CreateSCSIController creates a new SCSI controller of type name if given, otherwise defaults to lsilogic.
|
||||
func (l VirtualDeviceList) CreateSCSIController(name string) (types.BaseVirtualDevice, error) {
|
||||
ctypes := SCSIControllerTypes()
|
||||
|
||||
if name == "" || name == "scsi" {
|
||||
name = ctypes.Type(ctypes[0])
|
||||
} else if name == "virtualscsi" {
|
||||
name = "pvscsi" // ovf VirtualSCSI mapping
|
||||
}
|
||||
|
||||
found := ctypes.Select(func(device types.BaseVirtualDevice) bool {
|
||||
return l.Type(device) == name
|
||||
})
|
||||
|
||||
if len(found) == 0 {
|
||||
return nil, fmt.Errorf("unknown SCSI controller type '%s'", name)
|
||||
}
|
||||
|
||||
c, ok := found[0].(types.BaseVirtualSCSIController)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid SCSI controller type '%s'", name)
|
||||
}
|
||||
|
||||
scsi := c.GetVirtualSCSIController()
|
||||
scsi.BusNumber = l.newSCSIBusNumber()
|
||||
scsi.Key = l.NewKey()
|
||||
scsi.ScsiCtlrUnitNumber = 7
|
||||
return c.(types.BaseVirtualDevice), nil
|
||||
}
|
||||
|
||||
var scsiBusNumbers = []int{0, 1, 2, 3}
|
||||
|
||||
// newSCSIBusNumber returns the bus number to use for adding a new SCSI bus device.
|
||||
// -1 is returned if there are no bus numbers available.
|
||||
func (l VirtualDeviceList) newSCSIBusNumber() int32 {
|
||||
var used []int
|
||||
|
||||
for _, d := range l.SelectByType((*types.VirtualSCSIController)(nil)) {
|
||||
num := d.(types.BaseVirtualSCSIController).GetVirtualSCSIController().BusNumber
|
||||
if num >= 0 {
|
||||
used = append(used, int(num))
|
||||
} // else caller is creating a new vm using SCSIControllerTypes
|
||||
}
|
||||
|
||||
sort.Ints(used)
|
||||
|
||||
for i, n := range scsiBusNumbers {
|
||||
if i == len(used) || n != used[i] {
|
||||
return int32(n)
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
// FindNVMEController will find the named NVME controller if given, otherwise will pick an available controller.
|
||||
// An error is returned if the named controller is not found or not an NVME controller. Or, if name is not
|
||||
// given and no available controller can be found.
|
||||
func (l VirtualDeviceList) FindNVMEController(name string) (*types.VirtualNVMEController, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(*types.VirtualNVMEController); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not an NVME controller", name)
|
||||
}
|
||||
|
||||
c := l.PickController((*types.VirtualNVMEController)(nil))
|
||||
if c == nil {
|
||||
return nil, errors.New("no available NVME controller")
|
||||
}
|
||||
|
||||
return c.(*types.VirtualNVMEController), nil
|
||||
}
|
||||
|
||||
// CreateNVMEController creates a new NVMWE controller.
|
||||
func (l VirtualDeviceList) CreateNVMEController() (types.BaseVirtualDevice, error) {
|
||||
nvme := &types.VirtualNVMEController{}
|
||||
nvme.BusNumber = l.newNVMEBusNumber()
|
||||
nvme.Key = l.NewKey()
|
||||
|
||||
return nvme, nil
|
||||
}
|
||||
|
||||
var nvmeBusNumbers = []int{0, 1, 2, 3}
|
||||
|
||||
// newNVMEBusNumber returns the bus number to use for adding a new NVME bus device.
|
||||
// -1 is returned if there are no bus numbers available.
|
||||
func (l VirtualDeviceList) newNVMEBusNumber() int32 {
|
||||
var used []int
|
||||
|
||||
for _, d := range l.SelectByType((*types.VirtualNVMEController)(nil)) {
|
||||
num := d.(types.BaseVirtualController).GetVirtualController().BusNumber
|
||||
if num >= 0 {
|
||||
used = append(used, int(num))
|
||||
} // else caller is creating a new vm using NVMEControllerTypes
|
||||
}
|
||||
|
||||
sort.Ints(used)
|
||||
|
||||
for i, n := range nvmeBusNumbers {
|
||||
if i == len(used) || n != used[i] {
|
||||
return int32(n)
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
// FindDiskController will find an existing ide or scsi disk controller.
|
||||
func (l VirtualDeviceList) FindDiskController(name string) (types.BaseVirtualController, error) {
|
||||
switch {
|
||||
case name == "ide":
|
||||
return l.FindIDEController("")
|
||||
case name == "scsi" || name == "":
|
||||
return l.FindSCSIController("")
|
||||
case name == "nvme":
|
||||
return l.FindNVMEController("")
|
||||
default:
|
||||
if c, ok := l.Find(name).(types.BaseVirtualController); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not a valid controller", name)
|
||||
}
|
||||
}
|
||||
|
||||
// PickController returns a controller of the given type(s).
|
||||
// If no controllers are found or have no available slots, then nil is returned.
|
||||
func (l VirtualDeviceList) PickController(kind types.BaseVirtualController) types.BaseVirtualController {
|
||||
l = l.SelectByType(kind.(types.BaseVirtualDevice)).Select(func(device types.BaseVirtualDevice) bool {
|
||||
num := len(device.(types.BaseVirtualController).GetVirtualController().Device)
|
||||
|
||||
switch device.(type) {
|
||||
case types.BaseVirtualSCSIController:
|
||||
return num < 15
|
||||
case *types.VirtualIDEController:
|
||||
return num < 2
|
||||
case *types.VirtualNVMEController:
|
||||
return num < 8
|
||||
default:
|
||||
return true
|
||||
}
|
||||
})
|
||||
|
||||
if len(l) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return l[0].(types.BaseVirtualController)
|
||||
}
|
||||
|
||||
// newUnitNumber returns the unit number to use for attaching a new device to the given controller.
|
||||
func (l VirtualDeviceList) newUnitNumber(c types.BaseVirtualController) int32 {
|
||||
units := make([]bool, 30)
|
||||
|
||||
switch sc := c.(type) {
|
||||
case types.BaseVirtualSCSIController:
|
||||
// The SCSI controller sits on its own bus
|
||||
units[sc.GetVirtualSCSIController().ScsiCtlrUnitNumber] = true
|
||||
}
|
||||
|
||||
key := c.GetVirtualController().Key
|
||||
|
||||
for _, device := range l {
|
||||
d := device.GetVirtualDevice()
|
||||
|
||||
if d.ControllerKey == key && d.UnitNumber != nil {
|
||||
units[int(*d.UnitNumber)] = true
|
||||
}
|
||||
}
|
||||
|
||||
for unit, used := range units {
|
||||
if !used {
|
||||
return int32(unit)
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
// NewKey returns the key to use for adding a new device to the device list.
|
||||
// The device list we're working with here may not be complete (e.g. when
|
||||
// we're only adding new devices), so any positive keys could conflict with device keys
|
||||
// that are already in use. To avoid this type of conflict, we can use negative keys
|
||||
// here, which will be resolved to positive keys by vSphere as the reconfiguration is done.
|
||||
func (l VirtualDeviceList) NewKey() int32 {
|
||||
var key int32 = -200
|
||||
|
||||
for _, device := range l {
|
||||
d := device.GetVirtualDevice()
|
||||
if d.Key < key {
|
||||
key = d.Key
|
||||
}
|
||||
}
|
||||
|
||||
return key - 1
|
||||
}
|
||||
|
||||
// AssignController assigns a device to a controller.
|
||||
func (l VirtualDeviceList) AssignController(device types.BaseVirtualDevice, c types.BaseVirtualController) {
|
||||
d := device.GetVirtualDevice()
|
||||
d.ControllerKey = c.GetVirtualController().Key
|
||||
d.UnitNumber = new(int32)
|
||||
*d.UnitNumber = l.newUnitNumber(c)
|
||||
if d.Key == 0 {
|
||||
d.Key = -1
|
||||
}
|
||||
}
|
||||
|
||||
// CreateDisk creates a new VirtualDisk device which can be added to a VM.
|
||||
func (l VirtualDeviceList) CreateDisk(c types.BaseVirtualController, ds types.ManagedObjectReference, name string) *types.VirtualDisk {
|
||||
// If name is not specified, one will be chosen for you.
|
||||
// But if when given, make sure it ends in .vmdk, otherwise it will be treated as a directory.
|
||||
if len(name) > 0 && filepath.Ext(name) != ".vmdk" {
|
||||
name += ".vmdk"
|
||||
}
|
||||
|
||||
device := &types.VirtualDisk{
|
||||
VirtualDevice: types.VirtualDevice{
|
||||
Backing: &types.VirtualDiskFlatVer2BackingInfo{
|
||||
DiskMode: string(types.VirtualDiskModePersistent),
|
||||
ThinProvisioned: types.NewBool(true),
|
||||
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
|
||||
FileName: name,
|
||||
Datastore: &ds,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
l.AssignController(device, c)
|
||||
return device
|
||||
}
|
||||
|
||||
// ChildDisk creates a new VirtualDisk device, linked to the given parent disk, which can be added to a VM.
|
||||
func (l VirtualDeviceList) ChildDisk(parent *types.VirtualDisk) *types.VirtualDisk {
|
||||
disk := *parent
|
||||
backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo)
|
||||
p := new(DatastorePath)
|
||||
p.FromString(backing.FileName)
|
||||
p.Path = ""
|
||||
|
||||
// Use specified disk as parent backing to a new disk.
|
||||
disk.Backing = &types.VirtualDiskFlatVer2BackingInfo{
|
||||
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
|
||||
FileName: p.String(),
|
||||
Datastore: backing.Datastore,
|
||||
},
|
||||
Parent: backing,
|
||||
DiskMode: backing.DiskMode,
|
||||
ThinProvisioned: backing.ThinProvisioned,
|
||||
}
|
||||
|
||||
return &disk
|
||||
}
|
||||
|
||||
func (l VirtualDeviceList) connectivity(device types.BaseVirtualDevice, v bool) error {
|
||||
c := device.GetVirtualDevice().Connectable
|
||||
if c == nil {
|
||||
return fmt.Errorf("%s is not connectable", l.Name(device))
|
||||
}
|
||||
|
||||
c.Connected = v
|
||||
c.StartConnected = v
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Connect changes the device to connected, returns an error if the device is not connectable.
|
||||
func (l VirtualDeviceList) Connect(device types.BaseVirtualDevice) error {
|
||||
return l.connectivity(device, true)
|
||||
}
|
||||
|
||||
// Disconnect changes the device to disconnected, returns an error if the device is not connectable.
|
||||
func (l VirtualDeviceList) Disconnect(device types.BaseVirtualDevice) error {
|
||||
return l.connectivity(device, false)
|
||||
}
|
||||
|
||||
// FindCdrom finds a cdrom device with the given name, defaulting to the first cdrom device if any.
|
||||
func (l VirtualDeviceList) FindCdrom(name string) (*types.VirtualCdrom, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(*types.VirtualCdrom); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not a cdrom device", name)
|
||||
}
|
||||
|
||||
c := l.SelectByType((*types.VirtualCdrom)(nil))
|
||||
if len(c) == 0 {
|
||||
return nil, errors.New("no cdrom device found")
|
||||
}
|
||||
|
||||
return c[0].(*types.VirtualCdrom), nil
|
||||
}
|
||||
|
||||
// CreateCdrom creates a new VirtualCdrom device which can be added to a VM.
|
||||
func (l VirtualDeviceList) CreateCdrom(c *types.VirtualIDEController) (*types.VirtualCdrom, error) {
|
||||
device := &types.VirtualCdrom{}
|
||||
|
||||
l.AssignController(device, c)
|
||||
|
||||
l.setDefaultCdromBacking(device)
|
||||
|
||||
device.Connectable = &types.VirtualDeviceConnectInfo{
|
||||
AllowGuestControl: true,
|
||||
Connected: true,
|
||||
StartConnected: true,
|
||||
}
|
||||
|
||||
return device, nil
|
||||
}
|
||||
|
||||
// InsertIso changes the cdrom device backing to use the given iso file.
|
||||
func (l VirtualDeviceList) InsertIso(device *types.VirtualCdrom, iso string) *types.VirtualCdrom {
|
||||
device.Backing = &types.VirtualCdromIsoBackingInfo{
|
||||
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
|
||||
FileName: iso,
|
||||
},
|
||||
}
|
||||
|
||||
return device
|
||||
}
|
||||
|
||||
// EjectIso removes the iso file based backing and replaces with the default cdrom backing.
|
||||
func (l VirtualDeviceList) EjectIso(device *types.VirtualCdrom) *types.VirtualCdrom {
|
||||
l.setDefaultCdromBacking(device)
|
||||
return device
|
||||
}
|
||||
|
||||
func (l VirtualDeviceList) setDefaultCdromBacking(device *types.VirtualCdrom) {
|
||||
device.Backing = &types.VirtualCdromAtapiBackingInfo{
|
||||
VirtualDeviceDeviceBackingInfo: types.VirtualDeviceDeviceBackingInfo{
|
||||
DeviceName: fmt.Sprintf("%s-%d-%d", DeviceTypeCdrom, device.ControllerKey, device.UnitNumber),
|
||||
UseAutoDetect: types.NewBool(false),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// FindFloppy finds a floppy device with the given name, defaulting to the first floppy device if any.
|
||||
func (l VirtualDeviceList) FindFloppy(name string) (*types.VirtualFloppy, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(*types.VirtualFloppy); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not a floppy device", name)
|
||||
}
|
||||
|
||||
c := l.SelectByType((*types.VirtualFloppy)(nil))
|
||||
if len(c) == 0 {
|
||||
return nil, errors.New("no floppy device found")
|
||||
}
|
||||
|
||||
return c[0].(*types.VirtualFloppy), nil
|
||||
}
|
||||
|
||||
// CreateFloppy creates a new VirtualFloppy device which can be added to a VM.
|
||||
func (l VirtualDeviceList) CreateFloppy() (*types.VirtualFloppy, error) {
|
||||
device := &types.VirtualFloppy{}
|
||||
|
||||
c := l.PickController((*types.VirtualSIOController)(nil))
|
||||
if c == nil {
|
||||
return nil, errors.New("no available SIO controller")
|
||||
}
|
||||
|
||||
l.AssignController(device, c)
|
||||
|
||||
l.setDefaultFloppyBacking(device)
|
||||
|
||||
device.Connectable = &types.VirtualDeviceConnectInfo{
|
||||
AllowGuestControl: true,
|
||||
Connected: true,
|
||||
StartConnected: true,
|
||||
}
|
||||
|
||||
return device, nil
|
||||
}
|
||||
|
||||
// InsertImg changes the floppy device backing to use the given img file.
|
||||
func (l VirtualDeviceList) InsertImg(device *types.VirtualFloppy, img string) *types.VirtualFloppy {
|
||||
device.Backing = &types.VirtualFloppyImageBackingInfo{
|
||||
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
|
||||
FileName: img,
|
||||
},
|
||||
}
|
||||
|
||||
return device
|
||||
}
|
||||
|
||||
// EjectImg removes the img file based backing and replaces with the default floppy backing.
|
||||
func (l VirtualDeviceList) EjectImg(device *types.VirtualFloppy) *types.VirtualFloppy {
|
||||
l.setDefaultFloppyBacking(device)
|
||||
return device
|
||||
}
|
||||
|
||||
func (l VirtualDeviceList) setDefaultFloppyBacking(device *types.VirtualFloppy) {
|
||||
device.Backing = &types.VirtualFloppyDeviceBackingInfo{
|
||||
VirtualDeviceDeviceBackingInfo: types.VirtualDeviceDeviceBackingInfo{
|
||||
DeviceName: fmt.Sprintf("%s-%d", DeviceTypeFloppy, device.UnitNumber),
|
||||
UseAutoDetect: types.NewBool(false),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// FindSerialPort finds a serial port device with the given name, defaulting to the first serial port device if any.
|
||||
func (l VirtualDeviceList) FindSerialPort(name string) (*types.VirtualSerialPort, error) {
|
||||
if name != "" {
|
||||
d := l.Find(name)
|
||||
if d == nil {
|
||||
return nil, fmt.Errorf("device '%s' not found", name)
|
||||
}
|
||||
if c, ok := d.(*types.VirtualSerialPort); ok {
|
||||
return c, nil
|
||||
}
|
||||
return nil, fmt.Errorf("%s is not a serial port device", name)
|
||||
}
|
||||
|
||||
c := l.SelectByType((*types.VirtualSerialPort)(nil))
|
||||
if len(c) == 0 {
|
||||
return nil, errors.New("no serial port device found")
|
||||
}
|
||||
|
||||
return c[0].(*types.VirtualSerialPort), nil
|
||||
}
|
||||
|
||||
// CreateSerialPort creates a new VirtualSerialPort device which can be added to a VM.
|
||||
func (l VirtualDeviceList) CreateSerialPort() (*types.VirtualSerialPort, error) {
|
||||
device := &types.VirtualSerialPort{
|
||||
YieldOnPoll: true,
|
||||
}
|
||||
|
||||
c := l.PickController((*types.VirtualSIOController)(nil))
|
||||
if c == nil {
|
||||
return nil, errors.New("no available SIO controller")
|
||||
}
|
||||
|
||||
l.AssignController(device, c)
|
||||
|
||||
l.setDefaultSerialPortBacking(device)
|
||||
|
||||
return device, nil
|
||||
}
|
||||
|
||||
// ConnectSerialPort connects a serial port to a server or client uri.
|
||||
func (l VirtualDeviceList) ConnectSerialPort(device *types.VirtualSerialPort, uri string, client bool, proxyuri string) *types.VirtualSerialPort {
|
||||
if strings.HasPrefix(uri, "[") {
|
||||
device.Backing = &types.VirtualSerialPortFileBackingInfo{
|
||||
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
|
||||
FileName: uri,
|
||||
},
|
||||
}
|
||||
|
||||
return device
|
||||
}
|
||||
|
||||
direction := types.VirtualDeviceURIBackingOptionDirectionServer
|
||||
if client {
|
||||
direction = types.VirtualDeviceURIBackingOptionDirectionClient
|
||||
}
|
||||
|
||||
device.Backing = &types.VirtualSerialPortURIBackingInfo{
|
||||
VirtualDeviceURIBackingInfo: types.VirtualDeviceURIBackingInfo{
|
||||
Direction: string(direction),
|
||||
ServiceURI: uri,
|
||||
ProxyURI: proxyuri,
|
||||
},
|
||||
}
|
||||
|
||||
return device
|
||||
}
|
||||
|
||||
// DisconnectSerialPort disconnects the serial port backing.
|
||||
func (l VirtualDeviceList) DisconnectSerialPort(device *types.VirtualSerialPort) *types.VirtualSerialPort {
|
||||
l.setDefaultSerialPortBacking(device)
|
||||
return device
|
||||
}
|
||||
|
||||
func (l VirtualDeviceList) setDefaultSerialPortBacking(device *types.VirtualSerialPort) {
|
||||
device.Backing = &types.VirtualSerialPortURIBackingInfo{
|
||||
VirtualDeviceURIBackingInfo: types.VirtualDeviceURIBackingInfo{
|
||||
Direction: "client",
|
||||
ServiceURI: "localhost:0",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// CreateEthernetCard creates a new VirtualEthernetCard of the given name name and initialized with the given backing.
|
||||
func (l VirtualDeviceList) CreateEthernetCard(name string, backing types.BaseVirtualDeviceBackingInfo) (types.BaseVirtualDevice, error) {
|
||||
ctypes := EthernetCardTypes()
|
||||
|
||||
if name == "" {
|
||||
name = ctypes.deviceName(ctypes[0])
|
||||
}
|
||||
|
||||
found := ctypes.Select(func(device types.BaseVirtualDevice) bool {
|
||||
return l.deviceName(device) == name
|
||||
})
|
||||
|
||||
if len(found) == 0 {
|
||||
return nil, fmt.Errorf("unknown ethernet card type '%s'", name)
|
||||
}
|
||||
|
||||
c, ok := found[0].(types.BaseVirtualEthernetCard)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid ethernet card type '%s'", name)
|
||||
}
|
||||
|
||||
c.GetVirtualEthernetCard().Backing = backing
|
||||
|
||||
return c.(types.BaseVirtualDevice), nil
|
||||
}
|
||||
|
||||
// PrimaryMacAddress returns the MacAddress field of the primary VirtualEthernetCard
|
||||
func (l VirtualDeviceList) PrimaryMacAddress() string {
|
||||
eth0 := l.Find("ethernet-0")
|
||||
|
||||
if eth0 == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return eth0.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard().MacAddress
|
||||
}
|
||||
|
||||
// convert a BaseVirtualDevice to a BaseVirtualMachineBootOptionsBootableDevice
|
||||
var bootableDevices = map[string]func(device types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice{
|
||||
DeviceTypeNone: func(types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
return &types.VirtualMachineBootOptionsBootableDevice{}
|
||||
},
|
||||
DeviceTypeCdrom: func(types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
return &types.VirtualMachineBootOptionsBootableCdromDevice{}
|
||||
},
|
||||
DeviceTypeDisk: func(d types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
return &types.VirtualMachineBootOptionsBootableDiskDevice{
|
||||
DeviceKey: d.GetVirtualDevice().Key,
|
||||
}
|
||||
},
|
||||
DeviceTypeEthernet: func(d types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
return &types.VirtualMachineBootOptionsBootableEthernetDevice{
|
||||
DeviceKey: d.GetVirtualDevice().Key,
|
||||
}
|
||||
},
|
||||
DeviceTypeFloppy: func(types.BaseVirtualDevice) types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
return &types.VirtualMachineBootOptionsBootableFloppyDevice{}
|
||||
},
|
||||
}
|
||||
|
||||
// BootOrder returns a list of devices which can be used to set boot order via VirtualMachine.SetBootOptions.
|
||||
// The order can be any of "ethernet", "cdrom", "floppy" or "disk" or by specific device name.
|
||||
// A value of "-" will clear the existing boot order on the VC/ESX side.
|
||||
func (l VirtualDeviceList) BootOrder(order []string) []types.BaseVirtualMachineBootOptionsBootableDevice {
|
||||
var devices []types.BaseVirtualMachineBootOptionsBootableDevice
|
||||
|
||||
for _, name := range order {
|
||||
if kind, ok := bootableDevices[name]; ok {
|
||||
if name == DeviceTypeNone {
|
||||
// Not covered in the API docs, nor obvious, but this clears the boot order on the VC/ESX side.
|
||||
devices = append(devices, new(types.VirtualMachineBootOptionsBootableDevice))
|
||||
continue
|
||||
}
|
||||
|
||||
for _, device := range l {
|
||||
if l.Type(device) == name {
|
||||
devices = append(devices, kind(device))
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if d := l.Find(name); d != nil {
|
||||
if kind, ok := bootableDevices[l.Type(d)]; ok {
|
||||
devices = append(devices, kind(d))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return devices
|
||||
}
|
||||
|
||||
// SelectBootOrder returns an ordered list of devices matching the given bootable device order
|
||||
func (l VirtualDeviceList) SelectBootOrder(order []types.BaseVirtualMachineBootOptionsBootableDevice) VirtualDeviceList {
|
||||
var devices VirtualDeviceList
|
||||
|
||||
for _, bd := range order {
|
||||
for _, device := range l {
|
||||
if kind, ok := bootableDevices[l.Type(device)]; ok {
|
||||
if reflect.DeepEqual(kind(device), bd) {
|
||||
devices = append(devices, device)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return devices
|
||||
}
|
||||
|
||||
// TypeName returns the vmodl type name of the device
|
||||
func (l VirtualDeviceList) TypeName(device types.BaseVirtualDevice) string {
|
||||
dtype := reflect.TypeOf(device)
|
||||
if dtype == nil {
|
||||
return ""
|
||||
}
|
||||
return dtype.Elem().Name()
|
||||
}
|
||||
|
||||
var deviceNameRegexp = regexp.MustCompile(`(?:Virtual)?(?:Machine)?(\w+?)(?:Card|EthernetCard|Device|Controller)?$`)
|
||||
|
||||
func (l VirtualDeviceList) deviceName(device types.BaseVirtualDevice) string {
|
||||
name := "device"
|
||||
typeName := l.TypeName(device)
|
||||
|
||||
m := deviceNameRegexp.FindStringSubmatch(typeName)
|
||||
if len(m) == 2 {
|
||||
name = strings.ToLower(m[1])
|
||||
}
|
||||
|
||||
return name
|
||||
}
|
||||
|
||||
// Type returns a human-readable name for the given device
|
||||
func (l VirtualDeviceList) Type(device types.BaseVirtualDevice) string {
|
||||
switch device.(type) {
|
||||
case types.BaseVirtualEthernetCard:
|
||||
return DeviceTypeEthernet
|
||||
case *types.ParaVirtualSCSIController:
|
||||
return "pvscsi"
|
||||
case *types.VirtualLsiLogicSASController:
|
||||
return "lsilogic-sas"
|
||||
case *types.VirtualNVMEController:
|
||||
return "nvme"
|
||||
default:
|
||||
return l.deviceName(device)
|
||||
}
|
||||
}
|
||||
|
||||
// Name returns a stable, human-readable name for the given device
|
||||
func (l VirtualDeviceList) Name(device types.BaseVirtualDevice) string {
|
||||
var key string
|
||||
var UnitNumber int32
|
||||
d := device.GetVirtualDevice()
|
||||
if d.UnitNumber != nil {
|
||||
UnitNumber = *d.UnitNumber
|
||||
}
|
||||
|
||||
dtype := l.Type(device)
|
||||
switch dtype {
|
||||
case DeviceTypeEthernet:
|
||||
key = fmt.Sprintf("%d", UnitNumber-7)
|
||||
case DeviceTypeDisk:
|
||||
key = fmt.Sprintf("%d-%d", d.ControllerKey, UnitNumber)
|
||||
default:
|
||||
key = fmt.Sprintf("%d", d.Key)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s-%s", dtype, key)
|
||||
}
|
||||
|
||||
// ConfigSpec creates a virtual machine configuration spec for
|
||||
// the specified operation, for the list of devices in the device list.
|
||||
func (l VirtualDeviceList) ConfigSpec(op types.VirtualDeviceConfigSpecOperation) ([]types.BaseVirtualDeviceConfigSpec, error) {
|
||||
var fop types.VirtualDeviceConfigSpecFileOperation
|
||||
switch op {
|
||||
case types.VirtualDeviceConfigSpecOperationAdd:
|
||||
fop = types.VirtualDeviceConfigSpecFileOperationCreate
|
||||
case types.VirtualDeviceConfigSpecOperationEdit:
|
||||
fop = types.VirtualDeviceConfigSpecFileOperationReplace
|
||||
case types.VirtualDeviceConfigSpecOperationRemove:
|
||||
fop = types.VirtualDeviceConfigSpecFileOperationDestroy
|
||||
default:
|
||||
panic("unknown op")
|
||||
}
|
||||
|
||||
var res []types.BaseVirtualDeviceConfigSpec
|
||||
for _, device := range l {
|
||||
config := &types.VirtualDeviceConfigSpec{
|
||||
Device: device,
|
||||
Operation: op,
|
||||
}
|
||||
|
||||
if disk, ok := device.(*types.VirtualDisk); ok {
|
||||
config.FileOperation = fop
|
||||
|
||||
// Special case to attach an existing disk
|
||||
if op == types.VirtualDeviceConfigSpecOperationAdd && disk.CapacityInKB == 0 {
|
||||
childDisk := false
|
||||
if b, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
|
||||
childDisk = b.Parent != nil
|
||||
}
|
||||
|
||||
if !childDisk {
|
||||
// Existing disk, clear file operation
|
||||
config.FileOperation = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res = append(res, config)
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
227
vendor/github.com/vmware/govmomi/object/virtual_disk_manager.go
generated
vendored
Normal file
227
vendor/github.com/vmware/govmomi/object/virtual_disk_manager.go
generated
vendored
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
/*
|
||||
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"
|
||||
|
||||
"github.com/vmware/govmomi/vim25"
|
||||
"github.com/vmware/govmomi/vim25/methods"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
type VirtualDiskManager struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewVirtualDiskManager(c *vim25.Client) *VirtualDiskManager {
|
||||
m := VirtualDiskManager{
|
||||
Common: NewCommon(c, *c.ServiceContent.VirtualDiskManager),
|
||||
}
|
||||
|
||||
return &m
|
||||
}
|
||||
|
||||
// CopyVirtualDisk copies a virtual disk, performing conversions as specified in the spec.
|
||||
func (m VirtualDiskManager) CopyVirtualDisk(
|
||||
ctx context.Context,
|
||||
sourceName string, sourceDatacenter *Datacenter,
|
||||
destName string, destDatacenter *Datacenter,
|
||||
destSpec *types.VirtualDiskSpec, force bool) (*Task, error) {
|
||||
|
||||
req := types.CopyVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
SourceName: sourceName,
|
||||
DestName: destName,
|
||||
DestSpec: destSpec,
|
||||
Force: types.NewBool(force),
|
||||
}
|
||||
|
||||
if sourceDatacenter != nil {
|
||||
ref := sourceDatacenter.Reference()
|
||||
req.SourceDatacenter = &ref
|
||||
}
|
||||
|
||||
if destDatacenter != nil {
|
||||
ref := destDatacenter.Reference()
|
||||
req.DestDatacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CopyVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// CreateVirtualDisk creates a new virtual disk.
|
||||
func (m VirtualDiskManager) CreateVirtualDisk(
|
||||
ctx context.Context,
|
||||
name string, datacenter *Datacenter,
|
||||
spec types.BaseVirtualDiskSpec) (*Task, error) {
|
||||
|
||||
req := types.CreateVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
if datacenter != nil {
|
||||
ref := datacenter.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.CreateVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// MoveVirtualDisk moves a virtual disk.
|
||||
func (m VirtualDiskManager) MoveVirtualDisk(
|
||||
ctx context.Context,
|
||||
sourceName string, sourceDatacenter *Datacenter,
|
||||
destName string, destDatacenter *Datacenter,
|
||||
force bool) (*Task, error) {
|
||||
req := types.MoveVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
SourceName: sourceName,
|
||||
DestName: destName,
|
||||
Force: types.NewBool(force),
|
||||
}
|
||||
|
||||
if sourceDatacenter != nil {
|
||||
ref := sourceDatacenter.Reference()
|
||||
req.SourceDatacenter = &ref
|
||||
}
|
||||
|
||||
if destDatacenter != nil {
|
||||
ref := destDatacenter.Reference()
|
||||
req.DestDatacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.MoveVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// DeleteVirtualDisk deletes a virtual disk.
|
||||
func (m VirtualDiskManager) DeleteVirtualDisk(ctx context.Context, name string, dc *Datacenter) (*Task, error) {
|
||||
req := types.DeleteVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.DeleteVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// InflateVirtualDisk inflates a virtual disk.
|
||||
func (m VirtualDiskManager) InflateVirtualDisk(ctx context.Context, name string, dc *Datacenter) (*Task, error) {
|
||||
req := types.InflateVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.InflateVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// ShrinkVirtualDisk shrinks a virtual disk.
|
||||
func (m VirtualDiskManager) ShrinkVirtualDisk(ctx context.Context, name string, dc *Datacenter, copy *bool) (*Task, error) {
|
||||
req := types.ShrinkVirtualDisk_Task{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
Copy: copy,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.ShrinkVirtualDisk_Task(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// Queries virtual disk uuid
|
||||
func (m VirtualDiskManager) QueryVirtualDiskUuid(ctx context.Context, name string, dc *Datacenter) (string, error) {
|
||||
req := types.QueryVirtualDiskUuid{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := methods.QueryVirtualDiskUuid(ctx, m.c, &req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if res == nil {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (m VirtualDiskManager) SetVirtualDiskUuid(ctx context.Context, name string, dc *Datacenter, uuid string) error {
|
||||
req := types.SetVirtualDiskUuid{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
Uuid: uuid,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
_, err := methods.SetVirtualDiskUuid(ctx, m.c, &req)
|
||||
return err
|
||||
}
|
||||
166
vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go
generated
vendored
Normal file
166
vendor/github.com/vmware/govmomi/object/virtual_disk_manager_internal.go
generated
vendored
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
Copyright (c) 2017 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"
|
||||
"reflect"
|
||||
|
||||
"github.com/vmware/govmomi/vim25/soap"
|
||||
"github.com/vmware/govmomi/vim25/types"
|
||||
)
|
||||
|
||||
func init() {
|
||||
types.Add("ArrayOfVirtualDiskInfo", reflect.TypeOf((*arrayOfVirtualDiskInfo)(nil)).Elem())
|
||||
|
||||
types.Add("VirtualDiskInfo", reflect.TypeOf((*VirtualDiskInfo)(nil)).Elem())
|
||||
}
|
||||
|
||||
type arrayOfVirtualDiskInfo struct {
|
||||
VirtualDiskInfo []VirtualDiskInfo `xml:"VirtualDiskInfo,omitempty"`
|
||||
}
|
||||
|
||||
type queryVirtualDiskInfoTaskRequest struct {
|
||||
This types.ManagedObjectReference `xml:"_this"`
|
||||
Name string `xml:"name"`
|
||||
Datacenter *types.ManagedObjectReference `xml:"datacenter,omitempty"`
|
||||
IncludeParents bool `xml:"includeParents"`
|
||||
}
|
||||
|
||||
type queryVirtualDiskInfoTaskResponse struct {
|
||||
Returnval types.ManagedObjectReference `xml:"returnval"`
|
||||
}
|
||||
|
||||
type queryVirtualDiskInfoTaskBody struct {
|
||||
Req *queryVirtualDiskInfoTaskRequest `xml:"urn:internalvim25 QueryVirtualDiskInfo_Task,omitempty"`
|
||||
Res *queryVirtualDiskInfoTaskResponse `xml:"urn:vim25 QueryVirtualDiskInfo_TaskResponse,omitempty"`
|
||||
InternalRes *queryVirtualDiskInfoTaskResponse `xml:"urn:internalvim25 QueryVirtualDiskInfo_TaskResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *queryVirtualDiskInfoTaskBody) Fault() *soap.Fault { return b.Err }
|
||||
|
||||
func queryVirtualDiskInfoTask(ctx context.Context, r soap.RoundTripper, req *queryVirtualDiskInfoTaskRequest) (*queryVirtualDiskInfoTaskResponse, error) {
|
||||
var reqBody, resBody queryVirtualDiskInfoTaskBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBody.Res != nil {
|
||||
return resBody.Res, nil
|
||||
}
|
||||
|
||||
return resBody.InternalRes, nil
|
||||
}
|
||||
|
||||
type VirtualDiskInfo struct {
|
||||
Name string `xml:"unit>name"`
|
||||
DiskType string `xml:"diskType"`
|
||||
Parent string `xml:"parent,omitempty"`
|
||||
}
|
||||
|
||||
func (m VirtualDiskManager) QueryVirtualDiskInfo(ctx context.Context, name string, dc *Datacenter, includeParents bool) ([]VirtualDiskInfo, error) {
|
||||
req := queryVirtualDiskInfoTaskRequest{
|
||||
This: m.Reference(),
|
||||
Name: name,
|
||||
IncludeParents: includeParents,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.Datacenter = &ref
|
||||
}
|
||||
|
||||
res, err := queryVirtualDiskInfoTask(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
info, err := NewTask(m.Client(), res.Returnval).WaitForResult(ctx, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return info.Result.(arrayOfVirtualDiskInfo).VirtualDiskInfo, nil
|
||||
}
|
||||
|
||||
type createChildDiskTaskRequest struct {
|
||||
This types.ManagedObjectReference `xml:"_this"`
|
||||
ChildName string `xml:"childName"`
|
||||
ChildDatacenter *types.ManagedObjectReference `xml:"childDatacenter,omitempty"`
|
||||
ParentName string `xml:"parentName"`
|
||||
ParentDatacenter *types.ManagedObjectReference `xml:"parentDatacenter,omitempty"`
|
||||
IsLinkedClone bool `xml:"isLinkedClone"`
|
||||
}
|
||||
|
||||
type createChildDiskTaskResponse struct {
|
||||
Returnval types.ManagedObjectReference `xml:"returnval"`
|
||||
}
|
||||
|
||||
type createChildDiskTaskBody struct {
|
||||
Req *createChildDiskTaskRequest `xml:"urn:internalvim25 CreateChildDisk_Task,omitempty"`
|
||||
Res *createChildDiskTaskResponse `xml:"urn:vim25 CreateChildDisk_TaskResponse,omitempty"`
|
||||
InternalRes *createChildDiskTaskResponse `xml:"urn:internalvim25 CreateChildDisk_TaskResponse,omitempty"`
|
||||
Err *soap.Fault `xml:"http://schemas.xmlsoap.org/soap/envelope/ Fault,omitempty"`
|
||||
}
|
||||
|
||||
func (b *createChildDiskTaskBody) Fault() *soap.Fault { return b.Err }
|
||||
|
||||
func createChildDiskTask(ctx context.Context, r soap.RoundTripper, req *createChildDiskTaskRequest) (*createChildDiskTaskResponse, error) {
|
||||
var reqBody, resBody createChildDiskTaskBody
|
||||
|
||||
reqBody.Req = req
|
||||
|
||||
if err := r.RoundTrip(ctx, &reqBody, &resBody); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBody.Res != nil {
|
||||
return resBody.Res, nil // vim-version <= 6.5
|
||||
}
|
||||
|
||||
return resBody.InternalRes, nil // vim-version >= 6.7
|
||||
}
|
||||
|
||||
func (m VirtualDiskManager) CreateChildDisk(ctx context.Context, parent string, pdc *Datacenter, name string, dc *Datacenter, linked bool) (*Task, error) {
|
||||
req := createChildDiskTaskRequest{
|
||||
This: m.Reference(),
|
||||
ChildName: name,
|
||||
ParentName: parent,
|
||||
IsLinkedClone: linked,
|
||||
}
|
||||
|
||||
if dc != nil {
|
||||
ref := dc.Reference()
|
||||
req.ChildDatacenter = &ref
|
||||
}
|
||||
|
||||
if pdc != nil {
|
||||
ref := pdc.Reference()
|
||||
req.ParentDatacenter = &ref
|
||||
}
|
||||
|
||||
res, err := createChildDiskTask(ctx, m.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(m.Client(), res.Returnval), nil
|
||||
}
|
||||
924
vendor/github.com/vmware/govmomi/object/virtual_machine.go
generated
vendored
Normal file
924
vendor/github.com/vmware/govmomi/object/virtual_machine.go
generated
vendored
Normal file
|
|
@ -0,0 +1,924 @@
|
|||
/*
|
||||
Copyright (c) 2015-2017 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"
|
||||
"net"
|
||||
"path"
|
||||
|
||||
"github.com/vmware/govmomi/nfc"
|
||||
"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"
|
||||
)
|
||||
|
||||
const (
|
||||
PropRuntimePowerState = "summary.runtime.powerState"
|
||||
PropConfigTemplate = "summary.config.template"
|
||||
)
|
||||
|
||||
type VirtualMachine struct {
|
||||
Common
|
||||
}
|
||||
|
||||
func NewVirtualMachine(c *vim25.Client, ref types.ManagedObjectReference) *VirtualMachine {
|
||||
return &VirtualMachine{
|
||||
Common: NewCommon(c, ref),
|
||||
}
|
||||
}
|
||||
|
||||
func (v VirtualMachine) PowerState(ctx context.Context) (types.VirtualMachinePowerState, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{PropRuntimePowerState}, &o)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return o.Summary.Runtime.PowerState, nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) IsTemplate(ctx context.Context) (bool, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{PropConfigTemplate}, &o)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return o.Summary.Config.Template, nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) PowerOn(ctx context.Context) (*Task, error) {
|
||||
req := types.PowerOnVM_Task{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.PowerOnVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) PowerOff(ctx context.Context) (*Task, error) {
|
||||
req := types.PowerOffVM_Task{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.PowerOffVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) PutUsbScanCodes(ctx context.Context, spec types.UsbScanCodeSpec) (int32, error) {
|
||||
req := types.PutUsbScanCodes{
|
||||
This: v.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.PutUsbScanCodes(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Reset(ctx context.Context) (*Task, error) {
|
||||
req := types.ResetVM_Task{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.ResetVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Suspend(ctx context.Context) (*Task, error) {
|
||||
req := types.SuspendVM_Task{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.SuspendVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) ShutdownGuest(ctx context.Context) error {
|
||||
req := types.ShutdownGuest{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.ShutdownGuest(ctx, v.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (v VirtualMachine) RebootGuest(ctx context.Context) error {
|
||||
req := types.RebootGuest{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RebootGuest(ctx, v.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Destroy(ctx context.Context) (*Task, error) {
|
||||
req := types.Destroy_Task{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.Destroy_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Clone(ctx context.Context, folder *Folder, name string, config types.VirtualMachineCloneSpec) (*Task, error) {
|
||||
req := types.CloneVM_Task{
|
||||
This: v.Reference(),
|
||||
Folder: folder.Reference(),
|
||||
Name: name,
|
||||
Spec: config,
|
||||
}
|
||||
|
||||
res, err := methods.CloneVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Customize(ctx context.Context, spec types.CustomizationSpec) (*Task, error) {
|
||||
req := types.CustomizeVM_Task{
|
||||
This: v.Reference(),
|
||||
Spec: spec,
|
||||
}
|
||||
|
||||
res, err := methods.CustomizeVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Relocate(ctx context.Context, config types.VirtualMachineRelocateSpec, priority types.VirtualMachineMovePriority) (*Task, error) {
|
||||
req := types.RelocateVM_Task{
|
||||
This: v.Reference(),
|
||||
Spec: config,
|
||||
Priority: priority,
|
||||
}
|
||||
|
||||
res, err := methods.RelocateVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Reconfigure(ctx context.Context, config types.VirtualMachineConfigSpec) (*Task, error) {
|
||||
req := types.ReconfigVM_Task{
|
||||
This: v.Reference(),
|
||||
Spec: config,
|
||||
}
|
||||
|
||||
res, err := methods.ReconfigVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) RefreshStorageInfo(ctx context.Context) error {
|
||||
req := types.RefreshStorageInfo{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.RefreshStorageInfo(ctx, v.c, &req)
|
||||
return err
|
||||
}
|
||||
|
||||
// WaitForIP waits for the VM guest.ipAddress property to report an IP address.
|
||||
// Waits for an IPv4 address if the v4 param is true.
|
||||
func (v VirtualMachine) WaitForIP(ctx context.Context, v4 ...bool) (string, error) {
|
||||
var ip string
|
||||
|
||||
p := property.DefaultCollector(v.c)
|
||||
err := property.Wait(ctx, p, v.Reference(), []string{"guest.ipAddress"}, func(pc []types.PropertyChange) bool {
|
||||
for _, c := range pc {
|
||||
if c.Name != "guest.ipAddress" {
|
||||
continue
|
||||
}
|
||||
if c.Op != types.PropertyChangeOpAssign {
|
||||
continue
|
||||
}
|
||||
if c.Val == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
ip = c.Val.(string)
|
||||
if len(v4) == 1 && v4[0] {
|
||||
if net.ParseIP(ip).To4() == nil {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return ip, nil
|
||||
}
|
||||
|
||||
// WaitForNetIP waits for the VM guest.net property to report an IP address for all VM NICs.
|
||||
// Only consider IPv4 addresses if the v4 param is true.
|
||||
// By default, wait for all NICs to get an IP address, unless 1 or more device is given.
|
||||
// A device can be specified by the MAC address or the device name, e.g. "ethernet-0".
|
||||
// Returns a map with MAC address as the key and IP address list as the value.
|
||||
func (v VirtualMachine) WaitForNetIP(ctx context.Context, v4 bool, device ...string) (map[string][]string, error) {
|
||||
macs := make(map[string][]string)
|
||||
eths := make(map[string]string)
|
||||
|
||||
p := property.DefaultCollector(v.c)
|
||||
|
||||
// Wait for all NICs to have a MacAddress, which may not be generated yet.
|
||||
err := property.Wait(ctx, p, v.Reference(), []string{"config.hardware.device"}, func(pc []types.PropertyChange) bool {
|
||||
for _, c := range pc {
|
||||
if c.Op != types.PropertyChangeOpAssign {
|
||||
continue
|
||||
}
|
||||
|
||||
devices := VirtualDeviceList(c.Val.(types.ArrayOfVirtualDevice).VirtualDevice)
|
||||
for _, d := range devices {
|
||||
if nic, ok := d.(types.BaseVirtualEthernetCard); ok {
|
||||
mac := nic.GetVirtualEthernetCard().MacAddress
|
||||
if mac == "" {
|
||||
return false
|
||||
}
|
||||
macs[mac] = nil
|
||||
eths[devices.Name(d)] = mac
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(device) != 0 {
|
||||
// Only wait for specific NIC(s)
|
||||
macs = make(map[string][]string)
|
||||
for _, mac := range device {
|
||||
if eth, ok := eths[mac]; ok {
|
||||
mac = eth // device name, e.g. "ethernet-0"
|
||||
}
|
||||
macs[mac] = nil
|
||||
}
|
||||
}
|
||||
|
||||
err = property.Wait(ctx, p, v.Reference(), []string{"guest.net"}, func(pc []types.PropertyChange) bool {
|
||||
for _, c := range pc {
|
||||
if c.Op != types.PropertyChangeOpAssign {
|
||||
continue
|
||||
}
|
||||
|
||||
nics := c.Val.(types.ArrayOfGuestNicInfo).GuestNicInfo
|
||||
for _, nic := range nics {
|
||||
mac := nic.MacAddress
|
||||
if mac == "" || nic.IpConfig == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, ip := range nic.IpConfig.IpAddress {
|
||||
if _, ok := macs[mac]; !ok {
|
||||
continue // Ignore any that don't correspond to a VM device
|
||||
}
|
||||
if v4 && net.ParseIP(ip.IpAddress).To4() == nil {
|
||||
continue // Ignore non IPv4 address
|
||||
}
|
||||
macs[mac] = append(macs[mac], ip.IpAddress)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, ips := range macs {
|
||||
if len(ips) == 0 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return macs, nil
|
||||
}
|
||||
|
||||
// Device returns the VirtualMachine's config.hardware.device property.
|
||||
func (v VirtualMachine) Device(ctx context.Context) (VirtualDeviceList, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"config.hardware.device", "summary.runtime.connectionState"}, &o)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Quoting the SDK doc:
|
||||
// The virtual machine configuration is not guaranteed to be available.
|
||||
// For example, the configuration information would be unavailable if the server
|
||||
// is unable to access the virtual machine files on disk, and is often also unavailable
|
||||
// during the initial phases of virtual machine creation.
|
||||
if o.Config == nil {
|
||||
return nil, fmt.Errorf("%s Config is not available, connectionState=%s",
|
||||
v.Reference(), o.Summary.Runtime.ConnectionState)
|
||||
}
|
||||
|
||||
return VirtualDeviceList(o.Config.Hardware.Device), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) HostSystem(ctx context.Context) (*HostSystem, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"summary.runtime.host"}, &o)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
host := o.Summary.Runtime.Host
|
||||
if host == nil {
|
||||
return nil, errors.New("VM doesn't have a HostSystem")
|
||||
}
|
||||
|
||||
return NewHostSystem(v.c, *host), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) ResourcePool(ctx context.Context) (*ResourcePool, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"resourcePool"}, &o)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rp := o.ResourcePool
|
||||
if rp == nil {
|
||||
return nil, errors.New("VM doesn't have a resourcePool")
|
||||
}
|
||||
|
||||
return NewResourcePool(v.c, *rp), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) configureDevice(ctx context.Context, op types.VirtualDeviceConfigSpecOperation, fop types.VirtualDeviceConfigSpecFileOperation, devices ...types.BaseVirtualDevice) error {
|
||||
spec := types.VirtualMachineConfigSpec{}
|
||||
|
||||
for _, device := range devices {
|
||||
config := &types.VirtualDeviceConfigSpec{
|
||||
Device: device,
|
||||
Operation: op,
|
||||
}
|
||||
|
||||
if disk, ok := device.(*types.VirtualDisk); ok {
|
||||
config.FileOperation = fop
|
||||
|
||||
// Special case to attach an existing disk
|
||||
if op == types.VirtualDeviceConfigSpecOperationAdd && disk.CapacityInKB == 0 {
|
||||
childDisk := false
|
||||
if b, ok := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
|
||||
childDisk = b.Parent != nil
|
||||
}
|
||||
|
||||
if !childDisk {
|
||||
config.FileOperation = "" // existing disk
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spec.DeviceChange = append(spec.DeviceChange, config)
|
||||
}
|
||||
|
||||
task, err := v.Reconfigure(ctx, spec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return task.Wait(ctx)
|
||||
}
|
||||
|
||||
// AddDevice adds the given devices to the VirtualMachine
|
||||
func (v VirtualMachine) AddDevice(ctx context.Context, device ...types.BaseVirtualDevice) error {
|
||||
return v.configureDevice(ctx, types.VirtualDeviceConfigSpecOperationAdd, types.VirtualDeviceConfigSpecFileOperationCreate, device...)
|
||||
}
|
||||
|
||||
// EditDevice edits the given (existing) devices on the VirtualMachine
|
||||
func (v VirtualMachine) EditDevice(ctx context.Context, device ...types.BaseVirtualDevice) error {
|
||||
return v.configureDevice(ctx, types.VirtualDeviceConfigSpecOperationEdit, types.VirtualDeviceConfigSpecFileOperationReplace, device...)
|
||||
}
|
||||
|
||||
// RemoveDevice removes the given devices on the VirtualMachine
|
||||
func (v VirtualMachine) RemoveDevice(ctx context.Context, keepFiles bool, device ...types.BaseVirtualDevice) error {
|
||||
fop := types.VirtualDeviceConfigSpecFileOperationDestroy
|
||||
if keepFiles {
|
||||
fop = ""
|
||||
}
|
||||
return v.configureDevice(ctx, types.VirtualDeviceConfigSpecOperationRemove, fop, device...)
|
||||
}
|
||||
|
||||
// BootOptions returns the VirtualMachine's config.bootOptions property.
|
||||
func (v VirtualMachine) BootOptions(ctx context.Context) (*types.VirtualMachineBootOptions, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"config.bootOptions"}, &o)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return o.Config.BootOptions, nil
|
||||
}
|
||||
|
||||
// SetBootOptions reconfigures the VirtualMachine with the given options.
|
||||
func (v VirtualMachine) SetBootOptions(ctx context.Context, options *types.VirtualMachineBootOptions) error {
|
||||
spec := types.VirtualMachineConfigSpec{}
|
||||
|
||||
spec.BootOptions = options
|
||||
|
||||
task, err := v.Reconfigure(ctx, spec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return task.Wait(ctx)
|
||||
}
|
||||
|
||||
// Answer answers a pending question.
|
||||
func (v VirtualMachine) Answer(ctx context.Context, id, answer string) error {
|
||||
req := types.AnswerVM{
|
||||
This: v.Reference(),
|
||||
QuestionId: id,
|
||||
AnswerChoice: answer,
|
||||
}
|
||||
|
||||
_, err := methods.AnswerVM(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) AcquireTicket(ctx context.Context, kind string) (*types.VirtualMachineTicket, error) {
|
||||
req := types.AcquireTicket{
|
||||
This: v.Reference(),
|
||||
TicketType: kind,
|
||||
}
|
||||
|
||||
res, err := methods.AcquireTicket(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &res.Returnval, nil
|
||||
}
|
||||
|
||||
// CreateSnapshot creates a new snapshot of a virtual machine.
|
||||
func (v VirtualMachine) CreateSnapshot(ctx context.Context, name string, description string, memory bool, quiesce bool) (*Task, error) {
|
||||
req := types.CreateSnapshot_Task{
|
||||
This: v.Reference(),
|
||||
Name: name,
|
||||
Description: description,
|
||||
Memory: memory,
|
||||
Quiesce: quiesce,
|
||||
}
|
||||
|
||||
res, err := methods.CreateSnapshot_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// RemoveAllSnapshot removes all snapshots of a virtual machine
|
||||
func (v VirtualMachine) RemoveAllSnapshot(ctx context.Context, consolidate *bool) (*Task, error) {
|
||||
req := types.RemoveAllSnapshots_Task{
|
||||
This: v.Reference(),
|
||||
Consolidate: consolidate,
|
||||
}
|
||||
|
||||
res, err := methods.RemoveAllSnapshots_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
type snapshotMap map[string][]types.ManagedObjectReference
|
||||
|
||||
func (m snapshotMap) add(parent string, tree []types.VirtualMachineSnapshotTree) {
|
||||
for i, st := range tree {
|
||||
sname := st.Name
|
||||
names := []string{sname, st.Snapshot.Value}
|
||||
|
||||
if parent != "" {
|
||||
sname = path.Join(parent, sname)
|
||||
// Add full path as an option to resolve duplicate names
|
||||
names = append(names, sname)
|
||||
}
|
||||
|
||||
for _, name := range names {
|
||||
m[name] = append(m[name], tree[i].Snapshot)
|
||||
}
|
||||
|
||||
m.add(sname, st.ChildSnapshotList)
|
||||
}
|
||||
}
|
||||
|
||||
// FindSnapshot supports snapshot lookup by name, where name can be:
|
||||
// 1) snapshot ManagedObjectReference.Value (unique)
|
||||
// 2) snapshot name (may not be unique)
|
||||
// 3) snapshot tree path (may not be unique)
|
||||
func (v VirtualMachine) FindSnapshot(ctx context.Context, name string) (*types.ManagedObjectReference, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"snapshot"}, &o)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if o.Snapshot == nil || len(o.Snapshot.RootSnapshotList) == 0 {
|
||||
return nil, errors.New("no snapshots for this VM")
|
||||
}
|
||||
|
||||
m := make(snapshotMap)
|
||||
m.add("", o.Snapshot.RootSnapshotList)
|
||||
|
||||
s := m[name]
|
||||
switch len(s) {
|
||||
case 0:
|
||||
return nil, fmt.Errorf("snapshot %q not found", name)
|
||||
case 1:
|
||||
return &s[0], nil
|
||||
default:
|
||||
return nil, fmt.Errorf("%q resolves to %d snapshots", name, len(s))
|
||||
}
|
||||
}
|
||||
|
||||
// RemoveSnapshot removes a named snapshot
|
||||
func (v VirtualMachine) RemoveSnapshot(ctx context.Context, name string, removeChildren bool, consolidate *bool) (*Task, error) {
|
||||
snapshot, err := v.FindSnapshot(ctx, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := types.RemoveSnapshot_Task{
|
||||
This: snapshot.Reference(),
|
||||
RemoveChildren: removeChildren,
|
||||
Consolidate: consolidate,
|
||||
}
|
||||
|
||||
res, err := methods.RemoveSnapshot_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// RevertToCurrentSnapshot reverts to the current snapshot
|
||||
func (v VirtualMachine) RevertToCurrentSnapshot(ctx context.Context, suppressPowerOn bool) (*Task, error) {
|
||||
req := types.RevertToCurrentSnapshot_Task{
|
||||
This: v.Reference(),
|
||||
SuppressPowerOn: types.NewBool(suppressPowerOn),
|
||||
}
|
||||
|
||||
res, err := methods.RevertToCurrentSnapshot_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// RevertToSnapshot reverts to a named snapshot
|
||||
func (v VirtualMachine) RevertToSnapshot(ctx context.Context, name string, suppressPowerOn bool) (*Task, error) {
|
||||
snapshot, err := v.FindSnapshot(ctx, name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := types.RevertToSnapshot_Task{
|
||||
This: snapshot.Reference(),
|
||||
SuppressPowerOn: types.NewBool(suppressPowerOn),
|
||||
}
|
||||
|
||||
res, err := methods.RevertToSnapshot_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// IsToolsRunning returns true if VMware Tools is currently running in the guest OS, and false otherwise.
|
||||
func (v VirtualMachine) IsToolsRunning(ctx context.Context) (bool, error) {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"guest.toolsRunningStatus"}, &o)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return o.Guest.ToolsRunningStatus == string(types.VirtualMachineToolsRunningStatusGuestToolsRunning), nil
|
||||
}
|
||||
|
||||
// Wait for the VirtualMachine to change to the desired power state.
|
||||
func (v VirtualMachine) WaitForPowerState(ctx context.Context, state types.VirtualMachinePowerState) error {
|
||||
p := property.DefaultCollector(v.c)
|
||||
err := property.Wait(ctx, p, v.Reference(), []string{PropRuntimePowerState}, func(pc []types.PropertyChange) bool {
|
||||
for _, c := range pc {
|
||||
if c.Name != PropRuntimePowerState {
|
||||
continue
|
||||
}
|
||||
if c.Val == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
ps := c.Val.(types.VirtualMachinePowerState)
|
||||
if ps == state {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (v VirtualMachine) MarkAsTemplate(ctx context.Context) error {
|
||||
req := types.MarkAsTemplate{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.MarkAsTemplate(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) MarkAsVirtualMachine(ctx context.Context, pool ResourcePool, host *HostSystem) error {
|
||||
req := types.MarkAsVirtualMachine{
|
||||
This: v.Reference(),
|
||||
Pool: pool.Reference(),
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
_, err := methods.MarkAsVirtualMachine(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Migrate(ctx context.Context, pool *ResourcePool, host *HostSystem, priority types.VirtualMachineMovePriority, state types.VirtualMachinePowerState) (*Task, error) {
|
||||
req := types.MigrateVM_Task{
|
||||
This: v.Reference(),
|
||||
Priority: priority,
|
||||
State: state,
|
||||
}
|
||||
|
||||
if pool != nil {
|
||||
ref := pool.Reference()
|
||||
req.Pool = &ref
|
||||
}
|
||||
|
||||
if host != nil {
|
||||
ref := host.Reference()
|
||||
req.Host = &ref
|
||||
}
|
||||
|
||||
res, err := methods.MigrateVM_Task(ctx, v.c, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Unregister(ctx context.Context) error {
|
||||
req := types.UnregisterVM{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.UnregisterVM(ctx, v.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
// QueryEnvironmentBrowser is a helper to get the environmentBrowser property.
|
||||
func (v VirtualMachine) QueryConfigTarget(ctx context.Context) (*types.ConfigTarget, error) {
|
||||
var vm mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"environmentBrowser"}, &vm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := types.QueryConfigTarget{
|
||||
This: vm.EnvironmentBrowser,
|
||||
}
|
||||
|
||||
res, err := methods.QueryConfigTarget(ctx, v.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) MountToolsInstaller(ctx context.Context) error {
|
||||
req := types.MountToolsInstaller{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.MountToolsInstaller(ctx, v.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (v VirtualMachine) UnmountToolsInstaller(ctx context.Context) error {
|
||||
req := types.UnmountToolsInstaller{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
_, err := methods.UnmountToolsInstaller(ctx, v.Client(), &req)
|
||||
return err
|
||||
}
|
||||
|
||||
func (v VirtualMachine) UpgradeTools(ctx context.Context, options string) (*Task, error) {
|
||||
req := types.UpgradeTools_Task{
|
||||
This: v.Reference(),
|
||||
InstallerOptions: options,
|
||||
}
|
||||
|
||||
res, err := methods.UpgradeTools_Task(ctx, v.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) Export(ctx context.Context) (*nfc.Lease, error) {
|
||||
req := types.ExportVm{
|
||||
This: v.Reference(),
|
||||
}
|
||||
|
||||
res, err := methods.ExportVm(ctx, v.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nfc.NewLease(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
func (v VirtualMachine) UpgradeVM(ctx context.Context, version string) (*Task, error) {
|
||||
req := types.UpgradeVM_Task{
|
||||
This: v.Reference(),
|
||||
Version: version,
|
||||
}
|
||||
|
||||
res, err := methods.UpgradeVM_Task(ctx, v.Client(), &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return NewTask(v.c, res.Returnval), nil
|
||||
}
|
||||
|
||||
// UUID is a helper to get the UUID of the VirtualMachine managed object.
|
||||
// This method returns an empty string if an error occurs when retrieving UUID from the VirtualMachine object.
|
||||
func (v VirtualMachine) UUID(ctx context.Context) string {
|
||||
var o mo.VirtualMachine
|
||||
|
||||
err := v.Properties(ctx, v.Reference(), []string{"config.uuid"}, &o)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return o.Config.Uuid
|
||||
}
|
||||
|
||||
func (v VirtualMachine) QueryChangedDiskAreas(ctx context.Context, baseSnapshot, curSnapshot *types.ManagedObjectReference, disk *types.VirtualDisk, offset int64) (types.DiskChangeInfo, error) {
|
||||
var noChange types.DiskChangeInfo
|
||||
var err error
|
||||
|
||||
if offset > disk.CapacityInBytes {
|
||||
return noChange, fmt.Errorf("offset is greater than the disk size (%#x and %#x)", offset, disk.CapacityInBytes)
|
||||
} else if offset == disk.CapacityInBytes {
|
||||
return types.DiskChangeInfo{StartOffset: offset, Length: 0}, nil
|
||||
}
|
||||
|
||||
var b mo.VirtualMachineSnapshot
|
||||
err = v.Properties(ctx, baseSnapshot.Reference(), []string{"config.hardware"}, &b)
|
||||
if err != nil {
|
||||
return noChange, fmt.Errorf("failed to fetch config.hardware of snapshot %s: %s", baseSnapshot, err)
|
||||
}
|
||||
|
||||
var changeId *string
|
||||
for _, vd := range b.Config.Hardware.Device {
|
||||
d := vd.GetVirtualDevice()
|
||||
if d.Key != disk.Key {
|
||||
continue
|
||||
}
|
||||
|
||||
// As per VDDK programming guide, these are the four types of disks
|
||||
// that support CBT, see "Gathering Changed Block Information".
|
||||
if b, ok := d.Backing.(*types.VirtualDiskFlatVer2BackingInfo); ok {
|
||||
changeId = &b.ChangeId
|
||||
break
|
||||
}
|
||||
if b, ok := d.Backing.(*types.VirtualDiskSparseVer2BackingInfo); ok {
|
||||
changeId = &b.ChangeId
|
||||
break
|
||||
}
|
||||
if b, ok := d.Backing.(*types.VirtualDiskRawDiskMappingVer1BackingInfo); ok {
|
||||
changeId = &b.ChangeId
|
||||
break
|
||||
}
|
||||
if b, ok := d.Backing.(*types.VirtualDiskRawDiskVer2BackingInfo); ok {
|
||||
changeId = &b.ChangeId
|
||||
break
|
||||
}
|
||||
|
||||
return noChange, fmt.Errorf("disk %d has backing info without .ChangeId: %t", disk.Key, d.Backing)
|
||||
}
|
||||
if changeId == nil || *changeId == "" {
|
||||
return noChange, fmt.Errorf("CBT is not enabled on disk %d", disk.Key)
|
||||
}
|
||||
|
||||
req := types.QueryChangedDiskAreas{
|
||||
This: v.Reference(),
|
||||
Snapshot: curSnapshot,
|
||||
DeviceKey: disk.Key,
|
||||
StartOffset: offset,
|
||||
ChangeId: *changeId,
|
||||
}
|
||||
|
||||
res, err := methods.QueryChangedDiskAreas(ctx, v.Client(), &req)
|
||||
if err != nil {
|
||||
return noChange, err
|
||||
}
|
||||
|
||||
return res.Returnval, nil
|
||||
}
|
||||
25
vendor/github.com/vmware/govmomi/object/vmware_distributed_virtual_switch.go
generated
vendored
Normal file
25
vendor/github.com/vmware/govmomi/object/vmware_distributed_virtual_switch.go
generated
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
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
|
||||
|
||||
type VmwareDistributedVirtualSwitch struct {
|
||||
DistributedVirtualSwitch
|
||||
}
|
||||
|
||||
func (s VmwareDistributedVirtualSwitch) GetInventoryPath() string {
|
||||
return s.InventoryPath
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue