11 min read

How to Prove A/B Power Redundancy in Practice

Use rack, feed, panel, and device power records to prove A/B redundancy: the commands, the failure domain counts, the common false positives, and a worked example.

ByAndré Ribeiro· Founder, Obelinf
How to Prove A/B Power Redundancy in Practice
How to Prove A/B Power Redundancy in Practice · October 26, 2026
On this page

Two power cords are a design intent, not a proof. The intent becomes real only when each cord reaches a different feed, each feed comes from a different panel, and each panel is supplied by a different upstream source. Any shared link in that chain collapses the two paths into one failure domain, and the server keeps running on two power supplies that both depend on the same breaker.

The proof is a records exercise before it is a drill. You need the rack summary, the device power summary, the feed connections, and the upstream source links for each panel. Obelinf exposes all four, and the interesting part is not the happy path. It is the false positive that appears when two panels have no documented source link, or the degraded result that appears when two panels share a UPS. This procedure runs the checks, interprets the output, and tells you what to fix before you schedule a live test.

Two independent power paths from sources through panels and feeds to two device inlets TWO PATHS, TWO FAILURE DOMAINS UPS A source domain A UPS B source domain B Panel A3 breaker 42 Panel B3 breaker 42 web-prod-01 inlet A inlet B two supplies, two paths The proof is not the second cord. It is the separation between source, panel, breaker, and feed on each side.

What A/B redundancy actually requires

A/B redundancy starts with two independent sources and ends with two independent device inlets. The full condition is stricter than most rack diagrams suggest:

  • Each side has its own upstream source, or a source path that does not share a single point of failure.
  • Each side has its own panel and breaker.
  • Each side has its own feed, with a documented breaker position.
  • Each feed lands on a different device inlet.
  • Each side can carry the full rack load during the failure of the other.

The last condition is the one that changes the budget. If each feed can deliver 5 kW, the rack budget is 5 kW, not 10 kW. The A and B capacities are not additive. They are two attempts at the same requirement, and the requirement is that either one survives alone.

The model uses failure domains to represent this. Two feeds on the same panel are one domain. Two panels fed by the same source are one domain. Two panels with no documented source are treated as separate panel domains, which is useful for inventory but dangerous for redundancy claims. That is why the proof has to include the source links, not just the device summary.

Start with the rack summary

Find the rack ID first, then read the rack power summary. The summary returns the rack load, the feed capacity, the redundant capacity, the panel count, the failure domain count, and the individual feeds with their breaker positions and loads.

export OBELINF_API_KEY="your_read_write_key"
export OBELINF_ORG="acme-netops"
export API="https://api.obelinf.com/${OBELINF_ORG}"

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/racks?q=R07" \
  | jq -r '.racks[] | [.id, .name, .site_name] | @tsv'

Save the returned id as RACK_ID.

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/power/summary/rack/${RACK_ID}" \
  | jq '{
      rack_name,
      load_w,
      device_count,
      feed_capacity_w,
      redundant_capacity_w,
      redundancy,
      panel_count,
      failure_domain_count,
      utilization_pct,
      feeds: [.feeds[] | {
        id,
        name,
        panel_id,
        panel_name,
        breaker_position,
        role,
        capacity_w,
        load_w
      }]
    }'

Read four values before anything else. panel_count tells you whether the feeds reach more than one panel. failure_domain_count tells you whether those panels resolve to distinct upstream sources. redundancy is n+1 when more than one domain exists and none otherwise. redundant_capacity_w is the capacity that remains after the largest failure domain is removed, which is the number to compare with the rack load.

Do not use feed_capacity_w as the rack budget. It is the sum of the active feeds, and in an A/B rack that sum includes both sides. The useful budget is redundant_capacity_w, because it survives the loss of the largest domain. If the rack load is above that value, the surviving side cannot carry the rack after a failure.

Read each feed against its capacity

