Initial adg_control
Only implements database creation, system creation, normal resources, and platehotels
This commit is contained in:
		
						commit
						c776582b41
					
				| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					# Tokens!
 | 
				
			||||||
 | 
					token
 | 
				
			||||||
 | 
					.token
 | 
				
			||||||
 | 
					.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ADG itself
 | 
				
			||||||
 | 
					AutoDatabaseGenerator/
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,134 @@
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					from itertools import dropwhile, takewhile
 | 
				
			||||||
 | 
					from enum import StrEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADG_EXE = "HRB.Tools.CRA.CommandLine.exe"
 | 
				
			||||||
 | 
					ADG_DIR = "AutoDatabaseGenerator"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StorageType(StrEnum):
 | 
				
			||||||
 | 
					    RANDOM = "random",
 | 
				
			||||||
 | 
					    SERIAL = "serial"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AdgClient:
 | 
				
			||||||
 | 
					    def __init__(self, adg_exe: str, adg_dir: str):
 | 
				
			||||||
 | 
					        self.adg_exe = adg_exe
 | 
				
			||||||
 | 
					        self.adg_dir = adg_dir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _run(self, args: list[str]):
 | 
				
			||||||
 | 
					        return subprocess.run(["./"+self.adg_exe, *args],
 | 
				
			||||||
 | 
					                              cwd=self.adg_dir, capture_output=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_system_name(self, name: str):
 | 
				
			||||||
 | 
					        self.system_name = name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_databases(self):
 | 
				
			||||||
 | 
					        res = self._run(["ld"])
 | 
				
			||||||
 | 
					        if res.returncode > 0:
 | 
				
			||||||
 | 
					            raise Exception("Failed to get databases")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res_lines = iter(str(res.stdout, encoding="utf-8").splitlines())
 | 
				
			||||||
 | 
					        skip_header = dropwhile(lambda x: "Started" not in x, res_lines)
 | 
				
			||||||
 | 
					        next(skip_header)  # Advance to one positon past the header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        skip_footer = takewhile(lambda x: "Completed" not in x, skip_header)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return [x.replace("INFO|", "") for x in skip_footer]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create_database(self, name: str):
 | 
				
			||||||
 | 
					        res = self._run(["ccdb", "-u system", "-p oracle", f"-d {name}"])
 | 
				
			||||||
 | 
					        if res.returncode > 0:
 | 
				
			||||||
 | 
					            raise Exception("Failed to create database")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create_system(self, name: str = "", switch_ip: str = "",
 | 
				
			||||||
 | 
					                      host_name: str = ""):
 | 
				
			||||||
 | 
					        if not name:
 | 
				
			||||||
 | 
					            name = self.system_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        extra_args = []
 | 
				
			||||||
 | 
					        if switch_ip:
 | 
				
			||||||
 | 
					            extra_args.append(f"-a {switch_ip}")
 | 
				
			||||||
 | 
					        if host_name:
 | 
				
			||||||
 | 
					            extra_args.append(f"-h {host_name}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res = self._run(["csd",
 | 
				
			||||||
 | 
					                         f"-n {name}",
 | 
				
			||||||
 | 
					                         f"-d {name}",
 | 
				
			||||||
 | 
					                         *extra_args])
 | 
				
			||||||
 | 
					        if res.returncode > 0:
 | 
				
			||||||
 | 
					            raise Exception("Failed to create system")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create_normal_resource(self, name: str,
 | 
				
			||||||
 | 
					                               location: int, envelope: int,
 | 
				
			||||||
 | 
					                               driver_path: str, package_path: str = "",
 | 
				
			||||||
 | 
					                               driver_description: str = "",
 | 
				
			||||||
 | 
					                               connection_parameters: str = "",
 | 
				
			||||||
 | 
					                               system: str = ""):
 | 
				
			||||||
 | 
					        if not (package_path or driver_description):
 | 
				
			||||||
 | 
					            raise Exception(
 | 
				
			||||||
 | 
					                "Either package path or driver description must be passed")
 | 
				
			||||||
 | 
					        if package_path and driver_description:
 | 
				
			||||||
 | 
					            raise Exception(
 | 
				
			||||||
 | 
					                "Package path and driver description are mutually exclusive")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not system:
 | 
				
			||||||
 | 
					            system = self.system_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        extra_args = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if package_path:
 | 
				
			||||||
 | 
					            extra_args.append(f"-p {package_path}")
 | 
				
			||||||
 | 
					        elif driver_description:
 | 
				
			||||||
 | 
					            extra_args.append(f"-r {driver_description}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if connection_parameters:
 | 
				
			||||||
 | 
					            extra_args.append(f"-c {connection_parameters}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res = self._run(["cnr",
 | 
				
			||||||
 | 
					                         f"-s {system}",
 | 
				
			||||||
 | 
					                         f"-n {name}",
 | 
				
			||||||
 | 
					                         f"-l {location}",
 | 
				
			||||||
 | 
					                         f"-e {envelope}",
 | 
				
			||||||
 | 
					                         f"-d {driver_path}", *extra_args])
 | 
				
			||||||
 | 
					        if res.returncode > 0:
 | 
				
			||||||
 | 
					            raise Exception("Failed to add resource")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create_platehotel(self, name: str,
 | 
				
			||||||
 | 
					                          location: int, envelope: int,
 | 
				
			||||||
 | 
					                          system: str = "",
 | 
				
			||||||
 | 
					                          rows: int = -1,
 | 
				
			||||||
 | 
					                          type: StorageType = None):
 | 
				
			||||||
 | 
					        if not system:
 | 
				
			||||||
 | 
					            system = self.system_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res = self._run(["csr",
 | 
				
			||||||
 | 
					                         f"-s {system}",
 | 
				
			||||||
 | 
					                         f"-n {name}",
 | 
				
			||||||
 | 
					                         f"-l {location}",
 | 
				
			||||||
 | 
					                         f"-e {envelope}",
 | 
				
			||||||
 | 
					                         "-p platehotel"])
 | 
				
			||||||
 | 
					        if res.returncode > 0:
 | 
				
			||||||
 | 
					            raise Exception("Failed to create platehotel")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if type and rows > 0:
 | 
				
			||||||
 | 
					            storage_res = self._run(["crs",
 | 
				
			||||||
 | 
					                                     f"-s {system}",
 | 
				
			||||||
 | 
					                                     f"-n {name}",
 | 
				
			||||||
 | 
					                                     f"-r {rows}",
 | 
				
			||||||
 | 
					                                     f"-t {type}"])
 | 
				
			||||||
 | 
					            if storage_res.returncode > 0:
 | 
				
			||||||
 | 
					                raise Exception("Failed to add storage to platehotel")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _create_unique_database_name(self, prefix: str) -> str:
 | 
				
			||||||
 | 
					        MAX_ATTEMPTS = 100
 | 
				
			||||||
 | 
					        databases = self.get_databases()
 | 
				
			||||||
 | 
					        for i in range(1, MAX_ATTEMPTS):
 | 
				
			||||||
 | 
					            potential = f"{prefix}{i}"
 | 
				
			||||||
 | 
					            if potential not in databases:
 | 
				
			||||||
 | 
					                return potential
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create_unique_database(self, prefix: str) -> str:
 | 
				
			||||||
 | 
					        name = self._create_unique_database_name(prefix)
 | 
				
			||||||
 | 
					        self.create_database(name)
 | 
				
			||||||
 | 
					        return name
 | 
				
			||||||
		Loading…
	
		Reference in New Issue