hashicorp/terraform · error

resource schema not found for type

Error message

resource schema not found for type %q

What it means

tfplugin6 equivalent of error 960. Returned by the provider6 ListResource handler when the requested resource type is not in p.schema.ResourceTypes. Terraform core asked to list a type the provider never registered, so the wrapper has no schema to work against.

Solutions

  1. Run `terraform providers schema -json` and confirm the type is advertised.
  2. Correct the resource type spelling in configuration.
  3. Upgrade or pin the provider to a version that registers the resource.
  4. If developing a built-in provider, add the type to schema.ResourceTypes.

Example fix

// before
providerSchema.ResourceTypes = map[string]*config.Block{}
// after
providerSchema.ResourceTypes["aws_example_thing"] = exampleResourceSchema
Defensive patterns

Strategy: validation

Validate before calling

// tfplugin6 path: confirm the type is registered before listing.
schemas, err := client.GetProviderSchema(ctx, &tfplugin6.GetProviderSchema_Request{})
if err != nil {
    return err
}
if _, ok := schemas.ResourceTypes[typeName]; !ok {
    return fmt.Errorf("will not call ListResource: type %q not registered by provider", typeName)
}
return client.ListResource(ctx, typeName, config)

Type guard

func resourceTypeRegistered6(s *tfplugin6.GetProviderSchema_Response, typeName string) bool {
    _, ok := s.ResourceTypes[typeName]
    return ok
}

Prevention

When it happens

Trigger: A tfplugin6 ListResource RPC whose req.TypeName is absent from p.schema.ResourceTypes.

Common situations: Provider version lacking the resource; type name typo; core/provider schema skew; built-in provider that forgot to register the type.

Related errors


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

Appendix: 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 d32a084675)