diff --git a/tests/test_server.py b/tests/test_server.py index bffacdf..c1256a3 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -14,7 +14,6 @@ from wilfred.api.servers import Servers from wilfred.docker_conn import docker_client from wilfred.api.server_config import ServerConfig -from wilfred.database import Server, EnvironmentVariable, session from wilfred.api.config_parser import Config config = Config() @@ -33,36 +32,24 @@ def test_create_server(): # create - server = Server( + server = servers.create( id="test", name="test", image_uid="minecraft-paper", memory="1024", port="25565", - custom_startup=None, - status="installing", + environment_variables=[ + {"variable": "MINECRAFT_VERSION", "value": "latest"}, + {"variable": "EULA_ACCEPTANCE", "value": "true"}, + ], ) - session.add(server) - session.commit() - - minecraft_version = EnvironmentVariable( - server_id=server.id, variable="MINECRAFT_VERSION", value="latest" - ) - - eula_acceptance = EnvironmentVariable( - server_id=server.id, variable="EULA_ACCEPTANCE", value="true" - ) - - session.add(minecraft_version) - session.add(eula_acceptance) - session.commit() servers.install(server, skip_wait=False) servers.sync() def test_start_server(): - server = session.query(Server).filter_by(id="test").first() + server = servers.query(name="test") if server.status == "installing": raise Exception("server is installing") @@ -72,7 +59,7 @@ def test_start_server(): def test_pseudo_config_write(): - server = session.query(Server).filter_by(id="test").first() + server = servers.query(name="test") image = images.get_image(server.image_uid) @@ -87,5 +74,5 @@ def test_pseudo_config_write(): def test_delete_server(): - server = session.query(Server).filter_by(id="test").first() + server = servers.query(name="test") servers.remove(server) diff --git a/wilfred/api/config_parser.py b/wilfred/api/config_parser.py index 3ea438e..1240b83 100644 --- a/wilfred/api/config_parser.py +++ b/wilfred/api/config_parser.py @@ -14,7 +14,7 @@ from os.path import isfile, isdir from pathlib import Path -from wilfred.errors import WilfredException, ParseError, WriteError +from wilfred.api.errors import WilfredException, ParseError, WriteError API_VERSION = 1 diff --git a/wilfred/database.py b/wilfred/api/database.py similarity index 100% rename from wilfred/database.py rename to wilfred/api/database.py diff --git a/wilfred/errors.py b/wilfred/api/errors.py similarity index 100% rename from wilfred/errors.py rename to wilfred/api/errors.py diff --git a/wilfred/api/images.py b/wilfred/api/images.py index 0e31717..c1610a4 100644 --- a/wilfred/api/images.py +++ b/wilfred/api/images.py @@ -20,7 +20,7 @@ from copy import deepcopy from datetime import datetime, timedelta -from wilfred.errors import WilfredException, ReadError, ParseError +from wilfred.api.errors import WilfredException, ReadError, ParseError from wilfred.version import version API_VERSION = 2 diff --git a/wilfred/api/server_config.py b/wilfred/api/server_config.py index 8d2b8e6..122ac54 100644 --- a/wilfred/api/server_config.py +++ b/wilfred/api/server_config.py @@ -13,7 +13,7 @@ from tabulate import tabulate from wilfred.container_variables import ContainerVariables -from wilfred.errors import WilfredException, ParseError, WriteError +from wilfred.api.errors import WilfredException, ParseError, WriteError from wilfred.api.parser.properties import properties_read, properties_write from wilfred.api.parser.yaml import yaml_read, yaml_write diff --git a/wilfred/api/servers.py b/wilfred/api/servers.py index d7b1eeb..52f9039 100644 --- a/wilfred/api/servers.py +++ b/wilfred/api/servers.py @@ -20,17 +20,22 @@ from subprocess import call from sqlalchemy import inspect -from wilfred.database import session, Server, EnvironmentVariable, Port +from wilfred.api.database import session, Server, EnvironmentVariable, Port from wilfred.keyboard import KeyboardThread from wilfred.container_variables import ContainerVariables from wilfred.api.images import Images -from wilfred.errors import WilfredException, WriteError +from wilfred.api.errors import WilfredException, WriteError +from wilfred.core import random_string class ServerNotRunning(WilfredException): """Server is not running""" +class ServerNotFound(WilfredException): + """Specified server was not found""" + + class Servers(object): def __init__( self, docker_client: docker.DockerClient, configuration: dict, images: Images @@ -161,7 +166,7 @@ def remove(self, server: Server): Removes specified server Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object """ path = f"{self._configuration['data_path']}/{server.name}_{server.id}" @@ -192,7 +197,7 @@ def console(self, server: Server, disable_user_input=False): Enters server console Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object disable_user_input (bool): Blocks user input if `True`. By default this is `False`. Raises: @@ -218,12 +223,82 @@ def console(self, server: Server, disable_user_input=False): except docker.errors.NotFound: raise ServerNotRunning(f"server {server.id} is not running") + def create( + self, + name, + image_uid, + memory, + port, + custom_startup=None, + environment_variables=[], + id=None, + ): + """ + Creates a new server + + Args: + name (str): Name of new server + image_uid (str): UID of server image to use + memory (int): Memory to configure server with (in megabytes, i.e. 1024) + port (int): Port server should listen to + custom_startup (str, optional): Optional custom startup command (by default uses image command) + environment_variables (:obj:`list` of :obj:`dict`, optional): Optional list of environment variables + id (str, optional): Override generating random string as id by specifying it here + + Returns: + wilfred.api.database.Server: Server database object of newly created server + """ + + server = Server(id=random_string() if not id else id) + + server.name = name + server.image_uid = image_uid + server.memory = memory + server.port = port + server.custom_startup = custom_startup + server.status = "installing" + + # commit changes to database + session.add(server) + session.commit() + + for environment_variable in environment_variables: + session.add( + EnvironmentVariable( + server_id=server.id, + variable=environment_variable["variable"], + value=environment_variable["value"], + ) + ) + + session.commit() + + return server + + def query(self, name): + """ + Returns :class:`wilfred.api.database.Server` object of specified server + + Args: + name (str): Name of server to query for + + Returns: + wilfred.api.database.Server: Server database object of specified server + """ + + server = session.query(Server).filter_by(name=name.lower()).first() + + if not server: + raise ServerNotFound(f"Could not find server by name {name}") + + return server + def install(self, server: Server, skip_wait=False, spinner=None): """ Performs installation Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object skip_wait (bool): Doesn't stall while waiting for server installation to complete if `True`. spinner (Halo): If `Halo` spinner object is defined, will then write and perform actions to it. @@ -288,7 +363,7 @@ def kill(self, server): Kills server container Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object Raises: :py:class:`ServerNotRunning` @@ -307,7 +382,7 @@ def rename(self, server, name): Renames server and moves server folder Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object name (str): New name of the server Raises: @@ -339,7 +414,7 @@ def command(self, server, command): Sends command to server console Args: - server (wilfred.database.Server): Server database object + server (wilfred.api.database.Server): Server database object command (str): The command to send to the stdin of the server Raises: diff --git a/wilfred/container_variables.py b/wilfred/container_variables.py index f60a28b..acb74b7 100644 --- a/wilfred/container_variables.py +++ b/wilfred/container_variables.py @@ -8,7 +8,7 @@ # # ################################################################# -from wilfred.database import session, EnvironmentVariable +from wilfred.api.database import session, EnvironmentVariable class ContainerVariables(object): diff --git a/wilfred/migrate.py b/wilfred/migrate.py index ee40199..40d8e91 100644 --- a/wilfred/migrate.py +++ b/wilfred/migrate.py @@ -16,7 +16,7 @@ from os import remove from wilfred.message_handler import error -from wilfred.database import session, Server, EnvironmentVariable +from wilfred.api.database import session, Server, EnvironmentVariable class Migrate: diff --git a/wilfred/wilfred.py b/wilfred/wilfred.py index c4d39ce..05b0528 100755 --- a/wilfred/wilfred.py +++ b/wilfred/wilfred.py @@ -27,7 +27,13 @@ from wilfred.docker_conn import docker_client from wilfred.version import version, commit_hash, commit_date from wilfred.api.config_parser import Config, NoConfiguration -from wilfred.database import session, database_path, Server, EnvironmentVariable, Port +from wilfred.api.database import ( + session, + database_path, + Server, + EnvironmentVariable, + Port, +) from wilfred.api.servers import Servers from wilfred.api.images import Images, ImageAPIMismatch, ImagesOutdated from wilfred.message_handler import warning, error, ui_exception