---
title: Charmhub | Deploy Oai Ran Du K8S using Charmhub - The Open Operator Collection
description: Deploy the latest version of Oai Ran Du K8S as a Kubernetes Operator
  on any cloud.
url: https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config
---

# Oai Ran Du K8S

[Canonical Telco](https://charmhub.io/publisher/telco-charmers "View all packages from Canonical Telco")

* [Canonical Telco](https://charmhub.io/publisher/telco-charmers "View all packages from Canonical Telco")

Platform:

edge 1

```
juju deploy oai-ran-du-k8s --channel edge
```

[Learn to deploy on juju >](https://juju.is/docs/juju/manage-applications)

[Toggle side navigation](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#drawer)

## charms.oai\_ran\_du\_k8s.v0.fiveg\_rf\_config

* [*Docstrings*Docstrings](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config)
  [*Code*Source code](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config/source-code)
* + Download

    Fetch library

    ```
    charmcraft fetch-lib charms.oai_ran_du_k8s.v0.fiveg_rf_config
    ```

    [Download fiveg\_rf\_config.py](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config/download)
  + *Last updated* 21 May 2025
  + *Revision* Library version 0.1

Library for the `fiveg_rf_config` relation.

This library contains the Requires and Provides classes for handling the `fiveg-rf-config` interface.

The purpose of this library is to pass the Radio Frequency (RF) configuration data required to establish communication between two charms implementing the `fiveg-rf-config` interface over a real or simulated RF medium.
In particular the RF SIM address, Network Slice Type (SST), Slice Differentiator (SD), RF band, downlink frequency, carrier bandwidth, numerology and the number of the first usable subcarrier will be passed through the interface.
In the Telco world this will typically be charms implementing the DU (Distributed Unit) and the UE (User equipment).

##### Getting Started

From a charm directory, fetch the library using `charmcraft`:

```
charmcraft fetch-lib charms.oai_ran_du_k8s.v0.fiveg_rf_config
```

Add the following libraries to the charm's `requirements.txt` file:

* pydantic
* pytest-interface-tester

###### Provider charm

The provider charm is the one providing the information about RF SIM address, SST, SD, RF band, downlink frequency, carrier bandwidth, numerology and the number of the first usable subcarrier.
Typically, this will be the DU charm.

Example:

```
from ops import main
from ops.charm import CharmBase, RelationChangedEvent

from charms.oai_ran_du_k8s.v0.fiveg_rf_config import RFConfigProvides

class DummyFivegRFConfigProviderCharm(CharmBase):

    RFSIM_ADDRESS = "192.168.70.130"
    SST = 1
    SD = 1
    BAND = 77
    DL_FREQ = 4059090000  # In Hz
    CARRIER_BANDWIDTH = 106  # In PRBs
    NUMEROLOGY = 1
    START_SUBCARRIER = 541

    def __init__(self, *args):
        super().__init__(*args)
        self.rf_config_provider = RFConfigProvides(self, "fiveg_rf_config")
        self.framework.observe(
            self.on.fiveg_rf_config_relation_changed, self._on_fiveg_rf_config_relation_changed
        )

    def _on_fiveg_rf_config_relation_changed(self, event: RelationChangedEvent):
        if self.unit.is_leader():
            self.rf_config_provider.set_rf_config_information(
                version=0,
                rfsim_address=self.RFSIM_ADDRESS,
                sst=self.SST,
                sd=self.SD,
                band=self.BAND,
                dl_freq=self.DL_FREQ,
                carrier_bandwidth=self.CARRIER_BANDWIDTH,
                numerology=self.NUMEROLOGY,
                start_subcarrier=self.START_SUBCARRIER
            )

if __name__ == "__main__":
    main(DummyFivegRFConfigProviderCharm)
```

###### Requirer charm

The requirer charm is the one requiring the RF configuration information.
Typically, this will be the UE charm.

Example:

```
from ops import main
from ops.charm import CharmBase, RelationChangedEvent

from charms.oai_ran_du_k8s.v0.fiveg_rf_config import RFConfigRequires

logger = logging.getLogger(__name__)

class DummyFivegRFConfigRequires(CharmBase):

    def __init__(self, *args):
        super().__init__(*args)
        self.rf_config_requirer = RFConfigRequires(self, "fiveg_rf_config")
        self.framework.observe(
            self.on.fiveg_rf_config_relation_changed, self._on_fiveg_rf_config_relation_changed
        )

    def _on_fiveg_rf_config_relation_changed(self, event: RelationChangedEvent):
        provider_rfsim_address = event.rfsim_address
        provider_sst = event.sst
        provider_sd = event.sd
        provider_band = event.band
        provider_dl_freq = event.dl_freq
        provider_carrier_bandwidth = event.carrier_bandwidth
        provider_numerology = event.numerology
        provider_start_subcarrier = event.start_subcarrier
        <do something with the received data>

if __name__ == "__main__":
    main(DummyFivegRFConfigRequires)
```

---

Index

* [class ProviderAppData](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#providerappdata)
* [class ProviderSchema](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#providerschema)
* [class RequirerAppData](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#requirerappdata)
* [class RequirerSchema](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#requirerschema)
* [def provider\_data\_is\_valid(
  data
  )](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#provider_data_is_valid)
* [def requirer\_data\_is\_valid(
  data
  )](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#requirer_data_is_valid)
* [class FivegRFConfigError](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#fivegrfconfigerror)
* + [def \_\_init\_\_(
    self,
    message)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#fivegrfconfigerror-__init__)
* [class RFConfigProvides](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigprovides)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigprovides-__init__)
* + [def set\_rf\_config\_information(
    self,
    rfsim\_address,
    sst,
    sd,
    band,
    dl\_freq,
    carrier\_bandwidth,
    numerology,
    start\_subcarrier)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigprovides-set_rf_config_information)
* + [def interface\_version(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigprovides-interface_version)
* [class RFConfigRequires](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-__init__)
* + [def provider\_interface\_version(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-provider_interface_version)
* + [def rfsim\_address(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-rfsim_address)
* + [def sst(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-sst)
* + [def sd(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-sd)
* + [def band(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-band)
* + [def dl\_freq(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-dl_freq)
* + [def carrier\_bandwidth(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-carrier_bandwidth)
* + [def numerology(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-numerology)
* + [def start\_subcarrier(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-start_subcarrier)
* + [def get\_provider\_rf\_config\_information(
    self,
    relation)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-get_provider_rf_config_information)
* + [def set\_rf\_config\_information(
    self)](https://charmhub.io/oai-ran-du-k8s/libraries/fiveg_rf_config#rfconfigrequires-set_rf_config_information)

#### class ProviderAppData

Description

Provider app data for fiveg\_rf\_config. None

#### class ProviderSchema

Description

Provider schema for the fiveg\_rf\_config relation. None

#### class RequirerAppData

Description

Requirer app data for fiveg\_rf\_config. None

#### class RequirerSchema

Description

Requirer schema for the fiveg\_rf\_config relation. None

#### def provider\_data\_is\_valid(data)

Return whether the provider data is valid.

Arguments

data
(dict)

Data to be validated.

Returns

True if data is valid, False otherwise.

#### def requirer\_data\_is\_valid(data)

Return whether the requirer data is valid.

Arguments

data
(dict)

Data to be validated.

Returns

True if data is valid, False otherwise.

#### class FivegRFConfigError

Description

Custom error class for the `fiveg_rf_config` library. None

Methods

FivegRFConfigError.
\_\_init\_\_(

*self*

,
message: str
)

#### class RFConfigProvides

Description

Class to be instantiated by the charm providing the `fiveg_rf_config` relation. None

Methods

RFConfigProvides.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

Description

Init. None

RFConfigProvides.
set\_rf\_config\_information(

*self*

,
rfsim\_address

,
sst: int

,
sd

,
band: int

,
dl\_freq: int

,
carrier\_bandwidth: int

,
numerology: int

,
start\_subcarrier: int
)

Push the information about the RF configuration in the application relation data.

Arguments

rfsim\_address
(Optional[str])

rfsim service address which is equal to DU Pod IP

sst
(int)

Slice/Service Type

sd
(Optional[int])

Slice Differentiator

band
(int)

Valid 5G band

dl\_freq
(int)

Downlink frequency in Hz

carrier\_bandwidth
(int)

Carrier bandwidth (number of downlink PRBs)

numerology
(int)

Numerology

start\_subcarrier
(int)

First usable subcarrier

RFConfigProvides.
interface\_version(

*self*
)

#### class RFConfigRequires

Description

Class to be instantiated by the charm requiring the `fiveg_rf_config` relation. None

Methods

RFConfigRequires.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

Description

Init. None

RFConfigRequires.
provider\_interface\_version(

*self*
)

Return interface version used by the provider.

Returns

Optional[int]

The `fiveg_rf_config` interface version used by the provider.

RFConfigRequires.
rfsim\_address(

*self*
)

Return address of the RFSIM.

Returns

Optional[IPvAnyAddress]

rfsim address which is equal to DU pod ip.

RFConfigRequires.
sst(

*self*
)

Return the Network Slice Service Type (SST).

Returns

Optional[int]

sst (Network Slice Service Type)

RFConfigRequires.
sd(

*self*
)

Return the Network Slice Differentiator (SD).

Returns

Optional[int] : sd (Network Slice Differentiator)

RFConfigRequires.
band(

*self*
)

Return the RF Band number.

Returns

Optional[int] : band (RF Band number)

RFConfigRequires.
dl\_freq(

*self*
)

Return the Downlink frequency.

Returns

Optional[int] : dl\_freq (Downlink frequency)

RFConfigRequires.
carrier\_bandwidth(

*self*
)

Return the carrier bandwidth (number of downlink PRBs).

Returns

Optional[int] : carrier\_bandwidth (carrier bandwidth)

RFConfigRequires.
numerology(

*self*
)

Return numerology.

Returns

Optional[int] : numerology

RFConfigRequires.
start\_subcarrier(

*self*
)

Return number of the first usable subcarrier.

Returns

Optional[int] : start\_subcarrier

RFConfigRequires.
get\_provider\_rf\_config\_information(

*self*

,
relation
)

Get relation data for the remote application.

Arguments

relation

Juju relation object (optional).

Returns

ProviderAppData

Relation data for the remote application if data is valid,
None otherwise.

RFConfigRequires.
set\_rf\_config\_information(

*self*
)

Description

Push the information about the `fiveg_rf_config` interface version used by the Requirer. None
