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