rancher/rancher · error
either region or zone is required
Error message
either region or zone is required
What it means
listVersions validates location first: exactly one of Region or Zone must be set, because GKE server configs are fetched per location (regions.serverConfigs for regional clusters, zones.serverConfigs for zonal). When both are empty, HTTP 400 'either region or zone is required' is returned before the projectId check and before any GCP call.
Source
Thrown at pkg/api/norman/customization/gke/listers.go:144
}
client, err := getIamServiceClient(ctx, cap.Credentials)
if err != nil {
return nil, http.StatusInternalServerError, err
}
name := "projects/" + cap.ProjectID
result, err := client.Projects.ServiceAccounts.List(name).Do()
if err != nil {
return nil, http.StatusInternalServerError, err
}
return encodeOutput(result)
}
func listVersions(ctx context.Context, cap *Capabilities) ([]byte, int, error) {
if cap.Region == "" && cap.Zone == "" {
return nil, http.StatusBadRequest, fmt.Errorf("either region or zone is required")
}
if cap.Region != "" && cap.Zone != "" {
return nil, http.StatusBadRequest, fmt.Errorf("only one of region or zone can be provided")
}
if cap.ProjectID == "" {
return nil, http.StatusBadRequest, fmt.Errorf("projectId is required")
}
client, err := getContainerServiceClient(ctx, cap.Credentials)
if err != nil {
return nil, http.StatusInternalServerError, err
}
var location string
if cap.Region != "" {
location = cap.Region
} else {
location = cap.ZoneView on GitHub (pinned to 932558d4e6)
Solutions
- Add exactly one location param: ...&resourceType=gkeVersions&projectId=my-project&zone=us-central1-a (or region=us-central1)
- In the UI, disable the version dropdown until a location type and value are chosen
- Remember projectId is still required separately after fixing location
Example fix
// before GET /v3/gke/endpoints?resourceType=gkeVersions&cloudCredentialId=ns:n&projectId=my-project // after GET /v3/gke/endpoints?resourceType=gkeVersions&cloudCredentialId=ns:n&projectId=my-project&zone=us-central1-a
Defensive patterns
Strategy: validation
Validate before calling
function locationParam(region, zone) {
if (!region && !zone) throw new Error('gkeVersions requires exactly one of region or zone');
return zone ? { zone } : { region };
} Type guard
const hasExactlyOneLocation = (cap) => Boolean(cap?.region) !== Boolean(cap?.zone);
Prevention
- Make the version fetch wait on a completed location selection (regional vs zonal toggle + value)
- Model location as a single discriminated field in client state, never two independent strings
- Note projectId is still required after location passes — validate both together
When it happens
Trigger: Calling resourceType=gkeVersions with neither ?region= nor ?zone=; the location form section untouched (Kubernetes version dropdown fetched too early); location reset after a credential or project change.
Common situations: UI fetching versions before the user picks regional vs zonal; scripts that only send credential and projectId; location state lost on component re-mount.
Related errors
- only one of region or zone can be provided
- projectId and zone are required
- projectId and region are required
- must provide the 'imageProjects' query param
- must provide the 'imageFamilies' query param
AI-assisted analysis of rancher/rancher@932558d4e6 (2026-08-16).
Data as JSON: /api/errors/a9eeaf9acdf521bf.
Report an issue: GitHub.