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

# Oai Ran Cu 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-cu-k8s --channel edge
```

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

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

## charms.oai\_ran\_cu\_k8s.v0.oai\_ran\_cu\_k8s

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

    Fetch library

    ```
    charmcraft fetch-lib charms.oai_ran_cu_k8s.v0.oai_ran_cu_k8s
    ```

    [Download oai\_ran\_cu\_k8s.py](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s/download)
  + *Last updated* 02 Dec 2024
  + *Revision* Library version 0.3

Library for the `fiveg_f1` relation.

This library contains the Requires and Provides classes for handling the `fiveg_f1` interface.

The purpose of this library is to relate two charms claiming to be able to communicate
over the F1 interface. In the Telco world this will typically be charms implementing
the CU (Central Unit) and the DU (Distributed Unit).

##### Getting Started

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

```
charmcraft fetch-lib charms.oai_ran_cu_k8s.v0.fiveg_f1
```

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 the F1 interface.
Typically, this will be the CU charm.

Example:

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

from charms.oai_ran_cu_k8s.v0.fiveg_f1 import F1Provides, PLMNConfig

class DummyFivegF1ProviderCharm(CharmBase):

    IP_ADDRESS = "192.168.70.132"
    PORT = 2153
    TAC = 1
    PLMNS = [PLMNConfig(mcc="123", mnc="12", sst=1, sd=1)]

    def __init__(self, *args):
        super().__init__(*args)
        self.f1_provider = F1Provides(self, "fiveg_f1")
        self.framework.observe(
            self.on.fiveg_f1_relation_joined, self._on_fiveg_f1_relation_joined
        )
        self.framework.observe(
            self.on.fiveg_f1_relation_changed, self._on_fiveg_f1_relation_changed
        )

    def _on_fiveg_f1_relation_joined(self, event: RelationJoinedEvent):
        if self.unit.is_leader():
            self.f1_provider.set_f1_information(
                ip_address=self.IP_ADDRESS,
                port=self.PORT,
                tac=self.TAC,
                plmns=self.PLMNS,
            )

    def _on_fiveg_f1_relation_changed(self, event: RelationChangedEvent):
        requirer_f1_port = self.f1_provider.requirer_f1_port
        if requirer_f1_port:
            <do something with port>

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

###### Requirer charm

The requirer charm is the one requiring the F1 information.
Typically, this will be the DU charm.

Example:

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

from charms.oai_ran_cu_k8s.v0.fiveg_f1 import F1Requires

class DummyFivegF1Requires(CharmBase):

    PORT = 2153

    def __init__(self, *args):
        super().__init__(*args)
        self.f1_requirer = F1Requires(self, "fiveg_f1")
        self.framework.observe(
            self.on.fiveg_f1_relation_joined, self._on_fiveg_f1_relation_joined
        )
        self.framework.observe(
            self.on.fiveg_f1_relation_changed, self._on_fiveg_f1_relation_changed
        )

    def _on_fiveg_f1_relation_joined(self, event: RelationJoinedEvent):
        if self.unit.is_leader():
            self.f1_requirer.set_f1_information(port=self.PORT)

    def _on_fiveg_f1_relation_changed(self, event: RelationChangedEvent):
        provider_f1_ip_address = self.f1_requirer.f1_ip_address
        provider_f1_port = self.f1_requirer.f1_port
        provider_f1_tac = self.f1_requirer.tac
        provider_f1_plmn = self.f1_requirer.plmn
        <do something with the IP address, port, TAC and PLMNs>

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

---

Index

* [class PLMNConfig](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#plmnconfig)
* + [def \_\_init\_\_(
    self,
    mcc,
    mnc,
    sst,
    sd)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#plmnconfig-__init__)
* + [def asdict(
    self)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#plmnconfig-asdict)
* [class ProviderAppData](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#providerappdata)
* [class ProviderSchema](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#providerschema)
* [class RequirerAppData](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#requirerappdata)
* [class RequirerSchema](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#requirerschema)
* [def provider\_data\_is\_valid(
  data
  )](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#provider_data_is_valid)
* [def requirer\_data\_is\_valid(
  data
  )](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#requirer_data_is_valid)
* [class FivegF1Error](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#fivegf1error)
* + [def \_\_init\_\_(
    self,
    message)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#fivegf1error-__init__)
* [class F1Provides](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1provides)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1provides-__init__)
* + [def set\_f1\_information(
    self,
    ip\_address,
    port,
    tac,
    plmns)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1provides-set_f1_information)
* + [def requirer\_f1\_port(
    self)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1provides-requirer_f1_port)
* [class F1Requires](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1requires)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1requires-__init__)
* + [def set\_f1\_information(
    self,
    port)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1requires-set_f1_information)
* + [def get\_provider\_f1\_information(
    self,
    relation)](https://charmhub.io/oai-ran-cu-k8s/libraries/oai_ran_cu_k8s#f1requires-get_provider_f1_information)

#### class PLMNConfig

Description

Dataclass representing the configuration for a PLMN. None

Methods

PLMNConfig.
\_\_init\_\_(

*self*

,
mcc: str

,
mnc: str

,
sst: int

,
sd
)

PLMNConfig.
asdict(

*self*
)

Description

Convert the dataclass into a dictionary. None

#### class ProviderAppData

Description

Provider app data for fiveg\_f1. None

#### class ProviderSchema

Description

Provider schema for fiveg\_f1. None

#### class RequirerAppData

Description

Requirer app data for fiveg\_f1. None

#### class RequirerSchema

Description

Requirer schema for fiveg\_f1. None

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

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: dict)

Return whether the requirer data is valid.

Arguments

data
(dict)

Data to be validated.

Returns

True if data is valid, False otherwise.

#### class FivegF1Error

Description

Custom error class for the `fiveg_f1` library. None

Methods

FivegF1Error.
\_\_init\_\_(

*self*

,
message: str
)

#### class F1Provides

Description

Class to be instantiated by the charm providing relation using the `fiveg_f1` interface. None

Methods

F1Provides.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

Description

Init. None

F1Provides.
set\_f1\_information(

*self*

,
ip\_address: str

,
port: int

,
tac: int

,
plmns
)

Push the information about the F1 interface in the application relation data.

Arguments

ip\_address
(str)

IPv4 address of the network interface used for F1 traffic.

port
(int)

Number of the port used for F1 traffic.

tac
(int)

Tracking Area Code.

plmns
(list[PLMNConfig])

Configured PLMNs.

F1Provides.
requirer\_f1\_port(

*self*
)

Return the number of the port used for F1 traffic.

Returns

Optional[int]

Port number.

#### class F1Requires

Description

Class to be instantiated by the charm requiring relation using the `fiveg_f1` interface. None

Methods

F1Requires.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

Description

Init. None

F1Requires.
set\_f1\_information(

*self*

,
port: int
)

Push the information about the F1 interface in the application relation data.

Arguments

port
(int)

Number of the port used for F1 traffic.

F1Requires.
get\_provider\_f1\_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 valid, None otherwise.
