folder.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. "github.com/vmware/govmomi/vim25"
  17. "github.com/vmware/govmomi/vim25/methods"
  18. "github.com/vmware/govmomi/vim25/mo"
  19. "github.com/vmware/govmomi/vim25/types"
  20. )
  21. type Folder struct {
  22. Common
  23. }
  24. func NewFolder(c *vim25.Client, ref types.ManagedObjectReference) *Folder {
  25. return &Folder{
  26. Common: NewCommon(c, ref),
  27. }
  28. }
  29. func NewRootFolder(c *vim25.Client) *Folder {
  30. f := NewFolder(c, c.ServiceContent.RootFolder)
  31. f.InventoryPath = "/"
  32. return f
  33. }
  34. func (f Folder) Children(ctx context.Context) ([]Reference, error) {
  35. var mf mo.Folder
  36. err := f.Properties(ctx, f.Reference(), []string{"childEntity"}, &mf)
  37. if err != nil {
  38. return nil, err
  39. }
  40. var rs []Reference
  41. for _, e := range mf.ChildEntity {
  42. if r := NewReference(f.c, e); r != nil {
  43. rs = append(rs, r)
  44. }
  45. }
  46. return rs, nil
  47. }
  48. func (f Folder) CreateDatacenter(ctx context.Context, datacenter string) (*Datacenter, error) {
  49. req := types.CreateDatacenter{
  50. This: f.Reference(),
  51. Name: datacenter,
  52. }
  53. res, err := methods.CreateDatacenter(ctx, f.c, &req)
  54. if err != nil {
  55. return nil, err
  56. }
  57. // Response will be nil if this is an ESX host that does not belong to a vCenter
  58. if res == nil {
  59. return nil, nil
  60. }
  61. return NewDatacenter(f.c, res.Returnval), nil
  62. }
  63. func (f Folder) CreateCluster(ctx context.Context, cluster string, spec types.ClusterConfigSpecEx) (*ClusterComputeResource, error) {
  64. req := types.CreateClusterEx{
  65. This: f.Reference(),
  66. Name: cluster,
  67. Spec: spec,
  68. }
  69. res, err := methods.CreateClusterEx(ctx, f.c, &req)
  70. if err != nil {
  71. return nil, err
  72. }
  73. // Response will be nil if this is an ESX host that does not belong to a vCenter
  74. if res == nil {
  75. return nil, nil
  76. }
  77. return NewClusterComputeResource(f.c, res.Returnval), nil
  78. }
  79. func (f Folder) CreateFolder(ctx context.Context, name string) (*Folder, error) {
  80. req := types.CreateFolder{
  81. This: f.Reference(),
  82. Name: name,
  83. }
  84. res, err := methods.CreateFolder(ctx, f.c, &req)
  85. if err != nil {
  86. return nil, err
  87. }
  88. return NewFolder(f.c, res.Returnval), err
  89. }
  90. func (f Folder) CreateStoragePod(ctx context.Context, name string) (*StoragePod, error) {
  91. req := types.CreateStoragePod{
  92. This: f.Reference(),
  93. Name: name,
  94. }
  95. res, err := methods.CreateStoragePod(ctx, f.c, &req)
  96. if err != nil {
  97. return nil, err
  98. }
  99. return NewStoragePod(f.c, res.Returnval), err
  100. }
  101. func (f Folder) AddStandaloneHost(ctx context.Context, spec types.HostConnectSpec, addConnected bool, license *string, compResSpec *types.BaseComputeResourceConfigSpec) (*Task, error) {
  102. req := types.AddStandaloneHost_Task{
  103. This: f.Reference(),
  104. Spec: spec,
  105. AddConnected: addConnected,
  106. }
  107. if license != nil {
  108. req.License = *license
  109. }
  110. if compResSpec != nil {
  111. req.CompResSpec = *compResSpec
  112. }
  113. res, err := methods.AddStandaloneHost_Task(ctx, f.c, &req)
  114. if err != nil {
  115. return nil, err
  116. }
  117. return NewTask(f.c, res.Returnval), nil
  118. }
  119. func (f Folder) CreateVM(ctx context.Context, config types.VirtualMachineConfigSpec, pool *ResourcePool, host *HostSystem) (*Task, error) {
  120. req := types.CreateVM_Task{
  121. This: f.Reference(),
  122. Config: config,
  123. Pool: pool.Reference(),
  124. }
  125. if host != nil {
  126. ref := host.Reference()
  127. req.Host = &ref
  128. }
  129. res, err := methods.CreateVM_Task(ctx, f.c, &req)
  130. if err != nil {
  131. return nil, err
  132. }
  133. return NewTask(f.c, res.Returnval), nil
  134. }
  135. func (f Folder) RegisterVM(ctx context.Context, path string, name string, asTemplate bool, pool *ResourcePool, host *HostSystem) (*Task, error) {
  136. req := types.RegisterVM_Task{
  137. This: f.Reference(),
  138. Path: path,
  139. AsTemplate: asTemplate,
  140. }
  141. if name != "" {
  142. req.Name = name
  143. }
  144. if host != nil {
  145. ref := host.Reference()
  146. req.Host = &ref
  147. }
  148. if pool != nil {
  149. ref := pool.Reference()
  150. req.Pool = &ref
  151. }
  152. res, err := methods.RegisterVM_Task(ctx, f.c, &req)
  153. if err != nil {
  154. return nil, err
  155. }
  156. return NewTask(f.c, res.Returnval), nil
  157. }
  158. func (f Folder) CreateDVS(ctx context.Context, spec types.DVSCreateSpec) (*Task, error) {
  159. req := types.CreateDVS_Task{
  160. This: f.Reference(),
  161. Spec: spec,
  162. }
  163. res, err := methods.CreateDVS_Task(ctx, f.c, &req)
  164. if err != nil {
  165. return nil, err
  166. }
  167. return NewTask(f.c, res.Returnval), nil
  168. }
  169. func (f Folder) MoveInto(ctx context.Context, list []types.ManagedObjectReference) (*Task, error) {
  170. req := types.MoveIntoFolder_Task{
  171. This: f.Reference(),
  172. List: list,
  173. }
  174. res, err := methods.MoveIntoFolder_Task(ctx, f.c, &req)
  175. if err != nil {
  176. return nil, err
  177. }
  178. return NewTask(f.c, res.Returnval), nil
  179. }