hashicorp/terraform · error

resource schema not found for type %q

Error message

resource schema not found for type %q

What it means

Returned by ListResource (internal/grpcwrap/provider6.go:851) when the streamed ListResource request's req.TypeName is not a key in p.schema.ResourceTypes. The handler first resolves the underlying resource schema (used to encode each item's 'state' attribute); if the type is unknown it aborts before even checking the list-resource schema.

Source

Thrown at internal/grpcwrap/provider6.go:851

		return resp, nil
	}

	dv, err := encodeDynamicValue6(upgradeResp.UpgradedIdentity, ty)
	if err != nil {
		resp.Diagnostics = convert.AppendProtoDiag(resp.Diagnostics, err)
		return resp, nil
	}

	resp.UpgradedIdentity = &tfplugin6.ResourceIdentityData{
		IdentityData: dv,
	}
	return resp, nil
}

func (p *provider6) ListResource(req *tfplugin6.ListResource_Request, res tfplugin6.Provider_ListResourceServer) error {
	resourceSchema, ok := p.schema.ResourceTypes[req.TypeName]
	if !ok {
		return fmt.Errorf("resource schema not found for type %q", req.TypeName)
	}
	listSchema, ok := p.schema.ListResourceTypes[req.TypeName]
	if !ok {
		return fmt.Errorf("list resource schema not found for type %q", req.TypeName)
	}
	cfg, err := decodeDynamicValue6(req.Config, listSchema.Body.ImpliedType())
	if err != nil {
		return status.Errorf(codes.InvalidArgument, "failed to decode config: %v", err)
	}
	resp := p.provider.ListResource(providers.ListResourceRequest{
		TypeName:              req.TypeName,
		Config:                cfg,
		Limit:                 req.Limit,
		IncludeResourceObject: req.IncludeResourceObject,
	})
	if resp.Diagnostics.HasErrors() {
		return resp.Diagnostics.Err()
	}

View on GitHub (pinned to c9def3e214)

Solutions

  1. Ensure GetProviderSchema.ResourceTypes contains the resource type backing the list resource.
  2. Upgrade/reinstall the provider so its advertised resource types match what config/state expect.
  3. Check the list resource block's type spelling and that it corresponds to a real resource.
  4. In test harnesses, make sure the wrapped providers.Interface returns the resource in its schema response.

Example fix

// before
// provider advertises ListResourceTypes["things"] but not ResourceTypes["things"]
req.TypeName = "things"  // -> resource schema not found for type "things"

// after
schema.ResourceTypes["things"] = providers.Schema{Body: ...}
schema.ListResourceTypes["things"] = providers.Schema{Body: ...}
Defensive patterns

Strategy: validation

Validate before calling

func resourceTypeAdvertised(s providers.GetProviderSchemaResponse, typ string) bool {
    _, ok := s.ResourceTypes[typ]
    return ok
}

Type guard

func advertisedResourceTypes(s providers.GetProviderSchemaResponse) []string {
    out := make([]string, 0, len(s.ResourceTypes))
    for k := range s.ResourceTypes { out = append(out, k) }
    return out
}

Try / catch

if err := server.ListResource(req, stream); err != nil {
    if strings.Contains(err.Error(), "resource schema not found") {
        // re-init provider or skip this list resource
    }
}

Prevention

When it happens

Trigger: Terraform core calls the ListResource gRPC for a resource type the provider did not advertise in GetProviderSchema.ResourceTypes; e.g. a list resource referencing a backing managed resource type that was renamed or not registered.

Common situations: Provider version downgrade (state/config references a type the older provider doesn't define), typo in a list resource block, an experimental list resource whose backing type was removed, or a custom provider test missing the resource schema.

Related errors


AI-assisted analysis of hashicorp/terraform@c9def3e214 (2026-08-07). Data as JSON: /api/errors/ef3ff2bb814ddfef. Report an issue: GitHub.