{"record":{"id":"17ab948da7f98104","repo":"hashicorp/terraform","slug":"unknown-address-type-q-for-q","errorCode":null,"errorMessage":"Unknown address type %q for %q","messagePattern":"Unknown address type %q for %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/getproviders/reattach/reattach.go","lineNumber":74,"sourceCode":"\t\tfor p, c := range m {\n\t\t\ta, diags := addrs.ParseProviderSourceString(p)\n\t\t\tif diags.HasErrors() {\n\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Error parsing %q as a provider address: %w\", a, diags.Err())\n\t\t\t}\n\t\t\tvar addr net.Addr\n\t\t\tswitch c.Addr.Network {\n\t\t\tcase \"unix\":\n\t\t\t\taddr, err = net.ResolveUnixAddr(\"unix\", c.Addr.String)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Invalid unix socket path %q for %q: %w\", c.Addr.String, p, err)\n\t\t\t\t}\n\t\t\tcase \"tcp\":\n\t\t\t\taddr, err = net.ResolveTCPAddr(\"tcp\", c.Addr.String)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Invalid TCP address %q for %q: %w\", c.Addr.String, p, err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Unknown address type %q for %q\", c.Addr.Network, p)\n\t\t\t}\n\t\t\tunmanagedProviders[a] = &plugin.ReattachConfig{\n\t\t\t\tProtocol:        plugin.Protocol(c.Protocol),\n\t\t\t\tProtocolVersion: c.ProtocolVersion,\n\t\t\t\tPid:             c.Pid,\n\t\t\t\tTest:            c.Test,\n\t\t\t\tAddr:            addr,\n\t\t\t}\n\t\t}\n\t}\n\treturn unmanagedProviders, nil\n}\n\n// IsProviderReattached determines if a given provider is being supplied to Terraform via the TF_REATTACH_PROVIDERS\n// environment variable.\n//\n// Calling code is expected to pass in a provider address and the value of os.Getenv(\"TF_REATTACH_PROVIDERS\")\nfunc IsProviderReattached(provider tfaddr.Provider, in string) (bool, error) {","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/hashicorp/terraform/blob/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/getproviders/reattach/reattach.go#L56-L92","documentation":"Thrown from the default branch of the address-Network switch in the reattach loader. Only 'unix' and 'tcp' are recognised; any other value is rejected.","triggerScenarios":"c.Addr.Network is neither \"unix\" nor \"tcp\" (e.g. \"TCP\", \"grpc\", \"socket\", \"http\").","commonSituations":"Uppercase 'TCP'/'UNIX'; a protocol name mistakenly placed in the network field; typo such as 'ticp'; schema confusion between Protocol and Addr.Network fields.","solutions":["Set addr.Network to exactly \"unix\" or \"tcp\" (lowercase)","Do not put the gRPC protocol name in the network field","Re-export TF_REATTACH_PROVIDERS from a known-working debug session"],"exampleFix":"// before: {\"addr\":{\"network\":\"TCP\",\"string\":\"127.0.0.1:5678\"}}\n// after : {\"addr\":{\"network\":\"tcp\",\"string\":\"127.0.0.1:5678\"}}","handlingStrategy":"type-guard","validationCode":"// Allow only the two recognised network types before decoding.\nswitch c.Addr.Network {\ncase \"unix\", \"tcp\":\ndefault:\n    return fmt.Errorf(\"reattach network must be 'unix' or 'tcp', got %q\", c.Addr.Network)\n}","typeGuard":"func IsKnownReattachNetwork(s string) bool {\n    return s == \"unix\" || s == \"tcp\"\n}","tryCatchPattern":"providers, err := reattach.DecodeProviders(raw)\nif err != nil && strings.Contains(err.Error(), \"Unknown address type\") {\n    return fmt.Errorf(\"reattach addr.network must be lowercase 'unix' or 'tcp': %w\", err)\n}","preventionTips":["Always use lowercase 'unix' or 'tcp' for addr.network","Do not place the gRPC protocol name in the network field","Regenerate the value from a working debug session"],"tags":["reattach","network","validation","config"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}