Add image runtime installation and profile deletion controls
This commit is contained in:
@@ -10,6 +10,7 @@ from catalog import Catalog
|
||||
from profiles import Profiles
|
||||
from capacity import assess, overview
|
||||
from runtime import Runtime
|
||||
from image_runtime import ImageRuntime
|
||||
from image_test import ImageTests
|
||||
from urllib.parse import urlsplit, parse_qs
|
||||
from network.client import NetworkClient
|
||||
@@ -104,6 +105,8 @@ class Server(ThreadingHTTPServer):
|
||||
self.runtime = Runtime(Path(state_dir or os.environ.get("DECK_STATE_DIR", ROOT/".state"))/"runtime")
|
||||
self.profiles = Profiles(self.catalog.root.parent/"profiles.json",self.catalog)
|
||||
self.image_tests = ImageTests(self.catalog.root.parent/"image-tests",self.profiles)
|
||||
self.image_runtime = ImageRuntime(self.catalog.root.parent/"image-runtime")
|
||||
self.image_tests.runtime = self.image_runtime
|
||||
self.profiles.image_runtime_ready=lambda:self.image_tests.status()["runtime_installed"]
|
||||
self.demo = DemoService()
|
||||
self.hardware = HardwareProvider()
|
||||
@@ -274,6 +277,7 @@ class Handler(BaseHTTPRequestHandler):
|
||||
return self.respond((ROOT/name).read_bytes(), mime=mime)
|
||||
if self.path == '/api/v1/status':
|
||||
return self.respond(dict(name='Athena Deck', version='0.6.0', state='ready', uptime_seconds=round(time.time()-self.server.started), mode='isolated', location=os.environ.get('DECK_LOCATION', 'Athena · Debian-Server'), demo=self.server.demo.status()))
|
||||
if self.path == '/api/v1/image-runtime':return self.respond(self.server.image_runtime.status())
|
||||
if self.path == '/api/v1/image-tests':return self.respond(self.server.image_tests.status())
|
||||
if urlsplit(self.path).path == '/api/v1/image-tests/image':
|
||||
try:return self.respond(self.server.image_tests.image(parse_qs(urlsplit(self.path).query).get('id',[''])[0]),mime='image/png')
|
||||
@@ -351,6 +355,16 @@ class Handler(BaseHTTPRequestHandler):
|
||||
raise ValueError('Ungültige Laufzeitaktion.')
|
||||
except ValueError as exc:return self.respond({'error':str(exc)},400)
|
||||
except (OSError, subprocess.SubprocessError):return self.respond({'error':'Laufzeitaktion fehlgeschlagen; Speicher und Werkzeuge prüfen.'},503)
|
||||
if self.path in ('/api/v1/image-runtime/install','/api/v1/image-runtime/cancel'):
|
||||
try:
|
||||
if self.read_json():raise ValueError('Keine Parameter erwartet.')
|
||||
with self.server.image_tests.lock:
|
||||
if self.path.endswith('/cancel'):return self.respond(self.server.image_runtime.stop())
|
||||
job=self.server.image_tests.job
|
||||
if job and job.get('state')=='running':raise ValueError('Zuerst den laufenden Bildauftrag beenden.')
|
||||
return self.respond(self.server.image_runtime.start())
|
||||
except ValueError as exc:return self.respond({'error':str(exc)},400)
|
||||
except OSError:return self.respond({'error':'Installation konnte nicht vorbereitet werden.'},503)
|
||||
if self.path in ('/api/v1/image-tests/start','/api/v1/image-tests/cancel'):
|
||||
try:
|
||||
data=self.read_json()
|
||||
@@ -363,6 +377,15 @@ class Handler(BaseHTTPRequestHandler):
|
||||
try:return self.respond(self.server.profiles.assign(self.read_json()))
|
||||
except ValueError as exc:return self.respond({'error':str(exc)},400)
|
||||
except OSError:return self.respond({'error':'Zuordnung konnte nicht gespeichert werden.'},503)
|
||||
if self.path == '/api/v1/profiles/delete':
|
||||
try:
|
||||
data=self.read_json()
|
||||
with self.server.image_tests.lock:
|
||||
job=self.server.image_tests.job
|
||||
if job and job.get('state')=='running' and job.get('profile_id')==data.get('id'):raise ValueError('Dieses Profil wird gerade ausgeführt. Zuerst den Auftrag beenden.')
|
||||
return self.respond(self.server.profiles.delete(data))
|
||||
except ValueError as exc:return self.respond({'error':str(exc)},400)
|
||||
except OSError:return self.respond({'error':'Profil konnte nicht gelöscht werden.'},503)
|
||||
if self.path == '/api/v1/profiles/save':
|
||||
try:return self.respond(self.server.profiles.save(self.read_json()))
|
||||
except ValueError as exc:return self.respond({'error':str(exc)},400)
|
||||
@@ -416,6 +439,7 @@ def main():
|
||||
try:
|
||||
server.serve_forever()
|
||||
finally:
|
||||
server.image_runtime.stop()
|
||||
server.image_tests.stop()
|
||||
server.runtime.stop()
|
||||
server.catalog.stop()
|
||||
|
||||
Reference in New Issue
Block a user