From a28e4554da9c266df736f8da9b2fd00d72d4127d Mon Sep 17 00:00:00 2001 From: Martin Skorupski Date: Fri, 27 Oct 2023 07:16:02 +0200 Subject: [PATCH] Implement kml function for smo, near-rt-ric, o-cu - done IssueID: OAM-374 Change-Id: I087ce021f234679b4b1451ac09cf5f793d4ac757 Signed-off-by: Martin Skorupski --- code/network-generator/model/python/o_ran_cu.py | 51 +++++++++++++------- code/network-generator/model/python/o_ran_du.py | 11 ++++- .../model/python/o_ran_near_rt_ric.py | 50 +++++++++++++------- .../model/python/o_ran_network.py | 15 ++---- code/network-generator/model/python/o_ran_smo.py | 55 +++++++++++++--------- 5 files changed, 117 insertions(+), 65 deletions(-) diff --git a/code/network-generator/model/python/o_ran_cu.py b/code/network-generator/model/python/o_ran_cu.py index 830666e..70e1e44 100644 --- a/code/network-generator/model/python/o_ran_cu.py +++ b/code/network-generator/model/python/o_ran_cu.py @@ -17,6 +17,9 @@ """ A Class representing an O-RAN centralized unit (ORanCu) """ +from model.python.cube import Cube +from model.python.hexagon import Hex +import model.python.hexagon as Hexagon from model.python.o_ran_du import ORanDu from model.python.tower import Tower from model.python.o_ran_object import IORanObject @@ -38,24 +41,32 @@ class ORanCu(ORanNode, IORanCu): def _calculate_o_ran_dus(self) -> list[ORanDu]: hex_ring_radius: int = self.spiralRadiusProfile.oRanCuSpiralRadiusOfODus - index: int = 0 - s: str = "00" + str(index) - name: str = "O-RAN-DU-" + s[len(s) - 2 : len(s)] + hex_list: list[Hex] = self.spiralRadiusProfile.oRanDuSpiral(self.position, hex_ring_radius) result: list[ORanDu] = [] - result.append( - ORanDu( - { - "name": name, - "geoLocation": self.geoLocation, - "position": self.position, - "layout": self.layout, - "spiralRadiusProfile": self.spiralRadiusProfile, - "parent": self, - } + for index, hex in enumerate(hex_list): + s: str = "00" + str(index) + name: str = "-".join( + [self.name.replace("CU", "DU"), s[len(s) - 2 : len(s)]] + ) + network_center: dict = self.parent.parent.parent.center + newGeo = Hexagon.hex_to_geo_location( + self.layout, hex, network_center + ).json() + result.append( + ORanDu( + { + "name": name, + "geoLocation": newGeo, + "position": hex, + "layout": self.layout, + "spiralRadiusProfile": self.spiralRadiusProfile, + "parent": self, + } + ) ) - ) return result + @property def o_ran_dus(self) -> list[ORanDu]: return self._o_ran_dus @@ -68,8 +79,16 @@ class ORanCu(ORanNode, IORanCu): result.append(tower) return result - def toKml(self) -> None: - return None + def toKml(self) -> ET.Element: + o_ran_cu: ET.Element = ET.Element("Folder") + open: ET.Element = ET.SubElement(o_ran_cu, "open") + open.text = "1" + name: ET.Element = ET.SubElement(o_ran_cu, "name") + name.text = self.name + for o_ran_du in self.o_ran_dus: + o_ran_cu.append(o_ran_du.toKml()) + return o_ran_cu + def toSvg(self) -> None: return None diff --git a/code/network-generator/model/python/o_ran_du.py b/code/network-generator/model/python/o_ran_du.py index 16b6247..19eb3d0 100644 --- a/code/network-generator/model/python/o_ran_du.py +++ b/code/network-generator/model/python/o_ran_du.py @@ -69,8 +69,15 @@ class ORanDu(ORanNode, IORanDu): def towers(self) -> list[Tower]: return self._towers - def toKml(self) -> None: - return None + def toKml(self) -> ET.Element: + o_ran_du: ET.Element = ET.Element("Folder") + open: ET.Element = ET.SubElement(o_ran_du, "open") + open.text = "1" + name: ET.Element = ET.SubElement(o_ran_du, "name") + name.text = self.name + for tower in self.towers: + o_ran_du.append(tower.toKml()) + return o_ran_du def toSvg(self) -> None: return None diff --git a/code/network-generator/model/python/o_ran_near_rt_ric.py b/code/network-generator/model/python/o_ran_near_rt_ric.py index 17b6f3c..a375e68 100644 --- a/code/network-generator/model/python/o_ran_near_rt_ric.py +++ b/code/network-generator/model/python/o_ran_near_rt_ric.py @@ -21,6 +21,8 @@ from model.python.tower import Tower from model.python.o_ran_cu import ORanCu from model.python.o_ran_object import IORanObject from model.python.o_ran_node import ORanNode +from model.python.hexagon import Hex +import model.python.hexagon as Hexagon import xml.etree.ElementTree as ET @@ -38,22 +40,31 @@ class ORanNearRtRic(ORanNode, IORanNearRtRic): def _calculate_o_ran_cus(self) -> list[ORanCu]: hex_ring_radius: int = self.spiralRadiusProfile.oRanNearRtRicSpiralRadiusOfOCus - index: int = 0 - s: str = "00" + str(index) - name: str = "O-RAN-CU-" + s[len(s) - 2 : len(s)] + hex_list: list[Hex] = self.spiralRadiusProfile.oRanCuSpiral( + self.position, hex_ring_radius + ) result: list[ORanCu] = [] - result.append( - ORanCu( - { - "name": name, - "geoLocation": self.geoLocation, - "position": self.position, - "layout": self.layout, - "spiralRadiusProfile": self.spiralRadiusProfile, - "parent": self, - } + for index, hex in enumerate(hex_list): + s: str = "00" + str(index) + name: str = "-".join( + [self.name.replace("NearRtRic", "CU"), s[len(s) - 2 : len(s)]] + ) + network_center: dict = self.parent.parent.center + newGeo = Hexagon.hex_to_geo_location( + self.layout, hex, network_center + ).json() + result.append( + ORanCu( + { + "name": name, + "geoLocation": newGeo, + "position": hex, + "layout": self.layout, + "spiralRadiusProfile": self.spiralRadiusProfile, + "parent": self + } + ) ) - ) return result @property @@ -68,8 +79,15 @@ class ORanNearRtRic(ORanNode, IORanNearRtRic): result.append(tower) return result - def toKml(self) -> None: - return None + def toKml(self) -> ET.Element: + ric: ET.Element = ET.Element("Folder") + open: ET.Element = ET.SubElement(ric, "open") + open.text = "1" + name: ET.Element = ET.SubElement(ric, "name") + name.text = self.name + for o_ran_cu in self.o_ran_cus: + ric.append(o_ran_cu.toKml()) + return ric def toSvg(self) -> None: return None diff --git a/code/network-generator/model/python/o_ran_network.py b/code/network-generator/model/python/o_ran_network.py index 42ff19b..5caf7f6 100644 --- a/code/network-generator/model/python/o_ran_network.py +++ b/code/network-generator/model/python/o_ran_network.py @@ -60,7 +60,7 @@ class ORanNetwork(ORanObject): ) self._o_ran_smo = ORanSmo( { - "name": "SMO", + "name": "O-RAN-SMO", "geoLocation": self.center, "layout": layout, "spiralRadiusProfile": spiral_radius_profile, @@ -98,17 +98,12 @@ class ORanNetwork(ORanObject): def toKml(self) -> ET.Element: root: ET.Element = ET.Element("kml", xmlns="http://www.opengis.net/kml/2.2") document = ET.SubElement(root, "Document") - open = ET.SubElement(document, "open") + open: ET.Element = ET.SubElement(document, "open") open.text = "1" - name = ET.SubElement(document, "name") + name: ET.Element = ET.SubElement(document, "name") name.text = self.name - folder = ET.SubElement(document, "Folder") - open = ET.SubElement(folder, "open") - open.text = "1" - name = ET.SubElement(folder, "name") - name.text = "Towers" - for tower in self._o_ran_smo.towers: - folder.append(tower.toKml()) + + document.append(self._o_ran_smo.toKml()) return root diff --git a/code/network-generator/model/python/o_ran_smo.py b/code/network-generator/model/python/o_ran_smo.py index 2bfd8bb..fe04088 100644 --- a/code/network-generator/model/python/o_ran_smo.py +++ b/code/network-generator/model/python/o_ran_smo.py @@ -21,6 +21,8 @@ from model.python.tower import Tower from model.python.o_ran_near_rt_ric import ORanNearRtRic from model.python.o_ran_object import IORanObject from model.python.o_ran_node import ORanNode +from model.python.hexagon import Hex +import model.python.hexagon as Hexagon import xml.etree.ElementTree as ET @@ -38,29 +40,33 @@ class ORanSmo(ORanNode, IORanSmo): def _calculate_near_rt_rics(self) -> list[ORanNearRtRic]: hex_ring_radius: int = self.spiralRadiusProfile.oRanSmoSpiralRadiusOfNearRtRics - index: int = 0 - s: str = "00" + str(index) - name: str = "Ric-" + s[len(s) - 2 : len(s)] + hex_list: list[Hex] = self.spiralRadiusProfile.oRanNearRtRicSpiral( + self.position, hex_ring_radius + ) result: list[ORanNearRtRic] = [] - result.append( - ORanNearRtRic( - { - "name": name, - "geoLocation": self.geoLocation, - "position": self.position, - "layout": self.layout, - "spiralRadiusProfile": self.spiralRadiusProfile, - "parent": self, - } + for index, hex in enumerate(hex_list): + s: str = "00" + str(index) + name: str = "-".join( + [self.name.replace("SMO", "NearRtRic"), s[len(s) - 2 : len(s)]] + ) + network_center: dict = self.parent.center + newGeo = Hexagon.hex_to_geo_location( + self.layout, hex, network_center + ).json() + result.append( + ORanNearRtRic( + { + "name": name, + "geoLocation": newGeo, + "position": hex, + "layout": self.layout, + "spiralRadiusProfile": self.spiralRadiusProfile, + "parent": self, + } + ) ) - ) return result - # return this.spiralProfile.oRanNearRtRicSpiral(this.position, hexRingRadius).map((hex, index) => { - # const name: string = 'Ric-' + ('00' + index).slice(-2); - # return new ORanNearRtRic({ name: name, position: hex, layout: this.layout, spiralProfile: this.spiralProfile, parent: this }); - # }); - @property def o_ran_near_rt_rics(self) -> list[ORanNearRtRic]: return self._o_ran_near_rt_rics @@ -73,8 +79,15 @@ class ORanSmo(ORanNode, IORanSmo): result.append(tower) return result - def toKml(self) -> None: - return None + def toKml(self) -> ET.Element: + smo: ET.Element = ET.Element("Folder") + open: ET.Element = ET.SubElement(smo, "open") + open.text = "1" + name: ET.Element = ET.SubElement(smo, "name") + name.text = self.name + for ric in self.o_ran_near_rt_rics: + smo.append(ric.toKml()) + return smo def toSvg(self) -> None: return None -- 2.16.6