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.Zone

View on GitHub (pinned to 932558d4e6)

Solutions

  1. Add exactly one location param: ...&resourceType=gkeVersions&projectId=my-project&zone=us-central1-a (or region=us-central1)
  2. In the UI, disable the version dropdown until a location type and value are chosen
  3. 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

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


AI-assisted analysis of rancher/rancher@932558d4e6 (2026-08-16). Data as JSON: /api/errors/a9eeaf9acdf521bf. Report an issue: GitHub.