project.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2019 Yunion
  2. //
  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. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package esxi
  15. import (
  16. "context"
  17. "github.com/vmware/govmomi/object"
  18. api "yunion.io/x/cloudmux/pkg/apis/compute"
  19. "yunion.io/x/cloudmux/pkg/cloudprovider"
  20. "yunion.io/x/cloudmux/pkg/multicloud"
  21. "yunion.io/x/pkg/errors"
  22. )
  23. type SProject struct {
  24. multicloud.SProjectBase
  25. multicloud.STagBase
  26. client *SESXiClient
  27. folder *object.Folder
  28. Name string
  29. Id string
  30. }
  31. func (project *SProject) GetId() string {
  32. return project.Id
  33. }
  34. func (project *SProject) GetGlobalId() string {
  35. return project.Id
  36. }
  37. func (project *SProject) GetName() string {
  38. return project.Name
  39. }
  40. func (project *SProject) GetStatus() string {
  41. return api.EXTERNAL_PROJECT_STATUS_AVAILABLE
  42. }
  43. func (cli *SESXiClient) listAllFolders(ctx context.Context, folder *object.Folder, prefix string) ([]SProject, error) {
  44. ret := []SProject{}
  45. name, err := folder.ObjectName(ctx)
  46. if err != nil {
  47. return nil, errors.Wrap(err, "ObjectName")
  48. }
  49. if len(prefix) > 0 {
  50. name = prefix + name
  51. }
  52. ret = append(ret, SProject{
  53. folder: folder,
  54. Id: folder.Reference().Value,
  55. Name: name,
  56. })
  57. children, err := folder.Children(ctx)
  58. if err != nil {
  59. return nil, errors.Wrap(err, "Children")
  60. }
  61. for _, child := range children {
  62. if subFolder, ok := child.(*object.Folder); ok {
  63. folders, err := cli.listAllFolders(ctx, subFolder, name+"|")
  64. if err != nil {
  65. return nil, errors.Wrap(err, "listAllFolders")
  66. }
  67. ret = append(ret, folders...)
  68. }
  69. }
  70. return ret, nil
  71. }
  72. func (dc *SDatacenter) GetVMFolders() ([]SProject, error) {
  73. vmFolders, err := dc.getObjectDatacenter().Folders(dc.manager.context)
  74. if err != nil {
  75. return nil, errors.Wrap(err, "Folders")
  76. }
  77. ret, err := dc.manager.listAllFolders(dc.manager.context, vmFolders.VmFolder, "")
  78. if err != nil {
  79. return nil, errors.Wrap(err, "listAllFolders")
  80. }
  81. return ret, nil
  82. }
  83. func (dc *SDatacenter) GetFolder(folderId string) (*object.Folder, error) {
  84. vmFolders, err := dc.getObjectDatacenter().Folders(dc.manager.context)
  85. if err != nil {
  86. return nil, errors.Wrap(err, "Folders")
  87. }
  88. ret, err := dc.manager.listAllFolders(dc.manager.context, vmFolders.VmFolder, "")
  89. if err != nil {
  90. return nil, errors.Wrap(err, "listAllFolders")
  91. }
  92. for i := range ret {
  93. if ret[i].Id == folderId {
  94. return ret[i].folder, nil
  95. }
  96. }
  97. return vmFolders.VmFolder, nil
  98. }
  99. func (cli *SESXiClient) GetVMFolders() ([]SProject, error) {
  100. dcs, err := cli.GetDatacenters()
  101. if err != nil {
  102. return nil, errors.Wrap(err, "GetDatacenters")
  103. }
  104. ret := make([]SProject, 0)
  105. for i := range dcs {
  106. folders, err := dcs[i].GetVMFolders()
  107. if err != nil {
  108. return nil, errors.Wrap(err, "GetVMFolders")
  109. }
  110. ret = append(ret, folders...)
  111. }
  112. return ret, nil
  113. }
  114. func (cli *SESXiClient) GetIProjects() ([]cloudprovider.ICloudProject, error) {
  115. projects, err := cli.GetVMFolders()
  116. if err != nil {
  117. return nil, errors.Wrap(err, "GetVMFolders")
  118. }
  119. ret := make([]cloudprovider.ICloudProject, 0)
  120. for i := range projects {
  121. projects[i].client = cli
  122. ret = append(ret, &projects[i])
  123. }
  124. return ret, nil
  125. }