Pratyush Desai
c944c58f22
while it works to launch, stop and remove containers, fixing strings and func and var names is yet to be done Signed-off-by: Pratyush Desai <pratyush.desai@liberta.casa>
69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
from django.contrib import admin
|
|
from .models import Game, Server
|
|
from .utils import launch_docker_container, stop_docker_container, remove_docker_container
|
|
import podman
|
|
|
|
@admin.register(Game)
|
|
class GameAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'genre')
|
|
search_fields = ('name', 'genre')
|
|
ordering = ('name',)
|
|
|
|
@admin.action(description='Launch Docker Container')
|
|
def launch_container(modeladmin, request, queryset):
|
|
client = podman.PodmanClient(base_url="unix:///run/user/1000/podman/podman.sock")
|
|
for server in queryset:
|
|
container_name = f"{server.game.name}_{server.ip_address}_{server.port}"
|
|
try:
|
|
# Ensure the command is passed as a list of strings
|
|
command = server.get_docker_run_command().split() if server.docker_run_command else []
|
|
|
|
container = client.containers.run(
|
|
server.docker_image,
|
|
detach=True,
|
|
name=container_name,
|
|
command=command,
|
|
ports={f"{server.port}/tcp": server.port},
|
|
remove=True, # Automatically remove on stop
|
|
)
|
|
server.sync_status()
|
|
modeladmin.message_user(request, f"Container launched: {container.id}")
|
|
except Exception as e:
|
|
modeladmin.message_user(request, f"Failed to launch {server}: {e}", level="error")
|
|
|
|
@admin.action(description='Stop Docker Container')
|
|
def stop_container(modeladmin, request, queryset):
|
|
for server in queryset:
|
|
container_name = f"{server.game.name}_{server.ip_address}_{server.port}"
|
|
result = stop_docker_container(container_name)
|
|
server.sync_status()
|
|
modeladmin.message_user(request, f"Stop container result for {server}: {result}")
|
|
|
|
@admin.action(description='Remove Docker Container')
|
|
def remove_container(modeladmin, request, queryset):
|
|
for server in queryset:
|
|
container_name = f"{server.game.name}_{server.ip_address}_{server.port}"
|
|
result = remove_docker_container(container_name)
|
|
server.sync_status()
|
|
modeladmin.message_user(request, f"Remove container result for {server}: {result}")
|
|
|
|
@admin.register(Server)
|
|
class ServerAdmin(admin.ModelAdmin):
|
|
list_display = ('game', 'name', 'ip_address', 'port', 'status', 'docker_image', 'docker_run_command', 'command_args')
|
|
search_fields = ('game__name', 'ip_address', 'port')
|
|
|
|
def save_model(self, request, obj, form, change):
|
|
super().save_model(request, obj, form, change)
|
|
|
|
def get_queryset(self, request):
|
|
"""Sync status of all servers before rendering the admin list view."""
|
|
queryset = super().get_queryset(request)
|
|
for server in queryset:
|
|
server.sync_status()
|
|
return queryset
|
|
|
|
list_filter = ('status', 'game')
|
|
search_fields = ('ip_address', 'game__name', 'docker_image')
|
|
ordering = ('game', 'ip_address')
|
|
actions = [launch_container, stop_container, remove_container]
|