NRCell Status and Conditions
The spec of an NRCell is yours; its status is the controller's. This page lists what
the controller writes there and what each value means. The field-by-field schema is the
NRCell API; what to do when a cell is stuck is
Troubleshoot.
What kubectl get nrcell Shows
NAME PCI PCI-SOURCE SECTOR DU-ID NCI BAND PHASE AGE
nr-n78-b210 1 spec 0 0 0x66C000 78 ConfigGenerated 3m
| Column | Field |
|---|---|
PCI | spec.pci, which the controller fills in when you leave it out |
PCI-SOURCE | status.pciSource |
SECTOR, DU-ID, NCI | status.sectorId, status.gnbDuId, status.nci |
BAND | spec.band |
PHASE | status.phase |
Phase
status.phase | Meaning |
|---|---|
Pending | the cell had no spec.pci; the controller assigned a temporary one and the reconcile that generates the DU follows |
ConfigGenerated | the identity is resolved and the DU configuration is generated; the DU Deployment exists |
Suspended | as ConfigGenerated, with the DU Deployment rendered at 0 replicas because spec.du.suspend is true: no DU pod, by intent, until it is set back |
Error | the reconcile stopped; the conditions say why, and no DU is generated or updated; a DU that already exists keeps running its last configuration |
Identity
Assigned once, on the cell's first reconcile, and stable for the life of the cell. You never
set these; a legacy sectorId in a cell's spec is ignored.
| Field | Value |
|---|---|
sectorId | the lowest free sector id under the gNB, from 0 up to 16383; a gap left by a deleted cell is refilled before the range extends |
gnbDuId | equal to sectorId (one DU per cell) |
gnbId | the CU-wide gNB id the controller is configured with (racora-controller chart value gnbId, default 411) |
nci | the NR Cell Identity computed from gnbId and sectorId, as hex |
nciDecimal | the same value as an integer, which the CU-CP's runtime commands take |
identitySource | always controller |
Two cells declared in one apply get distinct identities: allocation is serialised in the controller.
PCI Provenance
| Field | Value |
|---|---|
pciSource | spec when you set spec.pci; controller-temp when the controller filled it from the temporary pool 1002 to 1007; controller-retuned once a CU-IP decision replaced it |
pciAssignedAt | when the controller assigned or retuned the PCI |
lastRetune | the most recent retune the controller applied: from, to, ts, the decision's reason tags and its decisionId |
Both fields are written on the first reconcile, on a temporary allocation and on a CU-IP
retune; editing spec.pci by hand later refreshes neither. A cell with
pciSource: controller-temp keeps that PCI until the Intelligence Plane runs and a PCI
decision arrives (the decision loop).
Decisions and Neighbors
| Field | Value |
|---|---|
lastApplied.<function> | per Intelligence Function (pci, anr): the ts and decisionId of the last decision applied to this cell; the controller reads it before applying the next one |
neighbors[] | the relations in effect: nrCellRef, the neighbor's nci, its reportConfigs, its source (manual for a relation declared in spec.neighbors, anr for one written by an ANR decision; ANR only ever removes relations it created) and appliedAt, kept across later applies |
Conditions
The controller writes a condition only when something needs saying: a cell that reconciles
cleanly from the start carries none. Each condition has type, status, reason,
message and lastTransitionTime. Only ConfigGenerated and ReportConfigConflict are
maintained afterwards; a cell that recovered from PCIAllocated=False or
IdentityAllocated=False keeps that condition on the object. Writing one condition keeps
the others: a ConfigGenerated=False does not remove a ReportConfigConflict. DUServed is written for every cell with an identity, from what the CU-CP serves over F1. RadioReady
and DUReady are written only for an ofh cell with an M-plane session, from its DU pod,
every 10 seconds. O1Ready and O1Config are written for every cell while O1 is on
(racora-controller.o1.enabled), from its DU's O1 datastore, every o1.checkSeconds
(O1 and the SMO Functions).
| Condition | Status | Reason | Meaning |
|---|---|---|---|
PCIAllocated | False | TempPCIPoolExhausted | the cell has no spec.pci and all six temporary PCIs (1002 to 1007) are held by other cells; phase Error |
IdentityAllocated | False | SectorIdSpaceExhausted | every sector id under the gNB is assigned; phase Error |
ConfigGenerated | False | PlmnNotServed | spec.plmn is not the network identity's PLMN (global.network.plmn); phase Error, and a Warning Event on the cell |
ConfigGenerated | False | TacNotServed | spec.tac is not one of the network identity's tracking areas; phase Error, and a Warning Event on the cell |
ConfigGenerated | False | UnsupportedRadioBackend | spec.radioBackend.ruType is one the DU generator cannot produce; phase Error. The CRD's enum rejects any value but uhd, zmq, dummy and ofh at apply time, so this is reached only when the schema and the controller disagree |
ConfigGenerated | False | InvalidRadioConfig | an ofh cell one end of the fronthaul could not take: a required key (ruMacAddr, the VLANs, the eAxC ids, txGain) set neither on the cell nor in its profile, different C- and U-plane VLANs, different IQ bit widths per direction, or a bandwidth the SCS cannot carry; phase Error, and a Warning Event on the cell |
ConfigGenerated | False | UnsupportedBand | an ofh cell on a paired (FDD) band; phase Error, and a Warning Event on the cell |
ConfigGenerated | False | RadioProfileNotFound | the ConfigMap spec.radioBackend.ofh.profileRef names does not exist in the cell's namespace; phase Error, and a Warning Event on the cell |
ConfigGenerated | False | InvalidRadioProfile | the radio profile has no profile.yaml, is not a YAML mapping, or holds keys a profile does not take (a cell's own networkInterface and duMacAddr among them); phase Error, and a Warning Event on the cell |
ConfigGenerated | True | Generated | written when a cell that carried a ConfigGenerated=False condition is corrected and its DU is generated |
RadioReady | True | Ready | an ofh cell with an M-plane session: its mplane sidecar's startup probe passed, the O-RU is supervised and every carrier is active |
RadioReady | False | Provisioning | the sidecar is running and provisioning the O-RU, including the wait for its PTP lock; the DU waits |
RadioReady | False | NotStarted | the sidecar is not running (the pod is starting, or the sidecar restarts) |
RadioReady | False | Unreachable | the fronthaul agent holds the O-RU unhealthy: no fronthaul-ready node reaches it on its NETCONF port, so the DU pod cannot schedule (Insufficient racora.io/oru), or it stopped answering under a running DU; past the controller's grace (ofhUnreachableGraceSeconds) the pod is replaced (a Warning Event RadioUnreachable says so) and the replacement schedules once the O-RU is healthy again |
RadioReady | False | NoPod | the cell's DU pod does not exist: not scheduled yet, or being replaced after its DU container restarted or its O-RU went unreachable (a Warning Event DURestarted or RadioUnreachable says so) |
DUReady | True | Running | the DU container runs ready |
DUReady | False | Waiting | the DU has not started; it starts once RadioReady is True |
DUReady | False | NoPod | no DU pod |
RadioReady, DUReady | False | Suspended | the DU is suspended (spec.du.suspend): no pod, by intent |
DUServed | True | Served | the CU-CP serves this cell's DU over F1 (its metrics stream lists the DU's gnbDuId); written for every cell once it has an identity, checked every duServedCheckSeconds |
DUServed | False | NotServed | a DU pod exists but the CU-CP does not serve it: the DU is starting, waiting for its radio, or not connecting; the cell's lock, bar and mobility intent stays pending until it is served, then is pushed at once. A DU that is ready but stays unserved for duUnservedGraceSeconds is replaced (a Warning Event DUNotServed says so) |
DUServed | False | NoPod | no DU pod |
DUServed | False | Suspended | the DU is suspended (spec.du.suspend): nothing to serve, nothing pending |
DUServed | False | CucpServesNone | the DU has been unserved for the grace while the CU-CP serves no DU of any cell (two or more cells have one): the CU-CP's F1-C listener is the fault, not this DU, so the pod is kept; the CU-CP's liveness probe restarts it once the listener is gone |
O1Ready | True | Ready | the NETCONF server in the cell's DU pod answers with the cell's datastore |
O1Ready | False | NoPod | no DU pod |
O1Ready | False | NotStarted | the DU pod's NETCONF server has not started yet |
O1Ready | False | NotReachable | the controller could not open a session to the DU pod's NETCONF server, or the server refused to answer; the message carries the error |
O1Ready | False | NotSeeded | the server answers, but not with the cell's datastore (its managed element is another name, or there is none): the seed was not loaded |
O1Ready | False | Suspended | the DU is suspended (spec.du.suspend): no element to read |
O1Config | True | InSync | the datastore holds every leaf of the cell's declared configuration (the seed the pod started from); the message counts the leaves added over O1, which are kept across pod starts |
O1Config | False | Drifted | a leaf of the declared configuration was changed or removed over O1; the change is in effect until the DU pod starts again, which returns the declared value. The message names the leaves; a Warning Event O1ConfigDrifted is posted when the cell drifts. A Warning Event O1AdditionsNotRestored says when the leaves added over O1 could not be merged back into a new pod's datastore |
O1Ready, O1Config | False | Disabled | O1 was turned off for the DUs; written only on a cell that carried the conditions |
ReportConfigConflict | True | DuplicateReportCfgId | another cell already defines one of this cell's mobility.reportConfigs ids differently; the lexicographically first definition is in effect |
ReportConfigConflict | False | Resolved | the conflict this cell carried is gone |
The Events the controller posts for an identity mismatch are visible with
kubectl -n racora-system describe nrcell <name>.