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=28ef5927441476ba78bd04aafec0ccaca7cfc4c5;hp=ab72f720fac7666944da94843f8d9304db66a15b;hpb=7004840bca352043aec43d36df79436b90bcbd5a;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 ab72f72..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,47 +12,73 @@ # 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. """ -from typing import overload +import xml.etree.ElementTree as ET +from typing import Any, cast + import network_generation.model.python.hexagon as Hexagon -from network_generation.model.python.hexagon import Hex 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 ( + IORanNode, + ORanNode, + default_value, +) +from network_generation.model.python.o_ran_termination_point import ( + ORanTerminationPoint, +) from network_generation.model.python.tower import Tower -from network_generation.model.python.o_ran_object import IORanObject -from network_generation.model.python.o_ran_node import ORanNode -from network_generation.model.python.o_ran_termination_point import ORanTerminationPoint -import xml.etree.ElementTree as ET - # 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 + hex_ring_radius: int = ( + self.parent.parent.parent.parent + .spiral_radius_profile.oRanDuSpiralRadiusOfTowers + ) hex_list: list[Hex] = Cube.spiral(self.position, hex_ring_radius) result: list[Tower] = [] for index, hex in enumerate(hex_list): s: str = "00" + str(index) name: str = "-".join( - [self.name.replace("O-Cloud-DU", "Tower"), s[len(s) - 2 : len(s)]] + [ + self.name.replace("O-Cloud-DU", "Tower"), + s[len(s) - 2: len(s)], + ] + ) + network_center: GeoLocation = ( + self.parent.parent.parent.parent.center ) - network_center: dict = self.parent.parent.parent.parent.center newGeo = Hexagon.hex_to_geo_location( self.layout, hex, network_center ).json() @@ -63,7 +89,6 @@ class ORanCloudDu(ORanNode, IORanCloudDu): "geoLocation": newGeo, "position": hex, "layout": self.layout, - "spiralRadiusProfile": self.spiralRadiusProfile, "parent": self, } ) @@ -74,28 +99,31 @@ 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"]: - id:str = "-".join([self.name, interface.upper()]) - result.append(ORanTerminationPoint({"id": id, "name":id, "supporter": phy_tp, "parent":self})) + id: str = "-".join([self.name, interface.upper()]) + result.append( + ORanTerminationPoint( + {"id": id, "name": id, "supporter": phy_tp, "parent": self} + ) + ) 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()) + 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()) + result.extend(tower.to_topology_links()) return result - + def toKml(self) -> ET.Element: o_ran_cloud_du: ET.Element = ET.Element("Folder") open: ET.Element = ET.SubElement(o_ran_cloud_du, "open") @@ -106,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")