From: Michael Tremer Date: Mon, 29 May 2023 12:51:54 +0000 (+0000) Subject: builders: Refactor deleteing builders X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e844251a340c2ed2cb75a508092df8b0a1c410cd;p=pbs.git builders: Refactor deleteing builders Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/builders.py b/src/buildservice/builders.py index 104a9ba2..c2dcb8c8 100644 --- a/src/buildservice/builders.py +++ b/src/buildservice/builders.py @@ -31,7 +31,7 @@ class Builders(base.Object): def __iter__(self): builders = self._get_builders("SELECT * FROM builders \ - WHERE deleted IS FALSE ORDER BY name") + WHERE deleted_at IS NULL ORDER BY name") return iter(builders) @@ -54,7 +54,7 @@ class Builders(base.Object): def get_by_name(self, name): return self._get_builder("SELECT * FROM builders \ - WHERE name = %s AND deleted IS FALSE", name) + WHERE name = %s AND deleted_at IS NULL", name) @property def connected(self): @@ -729,6 +729,18 @@ class Builder(base.DataObject): # Otherwise return a neutral preference return 0 + # Delete + + def delete(self, user=None): + """ + Deletes this builder + """ + log.info("Deleted builder %s" % self) + + self._set_attribute_now("deleted_at") + if user: + self._set_attribute("deleted_by", user) + # Stats @lazy_property diff --git a/src/database.sql b/src/database.sql index 69cb4c5f..54b66adb 100644 --- a/src/database.sql +++ b/src/database.sql @@ -336,7 +336,6 @@ CREATE TABLE public.builders ( name text NOT NULL, description text, enabled boolean DEFAULT false NOT NULL, - deleted boolean DEFAULT false NOT NULL, loadavg text DEFAULT '0'::character varying NOT NULL, maintenance boolean DEFAULT false NOT NULL, max_jobs bigint DEFAULT (1)::bigint NOT NULL, @@ -345,14 +344,15 @@ CREATE TABLE public.builders ( cpu_model text, cpu_count integer DEFAULT 1 NOT NULL, host_key_id text, - time_created timestamp without time zone DEFAULT now() NOT NULL, updated_at timestamp without time zone, - time_keepalive timestamp without time zone, - online_until timestamp without time zone, cpu_arch text, instance_id text, instance_type text, - mem_total bigint + mem_total bigint, + created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, + created_by integer, + deleted_at timestamp without time zone, + deleted_by integer ); @@ -1593,7 +1593,7 @@ CREATE UNIQUE INDEX build_watchers_unique ON public.build_watchers USING btree ( -- Name: builders_name; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX builders_name ON public.builders USING btree (name) WHERE (deleted IS FALSE); +CREATE UNIQUE INDEX builders_name ON public.builders USING btree (name) WHERE (deleted_at IS NULL); -- @@ -1995,6 +1995,22 @@ ALTER TABLE ONLY public.builder_stats ADD CONSTRAINT builder_stats_builder_id FOREIGN KEY (builder_id) REFERENCES public.builders(id); +-- +-- Name: builders builders_created_by; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.builders + ADD CONSTRAINT builders_created_by FOREIGN KEY (created_by) REFERENCES public.users(id); + + +-- +-- Name: builders builders_deleted_by; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.builders + ADD CONSTRAINT builders_deleted_by FOREIGN KEY (deleted_by) REFERENCES public.users(id); + + -- -- Name: builds builds_build_group_id; Type: FK CONSTRAINT; Schema: public; Owner: - -- diff --git a/src/templates/builders/delete.html b/src/templates/builders/delete.html index c62a4171..c22505bc 100644 --- a/src/templates/builders/delete.html +++ b/src/templates/builders/delete.html @@ -1,48 +1,43 @@ -{% extends "../base.html" %} +{% extends "../modal.html" %} -{% block title %}{{ _("Delete builder %s") % builder.name }}{% end block %} +{% block title %}{{ _("Delete Builder") }} - {{ builder }}{% end block %} -{% block body %} - +{% block breadcrumbs %} + +{% end block %} + +{% block modal_title %} +

{{ _("Delete Builder") }}

+
{{ builder }}
+{% end block %} + +{% block modal %} +
+ {% raw xsrf_form_html() %} -
-
- +
+

+ {{ _("Are you sure you want to delete %s?") % builder }} +

-
-
-
- + {# Submit! #} +
+
-
+ {% end block %} diff --git a/src/templates/builders/show.html b/src/templates/builders/show.html index f0764607..b777598f 100644 --- a/src/templates/builders/show.html +++ b/src/templates/builders/show.html @@ -122,6 +122,10 @@ {{ _("Edit") }} + + + {{ _("Delete") }} +
{% end %} diff --git a/src/web/__init__.py b/src/web/__init__.py index 9208ac2e..8e52a8b8 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -182,7 +182,7 @@ class Application(tornado.web.Application): (r"/builders", builders.IndexHandler), (r"/builders/create", builders.CreateHandler), (r"/builders/([A-Za-z0-9\-\.]+)", builders.ShowHandler), - (r"/builders/([A-Za-z0-9\-\.]+)/delete", builders.BuilderDeleteHandler), + (r"/builders/([A-Za-z0-9\-\.]+)/delete", builders.DeleteHandler), (r"/builders/([A-Za-z0-9\-\.]+)/edit", builders.BuilderEditHandler), (r"/builders/([A-Za-z0-9\-\.]+)/stats", builders.StatsHandler), (r"/api/v1/builders/control", builders.APIv1ControlHandler), diff --git a/src/web/builders.py b/src/web/builders.py index 0327d03f..89336b4d 100644 --- a/src/web/builders.py +++ b/src/web/builders.py @@ -146,7 +146,7 @@ class BuilderEditHandler(base.BaseHandler): self.redirect("/builders/%s" % builder.hostname) -class BuilderDeleteHandler(base.BaseHandler): +class DeleteHandler(base.BaseHandler): @tornado.web.authenticated def get(self, name): builder = self.backend.builders.get_by_name(name) @@ -157,15 +157,23 @@ class BuilderDeleteHandler(base.BaseHandler): if not builder.has_perm(self.current_user): raise tornado.web.HTTPError(403) - confirmed = self.get_argument("confirmed", None) - if confirmed: - with self.db.transaction(): - builder.deleted = True + self.render("builders/delete.html", builder=builder) - self.redirect("/builders") - return + @tornado.web.authenticated + async def post(self, hostname): + builder = self.backend.builders.get_by_name(hostname) + if not builder: + raise tornado.web.HTTPError(404, "Builder not found: %s" % hostname) - self.render("builders/delete.html", builder=builder) + # Check permissions + if not builder.has_perm(self.current_user): + raise tornado.web.HTTPError(403) + + # Delete the builder + with self.db.transaction(): + builder.delete(user=self.current_user) + + self.redirect("/builders") class StatsModule(ui_modules.UIModule):