start / stop docker container on table start / stop
This commit is contained in:
@@ -1,7 +1,19 @@
|
|||||||
|
black==26.3.1
|
||||||
blinker==1.9.0
|
blinker==1.9.0
|
||||||
|
certifi==2026.2.25
|
||||||
|
charset-normalizer==3.4.6
|
||||||
click==8.3.1
|
click==8.3.1
|
||||||
|
docker==7.1.0
|
||||||
Flask==3.1.3
|
Flask==3.1.3
|
||||||
|
idna==3.11
|
||||||
itsdangerous==2.2.0
|
itsdangerous==2.2.0
|
||||||
Jinja2==3.1.6
|
Jinja2==3.1.6
|
||||||
MarkupSafe==3.0.3
|
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
|
Werkzeug==3.1.6
|
||||||
|
|||||||
31
src/container_managment.py
Normal file
31
src/container_managment.py
Normal file
@@ -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()
|
||||||
@@ -3,6 +3,7 @@ class GameTable:
|
|||||||
_game_table_name: str
|
_game_table_name: str
|
||||||
_game_table_link: str
|
_game_table_link: str
|
||||||
_active: bool
|
_active: bool
|
||||||
|
_docker_id: str
|
||||||
_created: bool
|
_created: bool
|
||||||
_updated: bool
|
_updated: bool
|
||||||
|
|
||||||
@@ -12,6 +13,7 @@ class GameTable:
|
|||||||
game_table_name: str,
|
game_table_name: str,
|
||||||
game_table_link: str,
|
game_table_link: str,
|
||||||
active: bool,
|
active: bool,
|
||||||
|
docker_id: int,
|
||||||
created: bool = False,
|
created: bool = False,
|
||||||
updated: bool = False,
|
updated: bool = False,
|
||||||
):
|
):
|
||||||
@@ -19,6 +21,7 @@ class GameTable:
|
|||||||
self._game_table_name = game_table_name
|
self._game_table_name = game_table_name
|
||||||
self._game_table_link = game_table_link
|
self._game_table_link = game_table_link
|
||||||
self._active = active
|
self._active = active
|
||||||
|
self._docker_id = docker_id
|
||||||
self._created = created
|
self._created = created
|
||||||
self._updated = updated
|
self._updated = updated
|
||||||
|
|
||||||
@@ -30,17 +33,21 @@ class GameTable:
|
|||||||
"active": self._active,
|
"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:
|
if not self._created:
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""INSERT INTO game_tables
|
"""INSERT INTO game_tables
|
||||||
(game_table_id, game_table_name, game_table_link, active)
|
(game_table_id, game_table_name, game_table_link, active, docker_id)
|
||||||
VALUES (?, ?, ?, ?)""",
|
VALUES (?, ?, ?, ?, ?)""",
|
||||||
(
|
(
|
||||||
self._game_table_id,
|
self._game_table_id,
|
||||||
self._game_table_name,
|
self._game_table_name,
|
||||||
self._game_table_link,
|
self._game_table_link,
|
||||||
self._active,
|
self._active,
|
||||||
|
self._docker_id,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
self._created = True
|
self._created = True
|
||||||
@@ -49,12 +56,13 @@ class GameTable:
|
|||||||
if not self._updated:
|
if not self._updated:
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""UPDATE game_tables
|
"""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 = ?""",
|
WHERE game_table_id = ?""",
|
||||||
(
|
(
|
||||||
self._game_table_name,
|
self._game_table_name,
|
||||||
self._game_table_link,
|
self._game_table_link,
|
||||||
self._active,
|
self._active,
|
||||||
|
self._docker_id,
|
||||||
self._game_table_id,
|
self._game_table_id,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -70,6 +78,15 @@ class GameTable:
|
|||||||
self._updated = False
|
self._updated = False
|
||||||
self._game_table_id = game_table_id
|
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
|
@property
|
||||||
def active(self):
|
def active(self):
|
||||||
return self._active
|
return self._active
|
||||||
@@ -79,10 +96,19 @@ class GameTable:
|
|||||||
self._updated = False
|
self._updated = False
|
||||||
self._active = active
|
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):
|
def read_by_id(game_table_id, cursor):
|
||||||
rows = cursor.execute(
|
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
|
FROM game_tables
|
||||||
WHERE game_table_id = ?""",
|
WHERE game_table_id = ?""",
|
||||||
(game_table_id,),
|
(game_table_id,),
|
||||||
@@ -91,18 +117,18 @@ def read_by_id(game_table_id, cursor):
|
|||||||
if len(rows) == 0:
|
if len(rows) == 0:
|
||||||
return None
|
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):
|
def read_all(cursor):
|
||||||
rows = cursor.execute(
|
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()
|
).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):
|
def read_active(cursor):
|
||||||
rows = cursor.execute(
|
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()
|
).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]
|
||||||
|
|||||||
12
src/main.py
12
src/main.py
@@ -2,6 +2,7 @@ from flask import Flask, g, jsonify, request
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import game_tables
|
import game_tables
|
||||||
import key_tables
|
import key_tables
|
||||||
|
import container_managment
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
@@ -82,8 +83,12 @@ def activate_table(table_id):
|
|||||||
|
|
||||||
keys[0].reserve(table.game_table_id)
|
keys[0].reserve(table.game_table_id)
|
||||||
table.active = True
|
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)
|
keys[0].commit(cursor)
|
||||||
table.commit(cursor)
|
table.commit(app, cursor)
|
||||||
cursor.close()
|
cursor.close()
|
||||||
db.commit()
|
db.commit()
|
||||||
return jsonify(table.toJson())
|
return jsonify(table.toJson())
|
||||||
@@ -105,7 +110,10 @@ def deactivate_table(table_id):
|
|||||||
key.release()
|
key.release()
|
||||||
key.commit(cursor)
|
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()
|
cursor.close()
|
||||||
db.commit()
|
db.commit()
|
||||||
return jsonify(table.toJson())
|
return jsonify(table.toJson())
|
||||||
|
|||||||
Reference in New Issue
Block a user