func()

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
}