python 3.10 type definitions
[oam.git] / code / network-generator / model / python / o_ran_network.py
index 9198945..42ff19b 100644 (file)
 """
 Module for a class representing a O-RAN Network
 """
-from typing import Any, Dict, List
-from model.python.Tower import Tower
-from model.python.ORanObject import IORanObject, ORanObject
+from typing import Any
+
+from model.python.o_ran_smo import ORanSmo
+from model.python.o_ran_spiral_radius_profile import SpiralRadiusProfile
+from model.python.o_ran_object import IORanObject, ORanObject
+import model.python.hexagon as Hexagon
+from model.python.hexagon import Layout
+from model.python.point import Point
 import xml.etree.ElementTree as ET
 
 
@@ -28,29 +33,56 @@ class ORanNetwork(ORanObject):
     """
 
     # constructor
-    def __init__(self, configuration: Dict[str, Any], of: IORanObject = None, **kwargs):
+    def __init__(self, configuration: dict[str, Any], of: IORanObject = None, **kwargs):
         super().__init__(of, **kwargs)
         self.__configuration = configuration
-        self.__towers: List[Tower] = []
-
-        center = configuration["center"]
-        self.__towers.append(Tower(center))
+        self.name = configuration["name"]
+        self.center = configuration["center"]
+        size = configuration["pattern"]["o-ran-ru"]["max-reach"]
+        layout = Layout(
+            Hexagon.layout_flat, Point(size, size), Point(0, 0)
+        )  # 1 pixel = 1 meter
+        spiral_radius_profile = SpiralRadiusProfile(
+            {
+                "oRanSmoSpiralRadiusOfNearRtRics": configuration["pattern"]["smo"][
+                    "near-rt-ric-spiral-radius"
+                ],
+                "oRanNearRtRicSpiralRadiusOfOCus": configuration["pattern"][
+                    "near-rt-ric"
+                ]["o-ran-cu-spiral-radius"],
+                "oRanCuSpiralRadiusOfODus": configuration["pattern"]["o-ran-cu"][
+                    "o-ran-du-spiral-radius"
+                ],
+                "oRanDuSpiralRadiusOfTowers": configuration["pattern"]["o-ran-du"][
+                    "tower-spiral-radius"
+                ],
+            }
+        )
+        self._o_ran_smo = ORanSmo(
+            {
+                "name": "SMO",
+                "geoLocation": self.center,
+                "layout": layout,
+                "spiralRadiusProfile": spiral_radius_profile,
+                "parent": self,
+            }
+        )
 
     # getter
-    def configuration(self) -> Dict[str, Dict]:
+    def configuration(self) -> dict[str, dict]:
         """
         Getter for a json object representing the O-RAN Network.
         :return O-RAN Network as json object.
         """
         return self.__configuration
 
-    def __appendNodes(self):
-        result: List[Dict[str, Any]] = []
-        for tower in self.__towers:
+    def __appendNodes(self) -> list[dict[str, Any]]:
+        result: list[dict[str, Any]] = []
+        for tower in self._o_ran_smo.towers:
             result.append(tower.toTopology())
         return result
 
-    def toTopology(self):
+    def toTopology(self) -> dict[str, Any]:
         return {
             "ietf-network:networks": {
                 "network": [
@@ -63,19 +95,29 @@ class ORanNetwork(ORanObject):
             }
         }
 
-    def toKml(self):
-        root: Element = ET.Element("kml", xmlns="http://www.opengis.net/kml/2.2")
+    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.text = "1"
+        name = 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())
+
         return root
 
-    def toSvg(self):
+    def toSvg(self) -> ET.Element:
         """
         Getter for a xml/svg Element object representing the Network.
         :return Network as SVG object.
         """
-        root: Element = ET.Element(
+        root: ET.Element = ET.Element(
             "svg",
             # width=str(self.__svg_width()),
             # height=str(self.__svg_height()),