in pkg/common/connectionmanager/zones.go [318:398]
func (cm *ConnectionManager) LookupZoneByMoref(ctx context.Context, tenantRef string,
moRef types.ManagedObjectReference, zoneLabel string, regionLabel string) (map[string]string, error) {
result := make(map[string]string)
vsi := cm.VsphereInstanceMap[tenantRef]
if vsi == nil {
err := ErrConnectionNotFound
klog.Errorf("Unable to find Connection for tenantRef=%s", tenantRef)
return nil, err
}
err := withTagsClient(ctx, vsi.Conn, func(c *rest.Client) error {
client := tags.NewManager(c)
pc := vsi.Conn.Client.ServiceContent.PropertyCollector
// example result: ["Folder", "Datacenter", "Cluster", "Host"]
objects, err := mo.Ancestors(ctx, vsi.Conn.Client, pc, moRef)
if err != nil {
klog.Errorf("Ancestors failed for %s with err %v", moRef, err)
return err
}
// search the hierarchy, example order: ["Host", "Cluster", "Datacenter", "Folder"]
for i := range objects {
obj := objects[len(objects)-1-i]
klog.V(4).Infof("Name: %s, Type: %s", obj.Self.Value, obj.Self.Type)
tags, err := client.ListAttachedTags(ctx, obj)
if err != nil {
klog.Errorf("Cannot list attached tags. Err: %v", err)
continue
}
for _, value := range tags {
tag, err := client.GetTag(ctx, value)
if err != nil {
klog.Errorf("Zones Get tag %s: %s", value, err)
return err
}
category, err := client.GetCategory(ctx, tag.CategoryID)
if err != nil {
klog.Errorf("Zones Get category %s error", value)
return err
}
found := func() {
klog.V(2).Infof("Found %s tag (%s) attached to %s", category.Name, tag.Name, moRef)
}
switch {
case category.Name == zoneLabel:
result[ZoneLabel] = tag.Name
found()
case category.Name == regionLabel:
result[RegionLabel] = tag.Name
found()
}
if result[ZoneLabel] != "" && result[RegionLabel] != "" {
return nil
}
}
}
if result[RegionLabel] == "" {
if regionLabel != "" {
return fmt.Errorf("vSphere region category %s does not match any tags for mo: %v", regionLabel, moRef)
}
}
if result[ZoneLabel] == "" {
if zoneLabel != "" {
return fmt.Errorf("vSphere zone category %s does not match any tags for mo: %v", zoneLabel, moRef)
}
}
return nil
})
if err != nil {
klog.Errorf("Get zone for mo: %s: %s", moRef, err)
return nil, err
}
return result, nil
}