func (f *Finder) HostSystemList(ctx context.Context, path string) ([]*object.HostSystem, error) { es, err := f.find(ctx, f.hostFolder, false, path) if err != nil { return nil, err } var hss []*object.HostSystem for _, e := range es { var hs *object.HostSystem switch o := e.Object.(type) { case mo.HostSystem: hs = object.NewHostSystem(f.client, o.Reference()) case mo.ComputeResource: cr := object.NewComputeResource(f.client, o.Reference()) hosts, err := cr.Hosts(ctx) if err != nil { return nil, err } hs = object.NewHostSystem(f.client, hosts[0]) default: continue } hs.InventoryPath = e.Path hss = append(hss, hs) } if len(hss) == 0 { return nil, &NotFoundError{"host", path} } return hss, nil }
func NewExecutor(c *vim25.Client, host *object.HostSystem) (*Executor, error) { e := &Executor{ c: c, host: host, info: make(map[string]*CommandInfo), } { req := types.RetrieveManagedMethodExecuter{ This: host.Reference(), } res, err := methods.RetrieveManagedMethodExecuter(context.TODO(), c, &req) if err != nil { return nil, err } e.mme = res.Returnval } { req := types.RetrieveDynamicTypeManager{ This: host.Reference(), } res, err := methods.RetrieveDynamicTypeManager(context.TODO(), c, &req) if err != nil { return nil, err } e.dtm = res.Returnval } return e, nil }
func (cmd *disconnect) Disconnect(ctx context.Context, host *object.HostSystem) error { task, err := host.Disconnect(ctx) if err != nil { return err } logger := cmd.ProgressLogger(fmt.Sprintf("%s disconnecting... ", host.InventoryPath)) defer logger.Wait() _, err = task.WaitForResult(ctx, logger) return err }
func (cmd *enter) EnterMaintenanceMode(ctx context.Context, host *object.HostSystem) error { task, err := host.EnterMaintenanceMode(ctx, cmd.timeout, cmd.evacuate, nil) // TODO: spec param if err != nil { return err } logger := cmd.ProgressLogger(fmt.Sprintf("%s entering maintenance mode... ", host.InventoryPath)) defer logger.Wait() _, err = task.WaitForResult(ctx, logger) return err }
func (vmh *VMHost) RescanAllHba(hostSystem *object.HostSystem) error { storageSystem, err := hostSystem.ConfigManager().StorageSystem(vmh.Ctx) if err != nil { return err } err = storageSystem.RescanAllHba(vmh.Ctx) if err != nil { return err } return nil }
func (cmd *exit) ExitMaintenanceMode(ctx context.Context, host *object.HostSystem) error { task, err := host.ExitMaintenanceMode(ctx, cmd.timeout) if err != nil { return err } logger := cmd.ProgressLogger(fmt.Sprintf("%s exiting maintenance mode... ", host.InventoryPath)) defer logger.Wait() _, err = task.WaitForResult(ctx, logger) return err }
// GetFirewallInfo via 'esxcli network firewall get' // The HostFirewallSystem type does not expose this data. // This helper can be useful in particular to determine if the firewall is enabled or disabled. func GetFirewallInfo(s *object.HostSystem) (*FirewallInfo, error) { x, err := NewExecutor(s.Client(), s) res, err := x.Run([]string{"network", "firewall", "get"}) if err != nil { return nil, err } info := &FirewallInfo{ Loaded: res.Values[0]["Loaded"][0] == "true", Enabled: res.Values[0]["Enabled"][0] == "true", DefaultAction: res.Values[0]["DefaultAction"][0], } return info, nil }
// vSphereRemoveHost disconnects an ESXi host from the // vCenter server and then removes it. func vSphereRemoveHost(ctx context.Context, obj *object.HostSystem) error { disconnectTask, err := obj.Disconnect(ctx) if err != nil { return err } if err := disconnectTask.Wait(ctx); err != nil { return err } destroyTask, err := obj.Destroy(ctx) if err != nil { return err } return destroyTask.Wait(ctx) }
func (cmd *remove) Remove(ctx context.Context, host *object.HostSystem) error { var h mo.HostSystem err := host.Properties(ctx, host.Reference(), []string{"parent"}, &h) if err != nil { return err } remove := host.Destroy if h.Parent.Type == "ComputeResource" { // Standalone host. From the docs: // "Invoking remove on a HostSystem of standalone type throws a NotSupported fault. // A standalone HostSystem can be removeed only by invoking remove on its parent ComputeResource." remove = object.NewComputeResource(host.Client(), *h.Parent).Destroy } task, err := remove(ctx) if err != nil { return err } logger := cmd.ProgressLogger(fmt.Sprintf("%s removing... ", host.InventoryPath)) defer logger.Wait() _, err = task.WaitForResult(ctx, logger) return err }
// cloneVm creates the virtual machine using a template. func (vm *VirtualMachine) cloneVm(f *object.Folder, p *object.ResourcePool, ds *object.Datastore, h *object.HostSystem) error { Logf("%s cloning virtual machine from %s\n", vm.ID(), vm.TemplateConfig.Use) obj, err := vm.finder.VirtualMachine(vm.ctx, vm.TemplateConfig.Use) if err != nil { return err } folderRef := f.Reference() datastoreRef := ds.Reference() poolRef := p.Reference() var hostRef *types.ManagedObjectReference if h != nil { ref := h.Reference() hostRef = &ref } spec := types.VirtualMachineCloneSpec{ Location: types.VirtualMachineRelocateSpec{ Folder: &folderRef, Datastore: &datastoreRef, Pool: &poolRef, Host: hostRef, }, Template: vm.TemplateConfig.MarkAsTemplate, PowerOn: vm.TemplateConfig.PowerOn, } task, err := obj.Clone(vm.ctx, f, vm.Name, spec) if err != nil { return err } return task.Wait(vm.ctx) }
func newVNCHost(c *vim25.Client, host *object.HostSystem, low, high int) (*vncHost, error) { ports := make(map[int]struct{}) for i := low; i <= high; i++ { ports[i] = struct{}{} } used, err := loadUsedPorts(c, host.Reference()) if err != nil { return nil, err } // Remove used ports from range for _, u := range used { delete(ports, u) } h := &vncHost{ c: c, host: host, ports: ports, } return h, nil }