datacenter.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. Copyright (c) 2015 VMware, Inc. All Rights Reserved.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package object
  14. import (
  15. "context"
  16. "fmt"
  17. "github.com/vmware/govmomi/vim25"
  18. "github.com/vmware/govmomi/vim25/methods"
  19. "github.com/vmware/govmomi/vim25/mo"
  20. "github.com/vmware/govmomi/vim25/types"
  21. )
  22. type DatacenterFolders struct {
  23. VmFolder *Folder
  24. HostFolder *Folder
  25. DatastoreFolder *Folder
  26. NetworkFolder *Folder
  27. }
  28. type Datacenter struct {
  29. Common
  30. }
  31. func NewDatacenter(c *vim25.Client, ref types.ManagedObjectReference) *Datacenter {
  32. return &Datacenter{
  33. Common: NewCommon(c, ref),
  34. }
  35. }
  36. func (d *Datacenter) Folders(ctx context.Context) (*DatacenterFolders, error) {
  37. var md mo.Datacenter
  38. ps := []string{"name", "vmFolder", "hostFolder", "datastoreFolder", "networkFolder"}
  39. err := d.Properties(ctx, d.Reference(), ps, &md)
  40. if err != nil {
  41. return nil, err
  42. }
  43. df := &DatacenterFolders{
  44. VmFolder: NewFolder(d.c, md.VmFolder),
  45. HostFolder: NewFolder(d.c, md.HostFolder),
  46. DatastoreFolder: NewFolder(d.c, md.DatastoreFolder),
  47. NetworkFolder: NewFolder(d.c, md.NetworkFolder),
  48. }
  49. paths := []struct {
  50. name string
  51. path *string
  52. }{
  53. {"vm", &df.VmFolder.InventoryPath},
  54. {"host", &df.HostFolder.InventoryPath},
  55. {"datastore", &df.DatastoreFolder.InventoryPath},
  56. {"network", &df.NetworkFolder.InventoryPath},
  57. }
  58. for _, p := range paths {
  59. *p.path = fmt.Sprintf("/%s/%s", md.Name, p.name)
  60. }
  61. return df, nil
  62. }
  63. func (d Datacenter) Destroy(ctx context.Context) (*Task, error) {
  64. req := types.Destroy_Task{
  65. This: d.Reference(),
  66. }
  67. res, err := methods.Destroy_Task(ctx, d.c, &req)
  68. if err != nil {
  69. return nil, err
  70. }
  71. return NewTask(d.c, res.Returnval), nil
  72. }
  73. // PowerOnVM powers on multiple virtual machines with a single vCenter call.
  74. // If called against ESX, serially powers on the list of VMs and the returned *Task will always be nil.
  75. func (d Datacenter) PowerOnVM(ctx context.Context, vm []types.ManagedObjectReference, option ...types.BaseOptionValue) (*Task, error) {
  76. if d.Client().IsVC() {
  77. req := types.PowerOnMultiVM_Task{
  78. This: d.Reference(),
  79. Vm: vm,
  80. Option: option,
  81. }
  82. res, err := methods.PowerOnMultiVM_Task(ctx, d.c, &req)
  83. if err != nil {
  84. return nil, err
  85. }
  86. return NewTask(d.c, res.Returnval), nil
  87. }
  88. for _, ref := range vm {
  89. obj := NewVirtualMachine(d.Client(), ref)
  90. task, err := obj.PowerOn(ctx)
  91. if err != nil {
  92. return nil, err
  93. }
  94. err = task.Wait(ctx)
  95. if err != nil {
  96. // Ignore any InvalidPowerState fault, as it indicates the VM is already powered on
  97. if f, ok := err.(types.HasFault); ok {
  98. if _, ok = f.Fault().(*types.InvalidPowerState); !ok {
  99. return nil, err
  100. }
  101. }
  102. }
  103. }
  104. return nil, nil
  105. }