Add to_directory method to relevant object classes 80/12680/1 master
authorMartin Skorupski <martin.skorupski@highstreet-technologies.com>
Fri, 5 Apr 2024 13:42:23 +0000 (15:42 +0200)
committerMartin Skorupski <martin.skorupski@highstreet-technologies.com>
Fri, 5 Apr 2024 13:42:30 +0000 (15:42 +0200)
- method added to create folder structure for topology nodes

Issue-ID: OAM-408
Change-Id: I55900404eac916a37d9c761b4eda478528d77017
Signed-off-by: Martin Skorupski <martin.skorupski@highstreet-technologies.com>
12 files changed:
code/network-generator/network_generation/cli.py
code/network-generator/network_generation/model/python/nr_cell_du.py
code/network-generator/network_generation/model/python/o_ran_cloud_du.py
code/network-generator/network_generation/model/python/o_ran_cu.py
code/network-generator/network_generation/model/python/o_ran_du.py
code/network-generator/network_generation/model/python/o_ran_near_rt_ric.py
code/network-generator/network_generation/model/python/o_ran_network.py
code/network-generator/network_generation/model/python/o_ran_node.py
code/network-generator/network_generation/model/python/o_ran_ru.py
code/network-generator/network_generation/model/python/o_ran_smo.py
code/network-generator/network_generation/model/python/tower.py
code/network-generator/network_generation/view/network_viewer.py

index fa8a8f3..e156fcd 100644 (file)
@@ -59,6 +59,13 @@ def main() -> None:  # pragma: no cover
                 configuration["generationTasks"]["topology"]["compressed"]
             )
 
+        # dir structure for day0 configuration
+        # Note: compressed option ignored
+        if configuration["generationTasks"]["network_dir"]["enabled"] is True:
+            viewer.to_directory(
+                output_folder
+            )
+
         # svg xml
         if configuration["generationTasks"]["svg"]["enabled"] is True:
             viewer.svg(
index acdafe1..13fc42b 100644 (file)
@@ -240,3 +240,6 @@ class NrCellDu(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        pass
index b97f97e..d3a4d10 100644 (file)
@@ -136,3 +136,7 @@ class ORanCloudDu(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        for tower in self.towers:
+            tower.to_directory(parent_dir)
index be0006d..2df40f6 100644 (file)
@@ -143,3 +143,7 @@ class ORanCu(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        for o_ran_cloud_du in self.o_ran_cloud_dus:
+            o_ran_cloud_du.to_directory(parent_dir)
index 0392d2c..98e8c1a 100644 (file)
@@ -18,6 +18,7 @@
 A Class representing an O-RAN distributed unit (ORanDu)
 """
 import xml.etree.ElementTree as ET
+import os
 from typing import Any, cast
 
 from network_generation.model.python.o_ran_node import IORanNode, ORanNode
@@ -54,6 +55,7 @@ class ORanDu(ORanNode):
             if o_ran_du_data and "oRanRuCount" in o_ran_du_data
             else 1
         )
+        self.type = "ntsim-ng-o-du"
 
     def _to_o_ran_du_data(self, data: dict[str, Any]) -> IORanDu:
         result: IORanDu = default_value
@@ -114,3 +116,11 @@ class ORanDu(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        parent_path = os.path.join(parent_dir, self.type)
+        path = os.path.join(parent_path, self.name)
+        if not os.path.exists(parent_path):
+            os.makedirs(parent_path, exist_ok=True)
+        if not os.path.exists(path):
+            os.mkdir(path)
index 5a44843..17208f8 100644 (file)
@@ -145,3 +145,7 @@ class ORanNearRtRic(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        for o_ran_cu in self.o_ran_cus:
+            o_ran_cu.to_directory(parent_dir)
index 962e5b1..901e83f 100644 (file)
@@ -17,6 +17,7 @@
 Module for a class representing a O-RAN Network
 """
 import xml.etree.ElementTree as ET
+import os
 from typing import Any, cast
 
 import network_generation.model.python.hexagon as Hexagon
@@ -148,6 +149,9 @@ class ORanNetwork(ORanObject):
             }
         }
 
+    def to_directory(self, parent_dir: str) -> None:
+        self._o_ran_smo.to_directory(os.path.join(parent_dir, self.id))
+
     def toKml(self) -> ET.Element:
         root: ET.Element = ET.Element(
             "kml", xmlns="http://www.opengis.net/kml/2.2"
index 6a2b3cb..8dba3bc 100644 (file)
@@ -216,3 +216,7 @@ class ORanNode(ORanObject):
     @abstractmethod
     def toSvg(self) -> ET.Element:
         pass
+
+    @abstractmethod
+    def to_directory(self, parent_dir: str) -> None:
+        pass
index 265e6f4..c88dfec 100644 (file)
@@ -18,6 +18,7 @@
 A Class representing an O-RAN radio unit (ORanRu)
 """
 import xml.etree.ElementTree as ET
+import os
 from typing import Any, cast
 
 from network_generation.model.python.nr_cell_du import NrCellDu
@@ -70,6 +71,7 @@ class ORanRu(ORanNode):
         )
         self._cells: list[NrCellDu] = self._create_cells()
         name: str = self.name.replace("RU", "DU")
+        self.type = "ntsim-ng-o-ru"
 
         o_ran_du_data: dict[str, Any] = {
             "name": name,
@@ -185,3 +187,12 @@ class ORanRu(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        self.oRanDu.to_directory(parent_dir)
+        parent_path = os.path.join(parent_dir, self.type)
+        path = os.path.join(parent_path, self.name)
+        if not os.path.exists(parent_path):
+            os.makedirs(parent_path, exist_ok=True)
+        if not os.path.exists(path):
+            os.mkdir(path)
index 9308291..d9a7e9a 100644 (file)
@@ -153,3 +153,7 @@ class ORanSmo(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("not-implemented-yet-TODO")
+
+    def to_directory(self, parent_dir: str) -> None:
+        for ric in self.o_ran_near_rt_rics:
+            ric.to_directory(parent_dir)
index dd1eb70..2aae0b3 100644 (file)
@@ -154,3 +154,7 @@ class Tower(ORanNode):
 
     def toSvg(self) -> ET.Element:
         return ET.Element("to-be-implemented")
+
+    def to_directory(self, parent_dir: str) -> None:
+        for o_ran_ru in self.o_ran_rus:
+            o_ran_ru.to_directory(parent_dir)
index b55b476..750a661 100644 (file)
@@ -58,6 +58,13 @@ class NetworkViewer:
         """
         print(self.__network)
 
+    def to_directory(self, parent_dir: str) -> None:
+        """
+        Method converting the network to a subdirectory file structure
+        """
+        self.__network.to_directory(parent_dir)
+        print(f'Directory structure saved to "{parent_dir}"')
+
     def save(self, filename: str, compressed: bool = True) -> None:
         """
         Method saving the class content to a file in json format.