The feed list inside the rack summary is the evidence for each side. Pull the name, panel ID and name, breaker position, role, capacity, and load into a fixed shape so two racks can be compared without rereading the JSON.

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/power/summary/rack/${RACK_ID}" \
  | jq -r '.feeds[]
      | [.name,
         .role,
         .panel_id,
         .panel_name,
         (.breaker_position // "NO BREAKER"),
         (.capacity_w // 0),
         (.load_w // 0),
         (if .capacity_w then ((.load_w / .capacity_w) * 100 | floor) else "unrated" end)]
      | @tsv'

A healthy A/B rack shows two rows with different panels and breaker positions, both with a capacity above the rack load. A row with NO BREAKER is a documentation gap. A row with the same panel as its partner is a shared failure domain. A row with no capacity is a feed whose voltage or amperage is missing, which means the capacity calculation cannot protect you.

The feed load is a routing view, not the rack budget. It can be calculated from the connected device inlet or, when no cable endpoint exists, from the rack devices. That fallback is useful for a quick estimate, but it means feed loads should not be added together to prove redundancy. Use the rack load and the redundant capacity for the final number, and use the feed rows to prove that the paths are separate.

Read the device power summary

The rack summary proves the rack has two paths. The device summary proves the device is actually attached to both. List the devices in the rack, then read the power summary for each dual corded device.

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/devices?rack_id=${RACK_ID}&limit=100" \
  | jq -r '.devices[] | [.id, .name] | @tsv'

Save the device id as DEVICE_ID. Then read the power summary for that device.

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/power/devices/${DEVICE_ID}/power" \
  | jq '{
      device_name,
      redundancy,
      feed_count,
      panel_count,
      failure_domain_count,
      inlets: [.inlets[] | {
        name,
        connected_to,
        upstream_feed
      }]
    }'

The summary returns one of four redundancy values. unconnected means there are no inlets. single means one inlet, which is a single path no matter how many power supplies the chassis has. degraded means more than one inlet but not enough separation in the panels or failure domains. redundant means more than one inlet, more than one panel, and more than one documented failure domain.

The inlet rows are the part to keep. Each inlet shows the connected endpoint and the upstream feed, including the panel and feed role. If inlet A and inlet B both point to feeds on the same panel, the device is degraded. If they point to different panels that both resolve to the same source, the device is also degraded. If one inlet has no connection, the second path is not real yet.

Check the panels upstream

The device summary depends on the source links attached to each panel. Read the panel detail for every panel in the rack and confirm that it has at least one active source link. Use each panel_id from the rack summary as PANEL_ID. A panel with no source link is a panel with an unknown upstream path, even if it looks separate on the rack diagram.

curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/power/panels/${PANEL_ID}" \
  | jq '{
      panel: .power_panel.name,
      source_links: [.source_links[] | {
        upstream_source_name,
        role,
        is_active,
        priority
      }]
    }'
curl --fail --silent --show-error \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  "${API}/power/panels/${PANEL_ID}" \
  | jq -e '.source_links | length > 0' >/dev/null \
  || echo "${PANEL_ID} has no documented upstream source"

A panel with two active source links is not automatically redundant. The two links may point to the same source through different paths, or to sources that share an upstream ATS. The link list is evidence, not a guarantee. Read the source names and compare them with the actual design before you accept the result.

Four questions in an A/B redundancy proof and the record that answers each one EVIDENCE FOR EACH CLAIM Claim under test Record Pass condition Two paths reach the rack rack feeds different panel ids The paths are independent panel source links different sources The device uses both device inlets two connected inlets One side can carry the load rack summary load below redundant capacity A pass on all four rows is the evidence. A pass on only the first row is a drawing, not redundancy.

A worked example

The rack summary can look healthy while the device summary tells a different story. The table below uses the same rack and three devices to show how the values change.

CaseRack valuesDevice resultWhat to fix
Two independent panels2 panels, 2 failure domains, 4,992 W redundant capacity, 3,120 W load2 inlets, 2 panels, 2 domains, redundantNothing, but verify source independence and breaker positions
Two feeds on one panel1 panel, 1 failure domain, 4,992 W capacity2 inlets, 1 panel, 1 domain, degradedMove one feed to a different panel and source
Two panels, one source2 panels, 1 failure domain, 4,992 W capacity2 inlets, 2 panels, 1 domain, degradedSeparate the upstream source or document the shared path
Two panels, no source links2 panels, 2 failure domains, capacity looks plausible2 inlets, 2 panels, 2 domains, redundantDocument the source links before trusting the result

The first case is the one you want, but it still needs two checks that the counts cannot make. Confirm the sources are truly independent upstream, not two names on the same ATS. Confirm the breaker positions are different and match the panel schedule. The model can prove that distinct records exist; it cannot prove that the electrician wired them the way the records claim.

The last case is the false positive to watch for. Two unlinked panels are treated as separate panel domains, so the device summary can say redundant even when the upstream path is unknown. That does not make the data useless. It tells you which panels still need source links, and it prevents the summary from being worse than the documentation.

Test one side with a failure simulation

A simulation is a useful preflight before a real drill because it tests the model against the load. Pick the feed or source on one side, save its ID from the rack summary as FEED_A_ID, simulate its failure, and compare the affected devices and lost load with the device you expected to survive.

curl --fail --silent --show-error -X POST \
  -H "Authorization: Bearer ${OBELINF_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "{\"node_type\":\"feed\",\"node_id\":\"${FEED_A_ID}\"}" \
  "${API}/power/simulate" \
  | jq '{
      node_type,
      affected_feed_count,
      affected_devices: [.affected_devices[].name],
      affected_racks: [.affected_racks[].name],
      lost_load_w
    }'

The simulation uses the documented connections and source links. If a cable is missing, or a second inlet is unconnected, the result will be better than reality. Treat a clean simulation as a reason to verify the records, not as a reason to skip the physical check. A controlled drill that opens one breaker is still the only way to prove the wiring behaves as documented.

The A/B proof checklist

Use this list before you call a rack redundant:

  • The rack has two active feeds with different panel IDs.
  • Each feed has a breaker position and a rating that matches the panel schedule.
  • Each panel has at least one active source link, and the sources are independent.
  • Each feed has a real connected endpoint or a documented rack assignment.
  • The dual corded device has two connected inlets, one on each feed.
  • The rack load is below the redundant capacity, not the sum of both feeds.
  • The simulation of one side leaves the intended devices running.
  • The physical inspection matches the model, including breaker labels and outlet assignments.
Three proof levels for A/B redundancy: records, simulation, and physical drill THREE LEVELS OF PROOF Records Different panels, different sources, two connected inlets, load below capacity. model agrees Simulation One side fails, the intended devices stay up, the lost load matches the plan. model predicts Physical drill Open one breaker, observe the device, restore, and record the result. wiring agrees Records and simulation narrow the risk. The drill is the only step that proves the physical path.

Keep the proof current

A/B redundancy is a property of the current wiring, not a property of the original design. A server is replaced, a feed is moved, a panel is re fed, and the model still says redundant because nobody updated the connection. Put the proof on the same cadence as the power audit: quarterly for stable racks, before every deployment that adds a dual corded device, and after any breaker or panel change.

The review is short when the records are current. Read the rack summary, read the device summary, check the panel source links, and run the simulation for one side. If all four agree, the rack is documented. If they disagree, the disagreement is the worklist.

Start with one rack that matters and run the four commands in this article. The uncomfortable result is usually a device that everyone believed was redundant and a record that says otherwise. Finding that on a Tuesday afternoon is much cheaper than finding it during the first real power failure.

Obelinf provides the rack summary, device power summary, feed detail, and failure simulation as separate views of the same records, so the proof is a query rather than a reconstruction. That is the practical difference between having a redundancy design and being able to show it.

Frequently Asked Questions

What does A/B power redundancy actually require?
It requires two independent power paths into the same rack or device, each capable of carrying the full load on its own. Independence has to hold at the source, the panel, the breaker, the feed, and the physical cable path. Two cords on the same PDU, the same panel, or two panels fed by the same UPS are not redundant.
Why does a device with two power supplies still show degraded redundancy?
The second power supply only helps if its cord reaches a different failure domain. If both inlets land on the same panel, or on two panels fed by the same upstream source, the device has two power supplies but one failure domain. The device power summary reports that as degraded rather than redundant.
What does failure_domain_count mean in Obelinf?
It is the number of distinct documented upstream sources for the panels that feed the device. Panels with one active source link map to that source. Panels with no source link, or with more than one source link, map to the panel itself. A count above one is evidence of separation, but you still have to verify that the sources are actually independent.
Can two panels with no source links look redundant?
Yes. A panel with no documented source link is treated as its own failure domain, so two unlinked panels can produce a failure_domain_count of two and a device summary of redundant. That is a documentation false positive, not proof of A/B power. Verify that each panel has at least one source link before trusting the result.
Should I use feed_capacity_w as the rack power budget?
No. Feed capacity is the sum of the active feeds and can double count the A and B sides. With A/B power, each feed must carry the full rack load, so the practical budget is the redundant capacity, which is the total capacity minus the largest failure domain. Feed capacity is useful for seeing the paths, not for adding them together.
How do I test A/B redundancy before a real outage?
Simulate the failure of one feed, panel, or source and review the affected devices, racks, and lost load. Then compare that result with the physical path: one inlet on each side, separate panels, separate sources, and a breaker position for each feed. A simulation proves the model, not the wiring, so a physical check or a controlled drill is still required.

Stop reaching for a spreadsheet

Obelinf keeps every subnet, device, circuit, and rack in one live source of truth, with audit logs and a topology view. Free for personal use.

Related Articles