func()

in fleet-argocd-plugin/fleetclient/fleetclient.go [158:220]


func (c *FleetSync) Refresh(ctx context.Context) error {
	mems, err := c.listMemberships(ctx, c.ProjectNum)
	if err != nil {
		return fmt.Errorf("failed to list memberships: %w", err)
	}

	scopes, err := c.listScopes(ctx, c.ProjectNum)
	if err != nil {
		return fmt.Errorf("failed to list scopes: %w", err)
	}

	mbs, err := c.listMembershipBindings(ctx, c.ProjectNum)
	if err != nil {
		return fmt.Errorf("failed to list membership bindings: %w", err)
	}

	// Build one map from Memberships to a list of Scopes that the membership cluster is associated with,
	// and one reverse indexed map from Scopes to Memberships.
	memTenancyMap := make(map[string][]string)
	for _, mem := range mems {
		membershipName := mem.Name
		memTenancyMap[membershipName] = make([]string, 0)
	}

	scopeTenancyMap := make(map[string][]string)
	for _, s := range scopes {
		scopeID := s.Name
		scopeTenancyMap[scopeID] = make([]string, 0)
	}

	for _, binding := range mbs {
		// bindingName is in the format of
		// `projects/{project}/locations/{location}/memberships/{membership}/bindings/{membershipbinding}`
		bindingName := binding.Name
		parts := strings.Split(bindingName, "/")
		if len(parts) != 8 || parts[0] != "projects" || parts[2] != "locations" || parts[4] != "memberships" || parts[6] != "bindings" {
			fmt.Println("Invalid binding resource name format: %s", bindingName)
			continue
		}

		// Add the scope to the list for this membership
		membership := strings.Join(parts[:6], "/")
		scopeParts := strings.Split(binding.Scope, "/")
		if len(scopeParts) == 0 {
			fmt.Println("Invalid scope in binding (%s): %s", bindingName, binding.Scope)
			continue
		}

		scope := scopeParts[len(scopeParts)-1]
		memTenancyMap[membership] = append(memTenancyMap[membership], scope)
		scopeTenancyMap[scope] = append(scopeTenancyMap[scope], membership)
	}

	// Refresh cache.
	c.MembershipTenancyMapCache = memTenancyMap
	c.ScopeTenancyMapCache = scopeTenancyMap

	// Update cluster Secrets.
	if err := c.reconcileClusterSecrets(ctx); err != nil {
		return fmt.Errorf("failed to reconcile cluster secrets: %w", err)
	}
	return nil
}