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