{"record":{"id":"253a48d16e6a55de","repo":"hashicorp/terraform","slug":"missing-provisioner-schema","errorCode":null,"errorMessage":"missing provisioner schema","messagePattern":"missing provisioner schema","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/plugin/grpc_provisioner.go","lineNumber":72,"sourceCode":"func (p *GRPCProvisioner) GetSchema() (resp provisioners.GetSchemaResponse) {\n\tp.mu.Lock()\n\tdefer p.mu.Unlock()\n\n\tif p.schema != nil {\n\t\treturn provisioners.GetSchemaResponse{\n\t\t\tProvisioner: p.schema,\n\t\t}\n\t}\n\n\tprotoResp, err := p.client.GetSchema(p.ctx, new(proto.GetProvisionerSchema_Request))\n\tif err != nil {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))\n\t\treturn resp\n\t}\n\tresp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))\n\n\tif protoResp.Provisioner == nil {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(errors.New(\"missing provisioner schema\"))\n\t\treturn resp\n\t}\n\n\tresp.Provisioner = convert.ProtoToConfigSchema(protoResp.Provisioner.Block)\n\n\tp.schema = resp.Provisioner\n\n\treturn resp\n}\n\nfunc (p *GRPCProvisioner) ValidateProvisionerConfig(r provisioners.ValidateProvisionerConfigRequest) (resp provisioners.ValidateProvisionerConfigResponse) {\n\tschema := p.GetSchema()\n\tif schema.Diagnostics.HasErrors() {\n\t\tresp.Diagnostics = resp.Diagnostics.Append(schema.Diagnostics)\n\t\treturn resp\n\t}\n\n\tmp, err := msgpack.Marshal(r.Config, schema.Provisioner.ImpliedType())","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/plugin/grpc_provisioner.go#L54-L90","documentation":"Thrown in GRPCProvisioner.GetSchema when the provisioner's GetProvisionerSchema gRPC response succeeds but protoResp.Provisioner is nil. The provisioner plugin returned a schema response with no top-level provisioner block, which Terraform treats as a defect.","triggerScenarios":"A provisioner plugin (custom or in development) whose GetProvisionerSchema omits the Provisioner field; a provisioner built against an incompatible plugin SDK version; a stub returning an empty response.","commonSituations":"Writing/testing a custom provisioner without fully implementing GetProvisionerSchema; protocol skew; corrupted/half-built provisioner binary.","solutions":["Upgrade or rebuild the provisioner so GetProvisionerSchema returns a non-nil provisioner block.","Ensure the provisioner SDK version matches the Terraform plugin protocol version.","For custom provisioners, populate the Provisioner schema field in the response.","Clear the plugin cache and reinstall the provisioner binary cleanly."],"exampleFix":"# Custom provisioner (terraform-plugin-sdk) must return a schema:\n# before: returned an empty Resource\nfunc (p *Provisioner) GetSchema() (*rpc.GetSchemaResponse, error) {\n    return &rpc.GetSchemaResponse{}, nil   # Provisioner nil -> error\n}\n# after:\nfunc (p *Provisioner) GetSchema() (*rpc.GetSchemaResponse, error) {\n    return &rpc.GetSchemaResponse{\n        Provisioner: &rpc.Schema{Block: schemaToProto(mySchema)},\n    }, nil\n}","handlingStrategy":"validation","validationCode":"# use only provisioners known to ship a provisioner schema; gate in CI\ncheck \"provisioner\" {\n  assert {\n    condition     = contains([\"remote-exec\",\"local-exec\",\"file\"], var.provisioner_type)\n    error_message = \"unknown/unsupported provisioner; ensure it returns a schema\"\n  }\n}","typeGuard":null,"tryCatchPattern":"# wrap provisioners so a schema failure is caught early in a sandbox\n# resource block: provisioner \"local-exec\" { ... } validated in a scratch apply","preventionTips":["Prefer the built-in local-exec/remote-exec/file provisioners which always return schemas.","For custom provisioners, implement GetProvisionerSchema fully and unit-test it.","Match provisioner SDK version to Terraform's plugin protocol.","Clear the plugin cache and reinstall binaries after changes."],"tags":["plugin","grpc","provisioner","schema"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}