NRCell (racora.io/v1alpha1)
Generated at build time from
charts/racora-crds/files/nrcell-crd.yaml, the single source of the NRCell schema; edit the source, not this page.
An NRCell is the operator surface of a Racora cell: you declare the radio-facing
fields under spec, the controller assigns the cell's identity and reports what it
did under status. Every field's description below is the schema's own
(kubectl explain nrcell.spec shows the same text on a cluster). The one
example cell is what a first declaration looks like; real-radio
declarations, written out in YAML, are in Deploy Cells and
Connect a Radio.
racora.io/v1alpha1
Resource Types:
NRCell
| Name | Type | Description | Required |
|---|---|---|---|
| apiVersion | string | racora.io/v1alpha1 | true |
| kind | string | NRCell | true |
| metadata | object | Refer to the Kubernetes API documentation for the fields of the `metadata` field. | true |
| spec | object |
|
false |
| status | object |
|
false |
NRCell.spec
| Name | Type | Description | Required |
|---|---|---|---|
| band | integer |
NR operating band number (OCUDU cell_cfg.band), e.g. 3 (FDD) or 78 (TDD) |
true |
| channelBandwidthMHz | integer |
Channel bandwidth in MHz (OCUDU cell_cfg.channel_bandwidth_MHz) Enum: 5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80, 90, 100 |
true |
| commonScs | integer |
Subcarrier spacing in kHz Enum: 15, 30, 60, 120 |
true |
| dlArfcn | integer |
Downlink ARFCN of the carrier centre (OCUDU cell_cfg.dl_arfcn); the uplink follows the band's duplex spacing |
true |
| plmn | string |
PLMN identity (MCC+MNC) |
true |
| tac | integer |
Tracking Area Code the cell broadcasts (OCUDU cell_cfg.tac); the core must serve it |
true |
| adminState | enum |
Administrative intent for the cell at the CU-CP. Locked = the cell is gracefully stopped (bar, UE release, deactivate) and kept dormant across DU restarts until set back to Unlocked. Applied live over the CU-CP runtime commands and recorded in the boot overlay's logical_cells whitelist. While Locked, the controller also withholds its post-decision reactivation unlock. Enum: Unlocked, Locked Default: Unlocked |
false |
| azimuthDeg | number |
Boresight azimuth in degrees (0 = north, 90 = east, clockwise); read by CU-IP with position |
false |
| cellBarred | boolean |
Intended MIB cellBarred state: the cell stays on air but UEs may not camp on it. Tracked independently of adminState by the CU-CP. Default: false |
false |
| duAssignment | object |
Placement of this cell's DU pod. A uhd backend always requires a racora.io/rf-ready node; this narrows it further. |
false |
| mechanicalTiltDeg | number |
Mechanical antenna downtilt in degrees. Reserved for CU-IP; no component reads it today Default: 8 |
false |
| mobility | object |
This cell's contribution to the CU-wide mobility configuration. reportConfigs are unioned by reportCfgId across all cells (define each id once, on one cell, or identically on all — differing definitions of the same id resolve to the lexicographically-first cell name and raise a ReportConfigConflict condition on the others). Controller defaults for ids 1 (periodical) and 2 (A3) remain unless overridden here and are never removable. Field names mirror the OCUDU cu_cp.mobility report_configs keys (camelCase); the controller applies changes to the running CU-CP over the runtime command surface and bakes them into the boot overlay. |
false |
| neighbors | []object |
Directional neighbor relations from this cell (declare the reverse relation on the other cell). Pushed live to the running CU-CP and baked into its boot overlay; the applied state, with provenance, is mirrored under status.neighbors. |
false |
| pci | integer |
Physical Cell ID visible to UEs. Optional — when absent, the
controller assigns the next available PCI from the temp pool
(1002-1007) and the auto-retune workflow replaces it with a
non-temp PCI as soon as the cell appears in the substrate
graph and CU-IP emits a RANN-D decision. See
status.pciSource for assignment provenance.
Minimum: 0 Maximum: 1007 |
false |
| pdcch | object |
Passed through verbatim as OCUDU cell_cfg.pdcch — any key the pinned gNB image accepts; not validated by the API server |
false |
| pdsch | object |
Passed through verbatim as OCUDU cell_cfg.pdsch (see pdcch) |
false |
| periodicReportCfgId | integer |
Report config id for this cell's serving-cell periodical measurement report (OCUDU periodic_report_cfg_id). Must reference a periodical config; the controller default id 1 reports every 1024 ms. Default: 1 |
false |
| position | object |
Antenna position in a local Cartesian frame (metres). Read by CU-IP's NRCell watcher for the substrate graph geometry, never by the gNB. |
false |
| prach | object |
Passed through verbatim as OCUDU cell_cfg.prach (see pdcch) |
false |
| pusch | object |
Passed through verbatim as OCUDU cell_cfg.pusch (see pdcch) |
false |
| radioBackend | object |
The radio the DU drives and its parameters. ruType selects the backend; only the matching sub-object is read. |
false |
NRCell.spec.duAssignment
Placement of this cell's DU pod. A uhd backend always requires a racora.io/rf-ready node; this narrows it further.
| Name | Type | Description | Required |
|---|---|---|---|
| nodeName | string |
Pin this cell's DU to a specific Kubernetes node (by hostname), for a multi-node cluster where the cell's radio is on a particular box. Merged with the rf-ready nodeSelector via the scheduler (not a raw pod nodeName bind), so the node must still be rf-ready with a free radio. Omit to let the scheduler place it on any eligible node. |
false |
NRCell.spec.mobility
This cell's contribution to the CU-wide mobility configuration. reportConfigs are unioned by reportCfgId across all cells (define each id once, on one cell, or identically on all — differing definitions of the same id resolve to the lexicographically-first cell name and raise a ReportConfigConflict condition on the others). Controller defaults for ids 1 (periodical) and 2 (A3) remain unless overridden here and are never removable. Field names mirror the OCUDU cu_cp.mobility report_configs keys (camelCase); the controller applies changes to the running CU-CP over the runtime command surface and bakes them into the boot overlay.
| Name | Type | Description | Required |
|---|---|---|---|
| reportConfigs | []object |
Measurement report configurations this cell contributes to the CU-wide set (see mobility) |
false |
NRCell.spec.mobility.reportConfigs[index]
| Name | Type | Description | Required |
|---|---|---|---|
| reportCfgId | integer |
Identifier of this report configuration, referenced from neighbors[].reportConfigs and periodicReportCfgId Minimum: 1 Maximum: 63 |
true |
| reportType | enum |
periodical: serving-cell reports every reportIntervalMs. event_triggered: a 3GPP A-event evaluated on a neighbor relation. cond_trigger: a conditional-handover trigger (eventTriggeredReportType d1, d2 or t1; no report interval). Enum: periodical, event_triggered, cond_trigger |
true |
| eventTriggeredReportType | enum |
The RRC event (3GPP TS 38.331) for event_triggered and cond_trigger configs. a1-a6 are the measurement events; a3 (neighbor better than serving by measTriggerQuantityOffsetDb) is the handover default. d1/d2 (distance-based) and t1 (time-based) are accepted only with reportType cond_trigger. Enum: a1, a2, a3, a4, a5, a6, d1, d2, t1 |
false |
| hysteresisDb | integer |
Hysteresis in dB applied to the event condition (OCUDU hysteresis_db) Minimum: 0 Maximum: 15 |
false |
| measTriggerQuantity | enum |
Quantity the event evaluates (OCUDU meas_trigger_quantity) Enum: rsrp, rsrq, sinr |
false |
| measTriggerQuantityOffsetDb | integer |
Offset in dB for events A3/A6 — how much better the neighbor must measure (OCUDU meas_trigger_quantity_offset_db) Minimum: -15 Maximum: 15 |
false |
| measTriggerQuantityThreshold2Db | integer |
Second threshold in dB for event A5 (OCUDU meas_trigger_quantity_threshold_2_db) |
false |
| measTriggerQuantityThresholdDb | integer |
Threshold in dB for events A1/A2/A4/A5 (OCUDU meas_trigger_quantity_threshold_db) |
false |
| periodicHoRsrpOffsetDb | integer |
RSRP offset for triggering a handover from periodical reports, in field units of 0.5 dB; -1 disables handover from periodical measurements (OCUDU periodic_ho_rsrp_offset_db). Minimum: -1 Maximum: 30 |
false |
| reportIntervalMs | integer |
Interval between reports once triggered (OCUDU report_interval_ms); mandatory for periodical and event_triggered configs Enum: 120, 240, 480, 640, 1024, 2048, 5120, 10240, 20480, 40960, 60000, 360000, 720000, 1800000 |
false |
| t312 | integer |
T312 in ms: started by the UE on an event-triggered report while T310 (out-of-sync) is running; on expiry the UE declares radio-link failure to re-establish on another cell sooner (OCUDU t312). Enum: 0, 50, 100, 200, 300, 400, 500, 1000 |
false |
| timeToTriggerMs | integer |
How long the condition must hold before the UE reports (OCUDU time_to_trigger_ms) Enum: 0, 40, 64, 80, 100, 128, 160, 256, 320, 480, 512, 640, 1024, 1280, 2560, 5120 |
false |
NRCell.spec.neighbors[index]
| Name | Type | Description | Required |
|---|---|---|---|
| nrCellRef | string |
Name of the neighbor NRCell (same namespace) |
true |
| reportConfigs | []integer |
Report config ids attached to this relation. Must reference event-triggered configs — the CU-CP rejects periodical configs on neighbor relations. Default: [2] |
false |
NRCell.spec.position
Antenna position in a local Cartesian frame (metres). Read by CU-IP's NRCell watcher for the substrate graph geometry, never by the gNB.
| Name | Type | Description | Required |
|---|---|---|---|
| heightM | number |
Antenna height above ground in meters |
false |
| xCoord | number |
East coordinate in meters (local Cartesian) |
false |
| yCoord | number |
North coordinate in meters (local Cartesian) |
false |
NRCell.spec.radioBackend
The radio the DU drives and its parameters. ruType selects the backend; only the matching sub-object is read.
| Name | Type | Description | Required |
|---|---|---|---|
| dummyProcessingDelay | integer |
For ruType dummy — the dummy RU's downlink processing delay in slots (OCUDU ru_dummy.dl_processing_delay) Default: 1 |
false |
| ruType | enum |
Radio backend: zmq | dummy (virtual) | uhd (USRP); other backends are not accepted Enum: zmq, dummy, uhd Default: dummy |
false |
| uhd | object |
Parameters for ruType uhd — a USRP over UHD (OCUDU ru_sdr with device_driver uhd) |
false |
| zmq | object |
Parameters for ruType zmq — a virtual radio exchanging IQ samples over ZeroMQ with a UE simulator (OCUDU ru_sdr with device_driver zmq). The controller exposes the DU's port 2000 as a Service. |
false |
NRCell.spec.radioBackend.uhd
Parameters for ruType uhd — a USRP over UHD (OCUDU ru_sdr with device_driver uhd)
| Name | Type | Description | Required |
|---|---|---|---|
| clockSource | enum |
Clock source (internal for single cell, gpsdo for sync) Enum: internal, external, gpsdo Default: internal |
false |
| deviceArgs | string |
UHD device args (e.g., type=b200,serial=3591266) Default: type=b200 |
false |
| otwFormat | string |
UHD over-the-wire sample format (sc12 halves USB bandwidth on a B210; sc16 is UHD's default) Default: sc12 |
false |
| rxGain | integer |
RX gain in dB (0-76) Default: 75 |
false |
| srate | number |
Sample rate in MHz Default: 23.04 |
false |
| syncSource | enum |
TIME synchronization source (OCUDU ru_sdr `sync`). Defaults to clockSource when that is gpsdo/external. Frame-time alignment across cells (required for connected-mode neighbor measurement and A3 handover) needs a time-capable source with lock on every cell — a disciplined clock alone does not align frames. Enum: internal, external, gpsdo |
false |
| txGain | integer |
TX gain in dB (0-89) Default: 75 |
false |
NRCell.spec.radioBackend.zmq
Parameters for ruType zmq — a virtual radio exchanging IQ samples over ZeroMQ with a UE simulator (OCUDU ru_sdr with device_driver zmq). The controller exposes the DU's port 2000 as a Service.
| Name | Type | Description | Required |
|---|---|---|---|
| baseSrate | string |
Base sample rate in Hz, as a string (device_args base_srate); must match the UE simulator's Default: 23.04e6 |
false |
| rxGain | integer |
RX gain in dB (ru_sdr.rx_gain) Default: 75 |
false |
| rxPort | string |
ZMQ endpoint the DU receives samples from (device_args rx_port); default tcp://srsue. |
false |
| srate | number |
Sample rate in MHz (OCUDU ru_sdr.srate) Default: 23.04 |
false |
| txGain | integer |
TX gain in dB (ru_sdr.tx_gain); no physical effect on a virtual radio Default: 75 |
false |
| txPort | string |
ZMQ endpoint the DU transmits samples on (device_args tx_port); default tcp://0.0.0.0:2000 |
false |
NRCell.status
| Name | Type | Description | Required |
|---|---|---|---|
| conditions | []object |
Kubernetes-style conditions the controller sets: IdentityAllocated (False: SectorIdSpaceExhausted), PCIAllocated (False: TempPCIPoolExhausted), ConfigGenerated (False: UnsupportedRadioBackend, PlmnNotServed or TacNotServed — the cell's plmn/tac are not in the network identity the core serves and the CU-CP advertises; True: Generated once corrected) and ReportConfigConflict (True: DuplicateReportCfgId; False: Resolved). |
false |
| gnbDuId | integer |
Controller-assigned gNB-DU ID (unique per DU; F1AP identity) |
false |
| gnbId | integer |
CU-wide gNodeB ID assigned by the controller |
false |
| identitySource | enum |
Provenance of the identity fields (always controller-assigned) Enum: controller |
false |
| lastApplied | map[string]object |
Per-function record of the most recent CU-IP decision applied to this cell, keyed by decision function name (pci, anr): the apply time and the decision id. The controller's verify-current gate reads it before applying the next decision of that function. |
false |
| lastRetune | object |
Audit record of the most recent PCI retune applied by the controller |
false |
| nci | string |
Computed NCI (hex) |
false |
| nciDecimal | integer |
The NCI as a decimal integer (what the CU-CP's runtime commands take) |
false |
| neighbors | []object |
Applied neighbor relations with provenance (manual = declared in spec; anr = written by a CU-IP ANR decision). |
false |
| pciAssignedAt | string |
When the current spec.pci value was last assigned/changed Format: date-time |
false |
| pciSource | enum |
Provenance of the current spec.pci value:
spec - explicit value provided in NRCell spec
controller-temp - controller-assigned temp PCI from the
1002-1007 pool (transient — auto-retune
workflow will replace it)
controller-retuned - controller-applied recommendation from
a CU-IP RANN-D decision (terminal until
the next retune)
Enum: spec, controller-temp, controller-retuned |
false |
| phase | enum |
Pending (temp PCI allocated, reconcile pending), ConfigGenerated (identity resolved, DU generated), Error (see conditions) Enum: Pending, ConfigGenerated, Error |
false |
| sectorId | integer |
Controller-assigned sector ID (unique per cell) |
false |
NRCell.status.conditions[index]
| Name | Type | Description | Required |
|---|---|---|---|
| lastTransitionTime | string |
When the condition last changed Format: date-time |
false |
| message | string |
Human-readable detail |
false |
| reason | string |
Machine-readable cause: SectorIdSpaceExhausted, TempPCIPoolExhausted, UnsupportedRadioBackend, PlmnNotServed, TacNotServed, Generated, DuplicateReportCfgId or Resolved |
false |
| status | enum |
Whether the condition holds Enum: True, False, Unknown |
false |
| type | string |
IdentityAllocated, PCIAllocated, ConfigGenerated or ReportConfigConflict |
false |
NRCell.status.lastApplied[key]
One entry per intelligence function
| Name | Type | Description | Required |
|---|---|---|---|
| decisionId | string |
The applied decision's decision_id |
false |
| ts | string |
When the decision was applied Format: date-time |
false |
NRCell.status.lastRetune
Audit record of the most recent PCI retune applied by the controller
| Name | Type | Description | Required |
|---|---|---|---|
| decisionId | string |
RANN-D decision_id that triggered this retune (format: 'pci:{cell}:spec.pci') |
false |
| from | integer |
Previous PCI value |
false |
| reason | string |
RANN-D decision reason tags (e.g. 'temp', 'confused', 'temp,confused') |
false |
| to | integer |
New PCI value applied |
false |
| ts | string |
When the retune was applied Format: date-time |
false |
NRCell.status.neighbors[index]
| Name | Type | Description | Required |
|---|---|---|---|
| appliedAt | string |
When the relation was first applied; kept across later ANR applies Format: date-time |
false |
| nci | string |
Neighbor NCI (hex) |
false |
| nrCellRef | string |
Name of the neighbor NRCell |
false |
| reportConfigs | []integer |
Report config ids attached to the relation |
false |
| source | enum |
manual = declared in spec.neighbors; anr = written by a CU-IP ANR decision (ANR only ever removes relations it created) Enum: manual, anr |
false |