WIP
This commit is contained in:
parent
2662f0cf4e
commit
9075f4c538
BIN
database.db
BIN
database.db
Binary file not shown.
103
fleetcontrol
103
fleetcontrol
@ -1,11 +1,110 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
from network.communication import Server
|
from network.communication import Server
|
||||||
|
from utils.database.database import Database
|
||||||
from utils.config.config import ServerConfig
|
from utils.config.config import ServerConfig
|
||||||
|
from utils.models.models import VMImage
|
||||||
|
from utils.tools.tools import md5
|
||||||
|
import logging
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
config = ServerConfig()
|
config = ServerConfig()
|
||||||
server = Server(host=config.server_host, port=config.server_port, name=config.server_name, access_password=config.server_password,
|
logger = logging.getLogger(__name__)
|
||||||
access_username=config.server_access_username, jwt_secret=config.jwt_secret, version="v0.0.1alpha", database_file_path=config.database_file, logging_level=config.server_loglevel)
|
log_level_mapping_dict = {
|
||||||
|
"NOTSET": 0,
|
||||||
|
"DEBUG": 10,
|
||||||
|
"INFO": 20,
|
||||||
|
"WARNING": 30,
|
||||||
|
"ERROR": 40,
|
||||||
|
"CRITICAL": 50,
|
||||||
|
}
|
||||||
|
logger.setLevel(log_level_mapping_dict[config.server_loglevel])
|
||||||
|
logger = logging.getLogger()
|
||||||
|
logger.setLevel
|
||||||
|
|
||||||
|
|
||||||
|
def run_server():
|
||||||
|
server = Server(
|
||||||
|
host=config.server_host,
|
||||||
|
port=config.server_port,
|
||||||
|
name=config.server_name,
|
||||||
|
access_password=config.server_password,
|
||||||
|
access_username=config.server_access_username,
|
||||||
|
jwt_secret=config.jwt_secret,
|
||||||
|
version="v0.0.1alpha",
|
||||||
|
database_file_path=config.database_file,
|
||||||
|
logging_level=config.server_loglevel,
|
||||||
|
)
|
||||||
|
logger.info(
|
||||||
|
f"Running server on host: {config.server_host}, port: {config.server_port}, server name: {config.server_name}"
|
||||||
|
)
|
||||||
|
|
||||||
server.run()
|
server.run()
|
||||||
|
|
||||||
|
|
||||||
|
def add_image(image_name: str, image_file: str, image_version: str):
|
||||||
|
try:
|
||||||
|
new_image_hash = md5(image_file)
|
||||||
|
new_image_object = VMImage(
|
||||||
|
image_name=image_name,
|
||||||
|
image_file=image_file,
|
||||||
|
image_version=image_version,
|
||||||
|
image_hash=new_image_hash,
|
||||||
|
image_name_version_combo=f"{image_name}@{image_version}",
|
||||||
|
)
|
||||||
|
db = Database(config.database_file, config.server_loglevel)
|
||||||
|
db.add_image(new_image_object)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.error(f"Error adding image to the database: {str(ex)}")
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
|
||||||
|
def assign_image(image_name: str, image_version: str, client_mac_address: str):
|
||||||
|
try:
|
||||||
|
db = Database(config.database_file, config.server_loglevel)
|
||||||
|
db.assign_image_to_client(client_mac_address=client_mac_address, image_name_version_combo=f"{image_name}@{image_version}")
|
||||||
|
except Exception as ex:
|
||||||
|
logger.error(f"Error assigning image to a client: {str(ex)}")
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
prog="fleetcontrol",
|
||||||
|
description="Server and configuration utility for orchestrating VM machine clients",
|
||||||
|
)
|
||||||
|
|
||||||
|
function_mapper = {
|
||||||
|
"run": run_server,
|
||||||
|
"add_image": add_image,
|
||||||
|
"assign_image": assign_image,
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.add_argument("command", choices=function_mapper)
|
||||||
|
|
||||||
|
parser.add_argument("--image-name", action="store")
|
||||||
|
parser.add_argument("--image-filepath", action="store")
|
||||||
|
parser.add_argument("--image-version", action="store")
|
||||||
|
parser.add_argument("--mac-address", action="store")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
fun = function_mapper[args.command]
|
||||||
|
|
||||||
|
if "add_image" == args.command:
|
||||||
|
fun(
|
||||||
|
image_name=args.image_name,
|
||||||
|
image_file=args.image_filepath,
|
||||||
|
image_version=args.image_version,
|
||||||
|
)
|
||||||
|
elif "assign_image" == args.command:
|
||||||
|
fun(
|
||||||
|
image_name=args.image_name,
|
||||||
|
image_version=args.image_version,
|
||||||
|
client_mac_address=args.mac_address,
|
||||||
|
)
|
||||||
|
elif "run" == args.command:
|
||||||
|
fun()
|
||||||
|
else:
|
||||||
|
logger.error(f"Invalid operand: {args.command}")
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
# vi: ft=python
|
# vi: ft=python
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
from utils.database.database import Database
|
from utils.database.database import Database
|
||||||
|
from utils.config.config import ServerConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# vi: ft=python
|
# vi: ft=python
|
||||||
|
Binary file not shown.
Binary file not shown.
0
temp_file.qcow2
Normal file
0
temp_file.qcow2
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -49,7 +49,7 @@ class Database:
|
|||||||
try:
|
try:
|
||||||
with session.begin():
|
with session.begin():
|
||||||
result = session.query(
|
result = session.query(
|
||||||
Client, mac_address=mac_address).first()
|
Client).filter(Client.mac_address==mac_address).first()
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
self.logger.warn(f"Error getting client by mac address: {ex}")
|
self.logger.warn(f"Error getting client by mac address: {ex}")
|
||||||
return result
|
return result
|
||||||
@ -143,6 +143,17 @@ class Database:
|
|||||||
self.logger.error(
|
self.logger.error(
|
||||||
f"Error getting list of images from database: {ex}")
|
f"Error getting list of images from database: {ex}")
|
||||||
|
|
||||||
|
def get_image_by_name_version_string(self, image_name_version_string: str) -> list[VMImage]:
|
||||||
|
try:
|
||||||
|
session = self.Session()
|
||||||
|
with session.begin():
|
||||||
|
response = session.query(
|
||||||
|
VMImage).filter(VMImage.image_name_version_combo==image_name_version_string).first()
|
||||||
|
return response
|
||||||
|
except Exception as ex:
|
||||||
|
self.logger.error(
|
||||||
|
f"Error getting list of images from database: {ex}")
|
||||||
|
|
||||||
def get_image_by_hash(self, image_hash: str) -> list[VMImage]:
|
def get_image_by_hash(self, image_hash: str) -> list[VMImage]:
|
||||||
try:
|
try:
|
||||||
session = self.Session()
|
session = self.Session()
|
||||||
@ -179,6 +190,20 @@ class Database:
|
|||||||
raise DatabaseException(
|
raise DatabaseException(
|
||||||
f"Couldn't modify object in database: {ex}")
|
f"Couldn't modify object in database: {ex}")
|
||||||
|
|
||||||
|
def assign_image_to_client(self, client_mac_address: str, image_name_version_combo: str):
|
||||||
|
try:
|
||||||
|
session = self.Session()
|
||||||
|
with session.begin():
|
||||||
|
client = session.query(Client).filter(Client.mac_address==client_mac_address).first()
|
||||||
|
image = session.query(VMImage).filter(VMImage.image_name_version_combo==image_name_version_combo).first()
|
||||||
|
client.vm_list_on_machine.append(image)
|
||||||
|
session.merge(client)
|
||||||
|
session.flush()
|
||||||
|
session.commit()
|
||||||
|
except Exception as ex:
|
||||||
|
self.logger.error(f"Couldn't add image to client list: {str(ex)}")
|
||||||
|
raise DatabaseException(f"Couldn't add image to client list: {str(ex)}")
|
||||||
|
|
||||||
def add_user(self, new_user: User):
|
def add_user(self, new_user: User):
|
||||||
try:
|
try:
|
||||||
session = self.Session()
|
session = self.Session()
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
utils/tools/__init__.py
Normal file
1
utils/tools/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from . import tools
|
BIN
utils/tools/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
utils/tools/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
utils/tools/__pycache__/tools.cpython-310.pyc
Normal file
BIN
utils/tools/__pycache__/tools.cpython-310.pyc
Normal file
Binary file not shown.
9
utils/tools/tools.py
Normal file
9
utils/tools/tools.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import hashlib
|
||||||
|
|
||||||
|
# from https://stackoverflow.com/questions/3431825/generating-an-md5-checksum-of-a-file
|
||||||
|
def md5(fname):
|
||||||
|
hash_md5 = hashlib.md5()
|
||||||
|
with open(fname, "rb") as f:
|
||||||
|
for chunk in iter(lambda: f.read(4096), b""):
|
||||||
|
hash_md5.update(chunk)
|
||||||
|
return hash_md5.hexdigest()
|
Loading…
Reference in New Issue
Block a user