diff --git a/requirements.txt b/requirements.txt index ff9c766..76cc36b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,19 @@ +black==26.3.1 blinker==1.9.0 +certifi==2026.2.25 +charset-normalizer==3.4.6 click==8.3.1 +docker==7.1.0 Flask==3.1.3 +idna==3.11 itsdangerous==2.2.0 Jinja2==3.1.6 MarkupSafe==3.0.3 +mypy_extensions==1.1.0 +packaging==26.0 +pathspec==1.0.4 +platformdirs==4.9.4 +pytokens==0.4.1 +requests==2.33.0 +urllib3==2.6.3 Werkzeug==3.1.6 diff --git a/src/container_managment.py b/src/container_managment.py new file mode 100644 index 0000000..b4a8366 --- /dev/null +++ b/src/container_managment.py @@ -0,0 +1,31 @@ +import docker + + +def start_container(table_name, prefix): + client = docker.from_env() + + router_key = "traefik.http.routers.{table_name}.rule".format(table_name=table_name) + middleware_key = ( + "traefik.http.middlewares.{table_name}-stripprefix.stripprefix.prefixes".format( + table_name=table_name + ) + ) + middleware_router_key = "traefik.http.routers.{table_name}.middlewares".format( + table_name=table_name + ) + + labels = {} + labels[router_key] = "Host(`localhost`) && PathPrefix(`/{prefix}`)".format(prefix=prefix) + labels[middleware_key] = "/{prefix}".format(prefix=prefix) + labels[middleware_router_key] = "{table_name}-stripprefix".format(table_name=table_name) + + container = client.containers.run( + image="crccheck/hello-world", detach=True, labels=labels, ports={8000:8000} + ) + + return container.id + +def stop_container(docker_id): + client = docker.from_env() + container = client.containers.get(docker_id) + container.kill() diff --git a/src/game_tables.py b/src/game_tables.py index d7a0e66..ded39fb 100644 --- a/src/game_tables.py +++ b/src/game_tables.py @@ -3,6 +3,7 @@ class GameTable: _game_table_name: str _game_table_link: str _active: bool + _docker_id: str _created: bool _updated: bool @@ -12,6 +13,7 @@ class GameTable: game_table_name: str, game_table_link: str, active: bool, + docker_id: int, created: bool = False, updated: bool = False, ): @@ -19,6 +21,7 @@ class GameTable: self._game_table_name = game_table_name self._game_table_link = game_table_link self._active = active + self._docker_id = docker_id self._created = created self._updated = updated @@ -30,17 +33,21 @@ class GameTable: "active": self._active, } - def commit(self, cursor): + def commit(self, app, cursor): + app.logger.info(self._created) + app.logger.info(self._updated) + app.logger.info(self._docker_id) if not self._created: cursor.execute( """INSERT INTO game_tables - (game_table_id, game_table_name, game_table_link, active) - VALUES (?, ?, ?, ?)""", + (game_table_id, game_table_name, game_table_link, active, docker_id) + VALUES (?, ?, ?, ?, ?)""", ( self._game_table_id, self._game_table_name, self._game_table_link, self._active, + self._docker_id, ), ) self._created = True @@ -49,12 +56,13 @@ class GameTable: if not self._updated: cursor.execute( """UPDATE game_tables - SET game_table_name = ?, game_table_link = ?, active = ? + SET game_table_name = ?, game_table_link = ?, active = ?, docker_id = ? WHERE game_table_id = ?""", ( self._game_table_name, self._game_table_link, self._active, + self._docker_id, self._game_table_id, ), ) @@ -70,6 +78,15 @@ class GameTable: self._updated = False self._game_table_id = game_table_id + @property + def game_table_name(self): + return self._game_table_name + + @game_table_name.setter + def game_table_name(self, game_table_name: str): + self._updated = False + self._game_table_name = game_table_name + @property def active(self): return self._active @@ -79,10 +96,19 @@ class GameTable: self._updated = False self._active = active + @property + def docker_id(self): + return self._docker_id + + @docker_id.setter + def docker_id(self, docker_id: int): + self._upadted = False + self._docker_id = docker_id + def read_by_id(game_table_id, cursor): rows = cursor.execute( - """SELECT game_table_id, game_table_name, game_table_link, active + """SELECT game_table_id, game_table_name, game_table_link, active, docker_id FROM game_tables WHERE game_table_id = ?""", (game_table_id,), @@ -91,18 +117,18 @@ def read_by_id(game_table_id, cursor): if len(rows) == 0: return None - return GameTable(rows[0], rows[1], rows[2], rows[3], True, True) + return GameTable(rows[0], rows[1], rows[2], rows[3], rows[4], True, True) def read_all(cursor): rows = cursor.execute( - "SELECT game_table_id, game_table_name, game_table_link, active FROM game_tables" + "SELECT game_table_id, game_table_name, game_table_link, active, docker_id FROM game_tables" ).fetchall() - return [GameTable(row[0], row[1], row[2], row[3], True, True) for row in rows] + return [GameTable(row[0], row[1], row[2], row[3], row[4], True, True) for row in rows] def read_active(cursor): rows = cursor.execute( - "SELECT game_table_id, game_table_name, game_table_link, active FROM game_tables WHERE active != 0" + "SELECT game_table_id, game_table_name, game_table_link, active, docker_id FROM game_tables WHERE active != 0" ).fetchall() - return [GameTable(row[0], row[1], row[2], row[3], True, True) for row in rows] + return [GameTable(row[0], row[1], row[2], row[3], row[4],True, True) for row in rows] diff --git a/src/main.py b/src/main.py index 15b3ce9..3b02e3c 100644 --- a/src/main.py +++ b/src/main.py @@ -2,6 +2,7 @@ from flask import Flask, g, jsonify, request import sqlite3 import game_tables import key_tables +import container_managment app = Flask(__name__) @@ -82,8 +83,12 @@ def activate_table(table_id): keys[0].reserve(table.game_table_id) table.active = True + table.docker_id = container_managment.start_container( + table.game_table_name, "test_table_1" + ) + app.logger.info(table.docker_id) keys[0].commit(cursor) - table.commit(cursor) + table.commit(app, cursor) cursor.close() db.commit() return jsonify(table.toJson()) @@ -105,7 +110,10 @@ def deactivate_table(table_id): key.release() key.commit(cursor) - table.commit(cursor) + table.commit(app, cursor) + app.logger.info(table.docker_id) + container_managment.stop_container(table.docker_id) + cursor.close() db.commit() return jsonify(table.toJson())