mobase.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. "strings"
  17. "github.com/vmware/govmomi/vim25/mo"
  18. "yunion.io/x/log"
  19. "yunion.io/x/cloudmux/pkg/cloudprovider"
  20. )
  21. type SManagedObject struct {
  22. manager *SESXiClient
  23. datacenter *SDatacenter
  24. object mo.Entity
  25. path []string
  26. }
  27. func newManagedObject(manager *SESXiClient, moobj mo.Entity, dc *SDatacenter) SManagedObject {
  28. return SManagedObject{manager: manager, object: moobj, datacenter: dc}
  29. }
  30. func (self *SManagedObject) GetName() string {
  31. return self.object.Entity().Name
  32. }
  33. func (self *SManagedObject) GetId() string {
  34. return moRefId(self.object.Entity().Self)
  35. }
  36. func (self *SManagedObject) GetType() string {
  37. return moRefType(self.object.Entity().Self)
  38. }
  39. func (self *SManagedObject) getCurrentParentEntity() *mo.ManagedEntity {
  40. return self.getParentEntity(self.object.Entity())
  41. }
  42. func (self *SManagedObject) getParentEntity(obj *mo.ManagedEntity) *mo.ManagedEntity {
  43. parent := obj.Parent
  44. if parent != nil {
  45. var entity mo.ManagedEntity
  46. err := self.manager.reference2Object(*parent, []string{"name", "parent"}, &entity)
  47. if err != nil {
  48. log.Errorf("%s", err)
  49. return nil
  50. }
  51. // log.Debugf("getParentEntity %s %s %s", entity.Self.Type, entity.Self.Value, entity.Name)
  52. return &entity
  53. }
  54. return nil
  55. }
  56. func (self *SManagedObject) fetchPath() []string {
  57. path := make([]string, 0)
  58. obj := self.object.Entity()
  59. for obj != nil {
  60. obj = self.getParentEntity(obj)
  61. if obj != nil {
  62. path = append(path, obj.Name)
  63. }
  64. }
  65. reverseArray(path)
  66. return path
  67. }
  68. func (self *SManagedObject) GetPath() []string {
  69. if self.path == nil {
  70. self.path = self.fetchPath()
  71. log.Debugf("fetch path: %s", self.path)
  72. }
  73. return self.path
  74. }
  75. func (self *SManagedObject) findInParents(objType string) *mo.ManagedEntity {
  76. obj := self.object.Entity()
  77. for obj != nil && obj.Self.Type != objType {
  78. log.Debugf("find %s want %s", obj.Self.Type, objType)
  79. obj = self.getParentEntity(obj)
  80. }
  81. return obj
  82. }
  83. func (self *SManagedObject) fetchDatacenter() (*SDatacenter, error) {
  84. me := self.findInParents("Datacenter")
  85. if me == nil {
  86. return nil, cloudprovider.ErrNotFound
  87. }
  88. return self.manager.FindDatacenterByMoId(me.Self.Value)
  89. }
  90. func (self *SManagedObject) GetDatacenter() (*SDatacenter, error) {
  91. if self.datacenter == nil {
  92. dc, err := self.fetchDatacenter()
  93. if err != nil {
  94. return nil, err
  95. }
  96. self.datacenter = dc
  97. }
  98. return self.datacenter, nil
  99. }
  100. func (self *SManagedObject) GetDatacenterPath() []string {
  101. dc, err := self.GetDatacenter()
  102. if err != nil {
  103. log.Errorf("cannot find datacenter")
  104. return nil
  105. }
  106. path := dc.GetPath()
  107. return path[1:]
  108. }
  109. func (self *SManagedObject) GetDatacenterPathString() string {
  110. path := self.GetDatacenterPath()
  111. if path != nil {
  112. return strings.Join(path, "/")
  113. }
  114. return ""
  115. }
  116. func (self *SManagedObject) getManagerUri() string {
  117. return self.manager.getUrl()
  118. }