Summary
get_servers_api() parses /cucm-uds/servers backwards relative to what Cisco documents. It looks for hostName, ipv4Address, ipv6Address and serverType child elements first, and treats plain text inside <server> as a fallback for "newer UDS (15.x+)".
Both halves of that framing are wrong:
1. The plain-text shape is the only shape Cisco documents, and it is documented from 10.0(1) onward — not a 15.x novelty. From System Resources, byte-identical in the current and the legacy CUCM 10.x reference:
<servers version="{version}" uri="https://{host}:8443/cucm-uds/servers">
<server>{host}</server>
<server>{host1}</server>
<server>{host2}</server>
</servers>
2. hostName, ipv4Address, ipv6Address and serverType are not UDS element names at all. All four grep to zero matches across every UDS doc page. That vocabulary belongs to AXL (getCallManager / listProcessNode) and the Platform/Serviceability APIs. If they were copied from a capture, it was a capture of a different API.
Impact
Functionally this is benign today — the plain-text fallback catches the documented shape, so the parser works. The cost is in the wrong places: the misleading comment will send the next reader looking for a version check that should not exist, and serverType is threaded through --servers output and the uds_servers table as a column that can never be populated. Anyone reading the DB schema will reasonably assume Publisher/Subscriber roles are being captured when they are not. UDS does not expose server role; that requires AXL.
Fix
- Invert the parse: read
<server> text content first, fall back to child-element lookup only if the text is empty. That handles the documented shape and any undocumented drift with no version branching.
- Correct the comment. Suggested wording:
UDS documents <server> as plain-text hostname (10.0(1)+); the child-element branch is defensive only and matches no documented release.
- Decide what to do about
serverType / ipv4Address — either drop them, or keep the columns and document that they are nullable and only ever filled by a hypothetical non-standard response.
Coverage caveat
Cisco's UDS "New and Changed Information" changelog stops at 12.5(1); there are no 14 or 15 sections anywhere in the docs. So "unchanged through 15" is unverified rather than confirmed — the changelog appears abandoned, not stable. The text-first-then-children approach above is what makes that uncertainty harmless. A live capture against a 14 or 15 cluster is the only way to settle the actual shape, and would be worth doing on the next engagement that has one in scope.
Summary
get_servers_api()parses/cucm-uds/serversbackwards relative to what Cisco documents. It looks forhostName,ipv4Address,ipv6AddressandserverTypechild elements first, and treats plain text inside<server>as a fallback for "newer UDS (15.x+)".Both halves of that framing are wrong:
1. The plain-text shape is the only shape Cisco documents, and it is documented from 10.0(1) onward — not a 15.x novelty. From System Resources, byte-identical in the current and the legacy CUCM 10.x reference:
2.
hostName,ipv4Address,ipv6AddressandserverTypeare not UDS element names at all. All four grep to zero matches across every UDS doc page. That vocabulary belongs to AXL (getCallManager/listProcessNode) and the Platform/Serviceability APIs. If they were copied from a capture, it was a capture of a different API.Impact
Functionally this is benign today — the plain-text fallback catches the documented shape, so the parser works. The cost is in the wrong places: the misleading comment will send the next reader looking for a version check that should not exist, and
serverTypeis threaded through--serversoutput and theuds_serverstable as a column that can never be populated. Anyone reading the DB schema will reasonably assume Publisher/Subscriber roles are being captured when they are not. UDS does not expose server role; that requires AXL.Fix
<server>text content first, fall back to child-element lookup only if the text is empty. That handles the documented shape and any undocumented drift with no version branching.UDS documents <server> as plain-text hostname (10.0(1)+); the child-element branch is defensive only and matches no documented release.serverType/ipv4Address— either drop them, or keep the columns and document that they are nullable and only ever filled by a hypothetical non-standard response.Coverage caveat
Cisco's UDS "New and Changed Information" changelog stops at 12.5(1); there are no 14 or 15 sections anywhere in the docs. So "unchanged through 15" is unverified rather than confirmed — the changelog appears abandoned, not stable. The text-first-then-children approach above is what makes that uncertainty harmless. A live capture against a 14 or 15 cluster is the only way to settle the actual shape, and would be worth doing on the next engagement that has one in scope.