forked from 3wordchant/capsul-flask
97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
import re
|
|
|
|
from flask import current_app, Flask
|
|
from typing import List
|
|
from threading import Lock
|
|
|
|
class OnlineHost:
|
|
def __init__(self, id: str, url: str):
|
|
self.id = id
|
|
self.url = url
|
|
|
|
# I decided to just use dict everywhere instead because I have to use dict to read it from json
|
|
# class SSHHostKey:
|
|
# def __init__(self, key_type=None, content=None, sha256=None):
|
|
# self.key_type = key_type
|
|
# self.content = content
|
|
# self.sha256 = sha256
|
|
|
|
class VirtualMachine:
|
|
def __init__(self, id, host, ipv4=None, ipv6=None, state="unknown", ssh_host_keys: List[dict] = list()):
|
|
self.id = id
|
|
self.host = host
|
|
self.ipv4 = ipv4
|
|
self.ipv6 = ipv6
|
|
self.state = state
|
|
self.ssh_host_keys = ssh_host_keys
|
|
|
|
class VirtualizationInterface:
|
|
def capacity_avaliable(self, additional_ram_bytes: int) -> bool:
|
|
pass
|
|
|
|
def get(self, id: str) -> VirtualMachine:
|
|
pass
|
|
|
|
def list_ids(self) -> list:
|
|
pass
|
|
|
|
def create(self, email: str, id: str, template_image_file_name: str, vcpus: int, memory: int, ssh_authorized_keys: list):
|
|
pass
|
|
|
|
def destroy(self, email: str, id: str):
|
|
pass
|
|
|
|
def vm_state_command(self, email: str, id: str, command: str):
|
|
pass
|
|
|
|
def validate_capsul_id(id):
|
|
if not re.match(r"^(cvm|capsul)-[a-z0-9]{10}$", id):
|
|
raise ValueError(f"vm id \"{id}\" must match \"^capsul-[a-z0-9]{{10}}$\"")
|
|
|
|
def authorized_as_hub(headers):
|
|
if headers.get('Authorization'):
|
|
auth_header_value = headers.get('Authorization').replace("Bearer ", "")
|
|
return auth_header_value == current_app.config["HUB_TOKEN"]
|
|
return False
|
|
|
|
def my_exec_info_message(exec_info):
|
|
return "{}: {}".format(".".join([exec_info[0].__module__, exec_info[0].__name__]), exec_info[1])
|
|
|
|
|
|
|
|
|
|
mylog_current_test_id_container = {
|
|
'value': '',
|
|
'mutex': Lock()
|
|
}
|
|
def set_mylog_test_id(test_id):
|
|
mylog_current_test_id_container['value'] = ".".join(test_id.split(".")[-2:])
|
|
|
|
|
|
def log_output_for_tests(app: Flask, message: str):
|
|
if app.config['TESTING'] and mylog_current_test_id_container['value'] != "":
|
|
mylog_current_test_id_container['mutex'].acquire()
|
|
file_object = open('unittest-log-output.log', 'a')
|
|
file_object.write(f"{mylog_current_test_id_container['value']}: {message}\n")
|
|
file_object.close()
|
|
mylog_current_test_id_container['mutex'].release()
|
|
|
|
def mylog_debug(app: Flask, message: str):
|
|
log_output_for_tests(app, f"DEBUG: {message}")
|
|
app.logger.debug(message)
|
|
|
|
def mylog_info(app: Flask, message: str):
|
|
log_output_for_tests(app, f"INFO: {message}")
|
|
app.logger.info(message)
|
|
|
|
def mylog_warning(app: Flask, message: str):
|
|
log_output_for_tests(app, f"WARNING: {message}")
|
|
app.logger.warning(message)
|
|
|
|
def mylog_error(app: Flask, message: str):
|
|
log_output_for_tests(app, f"ERROR: {message}")
|
|
app.logger.error(message)
|
|
|
|
def mylog_critical(app: Flask, message: str):
|
|
log_output_for_tests(app, f"CRITICAL: {message}")
|
|
app.logger.critical(message) |