X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=code%2Fnetwork-generator%2Fnetwork_generation%2Fmodel%2Fpython%2Fo_ran_cloud_du.py;h=b97f97e279131c330aca4f6222c913ef630b68e1;hb=091313ef66ae97923fd970be160e01d46649a835;hp=0c5b7821678474451f1f4725985c4d8aab65ffac;hpb=a2b078aa43c03151b01b97b421ff1dc21b04c555;p=oam.git diff --git a/code/network-generator/network_generation/model/python/o_ran_cloud_du.py b/code/network-generator/network_generation/model/python/o_ran_cloud_du.py index 0c5b782..b97f97e 100644 --- a/code/network-generator/network_generation/model/python/o_ran_cloud_du.py +++ b/code/network-generator/network_generation/model/python/o_ran_cloud_du.py @@ -12,43 +12,59 @@ # See the License for the specific language governing permissions and # limitations under the License. -#!/usr/bin/python +# !/usr/bin/python """ -A Class representing an O-RAN O-Cloud resource pool for O-RAN distributed units (ORanDu) +A Class representing an O-RAN O-Cloud resource pool for O-RAN distributed units +(ORanDu). By default all O-RAN-DUs associated with the towers around are deployed here. -Maybe dedicated hardware is required to host O-DUs, but it is expected +Maybe dedicated hardware is required to host O-DUs, but it is expected that the O-Cloud mechanism and concepts can be applied here. """ import xml.etree.ElementTree as ET -from typing import overload +from typing import Any, cast import network_generation.model.python.hexagon as Hexagon from network_generation.model.python.cube import Cube +from network_generation.model.python.geo_location import GeoLocation from network_generation.model.python.hexagon import Hex -from network_generation.model.python.o_ran_node import ORanNode -from network_generation.model.python.o_ran_object import IORanObject +from network_generation.model.python.o_ran_node import ( + IORanNode, + ORanNode, + default_value, +) from network_generation.model.python.o_ran_termination_point import ( ORanTerminationPoint, ) from network_generation.model.python.tower import Tower - # Define the "IORanDu" interface -class IORanCloudDu(IORanObject): - def __init__(self, **kwargs): - super().__init__(**kwargs) +IORanCloudDu = IORanNode # Implements a concrete O-RAN Node class -class ORanCloudDu(ORanNode, IORanCloudDu): - def __init__(self, o_ran_du_data: IORanCloudDu = None, **kwargs): - super().__init__(o_ran_du_data, **kwargs) +class ORanCloudDu(ORanNode): + def __init__( + self, + data: dict[str, Any] = cast(dict[str, Any], default_value), + **kwargs: dict[str, Any] + ) -> None: + o_ran_cloud_du_data: IORanCloudDu = self._to_o_ran_cloud_du_data(data) + + super().__init__(cast(dict[str, Any], o_ran_cloud_du_data), **kwargs) self._towers: list[Tower] = self._calculate_towers() + def _to_o_ran_cloud_du_data(self, data: dict[str, Any]) -> IORanCloudDu: + result: IORanCloudDu = default_value + for key, key_type in IORanCloudDu.__annotations__.items(): + if key in data: + result[key] = data[key] # type: ignore + return result + def _calculate_towers(self) -> list[Tower]: hex_ring_radius: int = ( - self.spiralRadiusProfile.oRanDuSpiralRadiusOfTowers + self.parent.parent.parent.parent + .spiral_radius_profile.oRanDuSpiralRadiusOfTowers ) hex_list: list[Hex] = Cube.spiral(self.position, hex_ring_radius) result: list[Tower] = [] @@ -57,10 +73,12 @@ class ORanCloudDu(ORanNode, IORanCloudDu): name: str = "-".join( [ self.name.replace("O-Cloud-DU", "Tower"), - s[len(s) - 2 : len(s)], + s[len(s) - 2: len(s)], ] ) - network_center: dict = self.parent.parent.parent.parent.center + network_center: GeoLocation = ( + self.parent.parent.parent.parent.center + ) newGeo = Hexagon.hex_to_geo_location( self.layout, hex, network_center ).json() @@ -71,7 +89,6 @@ class ORanCloudDu(ORanNode, IORanCloudDu): "geoLocation": newGeo, "position": hex, "layout": self.layout, - "spiralRadiusProfile": self.spiralRadiusProfile, "parent": self, } ) @@ -82,9 +99,8 @@ class ORanCloudDu(ORanNode, IORanCloudDu): def towers(self) -> list[Tower]: return self._towers - @property def termination_points(self) -> list[ORanTerminationPoint]: - result: list[ORanTerminationPoint] = super().termination_points + result: list[ORanTerminationPoint] = super().termination_points() phy_tp: str = "-".join([self.name, "phy".upper()]) result.append(ORanTerminationPoint({"id": phy_tp, "name": phy_tp})) for interface in ["o2"]: @@ -96,14 +112,14 @@ class ORanCloudDu(ORanNode, IORanCloudDu): ) return result - def to_topology_nodes(self) -> list[dict[str, dict]]: - result: list[dict[str, dict]] = super().to_topology_nodes() + def to_topology_nodes(self) -> list[dict[str, Any]]: + result: list[dict[str, Any]] = super().to_topology_nodes() for tower in self.towers: result.extend(tower.to_topology_nodes()) return result - def to_topology_links(self) -> list[dict[str, dict]]: - result: list[dict[str, dict]] = super().to_topology_links() + def to_topology_links(self) -> list[dict[str, Any]]: + result: list[dict[str, Any]] = super().to_topology_links() for tower in self.towers: result.extend(tower.to_topology_links()) return result @@ -118,5 +134,5 @@ class ORanCloudDu(ORanNode, IORanCloudDu): o_ran_cloud_du.append(tower.toKml()) return o_ran_cloud_du - def toSvg(self) -> None: - return None + def toSvg(self) -> ET.Element: + return ET.Element("to-be-implemented")