Skip to main content

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
ColumnField
PCIspec.pci, which the controller fills in when you leave it out
PCI-SOURCEstatus.pciSource
SECTOR, DU-ID, NCIstatus.sectorId, status.gnbDuId, status.nci
BANDspec.band
PHASEstatus.phase

Phase​

status.phaseMeaning
Pendingthe cell had no spec.pci; the controller assigned a temporary one and the reconcile that generates the DU follows
ConfigGeneratedthe identity is resolved and the DU configuration is generated; the DU Deployment exists
Suspendedas 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
Errorthe 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.

FieldValue
sectorIdthe 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
gnbDuIdequal to sectorId (one DU per cell)
gnbIdthe CU-wide gNB id the controller is configured with (racora-controller chart value gnbId, default 411)
ncithe NR Cell Identity computed from gnbId and sectorId, as hex
nciDecimalthe same value as an integer, which the CU-CP's runtime commands take
identitySourcealways controller

Two cells declared in one apply get distinct identities: allocation is serialised in the controller.

PCI Provenance​

FieldValue
pciSourcespec 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
pciAssignedAtwhen the controller assigned or retuned the PCI
lastRetunethe 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​

FieldValue
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).

ConditionStatusReasonMeaning
PCIAllocatedFalseTempPCIPoolExhaustedthe cell has no spec.pci and all six temporary PCIs (1002 to 1007) are held by other cells; phase Error
IdentityAllocatedFalseSectorIdSpaceExhaustedevery sector id under the gNB is assigned; phase Error
ConfigGeneratedFalsePlmnNotServedspec.plmn is not the network identity's PLMN (global.network.plmn); phase Error, and a Warning Event on the cell
ConfigGeneratedFalseTacNotServedspec.tac is not one of the network identity's tracking areas; phase Error, and a Warning Event on the cell
ConfigGeneratedFalseUnsupportedRadioBackendspec.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
ConfigGeneratedFalseInvalidRadioConfigan 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
ConfigGeneratedFalseUnsupportedBandan ofh cell on a paired (FDD) band; phase Error, and a Warning Event on the cell
ConfigGeneratedFalseRadioProfileNotFoundthe ConfigMap spec.radioBackend.ofh.profileRef names does not exist in the cell's namespace; phase Error, and a Warning Event on the cell
ConfigGeneratedFalseInvalidRadioProfilethe 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
ConfigGeneratedTrueGeneratedwritten when a cell that carried a ConfigGenerated=False condition is corrected and its DU is generated
RadioReadyTrueReadyan ofh cell with an M-plane session: its mplane sidecar's startup probe passed, the O-RU is supervised and every carrier is active
RadioReadyFalseProvisioningthe sidecar is running and provisioning the O-RU, including the wait for its PTP lock; the DU waits
RadioReadyFalseNotStartedthe sidecar is not running (the pod is starting, or the sidecar restarts)
RadioReadyFalseUnreachablethe 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
RadioReadyFalseNoPodthe 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)
DUReadyTrueRunningthe DU container runs ready
DUReadyFalseWaitingthe DU has not started; it starts once RadioReady is True
DUReadyFalseNoPodno DU pod
RadioReady, DUReadyFalseSuspendedthe DU is suspended (spec.du.suspend): no pod, by intent
DUServedTrueServedthe 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
DUServedFalseNotServeda 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)
DUServedFalseNoPodno DU pod
DUServedFalseSuspendedthe DU is suspended (spec.du.suspend): nothing to serve, nothing pending
DUServedFalseCucpServesNonethe 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
O1ReadyTrueReadythe NETCONF server in the cell's DU pod answers with the cell's datastore
O1ReadyFalseNoPodno DU pod
O1ReadyFalseNotStartedthe DU pod's NETCONF server has not started yet
O1ReadyFalseNotReachablethe controller could not open a session to the DU pod's NETCONF server, or the server refused to answer; the message carries the error
O1ReadyFalseNotSeededthe server answers, but not with the cell's datastore (its managed element is another name, or there is none): the seed was not loaded
O1ReadyFalseSuspendedthe DU is suspended (spec.du.suspend): no element to read
O1ConfigTrueInSyncthe 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
O1ConfigFalseDrifteda 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, O1ConfigFalseDisabledO1 was turned off for the DUs; written only on a cell that carried the conditions
ReportConfigConflictTrueDuplicateReportCfgIdanother cell already defines one of this cell's mobility.reportConfigs ids differently; the lexicographically first definition is in effect
ReportConfigConflictFalseResolvedthe 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>.