diff --git a/panel/src/panel/templates/configuration_form.html b/panel/src/panel/templates/configuration_form.html index 1c33ff3c..bd706195 100644 --- a/panel/src/panel/templates/configuration_form.html +++ b/panel/src/panel/templates/configuration_form.html @@ -4,7 +4,6 @@ {% csrf_token %} {{ form.as_p }} - <button id="deploy-button" class="button" hx-post="{% url 'configuration_form' %}" hx-trigger="click" diff --git a/panel/src/panel/views.py b/panel/src/panel/views.py index 16d29849..75921eeb 100644 --- a/panel/src/panel/views.py +++ b/panel/src/panel/views.py @@ -1,6 +1,7 @@ from enum import Enum import json import subprocess +import os from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin @@ -8,9 +9,10 @@ from django.contrib.auth.models import User from django.views.generic import TemplateView, DetailView from django.views.generic.edit import FormView -from panel import models, settings -from panel.configuration import forms +from time import sleep +from panel import models +from panel.configuration import forms class Index(TemplateView): template_name = 'index.html' @@ -33,53 +35,50 @@ class ConfigurationForm(LoginRequiredMixin, FormView): success_url = reverse_lazy('configuration_form') form_class = forms.Form - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - return context - def get_object(self): """Get or create the configuration object for the current user""" obj, created = models.Configuration.objects.get_or_create( operator=self.request.user, ) - # Check for deploy button - if "deploy" in self.request.POST.keys(): - submission = obj.parsed_value.model_dump_json() - # FIXME: let the user specify these from the form (#190) - dummy_user = { - "initialUser": { - "displayName": "Testy McTestface", - "username": "test", - "password": "testtest", - "email": "test@test.com", - }, - } - # serialize back and forth now we still need to manually inject the dummy user - deployment = json.dumps(dummy_user | json.loads(submission)) - env = { - "PATH": settings.bin_path, - # pass in form info to our deployment - "DEPLOYMENT": deployment, - } - cmd = [ - "nix", - "develop", - # workaround to pass in info to nixops4 thru env vars, tho impure :( - "--extra-experimental-features", - "configurable-impure-env", - "--command", - "nixops4", - "apply", - "test", - ] - subprocess.run( - cmd, - cwd=settings.repo_dir, - env=env, - ) return obj + def run_deployment(self, obj): + print("DEPLOYING:") + print(os.getenv("REPO_DIR")) + print(os.getenv("NIX_DIR")) + submission = obj.parsed_value.model_dump_json() + deployment = json.dumps(json.loads(submission) | { + "initialUser": { + "displayName": "Testy McTestface", + "username": "test", + "password": "testtest", + "email": "test@test.com", + }, + }) + env = { + "DEPLOYMENT": deployment, + "PATH": f"{os.getenv("NIX_DIR")}/bin/", + } + print(f"env: {env}") + print(f"Path: {os.getcwd()}/..") + cmd = [ + "nix", + "develop", + "--extra-experimental-features", + "configurable-impure-env", + "--command", + "nixops4", + "--show-trace", + "--verbose", + "apply", + "test", + ] + print('start deployment') + sleep(5) + print('done with deployment') + #subprocess.run(cmd, cwd=os.getenv("REPO_DIR") or f"{os.getcwd()}/..", env=env) + # TODO(@fricklerhandwerk): # this should probably live somewhere else def convert_enums_to_names(self, data_dict): @@ -120,9 +119,65 @@ class ConfigurationForm(LoginRequiredMixin, FormView): initial.update(self.convert_enums_to_names(config_dict)) return initial +class Save(ConfigurationForm): def form_valid(self, form): obj = self.get_object() obj.value = form.to_python().model_dump_json() obj.save() + print('-------------debug-------------') + print(self.request.POST) + print('-------------debug-------------') + + if "deploy" in self.request.POST.keys(): + threading.Thread(target=self.run_deployment, args=(obj,)).start() + return super().form_valid(form) + +class DeploymentStatus(ConfigurationForm): + def form_valid(self, form): + obj = self.get_object() + obj.value = form.to_python().model_dump_json() + obj.save() + + # Check for deploy button + if "deploy" in self.request.POST.keys(): + self.deployment(obj) + + return super().form_valid(form) + + def deployment(self, obj): + submission = obj.parsed_value.model_dump_json() + # FIXME: let the user specify these from the form (#190) + dummy_user = { + "initialUser": { + "displayName": "Testy McTestface", + "username": "test", + "password": "testtest", + "email": "test@test.com", + }, + } + # serialize back and forth now we still need to manually inject the dummy user + deployment = json.dumps(dummy_user | json.loads(submission)) + env = { + "PATH": settings.nix_bin_dir, + # pass in form info to our deployment + "DEPLOYMENT": deployment, + } + cmd = [ + "nix", + "develop", + "--extra-experimental-features", + "configurable-impure-env", + "--command", + "nixops4", + "apply", + "test", + ] + deployment_result = subprocess.run( + cmd, + cwd=settings.repo_dir, + env=env, + ) + print(deployment_result) + return deployment_result \ No newline at end of file