{"record":{"id":"887142e761a3ad8e","repo":"kubernetes/kops","slug":"zone-does-not-support-resource-records-q","errorCode":null,"errorMessage":"zone does not support resource records %q","messagePattern":"zone does not support resource records %q","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dns-controller/pkg/dns/dnscontroller.go","lineNumber":463,"sourceCode":"\t\tzone := o.zones[zoneName]\n\t\tif zone != nil {\n\t\t\treturn zone\n\t\t}\n\t\tdot := strings.IndexByte(zoneName, '.')\n\t\tif dot == -1 {\n\t\t\treturn nil\n\t\t}\n\t\tzoneName = zoneName[dot+1:]\n\t}\n}\n\nfunc (o *dnsOp) getChangeset(zone dnsprovider.Zone) (dnsprovider.ResourceRecordChangeset, error) {\n\tkey := zone.Name() + \"::\" + zone.ID()\n\tchangeset := o.changesets[key]\n\tif changeset == nil {\n\t\trrsProvider, ok := zone.ResourceRecordSets()\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"zone does not support resource records %q\", zone.Name())\n\t\t}\n\t\tchangeset = rrsProvider.StartChangeset()\n\t\to.changesets[key] = changeset\n\t}\n\n\treturn changeset, nil\n}\n\n// listRecords is a wrapper around listing records, but will cache the results for the duration of the dnsOp\nfunc (o *dnsOp) listRecords(zone dnsprovider.Zone) ([]dnsprovider.ResourceRecordSet, error) {\n\tkey := zone.Name() + \"::\" + zone.ID()\n\n\trrs := o.recordsCache[key]\n\tif rrs == nil {\n\t\trrsProvider, ok := zone.ResourceRecordSets()\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"zone does not support resource records %q\", zone.Name())\n\t\t}","sourceCodeStart":445,"sourceCodeEnd":481,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/dns-controller/pkg/dns/dnscontroller.go#L445-L481","documentation":"getChangeset needs a ResourceRecordSets() interface from the zone. dnsprovider zones return (interface, bool); if ok is false, that provider's zone implementation cannot manage individual records, so getChangeset fails with 'zone does not support resource records %q'. This is a provider-capability error, not a record-level problem.","triggerScenarios":"o.getChangeset(zone) called from deleteRecords/updateRecords on a zone whose dnsprovider implementation returns false from ResourceRecordSets() — i.e., a zone type lacking record-set support in the provider driver.","commonSituations":"Using a dns-provider backend whose kops driver only implements zone listing (incomplete/limited provider support); misconfigured --dns flag selecting a provider that cannot host the records; a stub/mock provider in tests.","solutions":["Switch to a fully supported --dns provider (aws-route53, google-clouddns, digitalocean, etc.) that implements ResourceRecordSets.","Check the dnsprovider driver for your backend: if ResourceRecordSets() is unimplemented, it needs a driver fix/upstream contribution.","Exclude record-hosting-incompatible zones from the controller's zone filters so they are never selected via findZone."],"exampleFix":"// before\n--dns=cloudless   // provider whose zones do not support record sets\n// after\n--dns=aws-route53","handlingStrategy":"validation","validationCode":"// guard before requesting a changeset\nfunc zoneSupportsRecords(zone dnsprovider.Zone) bool {\n    _, ok := zone.ResourceRecordSets()\n    return ok\n}\nif !zoneSupportsRecords(zone) {\n    return fmt.Errorf(\"skip zone %s: no record-set support\", zone.Name())\n}","typeGuard":"func hasRecordSets(zone dnsprovider.Zone) (dnsprovider.ResourceRecordSets, bool) {\n    return zone.ResourceRecordSets() // (interface, ok) narrowing built into the API\n}","tryCatchPattern":"cs, err := o.getChangeset(zone)\nif err != nil {\n    if strings.Contains(err.Error(), \"does not support resource records\") {\n        klog.Warningf(\"provider driver lacks record support for %s; switch --dns provider\", zone.Name())\n        return\n    }\n    return err\n}","preventionTips":["Choose a --dns provider whose driver implements ResourceRecordSets (aws-route53, google-clouddns, etc.).","Review provider driver capability docs before adopting a new backend.","Filter out zones from incapable providers via --zone/--zoneid."],"tags":["dns","dnsprovider","capability","dns-controller"],"backgroundTag":"dns-provider-unsupported-operation","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}