Bugfix: Use pages to list all enterprises in direct google AMAPI calls (#38915)

This commit is contained in:
Martin Angers 2026-01-28 11:03:13 -05:00 committed by GitHub
parent cf2411e40a
commit 49cc44011f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 5 deletions

View file

@ -307,11 +307,15 @@ func (g *GoogleClient) EnterpriseDelete(ctx context.Context, enterpriseName stri
}
func (g *GoogleClient) EnterprisesList(ctx context.Context, serverURL string) ([]*androidmanagement.Enterprise, error) {
resp, err := g.mgmt.Enterprises.List().ProjectId(g.androidProjectID).Context(ctx).Do()
var enterprises []*androidmanagement.Enterprise
err := g.mgmt.Enterprises.List().ProjectId(g.androidProjectID).Context(ctx).Pages(ctx, func(page *androidmanagement.ListEnterprisesResponse) error {
enterprises = append(enterprises, page.Enterprises...)
return nil
})
if err != nil {
return nil, fmt.Errorf("listing enterprises: %w", err)
}
return resp.Enterprises, nil
return enterprises, nil
}
// SetAuthenticationSecret is not used by GoogleClient because this client gets its secret from env var.

View file

@ -267,6 +267,9 @@ func (p *ProxyClient) EnterprisesList(ctx context.Context, serverURL string) ([]
call := p.mgmt.Enterprises.List().Context(ctx)
call.Header().Set("Authorization", "Bearer "+p.fleetServerSecret)
call.Header().Set("Origin", serverURL)
// NOTE: we don't call .Pages(...) here because the Fleet proxy takes care of
// listing enterprises on all pages and filtering those that belong to this Fleet instance:
// https://github.com/fleetdm/fleet/blob/ac960d64fce49175b4f3ee396ed30c27824450ea/website/api/controllers/android-proxy/get-android-enterprises.js#L74-L91
resp, err := call.Do()
if err != nil {
// Convert proxy errors to proper googleapi.Error for service layer

View file

@ -128,17 +128,25 @@ func enterprisesDelete(mgmt *androidmanagement.Service, enterpriseID string) {
}
func enterprisesList(mgmt *androidmanagement.Service) {
enterprises, err := mgmt.Enterprises.List().ProjectId(androidProjectID).Do()
ctx := context.Background()
var enterprises []*androidmanagement.Enterprise
var callCount int
err := mgmt.Enterprises.List().ProjectId(androidProjectID).Pages(ctx, func(page *androidmanagement.ListEnterprisesResponse) error {
callCount++
enterprises = append(enterprises, page.Enterprises...)
return nil
})
if err != nil {
log.Fatalf("Error listing enterprises: %v", err)
}
if len(enterprises.Enterprises) == 0 {
if len(enterprises) == 0 {
log.Printf("No enterprises found")
return
}
for _, enterprise := range enterprises.Enterprises {
for _, enterprise := range enterprises {
log.Printf("Enterprise: %+v", *enterprise)
}
log.Printf("%d enterprises found in %d pages", len(enterprises), callCount)
}
func policiesList(mgmt *androidmanagement.Service, enterpriseID string) {