Skip to content

An HTTPProxy reports success while one hostname's DNS record is refused #537

Closed

Description

@vvoytovych

Summary

An HTTPProxy reports HostnamesVerified=True, "All hostnames have been accepted and programmed", while the DNS record for one of its hostnames was refused. That hostname's own status says DNSRecordProgrammed=False.

Our API documentation promises that a hostname which is not programmed is named in that message, with the reason.

Evidence

The condition is decided from the downstream Gateway's listener Accepted conditions and nothing else, so "programmed" means the listener was accepted. The deprecated status.hostnames list comes from the same set.

The DNS result is built after the condition is written and goes only into the per-hostname statuses. A refused record gives the hostname DNSRecordProgrammed=False with the refusal.

To reproduce, use a zone whose Domain is an apex, so the proxy writes ALIAS records. Create a CNAME record set at one name, and attach that name and one other to an HTTPProxy. PowerDNS refuses the proxy's ALIAS beside the CNAME.

datumctl get httpproxy <name> --project <project> -n <namespace> -o json \
  | jq '{verified: [.status.conditions[] | select(.type == "HostnamesVerified") | {status, message}],
         dns: [.status.hostnameStatuses[] | {hostname, dns: [.conditions[] | select(.type == "DNSRecordProgrammed") | .status]}]}'

verified reads True and names no hostname. The refused hostname's entry reads False.

Acceptance criteria

  • An HTTPProxy with a hostname whose DNS record is not programmed reports HostnamesVerified other than True.
  • The condition message names that hostname and why its DNS record is not programmed.
  • An HTTPProxy whose DNS records are all programmed still reports HostnamesVerified=True.

Related

Activity

  1. vvoytovych commented on Oct 19, 2026

    @vvoytovych
    ContributorAuthor

    Fixed in v0.32.30 by #657, which production has run since 2026-10-18.

    What an HTTPProxy shows now:

    • It carries DNSRecordsProgrammed, as its Gateway does. A refused or conflicting DNS record reads False with reason PartialFailure, and the hostname's own status says why.
    • A hostname that waits for its DNS zone or domain to be set up reads False with reason Pending, not as a failure.
    • A Gateway with no hostname left for Datum-managed DNS carries no condition, so its HTTPProxies carry none.

    HostnamesVerified keeps its meaning: whether each hostname is owned and accepted. So this took a different route than the criteria above name. DNS has a condition of its own.

    On production, before and after the roll:

    Before After
    Gateways with DNSRecordsProgrammed False 23 8
    HTTPProxies that carry DNSRecordsProgrammed 0 45 (37 True, 8 False)

    The 8 Gateways that stay False each have a hostname whose record was refused or that waits on the customer. A wait on Datum would read Pending. The other 15 had no hostname left for Datum-managed DNS and dropped a condition left from an earlier state.

    The API documentation and the True message that this issue quoted are corrected in #665.

    #650 first carried the condition and was reverted by #655, because a new hostname showed a false failure while its zone settled. #657 carries it again and reports that wait as pending.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions